Update Dockerfile settings
Build und Push Docker Image / build-and-push (push) Successful in 9s

This commit is contained in:
2026-08-21 13:21:37 +02:00
parent ac9cf234b4
commit 3202f26b76
3 changed files with 114 additions and 50 deletions
+68 -22
View File
@@ -6,33 +6,75 @@ beim Essensportal-Projekt. Postgres-Datenbank.
## Start
Es gibt bewusst **keine `.env`-Datei** alle Einstellungen (DB-Zugangsdaten,
Port, `SECRET_KEY`, `MASCHINEN_PASSWORT`) stehen direkt in `docker-compose.yml`.
Vor dem ersten Start dort alle `BITTE-AENDERN-...`-Platzhalter durch echte
Werte ersetzen (Datenbank-Passwort bei `ens-db` und `ens-app` muss identisch
sein), dann:
```bash
cp .env.example .env
# .env anpassen (Passwort etc.)
docker compose up -d --build
```
Die Anwendung ist danach unter `http://<server>:8090/` erreichbar (Port über
`APP_PORT` in `.env` änderbar).
Die Anwendung ist danach unter `http://<server>:8081/` erreichbar (Port
direkt im `ports:`-Abschnitt von `docker-compose.yml` änderbar).
**Wichtig zur DB-Initialisierung:** `build/db/init.sql` (= dein hochgeladenes Schema,
ergänzt um ein paar Beispiel-Abweichungsgründe) wird **nur beim allerersten
Start** ausgeführt, wenn das Datenvolume noch leer ist. Hast du bereits eine
bestehende Postgres-Datenbank mit Daten, dann:
- entweder das `db`-Volume vor dem ersten Start leer lassen und `init.sql`
anpassen/ersetzen, **oder**
- den `db`-Service in `docker-compose.yml` entfernen und stattdessen über
`DB_HOST` / `DB_PORT` / `DB_NAME` / `DB_USER` / `DB_PASSWORD` in der `.env`
- entweder das Datenverzeichnis vor dem ersten Start leer lassen und
`init.sql` anpassen/ersetzen, **oder**
- den `ens-db`-Service in `docker-compose.yml` entfernen und stattdessen über
`DB_HOST` / `DB_PORT` / `DB_NAME` / `DB_USER` / `DB_PASSWORD` bei `ens-app`
auf deine bestehende Datenbank zeigen.
> **Achtung, bitte prüfen:** `ens-db` bindet aktuell als Volume das Verzeichnis
> `/var/lib/docker/volumes/postgresql_ens_data` ein. Laut eurer eigenen
> System-Doku ist genau das der Datenbankpfad des *bestehenden* Budibase-
> Systems. Läuft Budibase parallel mit seiner eigenen Postgres-Instanz auf
> demselben Host, würden zwei unabhängige Postgres-Prozesse gleichzeitig auf
> dasselbe Datenverzeichnis schreiben das kann das Datenverzeichnis
> beschädigen. Bitte kurz gegenprüfen, ob das so beabsichtigt ist (z.B. weil
> Budibase dort inzwischen abgelöst ist) oder ob hier versehentlich der
> falsche Pfad übernommen wurde; im Zweifel einen eigenen, neuen Pfad/Volume
> für `ens-db` verwenden.
## Bauen und Verteilen als Container
Bei jedem Push nach `main` bzw. auf einen `v*`-Tag baut die Gitea-Actions-
Pipeline (`.gitea/workflows/build.yml`) automatisch ein Image und pusht es in
die Gitea-Registry (getaggt als `:latest` und mit dem Commit-Hash).
Für einen **anderen Server**, der nur das fertige Image ziehen und selbst
nichts bauen soll, gibt es `docker-compose.deploy.yml`: sie referenziert das
Image direkt aus der Registry (`image: git.thiede-brauer.de/bryan.hoffmann/wdm:latest`,
kein `build:`). Auf diesem Server reicht allein diese eine Datei der Rest
des Repos wird dort nicht benötigt:
```bash
docker login git.thiede-brauer.de -u <benutzername> # falls die Registry nicht öffentlich lesbar ist
docker compose -f docker-compose.deploy.yml up -d
```
Update auf eine neue Version:
```bash
docker compose -f docker-compose.deploy.yml pull
docker compose -f docker-compose.deploy.yml up -d
```
Auch hier gilt: keine `.env`, alle Werte direkt in `docker-compose.deploy.yml`
eintragen (dieselben Werte wie beim Bauen, insbesondere das DB-Passwort).
## Aufruf der einzelnen Seiten
- Maschine N (140): `http://<server>:8090/m<N>`
z.B. `http://<server>:8090/m1`
- Produktionsleiter: `http://<server>:8090/start`
- Maschine N (140): `http://<server>:8081/m<N>`
z.B. `http://<server>:8081/m1`
- Produktionsleiter: `http://<server>:8081/start`
**Alte/lange URL-Form:** `http://<server>:8090/m<N>_m_view_main` (z.B.
**Alte/lange URL-Form:** `http://<server>:8081/m<N>_m_view_main` (z.B.
`.../m1_m_view_main`) funktioniert unverändert weiter und zeigt auf
dieselbe Seite. Sie bleibt bewusst zusätzlich zur kurzen Form erhalten,
damit bereits auf Tablets als Kiosk-Startseite/Lesezeichen hinterlegte
@@ -122,9 +164,10 @@ location /app/wdm-performance/ {
- **Maschinenverwaltung** (`/start_maschinen_verwaltung`, passwortgeschützt):
Maschinen anlegen, umbenennen/Standort ändern, löschen (nur möglich wenn
keine Aufträge mehr an der Maschine hängen). Passwort über die
Umgebungsvariable `MASCHINEN_PASSWORT` in der `.env` konfigurierbar
(Standard `admin` bitte unbedingt ändern!). Für die Login-Session wird
zusätzlich ein `SECRET_KEY` benötigt (ebenfalls in der `.env` setzen).
Umgebungsvariable `MASCHINEN_PASSWORT` in `docker-compose.yml` konfigurierbar
(unbedingt vom Platzhalter auf einen echten Wert ändern!). Für die
Login-Session wird zusätzlich ein `SECRET_KEY` benötigt (ebenfalls dort
gesetzt).
### Aufträge importieren (`/start_import`)
Excel- (.xlsx) oder CSV-Datei mit (mindestens) diesen Spalten hochladen
@@ -160,10 +203,12 @@ Prioritätsliste und (sofern gerade ein Auftrag aktiv ist) auch in der
Maschinenübersicht ("Zu Maschine springen") mit angezeigt.
### Logo / Icon
`build/static/logo.svg` wird als Favicon und (in doppelter Standardgröße,
104×104px) über dem Seitentitel angezeigt. Einfach durch eine eigene Datei
mit demselben Namen (`logo.svg`, idealerweise quadratisch) ersetzen, um das
Firmenlogo einzubinden kein Code muss dafür angepasst werden.
`build/static/logo.svg` wird als Favicon und über dem Seitentitel angezeigt.
Die Darstellung ist proportional (feste Höhe 130px, Breite skaliert automatisch
im echten Seitenverhältnis mit) funktioniert also auch mit einem breiten,
nicht-quadratischen Logo. Einfach durch eine eigene Datei mit demselben Namen
(`logo.svg`) ersetzen, um das Firmenlogo einzubinden kein Code muss dafür
angepasst werden.
### JavaScript-Einsatz (Ausnahmen vom "kein Client-JS"-Grundsatz)
Zwei bewusste, punktuelle Ausnahmen von der sonst reinen Server-Side-
@@ -189,11 +234,12 @@ Rendering-Philosophie:
## Struktur
```
wdm-performance/
wdm/
├── Dockerfile Build-Anweisungen (Kontext = Projektwurzel)
├── docker-compose.yml
├── docker-compose.yml lokal bauen/testen (build: .)
├── docker-compose.deploy.yml nur Image ziehen (für andere Server)
├── .gitea/workflows/build.yml CI: baut Image und pusht in die Gitea-Registry
├── README.md
├── .env.example
└── build/
├── app.py Flask-Anwendung (alle Routen, Server-Side-Rendering)
├── db.py DB-Pool mit Retry-Logik
+24 -18
View File
@@ -1,9 +1,15 @@
# Für ANDERE Docker-Instanzen: zieht nur das fertig gebaute Image,
# baut nicht selbst aus dem Quellcode. Diese Datei (+ .env) reicht dort aus,
# der Rest des Repos wird nicht benötigt.
# Für ANDERE Docker-Instanzen: zieht nur das fertig gebaute Image aus der
# Gitea-Registry, baut nicht selbst aus dem Quellcode. Diese eine Datei
# reicht auf dem Zielserver aus, der Rest des Repos wird dort nicht benötigt.
#
# Vor dem ersten Start einmalig einloggen:
# docker login git.meinefirma.de -u <benutzername>
# Es gibt bewusst KEINE .env - alle Werte stehen direkt hier. Vor dem
# produktiven Einsatz alle "BITTE-AENDERN"-Platzhalter ersetzen (DB-Passwort
# muss mit dem beim Bauen verwendeten Wert übereinstimmen) und diese Datei
# danach entsprechend schützen (Klartext-Zugangsdaten).
#
# Vor dem ersten Start ggf. einmalig an der Registry anmelden (falls sie
# nicht öffentlich lesbar ist):
# docker login git.thiede-brauer.de -u <benutzername>
#
# Start:
# docker compose -f docker-compose.deploy.yml up -d
@@ -18,15 +24,15 @@ services:
container_name: ens-db
restart: unless-stopped
environment:
POSTGRES_DB: ${DB_NAME:-wdm}
POSTGRES_USER: ${DB_USER:-wdm}
POSTGRES_PASSWORD: ${DB_PASSWORD:-wdm}
POSTGRES_DB: postgres
POSTGRES_USER: postgres
POSTGRES_PASSWORD: "BITTE-AENDERN-DB-PASSWORT"
ports:
- "5432:5432"
volumes:
- /var/lib/docker/volumes/postgresql_ens_data:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U ${DB_USER:-wdm} -d ${DB_NAME:-wdm}"]
test: ["CMD-SHELL", "pg_isready -U postgres -d postgres"]
interval: 10s
timeout: 5s
retries: 10
@@ -34,9 +40,9 @@ services:
oom_score_adj: -200
ens-app:
# Statt "build: ." wird hier das fertige Image aus der Gitea/Forgejo-
# Registry gezogen. Owner/Repo-Name muss klein geschrieben sein.
image: git.meinefirma.de/owner/ens:latest
# Statt "build: ." wird hier das fertige Image aus der Gitea-Registry
# gezogen. Owner/Repo-Name muss klein geschrieben sein (Docker-Vorgabe).
image: git.thiede-brauer.de/bryan.hoffmann/wdm:latest
container_name: ens-app
restart: unless-stopped
depends_on:
@@ -45,13 +51,13 @@ services:
environment:
DB_HOST: ens-db
DB_PORT: 5432
DB_NAME: ${DB_NAME:-wdm}
DB_USER: ${DB_USER:-wdm}
DB_PASSWORD: ${DB_PASSWORD:-wdm}
SECRET_KEY: ${SECRET_KEY:-bitte-in-der-.env-aendern}
MASCHINEN_PASSWORT: ${MASCHINEN_PASSWORT:-admin}
DB_NAME: postgres
DB_USER: postgres
DB_PASSWORD: "BITTE-AENDERN-DB-PASSWORT"
SECRET_KEY: "BITTE-AENDERN-LANGER-ZUFALLSWERT"
MASCHINEN_PASSWORT: "BITTE-AENDERN-MASCHINEN-PASSWORT"
ports:
- "${APP_PORT:-8090}:5000"
- "8081:5000"
healthcheck:
test: ["CMD", "curl", "-fsS", "http://localhost:5000/api/health"]
interval: 30s
+22 -10
View File
@@ -1,18 +1,30 @@
# ---------------------------------------------------------------------------
# Lokales Bauen/Testen. Alle Einstellungen stehen direkt hier in der Datei -
# es gibt bewusst KEINE .env mehr. Vor dem produktiven Einsatz alle
# "BITTE-AENDERN"-Platzhalter durch echte, individuelle Werte ersetzen und
# diese Datei danach entsprechend schützen (enthält Klartext-Zugangsdaten,
# nicht ungeschützt in ein öffentliches Repo pushen).
#
# Für das Bauen+Verteilen als Container: das Gitea-Actions-Workflow
# (.gitea/workflows/build.yml) baut bei jedem Push auf main/Tag automatisch
# ein Image und pusht es in die Registry. Zum Deployment auf einem ANDEREN
# Server (der nur zieht, nicht selbst baut) siehe docker-compose.deploy.yml.
# ---------------------------------------------------------------------------
services:
ens-db:
image: postgres:17
container_name: ens-db
restart: unless-stopped
environment:
POSTGRES_DB: ${DB_NAME:-wdm}
POSTGRES_USER: ${DB_USER:-wdm}
POSTGRES_PASSWORD: ${DB_PASSWORD:-wdm}
POSTGRES_DB: postgres
POSTGRES_USER: postgres
POSTGRES_PASSWORD: "BITTE-AENDERN-DB-PASSWORT"
ports:
- "5432:5432"
volumes:
- /var/lib/docker/volumes/postgresql_ens_data:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U ${DB_USER:-wdm} -d ${DB_NAME:-wdm}"]
test: ["CMD-SHELL", "pg_isready -U postgres -d postgres"]
interval: 10s
timeout: 5s
retries: 10
@@ -29,13 +41,13 @@ services:
environment:
DB_HOST: ens-db
DB_PORT: 5432
DB_NAME: ${DB_NAME:-wdm}
DB_USER: ${DB_USER:-wdm}
DB_PASSWORD: ${DB_PASSWORD:-wdm}
SECRET_KEY: ${SECRET_KEY:-bitte-in-der-.env-aendern}
MASCHINEN_PASSWORT: ${MASCHINEN_PASSWORT:-admin}
DB_NAME: postgres
DB_USER: postgres
DB_PASSWORD: "BITTE-AENDERN-DB-PASSWORT"
SECRET_KEY: "BITTE-AENDERN-LANGER-ZUFALLSWERT"
MASCHINEN_PASSWORT: "BITTE-AENDERN-MASCHINEN-PASSWORT"
ports:
- "${APP_PORT:-8090}:5000"
- "8081:5000"
healthcheck:
test: ["CMD", "curl", "-fsS", "http://localhost:5000/api/health"]
interval: 30s