feat(deploy): manuelles Deploy-Verzeichnis für dockerbox.morz.de

- deploy/docker-compose.yml: Produktions-Stack (Backend, Postgres, Mosquitto)
  Backend bindet nur auf 127.0.0.1:8080 (HTTPS via Reverse Proxy)
- deploy/.env.example: Vorlage für Produktions-Umgebungsvariablen
- deploy/mosquitto/config/mosquitto.conf: Mosquitto mit Passwort-Auth
- ansible/group_vars: morz_server_base_url auf https://dockerbox.morz.de
- ansible/inventory.yml: debi entfernt, dev-Hosts info11/info12 ergänzt
- .gitignore: !.env.example als Ausnahme ergänzt

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Jesko Anschütz 2026-03-24 17:36:39 +01:00
parent 17ad69a82b
commit b3fd512d25
9 changed files with 120 additions and 2 deletions

1
.gitignore vendored
View file

@ -13,6 +13,7 @@ dist/
# Local environment files
.env
.env.*
!.env.example
# Compose override files
compose.override.yml

View file

@ -1,5 +1,5 @@
---
morz_server_base_url: "http://192.168.64.1:8080"
morz_server_base_url: "https://dockerbox.morz.de"
morz_mqtt_broker: "tcp://dockerbox.morz.de:1883"
morz_heartbeat_every_seconds: 30
morz_status_report_every_seconds: 60

View file

@ -0,0 +1,6 @@
---
ansible_host: 192.168.64.12
ansible_user: admin
screen_id: info11-dev
screen_name: "11 - Macbook"
screen_orientation: landscape

View file

@ -0,0 +1,6 @@
---
ansible_host: 192.168.64.13
ansible_user: admin
screen_id: info12-dev
screen_name: "12 - Macbook"
screen_orientation: landscape

View file

@ -7,7 +7,6 @@ all:
info01-dev:
info11-dev:
info12-dev:
debi:
signage_servers:
hosts:
dockerbox:

11
compose/.env.example Normal file
View file

@ -0,0 +1,11 @@
# Passwort für den initialen Admin-User (Tenant: MORZ_INFOBOARD_DEFAULT_TENANT).
# Wird beim ersten Start gesetzt, sofern noch kein Admin-User existiert.
# Leer lassen = zufälliges Passwort wird generiert und ins Log geschrieben.
MORZ_INFOBOARD_ADMIN_PASSWORD=
# Aktiviert den Dev-Modus (z. B. entspannte CORS-Regeln, ausführliches Logging).
# In Produktion auf false belassen.
MORZ_INFOBOARD_DEV_MODE=false
# Slug des Standard-Tenants, unter dem der Admin-User angelegt wird.
MORZ_INFOBOARD_DEFAULT_TENANT=morz

14
deploy/.env.example Normal file
View file

@ -0,0 +1,14 @@
# Datenbank-Passwort (wird auch intern vom Backend genutzt)
MORZ_DB_PASSWORD=sicheres-passwort-hier
# Initialer Admin-Benutzer (Tenant: MORZ_DEFAULT_TENANT)
# Leer lassen = zufälliges Passwort wird generiert und ins Log geschrieben
MORZ_ADMIN_PASSWORD=
# Standard-Tenant-Slug
MORZ_DEFAULT_TENANT=morz
# MQTT-Broker intern erreichbar über den mqtt-Service
MORZ_MQTT_BROKER=tcp://mqtt:1883
MORZ_MQTT_USERNAME=
MORZ_MQTT_PASSWORD=

70
deploy/docker-compose.yml Normal file
View file

@ -0,0 +1,70 @@
services:
backend:
image: git.az-it.net/az/morz-infoboard/backend:latest
restart: unless-stopped
ports:
- "127.0.0.1:8080:8080"
environment:
MORZ_INFOBOARD_HTTP_ADDR: ":8080"
MORZ_INFOBOARD_DATABASE_URL: "postgres://morz_infoboard:${MORZ_DB_PASSWORD}@db:5432/morz_infoboard?sslmode=disable"
MORZ_INFOBOARD_UPLOAD_DIR: /app/uploads
MORZ_INFOBOARD_STATUS_STORE_PATH: /app/data/status
MORZ_INFOBOARD_MQTT_BROKER: "${MORZ_MQTT_BROKER}"
MORZ_INFOBOARD_MQTT_USERNAME: "${MORZ_MQTT_USERNAME}"
MORZ_INFOBOARD_MQTT_PASSWORD: "${MORZ_MQTT_PASSWORD}"
MORZ_INFOBOARD_ADMIN_PASSWORD: "${MORZ_ADMIN_PASSWORD}"
MORZ_INFOBOARD_DEFAULT_TENANT: "${MORZ_DEFAULT_TENANT:-morz}"
MORZ_INFOBOARD_DEV_MODE: "false"
TZ: "Europe/Berlin"
volumes:
- ./uploads:/app/uploads
- ./data:/app/data
depends_on:
db:
condition: service_healthy
networks:
- internal
- proxy
db:
image: postgres:17-alpine
restart: unless-stopped
environment:
POSTGRES_USER: morz_infoboard
POSTGRES_PASSWORD: "${MORZ_DB_PASSWORD}"
POSTGRES_DB: morz_infoboard
volumes:
- db_data:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U morz_infoboard"]
interval: 10s
timeout: 5s
retries: 5
networks:
- internal
mqtt:
image: eclipse-mosquitto:2
restart: unless-stopped
ports:
- "1883:1883"
volumes:
- ./mosquitto/config:/mosquitto/config:ro
- mosquitto_data:/mosquitto/data
- mosquitto_log:/mosquitto/log
networks:
- internal
volumes:
db_data:
mosquitto_data:
mosquitto_log:
networks:
internal:
proxy:
# Gemeinsames Netz mit dem Reverse Proxy (z. B. Traefik/Nginx Proxy Manager).
# Falls der Proxy ein eigenes externes Netz verwaltet, hier name: und external: true setzen.
# Beispiel:
# name: proxy
# external: true

View file

@ -0,0 +1,11 @@
listener 1883
allow_anonymous false
password_file /mosquitto/config/passwd
persistence true
persistence_location /mosquitto/data/
log_dest file /mosquitto/log/mosquitto.log
log_type error
log_type warning
log_type notice