Install on a server: Difference between revisions
No edit summary |
|||
| (7 intermediate revisions by the same user not shown) | |||
| Line 29: | Line 29: | ||
<span style="color:magenta;">I used <code>5100</code> for the example flask application.</span> | <span style="color:magenta;">I used <code>5100</code> for the example flask application.</span> | ||
Edit the nginx <code>hub.xpub.nl</code> config file and check for used ports: | '''Edit''' the nginx <code>hub.xpub.nl</code> config file and '''check for used ports''': | ||
sudo nano /etc/nginx/sites-enabled/hub.xpub.nl | sudo nano /etc/nginx/sites-enabled/hub.xpub.nl | ||
| Line 35: | Line 35: | ||
Scroll down until you find "FLASK APPLICATIONS HERE". | Scroll down until you find "FLASK APPLICATIONS HERE". | ||
Paste this example into that section, and edit "YOUR_FOLDER" to your folder name. | |||
location /sergio/YOUR_FOLDER/ { | location /sergio/YOUR_FOLDER/ { | ||
| Line 44: | Line 41: | ||
include proxy_params; | include proxy_params; | ||
} | } | ||
'''''!!! don't forget to include the / at the end | '''''!!! don't forget to include the <code>/</code> at the end + to put your new port''''' | ||
==== | ====prefix.py==== | ||
Add these | Add these few lines to your flask application py script (there is an example [https://git.xpub.nl/manetta/flask-observations/src/branch/main/observations.py here]): | ||
It can either be saved as a separated file as <code>prefix.py</code> '''or''' (better) being pasted into your main py file, like for example the usual <code>app.py</code> | |||
<syntaxhighlight lang="python"> | <syntaxhighlight lang="python"> | ||
| Line 71: | Line 68: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
=== | === '''<big>Install as a systemd background process</big>''' === | ||
{{ :Service files }} | {{ :Service files }} | ||
[[Category:Raspberry Pi]] [[Category:flask]] | |||
Latest revision as of 13:58, 7 July 2026
Part of the Flask page
Running Flask applications on the collective hub.xpub.nl servers is possible, but needs a couple of steps.
There have been different attempts in the past:
- use the officially recommended PrefixMiddleware! (100% success rate, see below)
- for Kamo's notes: https://git.xpub.nl/kamo/pad-bis#nginx-configuration
- use gunicorn: see Flask/Gunicorn
- Flask official deployment page: https://flask.palletsprojects.com/en/stable/deploying/
PrefixMiddleware
To install your flask application on the sandbox server (sergio, cerealbox, etc), you need to take a few steps:
- configure nginx
- add prefix.py to your flask applications OR put it in your 'app.py'
- upload your code to the server (i would recommend to work with a git repository!)
- install your flask application as a systemd background process
Configure nginx
First, pick a port for your application, because we cannot all use port 5000! :)
A suggestion: let's use the range 5100-5200, so anything in between these two port numbers.
You can check the nginx config file to see which ones are used.
I used 5100 for the example flask application.
Edit the nginx hub.xpub.nl config file and check for used ports:
sudo nano /etc/nginx/sites-enabled/hub.xpub.nl
Scroll down until you find "FLASK APPLICATIONS HERE".
Paste this example into that section, and edit "YOUR_FOLDER" to your folder name.
location /sergio/YOUR_FOLDER/ {
proxy_pass http://localhost:51??/sergio/YOUR_FOLDER/;
include proxy_params;
}
!!! don't forget to include the / at the end + to put your new port
prefix.py
Add these few lines to your flask application py script (there is an example here):
It can either be saved as a separated file as prefix.py or (better) being pasted into your main py file, like for example the usual app.py
class PrefixMiddleware(object):
def __init__(self, app, prefix=''):
self.app = app
self.prefix = prefix
def __call__(self, environ, start_response):
if environ['PATH_INFO'].startswith(self.prefix):
environ['PATH_INFO'] = environ['PATH_INFO'][len(self.prefix):]
environ['SCRIPT_NAME'] = self.prefix
return self.app(environ, start_response)
else:
start_response('404', [('Content-Type', 'text/plain')])
return ["This url does not belong to the app.".encode()]
app.wsgi_app = PrefixMiddleware(app.wsgi_app, '/sergio/YOUR_FOLDER') #NO slash at the end of this line!!
Install as a systemd background process
Making a systemd service file
When you deploy your application on a server, you need to make sure the application runs uninterrupted. If the application crashes, you'd want it to automatically restart, and if the server experiences a power outage, you'd want the application to start immediately once power is restored.
SEE: https://blog.miguelgrinberg.com/post/running-a-flask-application-as-a-service-with-systemd
Useful: https://containersolutions.github.io/runbooks/posts/linux/debug-systemd-service-units/
$ sudo nano /etc/systemd/system/YOUR_NAME_OF_THE_APP.service
[Unit] Description=<a description of your application> After=network.target [Service] User=<username> WorkingDirectory=<path to your app> ExecStart=<app start command> Restart=always [Install] WantedBy=multi-user.target
Here is an example:
[Unit]
Description=Bla Bla Bla made in Flask
After=network.target
[Service]
User=YOUR_USERNAME
WorkingDirectory=/YOUR/PATH/
ExecStart=/YOUR/PATH/.venv/bin/flask --app NAME_OF_YOUR_PY_FILE run --port 51?? #DO NOT PUT .py AT THE END + #PUT YOUR_PORT
Restart=always
[Install]
WantedBy=multi-user.target
1st thing to do when your .service file is new or changed
$ sudo systemctl daemon-reload
Then in order:
$ sudo systemctl start YOUR_NAME_OF_THE_APP $ sudo systemctl status YOUR_NAME_OF_THE_APP
When you see that it's working (checking its status, that it actually is running, etc...)
$ sudo systemctl enable YOUR_NAME_OF_THE_APP
Will make the "service" auto start when the pi restarts.
Additional commands:
$ sudo systemctl restart YOUR_NAME_OF_THE_APP $ sudo systemctl stop YOUR_NAME_OF_THE_APP
To view the log file (errors):
$ sudo journalctl -u YOUR_NAME_OF_THE_APP -f
You can find documentation here:
https://www.freedesktop.org/software/systemd/man/latest/systemd.exec.html