1services:
2 zookeeper:
3 image: confluentinc/cp-zookeeper:7.6.0
4 hostname: zookeeper
5 container_name: zookeeper
6 network_mode: host
7 environment:
8 ZOOKEEPER_CLIENT_PORT: 2181
9 ZOOKEEPER_TICK_TIME: 2000
10 volumes:
11 - zookeeper-data:/var/lib/zookeeper/data
12 - zookeeper-logs:/var/lib/zookeeper/log
13
14 kafka1:
15 image: confluentinc/cp-kafka:7.6.0
16 hostname: kafka1
17 container_name: kafka1
18 network_mode: host
19 depends_on:
20 - zookeeper
21 environment:
22 KAFKA_BROKER_ID: 1
23 KAFKA_ZOOKEEPER_CONNECT: 'localhost:2181'
24 KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT
25 KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://localhost:29092,PLAINTEXT_HOST://localhost:9092
26 KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 3
27 KAFKA_TRANSACTION_STATE_LOG_MIN_ISR: 2
28 KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR: 3
29 KAFKA_GROUP_INITIAL_REBALANCE_DELAY_MS: 0
30 KAFKA_JMX_PORT: 9101
31 KAFKA_JMX_HOSTNAME: localhost
32 KAFKA_AUTO_CREATE_TOPICS_ENABLE: 'true'
33 volumes:
34 - kafka1-data:/var/lib/kafka/data
35
36 kafka2:
37 image: confluentinc/cp-kafka:7.6.0
38 hostname: kafka2
39 container_name: kafka2
40 network_mode: host
41 depends_on:
42 - zookeeper
43 environment:
44 KAFKA_BROKER_ID: 2
45 KAFKA_ZOOKEEPER_CONNECT: 'localhost:2181'
46 KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT
47 KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://localhost:29093,PLAINTEXT_HOST://localhost:9093
48 KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 3
49 KAFKA_TRANSACTION_STATE_LOG_MIN_ISR: 2
50 KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR: 3
51 KAFKA_GROUP_INITIAL_REBALANCE_DELAY_MS: 0
52 KAFKA_JMX_PORT: 9102
53 KAFKA_JMX_HOSTNAME: localhost
54 KAFKA_AUTO_CREATE_TOPICS_ENABLE: 'true'
55 volumes:
56 - kafka2-data:/var/lib/kafka/data
57
58 kafka3:
59 image: confluentinc/cp-kafka:7.6.0
60 hostname: kafka3
61 container_name: kafka3
62 network_mode: host
63 depends_on:
64 - zookeeper
65 environment:
66 KAFKA_BROKER_ID: 3
67 KAFKA_ZOOKEEPER_CONNECT: 'localhost:2181'
68 KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT
69 KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://localhost:29094,PLAINTEXT_HOST://localhost:9094
70 KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 3
71 KAFKA_TRANSACTION_STATE_LOG_MIN_ISR: 2
72 KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR: 3
73 KAFKA_GROUP_INITIAL_REBALANCE_DELAY_MS: 0
74 KAFKA_JMX_PORT: 9103
75 KAFKA_JMX_HOSTNAME: localhost
76 KAFKA_AUTO_CREATE_TOPICS_ENABLE: 'true'
77 volumes:
78 - kafka3-data:/var/lib/kafka/data
79
80 cassandra:
81 image: cassandra:5.0
82 hostname: cassandra
83 container_name: cassandra
84 network_mode: host
85 environment:
86 CASSANDRA_CLUSTER_NAME: 'MyCluster'
87 CASSANDRA_DC: 'dc1'
88 CASSANDRA_RACK: 'rack1'
89 CASSANDRA_ENDPOINT_SNITCH: 'GossipingPropertyFileSnitch'
90 CASSANDRA_NUM_TOKENS: 256
91 volumes:
92 - cassandra-data:/var/lib/cassandra
93 healthcheck:
94 test: ["CMD-SHELL", "cqlsh -e 'describe cluster'"]
95 interval: 30s
96 timeout: 10s
97 retries: 5
98
99 database:
100 image: ghcr.io/vylet-app/go/database:main-cef5ae4
101 container_name: vylet-database
102 network_mode: host
103 depends_on:
104 cassandra:
105 condition: service_healthy
106 environment:
107 VYLET_DATABASE_LISTEN_ADDR: ":9091"
108 command: ["./database", "--cassandra-addrs", "127.0.0.1", "--cassandra-keyspace", "vylet"]
109 restart: unless-stopped
110
111 api:
112 image: ghcr.io/vylet-app/go/api:main-6956838
113 container_name: vylet-api
114 network_mode: host
115 depends_on:
116 - database
117 environment:
118 VYLET_API_LISTEN_ADDR: ":8085"
119 VYLET_API_DB_HOST: "localhost:9091"
120 VYLET_API_CDN_HOST: "https://img.cdn.staging.vylet.app"
121 restart: unless-stopped
122
123 firehose:
124 image: ghcr.io/vylet-app/go/firehose:main-3eb83ef
125 container_name: vylet-firehose
126 network_mode: host
127 depends_on:
128 - kafka1
129 - kafka2
130 - kafka3
131 environment:
132 VYLET_FIREHOSE_WEBSOCKET_HOST: "wss://bsky.network"
133 VYLET_FIREHOSE_BOOTSTRAP_SERVERS: "localhost:9092,localhost:9093,localhost:9094"
134 VYLET_FIREHOSE_OUTPUT_TOPIC: "firehose-events-prod"
135 VYLET_FIREHOSE_DESIRED_COLLECTIONS: "app.vylet.*"
136 restart: unless-stopped
137
138 indexer:
139 image: ghcr.io/vylet-app/go/indexer:main-3eb83ef
140 container_name: vylet-indexer
141 network_mode: host
142 depends_on:
143 - kafka1
144 - kafka2
145 - kafka3
146 - database
147 environment:
148 VYLET_INDEXER_DATABASE_HOST: "localhost:9091"
149 VYLET_BOOTSTRAP_SERVERS: "localhost:9092,localhost:9093,localhost:9094"
150 VYLET_INDEXER_INPUT_TOPIC: "firehose-events-prod"
151 VYLET_INDEXER_CONSUMER_GROUP: "vylet-indexer-staging"
152 METRICS_LISTEN_ADDRESS: ":6104"
153 restart: unless-stopped
154
155 cdn:
156 image: ghcr.io/vylet-app/go/cdn:main
157 container_name: vylet-cdn
158 network_mode: host
159 depends_on:
160 - kafka1
161 - kafka2
162 - kafka3
163 - database
164 environment:
165 VYLET_CDN_DATABASE_HOST: "localhost:9091"
166 VYLET_BOOTSTRAP_SERVERS: "localhost:9092,localhost:9093,localhost:9094"
167 VYLET_CDN_INPUT_TOPIC: "firehose-events-prod"
168 VYLET_CDN_CONSUMER_GROUP: "vylet-cdn-staging"
169 restart: unless-stopped
170
171 imgproxy:
172 image: darthsim/imgproxy:latest
173 container_name: imgproxy
174 network_mode: host
175 environment:
176 IMGPROXY_BIND: ":9525"
177 IMGPROXY_ONLY_PRESETS: "true"
178 IMGPROXY_BASE_URL: "http://localhost:8085/xrpc/app.vylet.media.getBlob/"
179 IMGPROXY_USE_ETAG: "true"
180 IMGPROXY_PRESETS: "fullsize=resizing_type:fit/width:2000/height:2000/format:jpeg,thumb=resizing_type:fit/width:200/height:200/format:jpeg"
181 IMGPROXY_ALLOW_LOOPBACK_SOURCE_ADDRESSES: "true"
182 restart: unless-stopped
183
184volumes:
185 zookeeper-data:
186 zookeeper-logs:
187 kafka1-data:
188 kafka2-data:
189 kafka3-data:
190 cassandra-data: