Prerequisites#
- Docker and Docker Compose installed
- Domain name pointing to your server
1. Create Project Directory#
mkdir mastodon
cd mastodon2. Create Docker Compose File#
Create a docker-compose.yml file:
version: '3'
services:
db:
restart: always
image: postgres:14-alpine
shm_size: 256mb
networks:
- internal_network
healthcheck:
test: ['CMD', 'pg_isready', '-U', 'postgres']
volumes:
- postgres_data:/var/lib/postgresql/data
environment:
- POSTGRES_HOST_AUTH_METHOD=trust
redis:
restart: always
image: redis:7-alpine
networks:
- internal_network
healthcheck:
test: ['CMD', 'redis-cli', 'ping']
volumes:
- redis_data:/data
web:
restart: always
image: tootsuite/mastodon:latest
networks:
- external_network
- internal_network
healthcheck:
test: ['CMD-SHELL', 'wget -q --spider http://localhost:3000/health || exit 1']
timeout: 10s
depends_on:
- db
- redis
environment:
- DB_HOST=db
- DB_USER=postgres
- DB_NAME=postgres
- DB_PASS=
- REDIS_HOST=redis
- LOCAL_DOMAIN=your-domain.com
- SINGLE_USER_MODE=false
- SMTP_SERVER=smtp.mailgun.org
- SMTP_PORT=587
- SMTP_LOGIN=your-smtp-login
- SMTP_PASSWORD=your-smtp-password
- SMTP_FROM_ADDRESS=notifications@your-domain.com
volumes:
- ./public/system:/mastodon/public/system
ports:
- "3000:3000"
command: bash -c "rm -f /mastodon/tmp/pids/server.pid && bundle exec rails s -p 3000"
streaming:
restart: always
image: tootsuite/mastodon:latest
networks:
- external_network
- internal_network
depends_on:
- db
- redis
environment:
- DB_HOST=db
- DB_USER=postgres
- DB_NAME=postgres
- DB_PASS=
- REDIS_HOST=redis
- LOCAL_DOMAIN=your-domain.com
volumes:
- ./public/system:/mastodon/public/system
ports:
- "4000:4000"
command: node ./streaming
sidekiq:
restart: always
image: tootsuite/mastodon:latest
networks:
- internal_network
depends_on:
- db
- redis
environment:
- DB_HOST=db
- DB_USER=postgres
- DB_NAME=postgres
- DB_PASS=
- REDIS_HOST=redis
- LOCAL_DOMAIN=your-domain.com
volumes:
- ./public/system:/mastodon/public/system
command: bundle exec sidekiq
networks:
external_network:
internal_network:
internal: true
volumes:
postgres_data:
redis_data:3. Create Environment File#
Create a .env.production file with your configuration: