co_app
Insallation
- Git-Repository clonen
Entwicklungs- und Produktionsumgebung steuern (APP_ENV)
Die App unterscheidet zwischen Entwicklung und Produktion über die Umgebungsvariable APP_ENV.
Entwicklung (lokal)
Im Terminal setzen:
export APP_ENV=dev
Die Variable gilt, solange das Terminal geöffnet ist. Beim Starten der App:
streamlit run app/main.py
Die App erkennt automatisch den Dev-Modus.
Produktion (Systemd-Dienst)
Für den produktiven Betrieb setzt systemd die Variable dauerhaft auf prod:
Environment=APP_ENV=prod
In prod-Modus laufen z. B. Logging und Pfade anders als lokal.
systemd-Dienst einrichten
/etc/systemd/system/myapp.service
[Unit]
Description=MyApp Streamlit Service
After=network.target
[Service]
User=co_app
Group=co_app
WorkingDirectory=/opt/co_app
Environment=APP_ENV=prod
ExecStart=/usr/bin/python3 -m streamlit run app/main.py --server.port=8501
Restart=on-failure
[Install]
WantedBy=multi-user.target
Installation & Start
sudo systemctl daemon-reload
sudo systemctl enable co_app.service
sudo systemctl start co_app.service
Logs ansehen Da streamlit + python ins systemd-Journal loggen:
journalctl -u co_app.service -f
Wichtig
- APP_ENV=dev → Entwicklung, lokale Logs, lokale DB
- APP_ENV=prod → Systemd-Betrieb, serverseitige Pfade, Logging ins Journal
- Die App liest die Variable mit:
import os
APP_ENV = os.environ.get("APP_ENV", "dev")
Database Setup & Migration Guide
Dieses Projekt verwendet SQLite für die interne App-Datenbank. Das Schema wird vollständig über SQL-Migrationsdateien verwaltet, die automatisch in der richtigen Reihenfolge ausgeführt werden.
WICHTIG:
Bei der ersten Initialisierung muss ein admin-Passwort vergeben werden. Beim erstmaligen Anmelden an der App muss man sich dann als "adim" mit dem vergebenen Passwort anmelden. In der App können dann User angelegt.
Ordnerstruktur
data/ ← enthält die erzeugte SQLite-Datenbank (app.db)
migrations/ ← enthält alle SQL-Migrationsdateien
migrate.py ← Python-Skript zum Anwenden der Migrationen
Erstellen der Datenbank (Initial Setup)
python migrate.py
Das Skript:
- erstellt den Ordner db/ (falls nicht vorhanden)
- erzeugt eine neue Datei db/app.db
- führt alle SQL-Dateien im Ordner migrations/ der Reihe nach aus
- protokolliert die angewendeten Migrationen in der Tabelle schema_version
Danach ist die Datenbank vollständig initialisiert und einsatzbereit.
Arbeiten mit Migrationen (Änderungen am Schema)
Änderungen an der Datenbankstruktur werden nie direkt an der DB vorgenommen. Stattdessen erzeugst du eine neue Migrationsdatei im Ordner migrations/.
Beispiel: neue Spalte hinzufügen
Lege eine Datei an
touch /migrations/20250301_101500_add_last_login.sql
Dateiinhalt
BEGIN;
ALTER TABLE users ADD COLUMN last_login DATETIME;
INSERT INTO schema_version (version)
VALUES ('20250301_101500_add_last_login');
COMMIT;
Migration anwenden
python migrate.py
Das Skript erkennt automatisch, dass diese Migration neu ist und führt sie aus.
Erneutes Ausführen (Updates)
Wenn eine bestehende Installation aktualisiert werden soll:
git pull
python migrate.py
Das Skript:
- liest die Tabelle schema_version
- führt nur Migrationen aus, die noch nicht angewendet wurden
Bestehende Strukturen bleiben unberührt.
Entwicklungsphase: Hinweise
Solange das Projekt noch nicht produktiv genutzt wird, gilt:
- du kannst Migrationsdateien löschen/zusammenführen
- du kannst die komplette app.db jederzeit löschen
- vor dem ersten echten Deploy kannst du alle Migrationen zu einer sauberen initial.sql zusammenfassen
👉 Nach dem ersten produktiven Einsatz werden Migrationen nie mehr gelöscht, sondern nur ergänzt.
Optional: DB neu erzeugen für Tests
Um eine frische Datenbank zu bekommen:
rm -f data/app.db
python migrate.py