This commit is contained in:
@@ -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 (1–40): `http://<server>:8090/m<N>`
|
- Maschine N (1–40): `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
@@ -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
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user