Installation de PeerTube avec Docker : Alternative éthique à YouTube pour associations et collectifs
Table des matières
- Introduction
à PeerTube - Prérequis
matériels Installation initiale avec DockerArchitectureComprendre le transcodage vidéoPréparationConfiguration optimale du transcodageInstallationOrganisation du stockageTraefikSystèmeConfigurationde backup automatiquePeerTubeCommandes utilesSécuritéSurveillanceRéseau
1. Introduction à PeerTube
Qu'Qu’est-ce que PeerTube ?
PeerTube est une plateforme vidéo gratuiteopen source, décentralisée et open source, alternative à YouTube. Elle utilise le protocole WebRTC (Web Real-Time Communication) pour permettre le partage de vidéos en peer-to-peer directement dans le navigateur, sans plugin ni application externe.peer.
Avantages principaux :
- Pas de publicité
- Hébergement autonome
- Partage de bande passante
entre spectateurs (P2P)P2P - Contrôle total
de vosdes données
À qui s's’adresse ce guide ?
Ce tutoriel estpermet conçude pour mettre en placedéployer une instance de test de PeerTube sur un serveur domestique. Il convient parfaitement pour :
Prérequis matériels
Configuration minimale recommandée
Configuration de ce tutoriel
Pour ce guide, nous utiliserons un serveur avec :
- Nom de domaine personnalisé
2. Prérequis
Matériel recommandé
Logiciels requis
Stockage principal: NVMe 454 GB
Installation initiale avec
DockerÉtape 1 : Préparer les fichiers
Suivez la documentation officielle pour télécharger les fichiers de base.
Étape 2 : Modifications pour un environnement de test local
Fichier docker-compose.yml
Pour une installation locale (sans nom de domaine), commentez les services non nécessaires :
# Commentez ces lignes pour une installation locale :
# webserver: # Nginx (pas besoin en local)
# certbot: # SSL (pas besoin en local)
# volumes:
# - ./docker-volume/assets # Pas nécessaire
# Décommentez cette ligne pour accéder à PeerTube :
ports:
- "9000:9000" # Accès direct à PeerTube
Fichier .env
Configurez les variables pour l'accès local :
# Accès local
PEERTUBE_WEBSERVER_HOSTNAME=localhost
PEERTUBE_WEBSERVER_PORT=9000
PEERTUBE_WEBSERVER_HTTPS=false
# Base de données
POSTGRES_USER=peertube
POSTGRES_PASSWORD=peertube_password
# Administration
PEERTUBE_ADMIN_EMAIL=admin@localhost
⚠️ Important : Générer un secret sécurisé
Ne laissez jamais le secret par défaut. Générez-en un nouveau :
openssl rand -hex 32
Copiez le résultat et remplacezDocker la valeur de PEERTUBE_SECRET dans le fichier .env.
Étape 3 : Démarrer PeerTube
cd /chemin/vers/votre/dossier
docker compose up -d
Accédez à votre instance sur : http://localhost:9000
Comprendre le transcodage vidéo
Qu'est-ce que le transcodage ?
Le transcodage est le processus qui transforme votre vidéo originale en plusieurs versions optimisées :
Vidéo originale (fichier.mkv, 4 GB)
↓
TRANSCODAGE
↓
├── Version 1080p (500 MB)
├── Version 720p (300 MB)
├── Version 480p (150 MB)
└── Version 360p (80 MB)
Pourquoi c'est essentiel ?
1. Compatibilité universelle
2.
Adaptation à la connexion Internet
3. SansArchitecture
Schéma
Les contraintes du transcodage
Ressources nécessaires :fonctionnement
Exemple concret :
Configuration optimale du transcodage
Choix du format de streaming : HLS
Nous recommandons HLS (HTTP Live Streaming) plutôt que Web Videos :
Avantages du HLS :
Configuration dans docker-volume/config/local-production.json :
"web_videos": {
"enabled": false
},
"hls": {
"enabled": true,
"split_audio_and_video": false
}
Choix des résolutions
Pour un serveur de test avec audience limitée :
Configuration :
"resolutions": {
"240p": false,
"360p": false,
"480p": true,
"720p": true,
"1080p": true,
"1440p": false,
"2160p": false
}
Optimisation des performances CPU
Pour un processeur 8 threads (comme un Ryzen 5) :
"transcoding": {
"enabled": true,
"threads": 3,
"concurrency": 2,
"profile": "default",
"allow_audio_files": true,
"always_transcode_original_resolution": false
}
Explication des paramètres :
threads: 3
3concurrency: 2
threads: 3concurrency: 2Calcul simple :
CPU total : 8 threads
Transcodage : 6 threads (3 × 2)
Système : 2 threads libres
Options de stockage
"keep_original_file": false
⚠️ Attention : Mettre false supprime le fichier original après transcodage. C'est acceptable pour un serveur de test, mais conservez l'original en production (true).
Modifier la configuration
Méthode 1 : Interface web (recommandé)
http://localhost:9000Méthode 2 : Ligne de commande
cd /chemin/vers/votre/dossier
nano docker-volume/config/local-production.json
# Cherchez la section "transcoding" (ligne ~119)
# Modifiez les valeurs
# Redémarrez PeerTube
docker compose restart peertube
Organisation du stockage
Architecture recommandée
Stockage NVMe (rapide) - 454 GB
└── /home/user/Serveur/
├── docker-compose.yml
├── .env
└── docker-volume/
├── config/ # Configuration PeerTube
├── data/ # Vidéos et médias
├── db/ # Base PostgreSQL
└── redis/ # Cache Redis
Stockage HDD (lent mais grand) - 916 GB
└── /mnt/backup-disk/
└── peertube_backup/ # Sauvegardes automatiques
Pourquoi cette organisation ?
NVMe / SSD rapide :
HDD lent :
Configuration du disque de backup
Étape 1 : Identifier votre disque
lsblk
Vous verrez quelque chose comme :
NAME SIZE TYPE
sda 931.5G disk
└─sda1 931.5G part ← C'est notre HDD de backup
nvme0n1 454.5G disk
└─nvme0n1p2 454G part ← C'est notre disque système
Étape 2 : Obtenir l'UUID du disque
L'UUID est un identifiant unique qui ne change jamais (contrairement à /dev/sda1 qui peut changer).
sudo blkid /dev/sda1
Résultat :
/dev/sda1: UUID="abcd1234-5678-90ef-ghij-klmnopqrstuv" TYPE="ext4"
Notez l'UUID (vous en aurez besoin).
Étape 3 : Créer le point de montage
sudo mkdir -p /mnt/backup-disk
Étape 4 : Test de montage manuel
sudo mount /dev/sda1 /mnt/backup-disk
df -h | grep backup-disk
Si ça fonctionne, vous verrez votre disque monté.
Étape 5 : Montage automatique au démarrage
Éditez le fichier système /etc/fstab :
sudo nano /etc/fstab
Ajoutez cette ligne à la fin (remplacez l'UUID par le vôtre) :
UUID=abcd1234-5678-90ef-ghij-klmnopqrstuv /mnt/backup-disk ext4 defaults,nofail 0 2
Explication :
defaultsnofail0 2Testez :
sudo umount /mnt/backup-disk # Démonter
sudo mount -a # Remonter tout
df -h | grep backup-disk # Vérifier
Système de backup automatique {#backup}
Principe du backup
┌───────────────────────┐
│ PeerTube (NVMe) │
│ Données actives │
│ Accès rapide │
└───────────┬───────────┘
│
│ Copie quotidienne (2h du matin)
│ rsync --delete
↓
┌──────────────────────────────────┐
│ HDD│
Backup│ ┌─────────────┐ ┌─────────────┐ ┌───────────────────────────────────┐ │
│ Copie de sécurité│ │ │ Grande│ capacité│ │ │
│ │ Visiteur │───▶│ Traefik │───▶│ PeerTube │ │
│ │ │ │ │ │ │ │
│ └─────────────┘ └─────────────┘ └───────────────────────────────────┘ │
│ ▲ │ │
│ │ ▼ │
│ ┌──────┴──────┐ ┌─────────────────────┐ │
│ │ Internet │ │ PostgreSQL/Redis │ │
│ └────────────┘ └─────────────────────┘ │
│ │
└───────────────────────────────────────────────────────────────────────────────┘
Créer
Flux de données :
peertube.mondomaine.fr (HTTPS).
Traefik gère le 4. Préparation du serveur
Structure des dossiers
mkdir -p ~/peertube/{traefik/{dynamic,acme},config}
cd ~/peertube
Permissions critiques :
touch traefik/acme/acme.json
chmod 600 traefik/acme/acme.json
5. Installation avec Docker Compose
Fichier docker-compose.yml
services:
traefik:
image: traefik:v3.3
container_name: traefik
restart: always
ports:
- "80:80"
- "443:443"
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
- ./traefik/traefik.yml:/etc/traefik/traefik.yml:ro
- ./traefik/dynamic:/etc/traefik/dynamic:ro
- ./traefik/acme:/acme
networks:
- traefik-proxy
peertube:
image: chocobozzz/peertube:v8.0.0-trixie
container_name: peertube
restart: always
volumes:
- data:/data
- ./config:/config
depends_on:
- postgres
- redis
- traefik
networks:
- traefik-proxy
- peertube
environment:
- PEERTUBE_WEBSERVER_HOSTNAME=peertube.mondomaine.fr
- PEERTUBE_WEBSERVER_HTTPS=true
- PEERTUBE_WEBSERVER_PORT=443
- PEERTUBE_DB_HOSTNAME=postgres
- PEERTUBE_DB_USERNAME=peertube
- PEERTUBE_DB_PASSWORD=peertube
- PEERTUBE_REDIS_HOSTNAME=redis
labels:
- "traefik.enable=true"
- "traefik.http.routers.peertube.entrypoints=http"
- "traefik.http.routers.peertube.rule=Host(`peertube.mondomaine.fr`)"
- "traefik.http.routers.peertube-secure.entrypoints=https"
- "traefik.http.routers.peertube-secure.rule=Host(`peertube.mondomaine.fr`)"
- "traefik.http.routers.peertube-secure.tls=true"
- "traefik.http.routers.peertube-secure.tls.certresolver=letsencrypt"
- "traefik.http.services.peertube.loadbalancer.server.port=9000"
- "traefik.docker.network=traefik-proxy"
postgres:
image: postgres:16-alpine
container_name: peertube-postgres
restart: always
environment:
POSTGRES_USER: peertube
POSTGRES_PASSWORD: peertube
POSTGRES_DB: peertube
volumes:
- db:/var/lib/postgresql/data
networks:
- peertube
redis:
image: redis:7-alpine
container_name: peertube-redis
restart: always
volumes:
- redis:/data
networks:
- peertube
networks:
traefik-proxy:
name: traefik-proxy
driver: bridge
peertube:
name: peertube
driver: bridge
volumes:
data:
db:
redis:
⚠️ Remplacez peertube.mondomaine.fr et les mots de backuppasse par vos valeurs.
6. Configuration Traefik
Fichier traefik/traefik.yml
Étape
api:
1dashboard: true
insecure: false
entryPoints:
http:
address: ":80"
http:
redirections:
entryPoint:
to: https
scheme: https
permanent: true
https:
address: ":443"
http:
tls:
certResolver: letsencrypt
providers:
docker:
endpoint: "unix:///var/run/docker.sock"
exposedByDefault: false
network: traefik-proxy
file:
directory: /etc/traefik/dynamic
watch: true
certificatesResolvers:
letsencrypt:
acme:
email: admin@mondomaine.fr
storage: /acme/acme.json
httpChallenge:
entryPoint: http
7. Configuration PeerTube
Fichier config/production.yaml
listen:
hostname: '0.0.0.0'
port: 9000
webserver:
https: true
hostname: 'peertube.mondomaine.fr'
port: 443
database:
hostname: 'postgres'
port: 5432
suffix: ''
username: 'peertube'
password: 'peertube'
pool:
max: 5
redis:
hostname: 'redis'
port: 6379
auth: null
db: 0
smtp:
hostname: smtp.gmail.com
port: 465
username: votre-email@gmail.com
password: "votre-mot-de-passe-app"
tls: true
disable_starttls: false
ca_file: null
from_address: votre-email@gmail.com
signup:
enabled: true
limit: 10
requires_email_verification: true
video_transcoding:
enabled: true
web_videos:
enabled: false
hls:
enabled: true
secrets:
peertube: "REMPLACER_PAR_VOTRE_SECRET"
⚠️ Générez un secret sécurisé :
openssl lerand fichier-hex script32
8. Sécurité
UFW Firewall
sudo apt install -y ufw
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow 22/tcp comment 'SSH'
sudo ufw allow 80/tcp comment 'HTTP'
sudo ufw allow 443/tcp comment 'HTTPS'
sudo ufw --force enable
Fail2ban
sudo apt install -y fail2ban
sudo nano /usr/local/bin/backup-etc/fail2ban/jail.local
[DEFAULT]
bantime = 3600
findtime = 600
maxretry = 5
banaction = ufw
backend = systemd
[sshd]
enabled = true
port = 22
maxretry = 3
bantime = 7200
9. Configuration réseau
DNS
Ajoutez un enregistrement A chez votre registrar :
peertube.shmondomaine.fr → VOTRE_IP_PUBLIQUE
Redirection de ports (NAT/PAT)
10. Transcodage vidéo
Configuration recommandée
video_transcoding:
enabled: true
web_videos:
enabled: false
hls:
enabled: true
CopiezRésolutions ce contenuconseillées :
11. Gestion des utilisateurs
Activer les inscriptions
production.yaml :
signup:
enabled: true
requires_email_verification: true
12. Stockage et backup
Script de backup automatique
#!/bin/bash
# Script de backup automatique PeerTube
# Copie les données vers le disque de backup
DATE=$(date +%Y-%m-%d_%H:%M:%S)
LOG="/var/log/peertube-backup.log"
# Source : données PeerTube
SOURCE="/home/user/Serveur/docker-volume/peertube/"
# Destination : disque de backup
DEST="/mnt/backup-disk/peertube_backup/"
echo "[$DATE] Début du backup PeerTube" >> $LOG
#docker Copiecompose avecstop rsyncpeertube postgres redis
rsync -av --delete "$SOURCE" "$DEST" >> $LOG 2>&1
#docker Vérificationcompose dustart résultatpeertube ifpostgres [ $? -eq 0 ]; then
echo "[$DATE] ✓ Backup terminé avec succès" >> $LOG
else
echo "[$DATE] ✗ ERREUR lors du backup" >> $LOG
firedis
Explication13. duMaintenance
Commandes :utiles
DATE=$(date ...)LOG="/var/log/..."rsync -av --delete-a-v--delete>> $LOG 2>&1if [ $? -eq 0 ]Étape 2 : Rendre le script exécutable
sudodocker chmodcompose +xlogs /usr/local/bin/backup-peertube.sh-f peertube
docker compose restart peertube
docker system prune -a
Étape
3
14. : Créer le dossier de destination
sudo mkdir -p /mnt/backup-disk/peertube_backup
sudo chown $USER:$USER /mnt/backup-disk/peertube_backup
Étape 4 : Test manuel
sudo /usr/local/bin/backup-peertube.sh
Vérifiez que ça fonctionne :
# Voir les logs
tail -20 /var/log/peertube-backup.log
# Vérifier que les fichiers sont copiés
ls -lh /mnt/backup-disk/peertube_backup/
Automatiser avec Cron
Cron permet d'exécuter des scripts automatiquement à des heures précises.
Ajouter une tâche quotidienne
echo "0 2 * * * root /usr/local/bin/backup-peertube.sh" | sudo tee -a /etc/crontab
Comprendre la syntaxe Cron :Troubleshooting
0 2 * * * root /usr/local/bin/backup-peertube.sh
│ │ │ │ │ │ └─ Commande à exécuter
│ │ │ │ │ └────── Utilisateur (root)
│ │ │ │ └────────── Jour de la semaine (* = tous)
│ │ │ └──────────── Mois (* = tous)
│ │ └────────────── Jour du mois (* = tous)
│ └──────────────── Heure (2h du matin)
└────────────────── Minute (0 = pile)
Exemples d'horaires Cron :
pas |
docker |
obtenu |
acme.json |
"S’inscrire" |
signup.enabled production.yaml |
envoyés |
htop
Vérifier l'installation
sudo grep "backup-peertube" /etc/crontab
Commandes utiles
Gestion de PeerTube
# Se placer dans le dossier
cd /chemin/vers/votre/dossier
# Démarrer PeerTube
docker compose up -d
# Arrêter PeerTube
docker compose down
# Redémarrer PeerTube
docker compose restart peertube
# Voir les logs en temps réel
docker compose logs -f peertube
# Voir l'état des conteneurs
docker compose ps
Gestion des backups
# Lancer un backup manuel
sudo /usr/local/bin/backup-peertube.sh
# Voir les derniers logs de backup
tail -50 /var/log/peertube-backup.log
# Chercher les erreurs dans les logs
grep "ERREUR" /var/log/peertube-backup.log
# Vérifier l'espace disque
df -h | grep -E "backup-disk|nvme"
# Taille du dossier de backup
du -sh /mnt/backup-disk/peertube_backup/
Monitoring du transcodage
# Voir les vidéos en cours de transcodage
docker exec -it <nom-conteneur-peertube> ls -lh /data/transcoding-jobs/
# Surveiller l'utilisation CPU en temps réel
htop
# Surveiller l'espace disque toutes les 5 secondes
watch -n 5 'df -h | grep nvme'
Vérification des ressources Docker
# Nombre de CPUs disponibles
nproc
# Vérifier que Docker voit tous les CPUs
docker info | grep "CPUs:"
# Résultat attendu : même nombre que nproc
Limiter les ressources Docker (optionnel)
Si le transcodage ralentit trop votre PC, ajoutez ceci dans docker-compose.yml :
services:
peertube:
image: chocobozzz/peertube:production-bookworm
# ... autres configs ...
# Nouvelles lignes à ajouter :
deploy:
resources:
limits:
cpus: '6' # Maximum 6 cœurs
memory: 4G # Maximum 4 GB de RAM
reservations:
cpus: '2' # Minimum 2 cœurs garantis
memory: 1G # Minimum 1 GB de RAM
Quand utiliser ces limites ?
Surveillance et maintenance
Surveillance régulière
1. Espace disque (hebdomadaire)
df -h /
Si l'espace disque dépasse 80%, libérez de l'espace :
docker system prune -a2. Logs de backup (mensuel)
grep "ERREUR" /var/log/peertube-backup.log
Si des erreurs apparaissent, vérifiez :
df -h | grep backupls -ld /mnt/backup-disk/peertube_backup3. Performance du transcodage
Observez le temps de transcodage. Si c'est trop lent :
Augmenter la concurrence :
"concurrency": 3 // Au lieu de 2
Attention : Plus de concurrence = plus de CPU utilisé.
Évolutions possibles
1. Activer le streaming en direct
Modifiez docker-volume/config/local-production.json :
"live": {
"enabled": true,
"max_duration": 3600, // 1 heure max
"max_instance_lives": 20, // 20 lives simultanés max
"allow_replay": true
}
Redémarrez :
docker compose restart peertube
2. Ajouter des résolutions supérieures
Si vous voulez proposer du 1440p ou 4K :
"resolutions": {
"1440p": true,
"2160p": true
}
⚠️ Attention : Le transcodage sera beaucoup plus long et utilisera beaucoup plus d'espace disque.
3. Remote runners (transcodage distant)
Si votre serveur est trop lent, vous pouvez déléguer le transcodage à d'autres machines. Voir la documentation officielle.
4. Rotation des backups
Pour garder plusieurs versions des backups (quotidien, hebdomadaire, mensuel), utilisez des outils comme :
rsnapshotborgresticRésumé de la configuration
✅ Ce que nous avons mis en place
📊 Ressources du serveur
Processeur : 8 threads
├── Transcodage : 6 threads (3 × 2)
└── Système : 2 threads libres
Stockage :
├── NVMe 454 GB : Données PeerTube
└── HDD 916 GB : Backups quotidiens
Réseau :
├── Port 9000 : Accès web (HTTP)
└── Port 1935 : Streaming live (RTMP)
Prochaines étapes
Tester le transcodage
Surveiller les backups
tail /var/log/peertube-backup.logAjuster les performances
concurrencythreadsRessources utiles
- Documentation officielle : https://docs.joinpeertube.org/
- Docker Compose : https://docs.docker.com/compose/
- Rsync manuel : https://linux.die.net/man/1/rsync
- Crontab generator : https://crontab.guru/
- Forum PeerTube : https://framacolibri.org/c/peertube/
- Aukfood .https://www.aukfood.fr/peertube-dockerise-avec-traefik-2/