atproto blogging
1services:
2 # ClickHouse - analytics database (internal only, no host ports exposed)
3 clickhouse:
4 image: clickhouse/clickhouse-server:25.11
5 container_name: weaver-clickhouse
6 # No ports exposed to host - only accessible via docker network
7 ports:
8 - "8123:8123"
9 - "9000:9000"
10 volumes:
11 - ~/data/clickhouse:/var/lib/clickhouse
12 - ~/data/clickhouse-logs:/var/log/clickhouse-server
13 - ~/data/clickhouse-config:/etc/clickhouse-server/config.d
14 environment:
15 CLICKHOUSE_DB: ${CLICKHOUSE_DATABASE:-weaver}
16 CLICKHOUSE_USER: ${CLICKHOUSE_USER:-default}
17 CLICKHOUSE_PASSWORD: ${CLICKHOUSE_PASSWORD}
18 CLICKHOUSE_DEFAULT_ACCESS_MANAGEMENT: 1
19 ulimits:
20 nofile:
21 soft: 262144
22 hard: 262144
23 healthcheck:
24 test: ["CMD", "wget", "--spider", "-q", "http://localhost:8123/ping"]
25 interval: 10s
26 timeout: 5s
27 retries: 3
28 restart: unless-stopped
29
30 # Docker registry for local image hosting
31 registry:
32 image: registry:2
33 container_name: weaver-registry
34 ports:
35 - "5000:5000"
36 volumes:
37 - registry_data:/var/lib/registry
38 restart: unless-stopped
39
40 # Tap - AT Protocol sync utility
41 tap:
42 container_name: weaver-tap
43 image: ghcr.io/bluesky-social/indigo/tap:latest
44 ports:
45 - "2480:2480"
46 volumes:
47 - tap_data:/data/tap
48 environment:
49 TAP_DATABASE_URL: sqlite:///data/tap/tap.db
50 TAP_BIND: ":2480"
51 TAP_DISABLE_ACKS: "false"
52 TAP_LOG_LEVEL: info
53 TAP_OUTBOX_PARALLELISM: 5
54 #TAP_FULL_NETWORK: true
55 #TAP_SIGNAL_COLLECTION: place.stream.chat.profile
56 TAP_SIGNAL_COLLECTION: sh.weaver.actor.profile
57 TAP_COLLECTION_FILTERS: "sh.weaver.*,app.bsky.actor.profile,sh.tangled.*,pub.leaflet.*,net.anisota.*,place.stream.*"
58 healthcheck:
59 test: ["CMD", "wget", "-q", "--spider", "http://localhost:2480/health"]
60 interval: 20s
61 timeout: 5s
62 retries: 3
63 restart: unless-stopped
64
65 # Weaver indexer - consumes from tap
66 index:
67 container_name: weaver-index
68 image: ${REGISTRY_HOST:-localhost}:5000/weaver-index:latest
69 ports:
70 - "3000:3000"
71 command: ["run"]
72 volumes:
73 - index_data:/app/data
74 environment:
75 RUST_LOG: info,weaver_index=debug,hyper_util::client::legacy::pool=info
76 CLICKHOUSE_URL: http://clickhouse:8123
77 CLICKHOUSE_DATABASE: ${CLICKHOUSE_DATABASE:-weaver}
78 CLICKHOUSE_USER: ${CLICKHOUSE_USER:-default}
79 CLICKHOUSE_PASSWORD: ${CLICKHOUSE_PASSWORD}
80 INDEXER_SOURCE: tap
81 TAP_URL: ws://tap:2480/channel
82 TAP_SEND_ACKS: "true"
83 FIREHOSE_RELAY_URL: wss://bsky.network
84 INDEXER_COLLECTIONS: "sh.weaver.*,app.bsky.actor.profile,sh.tangled.*,pub.leaflet.*,net.anisota.*,place.stream.*"
85 depends_on:
86 tap:
87 condition: service_healthy
88 clickhouse:
89 condition: service_healthy
90 healthcheck:
91 test: ["CMD", "wget", "-q", "-O", "/dev/null", "http://localhost:3000/xrpc/_health"]
92 interval: 20s
93 timeout: 5s
94 retries: 3
95 restart: unless-stopped
96
97 # Weaver app - web frontend
98 weaver-app:
99 container_name: weaver-app
100 image: ${REGISTRY_HOST:-localhost}:5000/weaver-app:latest
101 ports:
102 - "8080:8080"
103 environment:
104 PORT: 8080
105 IP: 0.0.0.0
106 RUST_LOG: info
107 healthcheck:
108 test: ["CMD", "wget", "-q", "--spider", "http://localhost:8080/"]
109 interval: 20s
110 timeout: 5s
111 retries: 3
112 restart: unless-stopped
113
114volumes:
115 registry_data:
116 tap_data:
117 index_data: