Cómo configurar Mastodon usando Docker Compose

Requisitos previos#

  • Docker y Docker Compose instalados
  • Nombre de dominio que apunta a su servidor

1. Crear directorio de proyectos#

mkdir mastodon
cd mastodon

2. Crear un archivo de redacción Docker#

Cree un archivo docker-compose.yml:

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. Crear archivo de entorno#

Cree un archivo .env.production con su configuración:

# Database
DB_HOST=db
DB_PORT=5432
DB_NAME=postgres
DB_USER=postgres
DB_PASS=

# Redis
REDIS_HOST=redis
REDIS_PORT=6379
REDIS_PASSWORD=

# Mastodon
LOCAL_DOMAIN=your-domain.com
SECRET_KEY_BASE=generate-a-secret-key
OTP_SECRET=generate-an-otp-secret

# Web Push
VAPID_PRIVATE_KEY=generate-vapid-private-key
VAPID_PUBLIC_KEY=generate-vapid-public-key

# SMTP (Email)
SMTP_SERVER=smtp.mailgun.org
SMTP_PORT=587
SMTP_LOGIN=your-email-login
SMTP_PASSWORD=your-email-password
SMTP_AUTH_METHOD=plain
SMTP_OPENSSL_VERIFY_MODE=none
SMTP_FROM_ADDRESS=notifications@your-domain.com

# Optional: S3 storage
S3_ENABLED=false
# S3_BUCKET=your-bucket-name
# AWS_ACCESS_KEY_ID=your-access-key
# AWS_SECRET_ACCESS_KEY=your-secret-key
# S3_REGION=us-east-1
# S3_PROTOCOL=https
# S3_HOSTNAME=s3.amazonaws.com

4. Generar secretos#

Ejecute los siguientes comandos para generar los secretos necesarios:

# Generate secret key base
docker run --rm tootsuite/mastodon:latest bundle exec rake secret

# Generate OTP secret
docker run --rm tootsuite/mastodon:latest bundle exec rake secret

# Generate VAPID keys
docker run --rm tootsuite/mastodon:latest bundle exec rake mastodon:webpush:generate_vapid_key

Actualice su archivo .env.production con estos valores generados.

5. Inicie Mastodon#

# Pull images
docker-compose pull

# Start services
docker-compose up -d

# Run database setup
docker-compose run --rm web bundle exec rake db:migrate

# Pre-compile assets
docker-compose run --rm web bundle exec rake assets:precompile

6. Crear usuario administrador#

docker-compose run --rm web bundle exec rake mastodon:setup

Siga las instrucciones interactivas para crear su cuenta de administrador.

7. Configuración de proxy inverso (Nginx)#

Cree un archivo de configuración de Nginx:

map $http_upgrade $connection_upgrade {
  default upgrade;
  '' close;
}

server {
  listen 80;
  listen [::]:80;
  server_name your-domain.com;
  
  # Uncomment for SSL
  # listen 443 ssl http2;
  # listen [::]:443 ssl http2;
  # ssl_certificate /path/to/certificate.crt;
  # ssl_certificate_key /path/to/private.key;
  
  root /home/mastodon/live/public;
  
  location / {
    try_files $uri @proxy;
  }
  
  location ~ ^/(emoji|packs|system/accounts/avatars|system/media_attachments/files) {
    add_header Cache-Control "public, max-age=31536000, immutable";
    try_files $uri @proxy;
  }
  
  location /sw.js {
    add_header Cache-Control "public, max-age=0";
    try_files $uri @proxy;
  }
  
  location @proxy {
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header Proxy "";
    proxy_pass_header Server;
    
    proxy_pass http://127.0.0.1:3000;
    proxy_buffering off;
    proxy_redirect off;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection $connection_upgrade;
    
    proxy_connect_timeout       90;
    proxy_send_timeout          90;
    proxy_read_timeout          90;
    
    add_header Strict-Transport-Security "max-age=31536000";
  }
  
  location /api/v1/streaming {
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header Proxy "";
    
    proxy_pass http://127.0.0.1:4000;
    proxy_buffering off;
    proxy_redirect off;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection $connection_upgrade;
  }
  
  error_page 500 501 502 503 504 /500.html;
}

8. Comandos útiles#

# Check logs
docker-compose logs -f
docker-compose logs -f web
docker-compose logs -f sidekiq

# Stop services
docker-compose down

# Backup database
docker-compose exec db pg_dump -U postgres postgres > backup.sql

# Update Mastodon
docker-compose pull
docker-compose run --rm web bundle exec rake db:migrate
docker-compose run --rm web bundle exec rake assets:precompile
docker-compose restart

Notas importantes#

  1. Reemplazar marcadores de posición: actualice your-domain.com con su dominio real
  2. Configuración de correo electrónico: configure la configuración SMTP adecuada para las notificaciones por correo electrónico
  3. Haga copias de seguridad periódicamente: implemente una estrategia de copias de seguridad para su base de datos
  4. Seguridad: Utilice certificados SSL/TLS y mantenga su sistema actualizado
  5. Recursos: Mastodon puede consumir muchos recursos; asegúrese de que su servidor tenga RAM y CPU adecuadas

Esta configuración proporciona una instancia básica de Mastodon. Es posible que desee personalizarlo aún más según sus necesidades, como agregar almacenamiento de objetos para archivos multimedia o configurar medidas de seguridad adicionales.