# famapp stack — family app + its Postgres and MinIO (plant/container images). # # Volume -> bind-mount conversions: # db data -> /config/famapp/postgres (SSD; DB) # minio data -> /storage1/labdata/famapp/minio (ZFS; uploaded images) # Only famapp joins edge (fam.ginnoir.com); db + minio stay private. # famapp reaches Authentik (OIDC) and ntfy over their public URLs through Caddy, # so there is no cross-stack container dependency. services: famapp: container_name: famapp image: ghcr.io/ginnoir/famapp:latest pull_policy: always restart: unless-stopped networks: [famapp, edge] env_file: - stack.env environment: NODE_ENV: production MINIO_ENDPOINT: http://famapp-minio:9000 ports: - "3010:3000" depends_on: famapp-db: condition: service_healthy famapp-minio: condition: service_healthy famapp-db: container_name: postgres_famapp image: postgres:16-alpine restart: unless-stopped labels: - "com.centurylabs.watchtower.enable=false" networks: [famapp] env_file: - stack.env volumes: - /config/famapp/postgres:/var/lib/postgresql/data healthcheck: test: ["CMD-SHELL", "pg_isready -U famapp -d famapp"] interval: 10s timeout: 5s retries: 5 famapp-minio: container_name: minio_famapp image: minio/minio:RELEASE.2025-09-07T16-13-09Z command: server /data --console-address ":9003" restart: unless-stopped labels: - "com.centurylabs.watchtower.enable=false" networks: [famapp] env_file: - stack.env volumes: - /storage1/labdata/famapp/minio:/data ports: - "9002:9000" - "9003:9003" healthcheck: test: ["CMD-SHELL", "curl -sf http://localhost:9000/minio/health/live || exit 1"] interval: 30s timeout: 20s retries: 3 start_period: 30s networks: famapp: name: famapp driver: bridge edge: name: edge external: true