services: # ClickHouse - analytics database (internal only, no host ports exposed) clickhouse: image: clickhouse/clickhouse-server:25.11 container_name: weaver-clickhouse # No ports exposed to host - only accessible via docker network ports: - "8123:8123" - "9000:9000" volumes: - ~/data/clickhouse:/var/lib/clickhouse - ~/data/clickhouse-logs:/var/log/clickhouse-server - ~/data/clickhouse-config:/etc/clickhouse-server/config.d environment: CLICKHOUSE_DB: ${CLICKHOUSE_DATABASE:-weaver} CLICKHOUSE_USER: ${CLICKHOUSE_USER:-default} CLICKHOUSE_PASSWORD: ${CLICKHOUSE_PASSWORD} CLICKHOUSE_DEFAULT_ACCESS_MANAGEMENT: 1 ulimits: nofile: soft: 262144 hard: 262144 healthcheck: test: ["CMD", "wget", "--spider", "-q", "http://localhost:8123/ping"] interval: 10s timeout: 5s retries: 3 restart: unless-stopped # Docker registry for local image hosting registry: image: registry:2 container_name: weaver-registry ports: - "5000:5000" volumes: - registry_data:/var/lib/registry restart: unless-stopped # Tap - AT Protocol sync utility tap: container_name: weaver-tap image: ghcr.io/bluesky-social/indigo/tap:latest ports: - "2480:2480" volumes: - tap_data:/data/tap environment: TAP_DATABASE_URL: sqlite:///data/tap/tap.db TAP_BIND: ":2480" TAP_DISABLE_ACKS: "false" TAP_LOG_LEVEL: info TAP_OUTBOX_PARALLELISM: 5 #TAP_FULL_NETWORK: true #TAP_SIGNAL_COLLECTION: place.stream.chat.profile TAP_SIGNAL_COLLECTION: sh.weaver.actor.profile TAP_COLLECTION_FILTERS: "sh.weaver.*,app.bsky.actor.profile,sh.tangled.*,pub.leaflet.*,net.anisota.*,place.stream.*" healthcheck: test: ["CMD", "wget", "-q", "--spider", "http://localhost:2480/health"] interval: 20s timeout: 5s retries: 3 restart: unless-stopped # Weaver indexer - consumes from tap index: container_name: weaver-index image: ${REGISTRY_HOST:-localhost}:5000/weaver-index:latest ports: - "3000:3000" command: ["run"] volumes: - index_data:/app/data environment: RUST_LOG: info,weaver_index=debug,hyper_util::client::legacy::pool=info CLICKHOUSE_URL: http://clickhouse:8123 CLICKHOUSE_DATABASE: ${CLICKHOUSE_DATABASE:-weaver} CLICKHOUSE_USER: ${CLICKHOUSE_USER:-default} CLICKHOUSE_PASSWORD: ${CLICKHOUSE_PASSWORD} INDEXER_SOURCE: tap TAP_URL: ws://tap:2480/channel TAP_SEND_ACKS: "true" FIREHOSE_RELAY_URL: wss://bsky.network INDEXER_COLLECTIONS: "sh.weaver.*,app.bsky.actor.profile,sh.tangled.*,pub.leaflet.*,net.anisota.*,place.stream.*" depends_on: tap: condition: service_healthy clickhouse: condition: service_healthy healthcheck: test: ["CMD", "wget", "-q", "-O", "/dev/null", "http://localhost:3000/xrpc/_health"] interval: 20s timeout: 5s retries: 3 restart: unless-stopped # Weaver app - web frontend weaver-app: container_name: weaver-app image: ${REGISTRY_HOST:-localhost}:5000/weaver-app:latest ports: - "8080:8080" environment: PORT: 8080 IP: 0.0.0.0 RUST_LOG: info healthcheck: test: ["CMD", "wget", "-q", "--spider", "http://localhost:8080/"] interval: 20s timeout: 5s retries: 3 restart: unless-stopped volumes: registry_data: tap_data: index_data: