version: "3.8" services: attic: image: ghcr.io/lmmendes/attic:latest # Start the entrypoint as root so it can apply optional PUID/PGID ownership; # the entrypoint drops privileges before starting attic. user: "0:0" ports: - "8080:8080" environment: - ATTIC_PORT=8080 - ATTIC_DATABASE_URL=postgres://${POSTGRES_USER}:${POSTGRES_PASSWORD}@postgres:5432/${POSTGRES_DB}?sslmode=disable - ATTIC_S3_ENDPOINT=${ATTIC_S3_ENDPOINT} - ATTIC_S3_BUCKET=${ATTIC_S3_BUCKET} - ATTIC_S3_REGION=${ATTIC_S3_REGION} - ATTIC_S3_ACCESS_KEY=${ATTIC_S3_ACCESS_KEY} - ATTIC_S3_SECRET_KEY=${ATTIC_S3_SECRET_KEY} - ATTIC_LOCAL_STORAGE_PATH=${ATTIC_LOCAL_STORAGE_PATH:-/data/uploads} - ATTIC_PUID=${ATTIC_PUID:-} - ATTIC_PGID=${ATTIC_PGID:-} - ATTIC_OIDC_ENABLED=${ATTIC_OIDC_ENABLED:-false} - ATTIC_OIDC_AUTO_REDIRECT=${ATTIC_OIDC_AUTO_REDIRECT:-false} - ATTIC_OIDC_ISSUER_URL=${ATTIC_OIDC_ISSUER_URL} - ATTIC_OIDC_CLIENT_ID=${ATTIC_OIDC_CLIENT_ID} - ATTIC_OIDC_CLIENT_SECRET=${ATTIC_OIDC_CLIENT_SECRET:-} - ATTIC_AUTH_DISABLED=${ATTIC_AUTH_DISABLED:-false} - ATTIC_AUTH_DISABLED_USER_EMAIL=${ATTIC_AUTH_DISABLED_USER_EMAIL:-admin} - ATTIC_BASE_URL=${ATTIC_BASE_URL:-http://localhost:8080} - ATTIC_SESSION_SECRET=${ATTIC_SESSION_SECRET} - ATTIC_CORS_ORIGINS=${ATTIC_CORS_ORIGINS:-http://localhost:8080} - ATTIC_GOOGLE_BOOKS_API_KEY=${ATTIC_GOOGLE_BOOKS_API_KEY:-} - ATTIC_TMDB_API_KEY=${ATTIC_TMDB_API_KEY:-} - ATTIC_REBRICKABLE_API_KEY=${ATTIC_REBRICKABLE_API_KEY:-} - ATTIC_BGG_API_KEY=${ATTIC_BGG_API_KEY:-} - ATTIC_IGDB_CLIENT_ID=${ATTIC_IGDB_CLIENT_ID:-} - ATTIC_IGDB_CLIENT_SECRET=${ATTIC_IGDB_CLIENT_SECRET:-} volumes: - attic_uploads:/data/uploads depends_on: postgres: condition: service_healthy restart: unless-stopped networks: - attic-network postgres: image: postgres:16-alpine environment: POSTGRES_USER: ${POSTGRES_USER:-attic} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} POSTGRES_DB: ${POSTGRES_DB:-attic} volumes: - postgres_data:/var/lib/postgresql/data healthcheck: test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER:-attic}"] interval: 5s timeout: 5s retries: 5 restart: unless-stopped networks: - attic-network keycloak: image: quay.io/keycloak/keycloak:26.0 command: start --optimized environment: KC_DB: postgres KC_DB_URL: jdbc:postgresql://postgres:5432/${KEYCLOAK_DB:-keycloak} KC_DB_USERNAME: ${POSTGRES_USER:-attic} KC_DB_PASSWORD: ${POSTGRES_PASSWORD} KC_HOSTNAME: ${KEYCLOAK_HOSTNAME} KC_HOSTNAME_STRICT: "false" KC_HTTP_ENABLED: "true" KEYCLOAK_ADMIN: ${KEYCLOAK_ADMIN:-admin} KEYCLOAK_ADMIN_PASSWORD: ${KEYCLOAK_ADMIN_PASSWORD} ports: - "8180:8080" depends_on: postgres: condition: service_healthy restart: unless-stopped networks: - attic-network volumes: postgres_data: attic_uploads: networks: attic-network: driver: bridge