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_TYPE: ${COCOON_DB_TYPE:-sqlite}
53 COCOON_DB_NAME: ${COCOON_DB_NAME:-/data/cocoon/cocoon.db}
54 COCOON_DATABASE_URL: ${COCOON_DATABASE_URL:-}
55 COCOON_BLOCKSTORE_VARIANT: ${COCOON_BLOCKSTORE_VARIANT:-sqlite}
56
57 # Optional: SMTP settings for email
58 COCOON_SMTP_USER: ${COCOON_SMTP_USER:-}
59 COCOON_SMTP_PASS: ${COCOON_SMTP_PASS:-}
60 COCOON_SMTP_HOST: ${COCOON_SMTP_HOST:-}
61 COCOON_SMTP_PORT: ${COCOON_SMTP_PORT:-}
62 COCOON_SMTP_EMAIL: ${COCOON_SMTP_EMAIL:-}
63 COCOON_SMTP_NAME: ${COCOON_SMTP_NAME:-}
64
65 # Optional: S3 configuration
66 COCOON_S3_BACKUPS_ENABLED: ${COCOON_S3_BACKUPS_ENABLED:-false}
67 COCOON_S3_BLOBSTORE_ENABLED: ${COCOON_S3_BLOBSTORE_ENABLED:-false}
68 COCOON_S3_REGION: ${COCOON_S3_REGION:-}
69 COCOON_S3_BUCKET: ${COCOON_S3_BUCKET:-}
70 COCOON_S3_ENDPOINT: ${COCOON_S3_ENDPOINT:-}
71 COCOON_S3_ACCESS_KEY: ${COCOON_S3_ACCESS_KEY:-}
72 COCOON_S3_SECRET_KEY: ${COCOON_S3_SECRET_KEY:-}
73 COCOON_S3_CDN_URL: ${COCOON_S3_CDN_URL:-}
74
75 # Optional: Fallback proxy
76 COCOON_FALLBACK_PROXY: ${COCOON_FALLBACK_PROXY:-}
77 restart: unless-stopped
78 healthcheck:
79 test: ["CMD", "curl", "-f", "http://localhost:8080/xrpc/_health"]
80 interval: 30s
81 timeout: 10s
82 retries: 3
83 start_period: 40s
84
85 create-invite:
86 build:
87 context: .
88 dockerfile: Dockerfile
89 image: ghcr.io/haileyok/cocoon:latest
90 container_name: cocoon-create-invite
91 network_mode: host
92 volumes:
93 - ./keys:/keys
94 - ./create-initial-invite.sh:/create-initial-invite.sh:ro
95 environment:
96 COCOON_DID: ${COCOON_DID}
97 COCOON_HOSTNAME: ${COCOON_HOSTNAME}
98 COCOON_ROTATION_KEY_PATH: /keys/rotation.key
99 COCOON_JWK_PATH: /keys/jwk.key
100 COCOON_CONTACT_EMAIL: ${COCOON_CONTACT_EMAIL}
101 COCOON_RELAYS: ${COCOON_RELAYS:-https://bsky.network}
102 COCOON_ADMIN_PASSWORD: ${COCOON_ADMIN_PASSWORD}
103 COCOON_DB_TYPE: ${COCOON_DB_TYPE:-sqlite}
104 COCOON_DB_NAME: ${COCOON_DB_NAME:-/data/cocoon/cocoon.db}
105 COCOON_DATABASE_URL: ${COCOON_DATABASE_URL:-}
106 depends_on:
107 - init-keys
108 entrypoint: ["/bin/sh", "/create-initial-invite.sh"]
109 restart: "no"
110
111 caddy:
112 image: caddy:2-alpine
113 container_name: cocoon-caddy
114 network_mode: host
115 volumes:
116 - ./Caddyfile:/etc/caddy/Caddyfile:ro
117 - caddy_data:/data
118 - caddy_config:/config
119 restart: unless-stopped
120 environment:
121 COCOON_HOSTNAME: ${COCOON_HOSTNAME}
122 CADDY_ACME_EMAIL: ${COCOON_CONTACT_EMAIL:-}
123
124volumes:
125 data:
126 driver: local
127 caddy_data:
128 driver: local
129 caddy_config:
130 driver: local