services: atcr-appview: build: context: . dockerfile: Dockerfile.appview image: atcr-appview:latest container_name: atcr-appview ports: - "5000:5000" # Optional: Load from .env.appview file (create from .env.appview.example) # env_file: # - .env.appview environment: # Server configuration ATCR_HTTP_ADDR: :5000 ATCR_DEFAULT_HOLD_DID: did:web:172.28.0.3:8080 # UI configuration ATCR_UI_ENABLED: true ATCR_BACKFILL_ENABLED: true # Test mode - fallback to default hold when user's hold is unreachable TEST_MODE: true # Logging ATCR_LOG_LEVEL: debug volumes: # Auth keys (JWT signing keys) # - atcr-auth:/var/lib/atcr/auth # UI database (includes OAuth sessions, devices, and Jetstream cache) - atcr-ui:/var/lib/atcr restart: unless-stopped dns: - 8.8.8.8 - 1.1.1.1 networks: atcr-network: ipv4_address: 172.28.0.2 # The AppView is stateless - all storage is external: # - Manifests/Tags -> ATProto PDS (via middleware) # - Blobs/Layers -> Hold service (via ProxyBlobStore) # - OAuth tokens -> SQLite database (atcr-ui volume) # - No config.yml needed - all config via environment variables atcr-hold: env_file: - ../atcr-secrets.env # Load S3/Storj credentials from external file environment: HOLD_PUBLIC_URL: http://172.28.0.3:8080 HOLD_OWNER: did:plc:pddp4xt5lgnv2qsegbzzs4xg HOLD_PUBLIC: false # STORAGE_DRIVER: filesystem # STORAGE_ROOT_DIR: /var/lib/atcr/hold TEST_MODE: true # DISABLE_PRESIGNED_URLS: true # Logging ATCR_LOG_LEVEL: debug # Storage config comes from env_file (STORAGE_DRIVER, AWS_*, S3_*) build: context: . dockerfile: Dockerfile.hold image: atcr-hold:latest container_name: atcr-hold ports: - "8080:8080" volumes: # PDS data (carstore SQLite + signing keys) - atcr-hold:/var/lib/atcr-hold restart: unless-stopped dns: - 8.8.8.8 - 1.1.1.1 networks: atcr-network: ipv4_address: 172.28.0.3 networks: atcr-network: driver: bridge ipam: config: - subnet: 172.28.0.0/24 volumes: atcr-hold: atcr-auth: atcr-ui: