services: caddy: image: caddy:2-alpine container_name: caddy restart: unless-stopped ports: - "${CADDY_HTTP_PORT:-80}:80" - "${CADDY_HTTPS_PORT:-443}:443" volumes: - /opt/hub/caddy/Caddyfile:/etc/caddy/Caddyfile - /opt/hub/caddy/data:/data - /opt/hub/caddy/config:/config - /opt/hub/maps/www:/srv/maps:ro - /opt/hub/weather/www:/srv/weather:ro - /opt/hub/garden/www:/srv/garden:ro - /opt/hub/library/www:/srv/library:ro networks: - hub homepage: image: ghcr.io/gethomepage/homepage:latest container_name: homepage restart: unless-stopped environment: - HOMEPAGE_ALLOWED_HOSTS=* volumes: - /opt/hub/homepage/config:/app/config - /var/run/docker.sock:/var/run/docker.sock:ro networks: - hub auth: image: python:3.12-slim container_name: auth restart: unless-stopped working_dir: /app environment: - HUB_PASSWORD=${HUB_PASSWORD:?HUB_PASSWORD not set in .env} - HUB_SECRET=${HUB_SECRET:?HUB_SECRET not set in .env} command: - sh - -c - "pip install --quiet fastapi 'uvicorn[standard]' python-multipart && uvicorn app:app --host 0.0.0.0 --port 8000" volumes: - /opt/hub/auth/data:/app - /opt/hub/auth/data/static:/static networks: - hub kiwix: image: ghcr.io/kiwix/kiwix-serve:latest container_name: kiwix restart: unless-stopped entrypoint: ["sh", "-c"] command: ["kiwix-serve --port=8080 --urlRootLocation=/library /data/*.zim 2>/dev/null || (echo 'No ZIMs yet - upload via /library/' && tail -f /dev/null)"] volumes: - /opt/hub/kiwix/zims:/data networks: - hub pdfs: image: python:3.12-slim container_name: pdfs restart: unless-stopped working_dir: /app command: - sh - -c - "pip install --quiet fastapi 'uvicorn[standard]' python-multipart && uvicorn app:app --host 0.0.0.0 --port 8000" volumes: - /opt/hub/pdfs/data:/app - /opt/hub/pdfs/data/static:/static - /opt/hub/pdfs/files:/files networks: - hub freqs: image: python:3.12-slim container_name: freqs restart: unless-stopped working_dir: /app command: - sh - -c - "pip install --quiet fastapi 'uvicorn[standard]' python-multipart && uvicorn app:app --host 0.0.0.0 --port 8000" volumes: - /opt/hub/freqs/data:/app - /opt/hub/freqs/data:/data - /opt/hub/freqs/data/static:/static networks: - hub inventory: image: python:3.12-slim container_name: inventory restart: unless-stopped working_dir: /app command: - sh - -c - "pip install --quiet fastapi 'uvicorn[standard]' python-multipart && uvicorn app:app --host 0.0.0.0 --port 8000" volumes: - /opt/hub/inventory/data:/app - /opt/hub/inventory/data:/data - /opt/hub/inventory/data/static:/static networks: - hub overlay: image: python:3.12-slim container_name: overlay restart: unless-stopped working_dir: /app command: - sh - -c - "pip install --quiet fastapi 'uvicorn[standard]' && uvicorn app:app --host 0.0.0.0 --port 8000" volumes: - /opt/hub/overlay/data:/app - /opt/hub/overlay/data:/data - /opt/hub/overlay/data/static:/static networks: - hub search: image: python:3.12-slim container_name: search restart: unless-stopped working_dir: /app command: - sh - -c - "pip install --quiet fastapi 'uvicorn[standard]' httpx && uvicorn app:app --host 0.0.0.0 --port 8000" volumes: - /opt/hub/search/data:/app - /opt/hub/search/data/static:/static networks: - hub zim-upload: image: python:3.12-slim container_name: zim-upload restart: unless-stopped working_dir: /app command: - sh - -c - "pip install --quiet fastapi 'uvicorn[standard]' python-multipart && apt-get update -qq && apt-get install -y -qq curl docker.io && uvicorn app:app --host 0.0.0.0 --port 8000" volumes: - /opt/hub/zim-upload/data:/app - /opt/hub/kiwix/zims:/zims - /var/run/docker.sock:/var/run/docker.sock networks: - hub networks: hub: name: hub