Project C - Flask deployen op Linux Fedora
01 - Inleiding: doel van Project C
In project A heb je een eerste Flask-dashboard gebouwd. In project B heb je geleerd hoe je API-data ophaalt, opslaat in SQLite en toont in een webapp. In project C gaan we de volgende stap zetten: we gaan de applicatie deployen op een Fedora-server.
De app draait daarbij niet meer met de ingebouwde Flask ontwikkelserver, maar met Gunicorn als WSGI-server en Apache als webserver en reverse proxy.
-
In dit project gebruiken we weer de map
coinsals voorbeeldapp. - Het doel is dat de Flask-app bereikbaar wordt via een echte webserver.
- De nadruk ligt op de praktische stappen: installeren, configureren, starten en testen.
02 - Wat je nodig hebt
- Voor dit project heb je nodig:
- een Fedora-server
- toegang via SSH
- Python 3
- Apache HTTP Server
- Gunicorn
-
je Flask-projectmap, bijvoorbeeld
coins
-
In dit voorbeeld plaatsen we het project op de server in:
/srv/apps/coins - Dat is een nette locatie voor zelf beheerde webapplicaties.
03 - Project naar de server kopieren
- Zet eerst je projectmap op de Fedora-server.
-
Dat kan bijvoorbeeld met
scp,rsyncof via Git.
- In dit project gaan we ervan uit dat je map uiteindelijk op de server staat als:
/srv/apps/coins
- Zorg dat in die map in elk geval je Flask-bestanden staan, zoals:
coins/
│
├── app.py
├── requirements.txt
├── data/
├── templates/
└── static/
04 - Benodigde software installeren
- Installeer eerst Apache op Fedora.
sudo dnf install httpd
- Start Apache daarna en zet hem aan bij het opstarten:
sudo systemctl enable --now httpd
- Installeer daarna de Python-onderdelen voor je project.
- Ga naar je projectmap:
cd /srv/apps/coins
- Maak een virtual environment aan en activeer die:
python -m venv .venv
source .venv/bin/activate
- Installeer daarna de projectdependencies:
pip install -r requirements.txt
pip install gunicorn
- Gunicorn wordt officieel aangeraden achter een reverse proxy te draaien.
- In dit project is Apache die reverse proxy.
05 - Testen of Gunicorn werkt
- Voordat we met systemd en Apache werken, testen we eerst of Gunicorn de app kan starten.
cd /srv/apps/coins
source .venv/bin/activate
gunicorn --bind 127.0.0.1:8000 app:app
-
Hier betekent
app:app: -
het eerste
appis het Python-bestandapp.py -
het tweede
appis de Flask-variabeleapp = Flask(__name__)
-
Als dit goed werkt, draait je app tijdelijk op:
http://127.0.0.1:8000 -
Stop deze test daarna weer met
Ctrl + C.
06 - Een systemd service maken voor Gunicorn
- Voor een echte deployment wil je dat Gunicorn automatisch als service draait.
- Daarvoor maken we een systemd servicebestand.
- Maak dit bestand aan:
sudo nano /etc/systemd/system/coins.service
- Zet daarin bijvoorbeeld:
[Unit]
Description=Gunicorn for Coins Flask app
After=network.target
[Service]
User=apache
Group=apache
WorkingDirectory=/srv/apps/coins
Environment="PYTHONUNBUFFERED=1"
ExecStart=/srv/apps/coins/.venv/bin/gunicorn --workers 2 --bind 127.0.0.1:8000 app:app
Restart=on-failure
RestartSec=3
[Install]
WantedBy=multi-user.target
-
Met
WorkingDirectorygeef je aan waar het project staat. -
Met
ExecStartgeef je aan hoe Gunicorn gestart moet worden. -
Met
Restart=on-failurestart systemd de service opnieuw als deze crasht.
Subuitleg: waarom gebruiken we systemd?
- systemd beheert services op Fedora.
- Daardoor kun je de app automatisch laten starten bij een reboot.
- Ook kun je de status bekijken, logs uitlezen en services opnieuw starten met vaste commando’s.
- Herlaad daarna systemd:
sudo systemctl daemon-reload
- Start de service en zet hem aan bij het opstarten:
sudo systemctl enable --now coins.service
- Controleer de status:
sudo systemctl status coins.service
07 - Apache als reverse proxy instellen
-
Gunicorn draait nu lokaal op poort
8000. - Apache gaat de publieke webserver worden die verzoeken doorstuurt naar Gunicorn.
- Maak een configuratiebestand aan in:
sudo nano /etc/httpd/conf.d/coins.conf
- Zet daarin bijvoorbeeld:
ProxyRequests Off
ProxyPass / http://127.0.0.1:8000/
ProxyPassReverse / http://127.0.0.1:8000/
-
Met
ProxyPassstuurt Apache inkomende requests door naar Gunicorn. -
Met
ProxyPassReverseworden redirects en terugverwijzingen goed afgehandeld.
Subuitleg: wat is een reverse proxy?
- De bezoeker praat met Apache.
- Apache haalt daarna intern de response op bij Gunicorn.
- Voor de bezoeker lijkt het alsof Apache zelf de app draait.
- Dit is een standaardopzet voor productieomgevingen.
- Test daarna de Apache-configuratie:
sudo apachectl configtest
-
Als je
Syntax OKziet, herstart dan Apache:
sudo systemctl restart httpd
08 - Firewall en SELinux
- Op Fedora blokkeert de firewall standaard veel inkomend verkeer.
- Open daarom de webpoorten:
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
sudo firewall-cmd --reload
- Bij reverse proxy-configuraties kan SELinux ook in de weg zitten.
-
Apache moet dan netwerkverbindingen mogen maken naar Gunicorn op
127.0.0.1:8000.
sudo setsebool -P httpd_can_network_connect on
sudo setsebool -P httpd_can_network_relay on
- Deze stap is vaak nodig op Fedora en andere systemen met SELinux.
09 - Logs en problemen oplossen
- Als iets niet werkt, kijk dan eerst in de logs.
- Voor Gunicorn via systemd gebruik je bijvoorbeeld:
sudo journalctl -u coins.service -n 50
- Voor Apache kun je bijvoorbeeld kijken naar:
sudo journalctl -u httpd -n 50
- Veelvoorkomende problemen zijn:
-
verkeerd pad in
WorkingDirectory -
verkeerd pad naar
.venv/bin/gunicorn -
een fout in
app:app - firewall of SELinux die verkeer blokkeert
- Apache-configuratie met een typefout
10 - Project afronden
- Als alles goed staat, draait je Flask-app nu op Fedora via:
- Gunicorn als applicatieserver
- Apache als webserver en reverse proxy
- systemd voor het beheren van de service
-
Daarmee heb je een veel realistischere deployment dan met alleen
python app.py. - Dit vormt een goede basis voor vervolgstappen zoals:
- een eigen domeinnaam koppelen
- HTTPS met TLS-certificaten toevoegen
-
een subpath zoals
/coinsgebruiken - een productiegebruikersaccount voor de app instellen
Inspiratie: relatie met het eindproduct
- Het live voorbeeld op www.crossway.nl/coins is ook gebaseerd op deze algemene aanpak: Flask achter Gunicorn met een webserver ervoor.
- In een productieomgeving komt daar vaak nog extra configuratie bij, zoals caching, HTTPS, static file-afhandeling en foutafhandeling.