forked from
hailey.at/cocoon
An atproto PDS written in Go
1# Docker Compose with PostgreSQL
2#
3# Usage:
4# docker-compose -f docker-compose.postgres.yaml up -d
5#
6# This file extends the base docker-compose.yaml with a PostgreSQL database.
7# Set the following in your .env file:
8# COCOON_DB_TYPE=postgres
9# POSTGRES_PASSWORD=your-secure-password
10
11version: '3.8'
12
13services:
14 postgres:
15 image: postgres:16-alpine
16 container_name: cocoon-postgres
17 environment:
18 POSTGRES_USER: cocoon
19 POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:?POSTGRES_PASSWORD is required}
20 POSTGRES_DB: cocoon
21 PGDATA: /var/lib/postgresql/data
22 volumes:
23 - postgres_data:/var/lib/postgresql/data
24 healthcheck:
25 test: ["CMD-SHELL", "pg_isready -U cocoon -d cocoon"]
26 interval: 10s
27 timeout: 5s
28 retries: 5
29 restart: unless-stopped
30
31 init-keys:
32 build:
33 context: .
34 dockerfile: Dockerfile
35 image: ghcr.io/haileyok/cocoon:latest
36 container_name: cocoon-init-keys
37 volumes:
38 - ./keys:/keys
39 - ./data:/data/cocoon
40 - ./init-keys.sh:/init-keys.sh:ro
41 environment:
42 COCOON_DID: ${COCOON_DID}
43 COCOON_HOSTNAME: ${COCOON_HOSTNAME}
44 COCOON_ROTATION_KEY_PATH: /keys/rotation.key
45 COCOON_JWK_PATH: /keys/jwk.key
46 COCOON_CONTACT_EMAIL: ${COCOON_CONTACT_EMAIL}
47 COCOON_RELAYS: ${COCOON_RELAYS:-https://bsky.network}
48 COCOON_ADMIN_PASSWORD: ${COCOON_ADMIN_PASSWORD}
49 entrypoint: ["/bin/sh", "/init-keys.sh"]
50 restart: "no"
51
52 cocoon:
53 build:
54 context: .
55 dockerfile: Dockerfile
56 image: ghcr.io/haileyok/cocoon:latest
57 container_name: cocoon-pds
58 depends_on:
59 init-keys:
60 condition: service_completed_successfully
61 postgres:
62 condition: service_healthy
63 ports:
64 - "8080:8080"
65 volumes:
66 - ./data:/data/cocoon
67 - ./keys/rotation.key:/keys/rotation.key:ro
68 - ./keys/jwk.key:/keys/jwk.key:ro
69 environment:
70 # Required settings
71 COCOON_DID: ${COCOON_DID}
72 COCOON_HOSTNAME: ${COCOON_HOSTNAME}
73 COCOON_ROTATION_KEY_PATH: /keys/rotation.key
74 COCOON_JWK_PATH: /keys/jwk.key
75 COCOON_CONTACT_EMAIL: ${COCOON_CONTACT_EMAIL}
76 COCOON_RELAYS: ${COCOON_RELAYS:-https://bsky.network}
77 COCOON_ADMIN_PASSWORD: ${COCOON_ADMIN_PASSWORD}
78 COCOON_SESSION_SECRET: ${COCOON_SESSION_SECRET}
79
80 # Database configuration - PostgreSQL
81 COCOON_ADDR: ":8080"
82 COCOON_DB_TYPE: postgres
83 COCOON_DATABASE_URL: postgres://cocoon:${POSTGRES_PASSWORD}@postgres:5432/cocoon?sslmode=disable
84 COCOON_BLOCKSTORE_VARIANT: ${COCOON_BLOCKSTORE_VARIANT:-sqlite}
85
86 # Optional: SMTP settings for email
87 COCOON_SMTP_USER: ${COCOON_SMTP_USER:-}
88 COCOON_SMTP_PASS: ${COCOON_SMTP_PASS:-}
89 COCOON_SMTP_HOST: ${COCOON_SMTP_HOST:-}
90 COCOON_SMTP_PORT: ${COCOON_SMTP_PORT:-}
91 COCOON_SMTP_EMAIL: ${COCOON_SMTP_EMAIL:-}
92 COCOON_SMTP_NAME: ${COCOON_SMTP_NAME:-}
93
94 # Optional: S3 configuration
95 COCOON_S3_BACKUPS_ENABLED: ${COCOON_S3_BACKUPS_ENABLED:-false}
96 COCOON_S3_BLOBSTORE_ENABLED: ${COCOON_S3_BLOBSTORE_ENABLED:-false}
97 COCOON_S3_REGION: ${COCOON_S3_REGION:-}
98 COCOON_S3_BUCKET: ${COCOON_S3_BUCKET:-}
99 COCOON_S3_ENDPOINT: ${COCOON_S3_ENDPOINT:-}
100 COCOON_S3_ACCESS_KEY: ${COCOON_S3_ACCESS_KEY:-}
101 COCOON_S3_SECRET_KEY: ${COCOON_S3_SECRET_KEY:-}
102
103 # Optional: Fallback proxy
104 COCOON_FALLBACK_PROXY: ${COCOON_FALLBACK_PROXY:-}
105 restart: unless-stopped
106 healthcheck:
107 test: ["CMD", "curl", "-f", "http://localhost:8080/xrpc/_health"]
108 interval: 30s
109 timeout: 10s
110 retries: 3
111 start_period: 40s
112
113 create-invite:
114 build:
115 context: .
116 dockerfile: Dockerfile
117 image: ghcr.io/haileyok/cocoon:latest
118 container_name: cocoon-create-invite
119 volumes:
120 - ./keys:/keys
121 - ./create-initial-invite.sh:/create-initial-invite.sh:ro
122 environment:
123 COCOON_DID: ${COCOON_DID}
124 COCOON_HOSTNAME: ${COCOON_HOSTNAME}
125 COCOON_ROTATION_KEY_PATH: /keys/rotation.key
126 COCOON_JWK_PATH: /keys/jwk.key
127 COCOON_CONTACT_EMAIL: ${COCOON_CONTACT_EMAIL}
128 COCOON_RELAYS: ${COCOON_RELAYS:-https://bsky.network}
129 COCOON_ADMIN_PASSWORD: ${COCOON_ADMIN_PASSWORD}
130 COCOON_DB_TYPE: postgres
131 COCOON_DATABASE_URL: postgres://cocoon:${POSTGRES_PASSWORD}@postgres:5432/cocoon?sslmode=disable
132 depends_on:
133 cocoon:
134 condition: service_healthy
135 entrypoint: ["/bin/sh", "/create-initial-invite.sh"]
136 restart: "no"
137
138 caddy:
139 image: caddy:2-alpine
140 container_name: cocoon-caddy
141 ports:
142 - "80:80"
143 - "443:443"
144 volumes:
145 - ./Caddyfile.postgres:/etc/caddy/Caddyfile:ro
146 - caddy_data:/data
147 - caddy_config:/config
148 restart: unless-stopped
149 environment:
150 COCOON_HOSTNAME: ${COCOON_HOSTNAME}
151 CADDY_ACME_EMAIL: ${COCOON_CONTACT_EMAIL:-}
152
153volumes:
154 postgres_data:
155 driver: local
156 caddy_data:
157 driver: local
158 caddy_config:
159 driver: local