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 coins als 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, rsync of 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 app is het Python-bestand app.py
  • het tweede app is de Flask-variabele app = 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 WorkingDirectory geef je aan waar het project staat.
  • Met ExecStart geef je aan hoe Gunicorn gestart moet worden.
  • Met Restart=on-failure start 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 ProxyPass stuurt Apache inkomende requests door naar Gunicorn.
  • Met ProxyPassReverse worden 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 OK ziet, 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 /coins gebruiken
  • 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.