Zwei Funde beim Lesen von pkg/storage/s3/s3.go und der .env.template des Projekts. BUCKET_DOMAIN fehlte. AWS_ENDPOINT ist nur der Weg, auf dem Lite die Dateien HINLEGT — http://minio:9000, Containername im internen Netz, und das ist richtig so. Die oeffentliche Adresse, die Lite nach dem Upload zurueckgibt, baut es aus BUCKET_DOMAIN. Die Variable steht nicht im README des Projekts, nur in dessen .env.template (BUCKET_DOMAIN=http://localhost:9000/lite-dev, also Endpunkt plus Bucket). Ohne sie waere jeder Upload scheinbar geglueckt und das Bild von aussen nicht abrufbar — ein Fehler, der erst im Handy auffaellt und dort nach einem CDN-Problem aussieht. minio-init faellt weg, und zwar nicht nur als Ballast: Lite legt den Bucket beim Start selbst an und setzt dabei die oeffentliche Leserichtlinie. Es ueberspringt beides, wenn der Bucket schon existiert ("already exists. skipping creation and policy application"). Mein Init-Container kam ihm zuvor und haette damit genau die Richtlinie verhindert, die er ersetzen sollte. Dass es trotzdem funktioniert haette — mc anonymous set download tut dasselbe — macht es nicht besser, sondern nur unauffaelliger. AWS_REGION folgt jetzt deren Vorlage (eu-west-1 statt auto). Fuer MinIO ist sie gleichgueltig, das SDK verlangt aber eine. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
112 lines
4.2 KiB
YAML
112 lines
4.2 KiB
YAML
# Fivemanage Lite — fuer den Betrieb, ueber Portainer aus diesem Repo.
|
|
#
|
|
# Abgeleitet aus den beiden Compose-Dateien im Projekt (fivemanage/lite) und
|
|
# dem README. Deren docker-compose.yml ist fuer die ENTWICKLUNG: sie startet
|
|
# Datenbank, ClickHouse, MinIO und Jaeger, aber nicht die Anwendung, und mit
|
|
# Standardpasswoertern. Die docker-compose.test.yml zeigt dafuer, wie der
|
|
# App-Container verdrahtet wird — und dass MySQL genuegt.
|
|
#
|
|
# Bewusst NICHT dabei:
|
|
#
|
|
# ClickHouse und Jaeger. Beides ist strukturiertes Logging und Tracing. Fuer
|
|
# das Ablegen von Bildern braucht es sie nicht, und ClickHouse ist eine
|
|
# schwere Abhaengigkeit. Nachruesten geht spaeter.
|
|
#
|
|
# Ein Weg nach aussen. Diese Datei allein ist von aussen NICHT erreichbar —
|
|
# das ist Absicht, denn wie der Reverse Proxy die Dienste findet,
|
|
# unterscheidet sich je Aufbau. Waehle eine Ergaenzung:
|
|
#
|
|
# docker-compose.hostports.yml Proxy erreicht die Dienste ueber den Host
|
|
# (http://host.docker.internal:9000)
|
|
# docker-compose.proxynet.yml Proxy haengt im selben Docker-Netz
|
|
# (http://minio:9000) — der sauberere Weg
|
|
#
|
|
# In Portainer beide Pfade angeben, durch Komma getrennt:
|
|
# docker-compose.yml,docker-compose.hostports.yml
|
|
|
|
services:
|
|
db:
|
|
image: postgres:16-alpine
|
|
restart: unless-stopped
|
|
environment:
|
|
POSTGRES_DB: fivemanage_lite
|
|
POSTGRES_USER: lite
|
|
POSTGRES_PASSWORD: ${DB_PASSWORD:?bitte in .env oder als Stack-Variable setzen}
|
|
volumes:
|
|
- pgdata:/var/lib/postgresql/data
|
|
networks: [internal]
|
|
healthcheck:
|
|
# Ohne das startet die App gegen eine Datenbank, die noch nicht
|
|
# antwortet, und beendet sich — beim ersten Hochfahren jedes Mal.
|
|
test: ["CMD-SHELL", "pg_isready -U lite -d fivemanage_lite"]
|
|
interval: 10s
|
|
timeout: 5s
|
|
retries: 12
|
|
|
|
minio:
|
|
image: minio/minio:latest
|
|
restart: unless-stopped
|
|
command: server /data --console-address ":9001"
|
|
environment:
|
|
MINIO_ROOT_USER: lite
|
|
MINIO_ROOT_PASSWORD: ${MINIO_ROOT_PASSWORD:?bitte setzen}
|
|
MINIO_SERVER_URL: ${PUBLIC_URL:?bitte setzen}
|
|
volumes:
|
|
- minio:/data
|
|
networks: [internal]
|
|
healthcheck:
|
|
test: ["CMD", "mc", "ready", "local"]
|
|
interval: 10s
|
|
timeout: 5s
|
|
retries: 12
|
|
|
|
lite:
|
|
# ghcr.io, NICHT Docker Hub: dort steht die Reihe bei 0.1.0-beta.16
|
|
# still, auf ghcr.io laeuft sie weiter. Die Test-Compose des Projekts
|
|
# zeigt `fivemanage/lite:latest` — das ist Docker Hub und damit alt.
|
|
image: ghcr.io/fivemanage/lite:0.1.0-beta.23
|
|
restart: unless-stopped
|
|
depends_on:
|
|
db:
|
|
condition: service_healthy
|
|
minio:
|
|
condition: service_healthy
|
|
environment:
|
|
PORT: "8080"
|
|
ENV: production
|
|
# PostgreSQL, und zwar zwingend: beta.23 geht direkt in den
|
|
# pgdriver — DB_DRIVER wird nicht ausgewertet. Eine MySQL-DSN endet in
|
|
# "pgdriver: invalid scheme: lite", weil der Treiber sie als URI liest.
|
|
#
|
|
# Die docker-compose.test.yml des Projekts zeigt MySQL, benutzt dafuer
|
|
# aber fivemanage/lite:latest von Docker Hub — und die Reihe steht dort
|
|
# bei beta.16 still. Das README hat recht, die Testdatei ist alt.
|
|
DSN: postgres://lite:${DB_PASSWORD:?bitte setzen}@db:5432/fivemanage_lite?sslmode=disable
|
|
ADMIN_PASSWORD: ${ADMIN_PASSWORD:?bitte setzen}
|
|
API_TOKEN_HMAC_SECRET: ${API_TOKEN_HMAC_SECRET:?bitte setzen}
|
|
S3_PROVIDER: minio
|
|
AWS_ENDPOINT: http://minio:9000
|
|
AWS_ACCESS_KEY_ID: lite
|
|
AWS_SECRET_ACCESS_KEY: ${MINIO_ROOT_PASSWORD:?bitte setzen}
|
|
AWS_BUCKET: media
|
|
# Aus der Vorlage des Projekts uebernommen; fuer MinIO ist die Region
|
|
# gleichgueltig, das SDK verlangt aber eine.
|
|
AWS_REGION: eu-west-1
|
|
|
|
# Woraus die OEFFENTLICHE Adresse gebaut wird, die Lite nach dem Upload
|
|
# zurueckgibt. Steht nicht im README, nur in deren .env.template — und
|
|
# ohne sie kaemen Adressen zurueck, die nur innerhalb von Docker gelten.
|
|
#
|
|
# Endpunkt plus Bucket, wie in der Vorlage
|
|
# (BUCKET_DOMAIN=http://localhost:9000/lite-dev).
|
|
BUCKET_DOMAIN: ${PUBLIC_URL:?bitte setzen}/media
|
|
networks: [internal]
|
|
|
|
networks:
|
|
internal:
|
|
driver: bridge
|
|
|
|
volumes:
|
|
pgdata:
|
|
minio:
|