Prérequis#
- Docker et Docker Compose installés
- Un nom de domaine pointant vers votre serveur
1. Créer le répertoire du projet#
mkdir mastodon
cd mastodon2. Créer le fichier Docker Compose#
Créez un fichier 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. Créer le fichier d’environnement#
Créez un fichier .env.production avec vos paramètres :
# Base de données
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 (Courrier électronique)
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
# Optionnel : stockage S3
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.com4. Générer les secrets#
Exécutez les commandes suivantes pour générer les secrets requis :
# Générer la clé secrète de base
docker run --rm tootsuite/mastodon:latest bundle exec rake secret
# Générer la clé OTP
docker run --rm tootsuite/mastodon:latest bundle exec rake secret
# Générer les clés VAPID
docker run --rm tootsuite/mastodon:latest bundle exec rake mastodon:webpush:generate_vapid_keyMettez à jour votre fichier .env.production avec ces valeurs générées.
5. Démarrer Mastodon#
# Télécharger les images
docker-compose pull
# Démarrer les services
docker-compose up -d
# Exécuter la configuration de la base de données
docker-compose run --rm web bundle exec rake db:migrate
# Compiler les ressources
docker-compose run --rm web bundle exec rake assets:precompile6. Créer un utilisateur administrateur#
docker-compose run --rm web bundle exec rake mastodon:setupSuivez les invites interactives pour créer votre compte administrateur.
7. Configuration du proxy inverse (Nginx)#
Créez un fichier de configuration Nginx :
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
server {
listen 80;
listen [::]:80;
server_name your-domain.com;
# Décommenter pour 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. Commandes utiles#
# Voir les journaux
docker-compose logs -f
docker-compose logs -f web
docker-compose logs -f sidekiq
# Arrêter les services
docker-compose down
# Sauvegardz la base de données
docker-compose exec db pg_dump -U postgres postgres > backup.sql
# Mettre à jour 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 restartNotes importantes#
- Remplacer les espaces réservés : Mettez à jour
your-domain.comavec votre domaine réel - Configuration de l’email : Configurez les paramètres SMTP appropriés pour les notifications par courrier électronique
- Sauvegardez régulièrement : Mettez en place une stratégie de sauvegarde pour votre base de données
- Sécurité : Utilisez des certificats SSL/TLS et maintenez votre système à jour
- Ressources : Mastodon peut être gourmand en ressources ; assurez-vous que votre serveur dispose de RAM et d’UC suffisants
Cette configuration fournit une instance Mastodon basique. Vous pouvez la personnaliser davantage selon vos besoins, par exemple en ajoutant un stockage d’objets pour les fichiers multim médias ou en configurant des mesures de sécurité supplémentaires.