Bonfire
Federated social networking toolkit for communities: customizable digital spaces with ActivityPub federation, flexible boundaries and moderation tools.
Configuration
version: "3.8"
services:
bonfire:
image: bonfirenetworks/bonfire:1.0.5-social-amd64
restart: unless-stopped
depends_on:
db:
condition: service_healthy
search:
condition: service_started
environment:
# Instance
- HOSTNAME=${BONFIRE_HOSTNAME}
- PUBLIC_PORT=${PUBLIC_PORT:-80}
- SERVER_PORT=4000
- APP_NAME=${APP_NAME:-Bonfire}
- LANG=en_US.UTF-8
# Secrets
- SECRET_KEY_BASE=${SECRET_KEY_BASE}
- SIGNING_SALT=${SIGNING_SALT}
- ENCRYPTION_SALT=${ENCRYPTION_SALT}
- RELEASE_COOKIE=${RELEASE_COOKIE}
# Database (migrations run automatically on startup)
- POSTGRES_HOST=db
- POSTGRES_USER=postgres
- POSTGRES_DB=bonfire_db
- POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
# Must stay false for the initial migrations; can be set to true
# after the first deployment to speed up future upgrades
- DB_MIGRATE_INDEXES_CONCURRENTLY=${DB_MIGRATE_INDEXES_CONCURRENTLY:-false}
# Search (Meilisearch)
- SEARCH_ADAPTER=meili
- SEARCH_MEILI_INSTANCE=http://search:7700
- MEILI_MASTER_KEY=${MEILI_MASTER_KEY}
# Email (the first account to sign up becomes admin and needs no
# confirmation email; configure a mail backend for further signups)
- MAIL_BACKEND=${MAIL_BACKEND:-none}
- MAIL_SERVER=${MAIL_SERVER:-}
- MAIL_PORT=${MAIL_PORT:-}
- MAIL_USER=${MAIL_USER:-}
- MAIL_PASSWORD=${MAIL_PASSWORD:-}
- MAIL_DOMAIN=${MAIL_DOMAIN:-}
- MAIL_FROM=${MAIL_FROM:-}
- MAIL_KEY=${MAIL_KEY:-}
# Max upload size in megabytes
- UPLOAD_LIMIT=${UPLOAD_LIMIT:-20}
volumes:
- bonfire-uploads:/opt/app/data/uploads
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:4000"]
interval: 30s
timeout: 10s
retries: 15
start_period: 120s
db:
image: postgis/postgis:17-3.5-alpine
restart: unless-stopped
environment:
- POSTGRES_USER=postgres
- POSTGRES_DB=bonfire_db
- POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
volumes:
- db-data:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U postgres -d bonfire_db"]
interval: 10s
timeout: 5s
retries: 10
search:
image: getmeili/meilisearch:v1.11
restart: unless-stopped
environment:
- MEILI_MASTER_KEY=${MEILI_MASTER_KEY}
- MEILI_ENV=production
- MEILI_NO_ANALYTICS=true
volumes:
- search-data:/meili_data
volumes:
bonfire-uploads:
db-data:
search-data:[variables]
main_domain = "${domain}"
secret_key_base = "${password:64}"
signing_salt = "${password:32}"
encryption_salt = "${password:32}"
release_cookie = "${password:32}"
postgres_password = "${password:32}"
meili_master_key = "${password:32}"
[config]
[[config.domains]]
serviceName = "bonfire"
port = 4000
host = "${main_domain}"
[config.env]
# Domain of your Bonfire instance (must match the domain above)
"BONFIRE_HOSTNAME" = "${main_domain}"
# Port used to build public URLs: keep 80 while the domain is plain HTTP,
# and change to 443 once you enable HTTPS on the domain
# (HTTPS is required for federation with other fediverse instances)
"PUBLIC_PORT" = "80"
# Display name of your instance
"APP_NAME" = "Bonfire"
# Max upload size in megabytes
"UPLOAD_LIMIT" = "20"
# Secrets (auto-generated)
"SECRET_KEY_BASE" = "${secret_key_base}"
"SIGNING_SALT" = "${signing_salt}"
"ENCRYPTION_SALT" = "${encryption_salt}"
"RELEASE_COOKIE" = "${release_cookie}"
"POSTGRES_PASSWORD" = "${postgres_password}"
"MEILI_MASTER_KEY" = "${meili_master_key}"
# Optional: set to true only AFTER the first deployment finished its initial
# database migrations (speeds up index creation during future upgrades)
# "DB_MIGRATE_INDEXES_CONCURRENTLY" = "true"
# --- Email ---
# The first account to sign up becomes the instance admin and does not need
# a confirmation email. Further signups are invite-only by default (the admin
# can create invite links or open up signups in the instance settings), and
# require a working mail backend to confirm their email address.
# Supported backends include smtp, mailgun, brevo, postmark, ses and more:
# https://docs.bonfirenetworks.org/deploy.html
# "MAIL_BACKEND" = "smtp"
# "MAIL_SERVER" = "smtp.example.com"
# "MAIL_PORT" = "587"
# "MAIL_USER" = "[email protected]"
# "MAIL_PASSWORD" = ""
# "MAIL_DOMAIN" = "example.com"
# "MAIL_FROM" = "[email protected]"
# For API-based backends (e.g. mailgun) set the API key instead:
# "MAIL_KEY" = ""Base64
To import this template in Dokploy: create a Compose service → Advanced → Base64 import and paste the content below:
ewogICJjb21wb3NlIjogInZlcnNpb246IFwiMy44XCJcbnNlcnZpY2VzOlxuICBib25maXJlOlxuICAgIGltYWdlOiBib25maXJlbmV0d29ya3MvYm9uZmlyZToxLjAuNS1zb2NpYWwtYW1kNjRcbiAgICByZXN0YXJ0OiB1bmxlc3Mtc3RvcHBlZFxuICAgIGRlcGVuZHNfb246XG4gICAgICBkYjpcbiAgICAgICAgY29uZGl0aW9uOiBzZXJ2aWNlX2hlYWx0aHlcbiAgICAgIHNlYXJjaDpcbiAgICAgICAgY29uZGl0aW9uOiBzZXJ2aWNlX3N0YXJ0ZWRcbiAgICBlbnZpcm9ubWVudDpcbiAgICAgICMgSW5zdGFuY2VcbiAgICAgIC0gSE9TVE5BTUU9JHtCT05GSVJFX0hPU1ROQU1FfVxuICAgICAgLSBQVUJMSUNfUE9SVD0ke1BVQkxJQ19QT1JUOi04MH1cbiAgICAgIC0gU0VSVkVSX1BPUlQ9NDAwMFxuICAgICAgLSBBUFBfTkFNRT0ke0FQUF9OQU1FOi1Cb25maXJlfVxuICAgICAgLSBMQU5HPWVuX1VTLlVURi04XG4gICAgICAjIFNlY3JldHNcbiAgICAgIC0gU0VDUkVUX0tFWV9CQVNFPSR7U0VDUkVUX0tFWV9CQVNFfVxuICAgICAgLSBTSUdOSU5HX1NBTFQ9JHtTSUdOSU5HX1NBTFR9XG4gICAgICAtIEVOQ1JZUFRJT05fU0FMVD0ke0VOQ1JZUFRJT05fU0FMVH1cbiAgICAgIC0gUkVMRUFTRV9DT09LSUU9JHtSRUxFQVNFX0NPT0tJRX1cbiAgICAgICMgRGF0YWJhc2UgKG1pZ3JhdGlvbnMgcnVuIGF1dG9tYXRpY2FsbHkgb24gc3RhcnR1cClcbiAgICAgIC0gUE9TVEdSRVNfSE9TVD1kYlxuICAgICAgLSBQT1NUR1JFU19VU0VSPXBvc3RncmVzXG4gICAgICAtIFBPU1RHUkVTX0RCPWJvbmZpcmVfZGJcbiAgICAgIC0gUE9TVEdSRVNfUEFTU1dPUkQ9JHtQT1NUR1JFU19QQVNTV09SRH1cbiAgICAgICMgTXVzdCBzdGF5IGZhbHNlIGZvciB0aGUgaW5pdGlhbCBtaWdyYXRpb25zOyBjYW4gYmUgc2V0IHRvIHRydWVcbiAgICAgICMgYWZ0ZXIgdGhlIGZpcnN0IGRlcGxveW1lbnQgdG8gc3BlZWQgdXAgZnV0dXJlIHVwZ3JhZGVzXG4gICAgICAtIERCX01JR1JBVEVfSU5ERVhFU19DT05DVVJSRU5UTFk9JHtEQl9NSUdSQVRFX0lOREVYRVNfQ09OQ1VSUkVOVExZOi1mYWxzZX1cbiAgICAgICMgU2VhcmNoIChNZWlsaXNlYXJjaClcbiAgICAgIC0gU0VBUkNIX0FEQVBURVI9bWVpbGlcbiAgICAgIC0gU0VBUkNIX01FSUxJX0lOU1RBTkNFPWh0dHA6Ly9zZWFyY2g6NzcwMFxuICAgICAgLSBNRUlMSV9NQVNURVJfS0VZPSR7TUVJTElfTUFTVEVSX0tFWX1cbiAgICAgICMgRW1haWwgKHRoZSBmaXJzdCBhY2NvdW50IHRvIHNpZ24gdXAgYmVjb21lcyBhZG1pbiBhbmQgbmVlZHMgbm9cbiAgICAgICMgY29uZmlybWF0aW9uIGVtYWlsOyBjb25maWd1cmUgYSBtYWlsIGJhY2tlbmQgZm9yIGZ1cnRoZXIgc2lnbnVwcylcbiAgICAgIC0gTUFJTF9CQUNLRU5EPSR7TUFJTF9CQUNLRU5EOi1ub25lfVxuICAgICAgLSBNQUlMX1NFUlZFUj0ke01BSUxfU0VSVkVSOi19XG4gICAgICAtIE1BSUxfUE9SVD0ke01BSUxfUE9SVDotfVxuICAgICAgLSBNQUlMX1VTRVI9JHtNQUlMX1VTRVI6LX1cbiAgICAgIC0gTUFJTF9QQVNTV09SRD0ke01BSUxfUEFTU1dPUkQ6LX1cbiAgICAgIC0gTUFJTF9ET01BSU49JHtNQUlMX0RPTUFJTjotfVxuICAgICAgLSBNQUlMX0ZST009JHtNQUlMX0ZST006LX1cbiAgICAgIC0gTUFJTF9LRVk9JHtNQUlMX0tFWTotfVxuICAgICAgIyBNYXggdXBsb2FkIHNpemUgaW4gbWVnYWJ5dGVzXG4gICAgICAtIFVQTE9BRF9MSU1JVD0ke1VQTE9BRF9MSU1JVDotMjB9XG4gICAgdm9sdW1lczpcbiAgICAgIC0gYm9uZmlyZS11cGxvYWRzOi9vcHQvYXBwL2RhdGEvdXBsb2Fkc1xuICAgIGhlYWx0aGNoZWNrOlxuICAgICAgdGVzdDogW1wiQ01EXCIsIFwiY3VybFwiLCBcIi1mXCIsIFwiaHR0cDovL2xvY2FsaG9zdDo0MDAwXCJdXG4gICAgICBpbnRlcnZhbDogMzBzXG4gICAgICB0aW1lb3V0OiAxMHNcbiAgICAgIHJldHJpZXM6IDE1XG4gICAgICBzdGFydF9wZXJpb2Q6IDEyMHNcblxuICBkYjpcbiAgICBpbWFnZTogcG9zdGdpcy9wb3N0Z2lzOjE3LTMuNS1hbHBpbmVcbiAgICByZXN0YXJ0OiB1bmxlc3Mtc3RvcHBlZFxuICAgIGVudmlyb25tZW50OlxuICAgICAgLSBQT1NUR1JFU19VU0VSPXBvc3RncmVzXG4gICAgICAtIFBPU1RHUkVTX0RCPWJvbmZpcmVfZGJcbiAgICAgIC0gUE9TVEdSRVNfUEFTU1dPUkQ9JHtQT1NUR1JFU19QQVNTV09SRH1cbiAgICB2b2x1bWVzOlxuICAgICAgLSBkYi1kYXRhOi92YXIvbGliL3Bvc3RncmVzcWwvZGF0YVxuICAgIGhlYWx0aGNoZWNrOlxuICAgICAgdGVzdDogW1wiQ01ELVNIRUxMXCIsIFwicGdfaXNyZWFkeSAtVSBwb3N0Z3JlcyAtZCBib25maXJlX2RiXCJdXG4gICAgICBpbnRlcnZhbDogMTBzXG4gICAgICB0aW1lb3V0OiA1c1xuICAgICAgcmV0cmllczogMTBcblxuICBzZWFyY2g6XG4gICAgaW1hZ2U6IGdldG1laWxpL21laWxpc2VhcmNoOnYxLjExXG4gICAgcmVzdGFydDogdW5sZXNzLXN0b3BwZWRcbiAgICBlbnZpcm9ubWVudDpcbiAgICAgIC0gTUVJTElfTUFTVEVSX0tFWT0ke01FSUxJX01BU1RFUl9LRVl9XG4gICAgICAtIE1FSUxJX0VOVj1wcm9kdWN0aW9uXG4gICAgICAtIE1FSUxJX05PX0FOQUxZVElDUz10cnVlXG4gICAgdm9sdW1lczpcbiAgICAgIC0gc2VhcmNoLWRhdGE6L21laWxpX2RhdGFcblxudm9sdW1lczpcbiAgYm9uZmlyZS11cGxvYWRzOlxuICBkYi1kYXRhOlxuICBzZWFyY2gtZGF0YTpcbiIsCiAgImNvbmZpZyI6ICJbdmFyaWFibGVzXVxubWFpbl9kb21haW4gPSBcIiR7ZG9tYWlufVwiXG5zZWNyZXRfa2V5X2Jhc2UgPSBcIiR7cGFzc3dvcmQ6NjR9XCJcbnNpZ25pbmdfc2FsdCA9IFwiJHtwYXNzd29yZDozMn1cIlxuZW5jcnlwdGlvbl9zYWx0ID0gXCIke3Bhc3N3b3JkOjMyfVwiXG5yZWxlYXNlX2Nvb2tpZSA9IFwiJHtwYXNzd29yZDozMn1cIlxucG9zdGdyZXNfcGFzc3dvcmQgPSBcIiR7cGFzc3dvcmQ6MzJ9XCJcbm1laWxpX21hc3Rlcl9rZXkgPSBcIiR7cGFzc3dvcmQ6MzJ9XCJcblxuW2NvbmZpZ11cbltbY29uZmlnLmRvbWFpbnNdXVxuc2VydmljZU5hbWUgPSBcImJvbmZpcmVcIlxucG9ydCA9IDQwMDBcbmhvc3QgPSBcIiR7bWFpbl9kb21haW59XCJcblxuW2NvbmZpZy5lbnZdXG4jIERvbWFpbiBvZiB5b3VyIEJvbmZpcmUgaW5zdGFuY2UgKG11c3QgbWF0Y2ggdGhlIGRvbWFpbiBhYm92ZSlcblwiQk9ORklSRV9IT1NUTkFNRVwiID0gXCIke21haW5fZG9tYWlufVwiXG4jIFBvcnQgdXNlZCB0byBidWlsZCBwdWJsaWMgVVJMczoga2VlcCA4MCB3aGlsZSB0aGUgZG9tYWluIGlzIHBsYWluIEhUVFAsXG4jIGFuZCBjaGFuZ2UgdG8gNDQzIG9uY2UgeW91IGVuYWJsZSBIVFRQUyBvbiB0aGUgZG9tYWluXG4jIChIVFRQUyBpcyByZXF1aXJlZCBmb3IgZmVkZXJhdGlvbiB3aXRoIG90aGVyIGZlZGl2ZXJzZSBpbnN0YW5jZXMpXG5cIlBVQkxJQ19QT1JUXCIgPSBcIjgwXCJcbiMgRGlzcGxheSBuYW1lIG9mIHlvdXIgaW5zdGFuY2VcblwiQVBQX05BTUVcIiA9IFwiQm9uZmlyZVwiXG4jIE1heCB1cGxvYWQgc2l6ZSBpbiBtZWdhYnl0ZXNcblwiVVBMT0FEX0xJTUlUXCIgPSBcIjIwXCJcblxuIyBTZWNyZXRzIChhdXRvLWdlbmVyYXRlZClcblwiU0VDUkVUX0tFWV9CQVNFXCIgPSBcIiR7c2VjcmV0X2tleV9iYXNlfVwiXG5cIlNJR05JTkdfU0FMVFwiID0gXCIke3NpZ25pbmdfc2FsdH1cIlxuXCJFTkNSWVBUSU9OX1NBTFRcIiA9IFwiJHtlbmNyeXB0aW9uX3NhbHR9XCJcblwiUkVMRUFTRV9DT09LSUVcIiA9IFwiJHtyZWxlYXNlX2Nvb2tpZX1cIlxuXCJQT1NUR1JFU19QQVNTV09SRFwiID0gXCIke3Bvc3RncmVzX3Bhc3N3b3JkfVwiXG5cIk1FSUxJX01BU1RFUl9LRVlcIiA9IFwiJHttZWlsaV9tYXN0ZXJfa2V5fVwiXG5cbiMgT3B0aW9uYWw6IHNldCB0byB0cnVlIG9ubHkgQUZURVIgdGhlIGZpcnN0IGRlcGxveW1lbnQgZmluaXNoZWQgaXRzIGluaXRpYWxcbiMgZGF0YWJhc2UgbWlncmF0aW9ucyAoc3BlZWRzIHVwIGluZGV4IGNyZWF0aW9uIGR1cmluZyBmdXR1cmUgdXBncmFkZXMpXG4jIFwiREJfTUlHUkFURV9JTkRFWEVTX0NPTkNVUlJFTlRMWVwiID0gXCJ0cnVlXCJcblxuIyAtLS0gRW1haWwgLS0tXG4jIFRoZSBmaXJzdCBhY2NvdW50IHRvIHNpZ24gdXAgYmVjb21lcyB0aGUgaW5zdGFuY2UgYWRtaW4gYW5kIGRvZXMgbm90IG5lZWRcbiMgYSBjb25maXJtYXRpb24gZW1haWwuIEZ1cnRoZXIgc2lnbnVwcyBhcmUgaW52aXRlLW9ubHkgYnkgZGVmYXVsdCAodGhlIGFkbWluXG4jIGNhbiBjcmVhdGUgaW52aXRlIGxpbmtzIG9yIG9wZW4gdXAgc2lnbnVwcyBpbiB0aGUgaW5zdGFuY2Ugc2V0dGluZ3MpLCBhbmRcbiMgcmVxdWlyZSBhIHdvcmtpbmcgbWFpbCBiYWNrZW5kIHRvIGNvbmZpcm0gdGhlaXIgZW1haWwgYWRkcmVzcy5cbiMgU3VwcG9ydGVkIGJhY2tlbmRzIGluY2x1ZGUgc210cCwgbWFpbGd1biwgYnJldm8sIHBvc3RtYXJrLCBzZXMgYW5kIG1vcmU6XG4jIGh0dHBzOi8vZG9jcy5ib25maXJlbmV0d29ya3Mub3JnL2RlcGxveS5odG1sXG4jIFwiTUFJTF9CQUNLRU5EXCIgPSBcInNtdHBcIlxuIyBcIk1BSUxfU0VSVkVSXCIgPSBcInNtdHAuZXhhbXBsZS5jb21cIlxuIyBcIk1BSUxfUE9SVFwiID0gXCI1ODdcIlxuIyBcIk1BSUxfVVNFUlwiID0gXCJwb3N0bWFzdGVyQGV4YW1wbGUuY29tXCJcbiMgXCJNQUlMX1BBU1NXT1JEXCIgPSBcIlwiXG4jIFwiTUFJTF9ET01BSU5cIiA9IFwiZXhhbXBsZS5jb21cIlxuIyBcIk1BSUxfRlJPTVwiID0gXCJib25maXJlQGV4YW1wbGUuY29tXCJcbiMgRm9yIEFQSS1iYXNlZCBiYWNrZW5kcyAoZS5nLiBtYWlsZ3VuKSBzZXQgdGhlIEFQSSBrZXkgaW5zdGVhZDpcbiMgXCJNQUlMX0tFWVwiID0gXCJcIlxuIgp9Links
Tags
social, fediverse, activitypub
Version: 1.0.5