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 ## 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 ```bash
cp .env.example .env
# .env anpassen (Passwort etc.)
docker compose up -d --build docker compose up -d --build
``` ```
Die Anwendung ist danach unter `http://<server>:8090/` erreichbar (Port über Die Anwendung ist danach unter `http://<server>:8081/` erreichbar (Port
`APP_PORT` in `.env` änderbar). direkt im `ports:`-Abschnitt von `docker-compose.yml` änderbar).
**Wichtig zur DB-Initialisierung:** `build/db/init.sql` (= dein hochgeladenes Schema, **Wichtig zur DB-Initialisierung:** `build/db/init.sql` (= dein hochgeladenes Schema,
ergänzt um ein paar Beispiel-Abweichungsgründe) wird **nur beim allerersten 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 Start** ausgeführt, wenn das Datenvolume noch leer ist. Hast du bereits eine
bestehende Postgres-Datenbank mit Daten, dann: bestehende Postgres-Datenbank mit Daten, dann:
- entweder das `db`-Volume vor dem ersten Start leer lassen und `init.sql` - entweder das Datenverzeichnis vor dem ersten Start leer lassen und
anpassen/ersetzen, **oder** `init.sql` anpassen/ersetzen, **oder**
- den `db`-Service in `docker-compose.yml` entfernen und stattdessen über - den `ens-db`-Service in `docker-compose.yml` entfernen und stattdessen über
`DB_HOST` / `DB_PORT` / `DB_NAME` / `DB_USER` / `DB_PASSWORD` in der `.env` `DB_HOST` / `DB_PORT` / `DB_NAME` / `DB_USER` / `DB_PASSWORD` bei `ens-app`
auf deine bestehende Datenbank zeigen. 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 ## Aufruf der einzelnen Seiten
- Maschine N (140): `http://<server>:8090/m<N>` - Maschine N (140): `http://<server>:8081/m<N>`
z.B. `http://<server>:8090/m1` z.B. `http://<server>:8081/m1`
- Produktionsleiter: `http://<server>:8090/start` - 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 `.../m1_m_view_main`) funktioniert unverändert weiter und zeigt auf
dieselbe Seite. Sie bleibt bewusst zusätzlich zur kurzen Form erhalten, dieselbe Seite. Sie bleibt bewusst zusätzlich zur kurzen Form erhalten,
damit bereits auf Tablets als Kiosk-Startseite/Lesezeichen hinterlegte damit bereits auf Tablets als Kiosk-Startseite/Lesezeichen hinterlegte
@@ -122,9 +164,10 @@ location /app/wdm-performance/ {
- **Maschinenverwaltung** (`/start_maschinen_verwaltung`, passwortgeschützt): - **Maschinenverwaltung** (`/start_maschinen_verwaltung`, passwortgeschützt):
Maschinen anlegen, umbenennen/Standort ändern, löschen (nur möglich wenn Maschinen anlegen, umbenennen/Standort ändern, löschen (nur möglich wenn
keine Aufträge mehr an der Maschine hängen). Passwort über die keine Aufträge mehr an der Maschine hängen). Passwort über die
Umgebungsvariable `MASCHINEN_PASSWORT` in der `.env` konfigurierbar Umgebungsvariable `MASCHINEN_PASSWORT` in `docker-compose.yml` konfigurierbar
(Standard `admin` bitte unbedingt ändern!). Für die Login-Session wird (unbedingt vom Platzhalter auf einen echten Wert ändern!). Für die
zusätzlich ein `SECRET_KEY` benötigt (ebenfalls in der `.env` setzen). Login-Session wird zusätzlich ein `SECRET_KEY` benötigt (ebenfalls dort
gesetzt).
### Aufträge importieren (`/start_import`) ### Aufträge importieren (`/start_import`)
Excel- (.xlsx) oder CSV-Datei mit (mindestens) diesen Spalten hochladen 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. Maschinenübersicht ("Zu Maschine springen") mit angezeigt.
### Logo / Icon ### Logo / Icon
`build/static/logo.svg` wird als Favicon und (in doppelter Standardgröße, `build/static/logo.svg` wird als Favicon und über dem Seitentitel angezeigt.
104×104px) über dem Seitentitel angezeigt. Einfach durch eine eigene Datei Die Darstellung ist proportional (feste Höhe 130px, Breite skaliert automatisch
mit demselben Namen (`logo.svg`, idealerweise quadratisch) ersetzen, um das im echten Seitenverhältnis mit) funktioniert also auch mit einem breiten,
Firmenlogo einzubinden kein Code muss dafür angepasst werden. 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) ### JavaScript-Einsatz (Ausnahmen vom "kein Client-JS"-Grundsatz)
Zwei bewusste, punktuelle Ausnahmen von der sonst reinen Server-Side- Zwei bewusste, punktuelle Ausnahmen von der sonst reinen Server-Side-
@@ -189,11 +234,12 @@ Rendering-Philosophie:
## Struktur ## Struktur
``` ```
wdm-performance/ wdm/
├── Dockerfile Build-Anweisungen (Kontext = Projektwurzel) ├── 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 ├── README.md
├── .env.example
└── build/ └── build/
├── app.py Flask-Anwendung (alle Routen, Server-Side-Rendering) ├── app.py Flask-Anwendung (alle Routen, Server-Side-Rendering)
├── db.py DB-Pool mit Retry-Logik ├── 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, # Für ANDERE Docker-Instanzen: zieht nur das fertig gebaute Image aus der
# baut nicht selbst aus dem Quellcode. Diese Datei (+ .env) reicht dort aus, # Gitea-Registry, baut nicht selbst aus dem Quellcode. Diese eine Datei
# der Rest des Repos wird nicht benötigt. # reicht auf dem Zielserver aus, der Rest des Repos wird dort nicht benötigt.
# #
# Vor dem ersten Start einmalig einloggen: # Es gibt bewusst KEINE .env - alle Werte stehen direkt hier. Vor dem
# docker login git.meinefirma.de -u <benutzername> # 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: # Start:
# docker compose -f docker-compose.deploy.yml up -d # docker compose -f docker-compose.deploy.yml up -d
@@ -18,15 +24,15 @@ services:
container_name: ens-db container_name: ens-db
restart: unless-stopped restart: unless-stopped
environment: environment:
POSTGRES_DB: ${DB_NAME:-wdm} POSTGRES_DB: postgres
POSTGRES_USER: ${DB_USER:-wdm} POSTGRES_USER: postgres
POSTGRES_PASSWORD: ${DB_PASSWORD:-wdm} POSTGRES_PASSWORD: "BITTE-AENDERN-DB-PASSWORT"
ports: ports:
- "5432:5432" - "5432:5432"
volumes: volumes:
- /var/lib/docker/volumes/postgresql_ens_data:/var/lib/postgresql/data - /var/lib/docker/volumes/postgresql_ens_data:/var/lib/postgresql/data
healthcheck: 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 interval: 10s
timeout: 5s timeout: 5s
retries: 10 retries: 10
@@ -34,9 +40,9 @@ services:
oom_score_adj: -200 oom_score_adj: -200
ens-app: ens-app:
# Statt "build: ." wird hier das fertige Image aus der Gitea/Forgejo- # Statt "build: ." wird hier das fertige Image aus der Gitea-Registry
# Registry gezogen. Owner/Repo-Name muss klein geschrieben sein. # gezogen. Owner/Repo-Name muss klein geschrieben sein (Docker-Vorgabe).
image: git.meinefirma.de/owner/ens:latest image: git.thiede-brauer.de/bryan.hoffmann/wdm:latest
container_name: ens-app container_name: ens-app
restart: unless-stopped restart: unless-stopped
depends_on: depends_on:
@@ -45,13 +51,13 @@ services:
environment: environment:
DB_HOST: ens-db DB_HOST: ens-db
DB_PORT: 5432 DB_PORT: 5432
DB_NAME: ${DB_NAME:-wdm} DB_NAME: postgres
DB_USER: ${DB_USER:-wdm} DB_USER: postgres
DB_PASSWORD: ${DB_PASSWORD:-wdm} DB_PASSWORD: "BITTE-AENDERN-DB-PASSWORT"
SECRET_KEY: ${SECRET_KEY:-bitte-in-der-.env-aendern} SECRET_KEY: "BITTE-AENDERN-LANGER-ZUFALLSWERT"
MASCHINEN_PASSWORT: ${MASCHINEN_PASSWORT:-admin} MASCHINEN_PASSWORT: "BITTE-AENDERN-MASCHINEN-PASSWORT"
ports: ports:
- "${APP_PORT:-8090}:5000" - "8081:5000"
healthcheck: healthcheck:
test: ["CMD", "curl", "-fsS", "http://localhost:5000/api/health"] test: ["CMD", "curl", "-fsS", "http://localhost:5000/api/health"]
interval: 30s 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: services:
ens-db: ens-db:
image: postgres:17 image: postgres:17
container_name: ens-db container_name: ens-db
restart: unless-stopped restart: unless-stopped
environment: environment:
POSTGRES_DB: ${DB_NAME:-wdm} POSTGRES_DB: postgres
POSTGRES_USER: ${DB_USER:-wdm} POSTGRES_USER: postgres
POSTGRES_PASSWORD: ${DB_PASSWORD:-wdm} POSTGRES_PASSWORD: "BITTE-AENDERN-DB-PASSWORT"
ports: ports:
- "5432:5432" - "5432:5432"
volumes: volumes:
- /var/lib/docker/volumes/postgresql_ens_data:/var/lib/postgresql/data - /var/lib/docker/volumes/postgresql_ens_data:/var/lib/postgresql/data
healthcheck: 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 interval: 10s
timeout: 5s timeout: 5s
retries: 10 retries: 10
@@ -29,13 +41,13 @@ services:
environment: environment:
DB_HOST: ens-db DB_HOST: ens-db
DB_PORT: 5432 DB_PORT: 5432
DB_NAME: ${DB_NAME:-wdm} DB_NAME: postgres
DB_USER: ${DB_USER:-wdm} DB_USER: postgres
DB_PASSWORD: ${DB_PASSWORD:-wdm} DB_PASSWORD: "BITTE-AENDERN-DB-PASSWORT"
SECRET_KEY: ${SECRET_KEY:-bitte-in-der-.env-aendern} SECRET_KEY: "BITTE-AENDERN-LANGER-ZUFALLSWERT"
MASCHINEN_PASSWORT: ${MASCHINEN_PASSWORT:-admin} MASCHINEN_PASSWORT: "BITTE-AENDERN-MASCHINEN-PASSWORT"
ports: ports:
- "${APP_PORT:-8090}:5000" - "8081:5000"
healthcheck: healthcheck:
test: ["CMD", "curl", "-fsS", "http://localhost:5000/api/health"] test: ["CMD", "curl", "-fsS", "http://localhost:5000/api/health"]
interval: 30s interval: 30s