services: garage: image: dxflrs/garage:v2.3.0 container_name: garage restart: unless-stopped networks: [garage] ports: - "3900:3900" # S3 API (LAN-reachable for your other services) - "3902:3902" # S3 web # - "3901:3901" # RPC — only publish once you go multi-node volumes: - /srv/docker/garage/garage.toml:/etc/garage.toml:ro - /srv/docker/garage/meta:/var/lib/garage/meta - /srv/docker/garage/data:/var/lib/garage/data - /srv/docker/garage/snapshots:/var/lib/garage/snapshots healthcheck: test: ["CMD", "/garage", "status"] # image is distroless; use the binary, not curl interval: 30s timeout: 5s retries: 3 start_period: 20s garage-webui: image: khairul169/garage-webui:1.1.0 container_name: garage-webui restart: unless-stopped networks: [garage] depends_on: garage: condition: service_healthy ports: # - "127.0.0.1:3909:3909" # bind localhost only — reverse-proxy in front for TLS/auth - "3909:3909" volumes: - /srv/docker/garage/garage.toml:/etc/garage.toml:ro environment: API_BASE_URL: "http://garage:3903" # override self-pointing default S3_ENDPOINT_URL: "http://garage:3900" networks: garage: driver: bridge