1version: '3.8'
2
3services:
4 init-keys:
5 build:
6 context: .
7 dockerfile: Dockerfile
8 image: ghcr.io/haileyok/cocoon:latest
9 container_name: cocoon-init-keys
10 volumes:
11 - ./keys:/keys
12 - ./data:/data/cocoon
13 - ./init-keys.sh:/init-keys.sh:ro
14 environment:
15 COCOON_DID: ${COCOON_DID}
16 COCOON_HOSTNAME: ${COCOON_HOSTNAME}
17 COCOON_ROTATION_KEY_PATH: /keys/rotation.key
18 COCOON_JWK_PATH: /keys/jwk.key
19 COCOON_CONTACT_EMAIL: ${COCOON_CONTACT_EMAIL}
20 COCOON_RELAYS: ${COCOON_RELAYS:-https://bsky.network}
21 COCOON_ADMIN_PASSWORD: ${COCOON_ADMIN_PASSWORD}
22 entrypoint: ["/bin/sh", "/init-keys.sh"]
23 restart: "no"
24
25 cocoon:
26 build:
27 context: .
28 dockerfile: Dockerfile
29 image: ghcr.io/haileyok/cocoon:latest
30 container_name: cocoon-pds
31 network_mode: host
32 depends_on:
33 init-keys:
34 condition: service_completed_successfully
35 volumes:
36 - ./data:/data/cocoon
37 - ./keys/rotation.key:/keys/rotation.key:ro
38 - ./keys/jwk.key:/keys/jwk.key:ro
39 environment:
40 # Required settings
41 COCOON_DID: ${COCOON_DID}
42 COCOON_HOSTNAME: ${COCOON_HOSTNAME}
43 COCOON_ROTATION_KEY_PATH: /keys/rotation.key
44 COCOON_JWK_PATH: /keys/jwk.key
45 COCOON_CONTACT_EMAIL: ${COCOON_CONTACT_EMAIL}
46 COCOON_RELAYS: ${COCOON_RELAYS:-https://bsky.network}
47 COCOON_ADMIN_PASSWORD: ${COCOON_ADMIN_PASSWORD}
48 COCOON_SESSION_SECRET: ${COCOON_SESSION_SECRET}
49
50 # Server configuration
51 COCOON_ADDR: ":8080"
52 COCOON_DB_NAME: /data/cocoon/cocoon.db
53 COCOON_BLOCKSTORE_VARIANT: ${COCOON_BLOCKSTORE_VARIANT:-sqlite}
54
55 # Optional: SMTP settings for email
56 COCOON_SMTP_USER: ${COCOON_SMTP_USER:-}
57 COCOON_SMTP_PASS: ${COCOON_SMTP_PASS:-}
58 COCOON_SMTP_HOST: ${COCOON_SMTP_HOST:-}
59 COCOON_SMTP_PORT: ${COCOON_SMTP_PORT:-}
60 COCOON_SMTP_EMAIL: ${COCOON_SMTP_EMAIL:-}
61 COCOON_SMTP_NAME: ${COCOON_SMTP_NAME:-}
62
63 # Optional: S3 configuration
64 COCOON_S3_BACKUPS_ENABLED: ${COCOON_S3_BACKUPS_ENABLED:-false}
65 COCOON_S3_BLOBSTORE_ENABLED: ${COCOON_S3_BLOBSTORE_ENABLED:-false}
66 COCOON_S3_REGION: ${COCOON_S3_REGION:-}
67 COCOON_S3_BUCKET: ${COCOON_S3_BUCKET:-}
68 COCOON_S3_ENDPOINT: ${COCOON_S3_ENDPOINT:-}
69 COCOON_S3_ACCESS_KEY: ${COCOON_S3_ACCESS_KEY:-}
70 COCOON_S3_SECRET_KEY: ${COCOON_S3_SECRET_KEY:-}
71
72 # Optional: Fallback proxy
73 COCOON_FALLBACK_PROXY: ${COCOON_FALLBACK_PROXY:-}
74 restart: unless-stopped
75 healthcheck:
76 test: ["CMD", "curl", "-f", "http://localhost:8080/xrpc/_health"]
77 interval: 30s
78 timeout: 10s
79 retries: 3
80 start_period: 40s
81
82 create-invite:
83 build:
84 context: .
85 dockerfile: Dockerfile
86 image: ghcr.io/haileyok/cocoon:latest
87 container_name: cocoon-create-invite
88 network_mode: host
89 volumes:
90 - ./keys:/keys
91 - ./create-initial-invite.sh:/create-initial-invite.sh:ro
92 environment:
93 COCOON_DID: ${COCOON_DID}
94 COCOON_HOSTNAME: ${COCOON_HOSTNAME}
95 COCOON_ROTATION_KEY_PATH: /keys/rotation.key
96 COCOON_JWK_PATH: /keys/jwk.key
97 COCOON_CONTACT_EMAIL: ${COCOON_CONTACT_EMAIL}
98 COCOON_RELAYS: ${COCOON_RELAYS:-https://bsky.network}
99 COCOON_ADMIN_PASSWORD: ${COCOON_ADMIN_PASSWORD}
100 COCOON_DB_NAME: /data/cocoon/cocoon.db
101 depends_on:
102 - init-keys
103 entrypoint: ["/bin/sh", "/create-initial-invite.sh"]
104 restart: "no"
105
106 caddy:
107 image: caddy:2-alpine
108 container_name: cocoon-caddy
109 network_mode: host
110 volumes:
111 - ./Caddyfile:/etc/caddy/Caddyfile:ro
112 - caddy_data:/data
113 - caddy_config:/config
114 restart: unless-stopped
115 environment:
116 COCOON_HOSTNAME: ${COCOON_HOSTNAME}
117 CADDY_ACME_EMAIL: ${COCOON_CONTACT_EMAIL:-}
118
119volumes:
120 data:
121 driver: local
122 caddy_data:
123 driver: local
124 caddy_config:
125 driver: local