services: backend: build: context: . dockerfile: Dockerfile.backend restart: unless-stopped env_file: - .env environment: # Override env_file: SQLite path must point inside the container volume SQLITE_PATH: /app/data/homelab.db volumes: - backend_data:/app/data networks: - homelable # Required for ping-based status checks cap_add: - NET_RAW # MAC addresses: on this bridge network the scanner can never see them — # ARP is layer 2 and every LAN host is one hop away behind the Docker # gateway. To collect MACs (and so keep DHCP devices matched across an IP # change), put the backend on the LAN: comment out the `networks:` key # above and uncomment the line below (Linux hosts only). # network_mode: host healthcheck: test: ["CMD", "curl", "-f", "http://localhost:8000/api/v1/health"] interval: 10s timeout: 5s retries: 6 start_period: 15s mcp: build: context: ./mcp dockerfile: Dockerfile.mcp restart: unless-stopped ports: - "8001:8001" env_file: - .env environment: BACKEND_URL: "http://backend:8000" depends_on: - backend networks: - homelable frontend: build: context: . dockerfile: Dockerfile.frontend args: # Serve Homelable under a subpath, e.g. VITE_BASE_PATH=/homelab/ in .env. # Defaults to the root — see docs/INSTALLATION.md. VITE_BASE_PATH: ${VITE_BASE_PATH:-/} restart: unless-stopped ports: - "3000:80" depends_on: - backend networks: - homelable volumes: backend_data: networks: homelable: driver: bridge