Installation de Peertube dans un container docker

Bonsoir,

J’ai suivi les instructions de la documentation Peertube pour l’installation d’une instance dans un container docker. J’ai donc éditer docker-compose.yml puis .env et finalement lancé docker-compose up. Toutefois, j’obtiens une erreur m’indiquant que le port est déjà utilisé. Malheureusement, le message n’indique pas quel port. J’ai testé avec --verbose ainsi qu’avec un strace -f. Mais impossible de trouver le port. Voici l’erreur obtenue:

Creating peertube_redis_1 … done
Creating peertube_postgres_1 … done
Creating peertube_postfix_1 … done
Creating peertube_peertube_1 … error

ERROR: for peertube_peertube_1 Cannot start service peertube: Address already in use

ERROR: for peertube Cannot start service peertube: Address already in use
ERROR: Encountered errors while bringing up the project.

Voici mon docker-comopse.yml:

version: "3.3"

services:
   # webserver/certbotwww retirés.
  peertube:
    # If you don't want to use the official image and build one from sources:
    # build:
    #   context: .
    #   dockerfile: ./support/docker/production/Dockerfile.buster
    image: chocobozzz/peertube:production-buster
    # Use a static IP for this container because nginx does not handle proxy host change without reload
    # This container could be restarted on crash or until the postgresql database is ready for connection
    networks:
      default:
        ipv4_address: 172.21.0.1
    env_file:
      - .env

    ports:
     - "1935:1935" # If you don't want to use the live feature, you can comment this line
     - "9001:9001" # If you provide your own webserver and reverse-proxy, otherwise not suitable for production
    volumes:
      - assets:/app/client/dist
      - ./docker-volume/data:/data
      - ./docker-volume/config:/config
    depends_on:
      - postgres
      - redis
      - postfix
    restart: "always"

  postgres:
    image: postgres:13-alpine
    env_file:
      - .env
    volumes:
      - ./docker-volume/db:/var/lib/postgresql/data
    restart: "always"

  redis:
    image: redis:6-alpine
    volumes:
      - ./docker-volume/redis:/data
    restart: "always"

  postfix:
    image: mwader/postfix-relay
    env_file:
      - .env
    volumes:
      - ./docker-volume/opendkim/keys:/etc/opendkim/keys
    restart: "always"

networks:
  default:
    ipam:
      driver: default
      config:
      - subnet: 172.21.0.0/16

volumes:
  assets:
  # certbot-www:

Bonjour @gaialabs,

Le service peertube est celui déclenchant l’erreur, et il ne déclare que les ports 1935 et 9001. Vérifiez qu’aucun service ne tourne déjà sur votre machine avec l’un de ces ports via sudo lsof -i:1935 et sudo lsof -i:9001.

Bonjour,

Merci, c’est bien ce que j’ai vérifié, mais il n’y a aucun processus qui bind les ports 1935 ou 9001. C’est ce qui est troublant. Est-ce que ce pourrait être un socket ?

Bonjour,
Pas impossible que ce soit l’adresse réseau 172.21.0.1 qui est déjà utilisée. bien probablement par la gateway configurée automatiquement par docker sur ce réseau.
Pour quelle raison utiliser des adresses IP fixes ? Ça ne devrait pas être nécessaire.

Bonjour,

Merci, c’était bien ça le soucis. J’ai utilisé l’IP statique fixe car dans le docker-compose.yml j’ai lu:

# Use a static IP for this container because nginx does not handle proxy host change without reload

L’installation continue mais la connexion à la base de données PostgreSQL semble ne pas fonctionner, je vous mets mon .env. Je réalise d’ailleurs que je ne saisis pas la différence entre « POSTGRES_USER » et « PEERTUBE_DB_USERNAME ». Est-ce que le premier c’est l’utilisateur « root » ?

# Database / Postgres service configuration
POSTGRES_USER=peertube
POSTGRES_PASSWORD=<xxx>
# Postgres database name "peertube"
POSTGRES_DB=peertube_prod
# Editable only with a suffix :
#POSTGRES_DB=peertube_prod
#PEERTUBE_DB_SUFFIX=_prod
PEERTUBE_DB_USERNAME=peertube
PEERTUBE_DB_PASSWORD=<xxx>
# Default to Postgres service name "postgres" in docker-compose.yml
PEERTUBE_DB_HOSTNAME=postgres

# Server configuration
PEERTUBE_WEBSERVER_HOSTNAME=peertube.gaialabs.ch
# If you do not use https and a reverse-proxy in docker-compose.yml
#PEERTUBE_WEBSERVER_PORT=80
#PEERTUBE_WEBSERVER_HTTPS=false
# If you need more than one IP as trust_proxy
# pass them as a comma separated array:
PEERTUBE_TRUST_PROXY=["127.0.0.1", "loopback", "172.21.0.0/16"]

# E-mail configuration
# If you use a Custom SMTP server
#PEERTUBE_SMTP_USERNAME=
#PEERTUBE_SMTP_PASSWORD=
# Default to Postfix service name "postfix" in docker-compose.yml
# May be the hostname of your Custom SMTP server
PEERTUBE_SMTP_HOSTNAME=postfix
PEERTUBE_SMTP_PORT=25
PEERTUBE_SMTP_FROM=noreply@gaialabs.ch
PEERTUBE_SMTP_TLS=false
PEERTUBE_SMTP_DISABLE_STARTTLS=false
PEERTUBE_ADMIN_EMAIL=<xxx>

# Postfix service configuration
POSTFIX_myhostname=gaialabs.ch
# If you need to generate a list of sub/DOMAIN keys
# pass them as a whitespace separated string <DOMAIN>=<selector>
#OPENDKIM_DOMAINS=<MY DOMAIN>=peertube
# see https://github.com/wader/postfix-relay/pull/18
#OPENDKIM_RequireSafeKeys=no

# /!\ Prefer to use the PeerTube admin interface to set the following configurations /!\
#PEERTUBE_SIGNUP_ENABLED=true
#PEERTUBE_TRANSCODING_ENABLED=true
#PEERTUBE_CONTACT_FORM_ENABLED=true

L’erreur que je peux voir lors de l’installation:

postfix_1   | Starting Postfix Mail Transport Agent: postfix.
postfix_1   | rsyslogd:  [origin software="rsyslogd" swVersion="8.1901.0" x-pid="128" x-info="https://www.rsyslog.com"] start
postgres_1  | 2021-03-21 14:35:36.649 UTC [27] FATAL:  database "peertube" does not exist
peertube_1  | [peertube.gaialabs.ch:443] 2021-03-21 14:35:36.660 error: Unable to connect to PostgreSQL database. {

La base de données doit être créée manuellement ? Ou est-ce que je suis passé à côté de quelque chose ?

Merci.

En tout premier lieu je pense qu’il est important de se doter d’un reverse proxy. Je recommande nginx-proxy avec docker-letsencrypt-nginx-proxy-companion. C’est facile à installer / configurer, et ça résoud une fois pour toutes la synchronisation avec les éventuels changement d’IP des services.

Pour la base de données, il faut soit décommenter PEERTUBE_DB_SUFFIX, soit configurer POSTGRES_DB=peertube. Mieux vaut la première option pour ne pas avoir à recréer la base de données.

Je n’avais en effet pas encore activé le reverse-proxy car je migre peertube.gaialabs.ch actuellement hébergé ailleurs, mais avec une ancienne version (1.2.1), et la mise à jour semble compliquée, alors je réinstalle from scratch (j’ai 35 vidéos et 3 utilisateurs).

J’ai modifié .env selon ce que vous indiquiez et ça a démarré. En revanche, la connexion au port 9001 se ferme immédiatement.

J’ai eu ce warn:

peertube_1  | [peertube.gaialabs.ch:80] 2021-03-21 15:51:17.070 warn: It seems PeerTube was started (and created some data) with another domain name. This means you will not be able to federate! Please use NODE_CONFIG_DIR=/config NODE_ENV=production npm run update-host to fix this.

Que j’ai corrigé avec:

# docker exec -it peertube_peertube_1 /bin/sh
# cd /app && NODE_CONFIG_DIR=/config NODE_ENV=production npm run update-host

Mais si je redémarrer les containers, j’ai à nouveau le « warn »…

On peut voir ensuite:

[peertube.gaialabs.ch:80] 2021-03-21 15:55:49.226 info: HTTP server listening on 0.0.0.0:9000
[peertube.gaialabs.ch:80] 2021-03-21 15:55:49.226 info: Web server: http://peertube.gaialabs.ch

Toutefois, j’ai précisé dans le docker-compose.yml:

- "9001:9001" 

Et je ne comprends donc pas pourquoi le serveur écoute sur 9000. Et donc si je fais un telnet vers le port 9001, ce dernier se referme immédiatement:

# telnet localhost 9001
Trying ::1...    
Connected to localhost.
Escape character is '^]'.
Connection closed by foreign host.

J’ai essayé de refaire le processus de zéro en supprimant tous les containers + images, mais cela ne change pas.

Est-ce que cela pourrait provenir du fait que pour le moment j’ai configuré peertube.gaialabs.ch uniquement en local ?

Dans ma config le serveur écoute sur le port 9000. Un docker inspect sur le conteneur le confirme. Si tu veux absolument l’avoir sur le port 9001 de l’hôte, il faudra spécifier :

    ports:
      - "9001:9000"

@Pini @gaialabs notez que le service webserver du docker-compose utilise la configuration Nginx supportée par le projet PeerTube, et apporte donc toute ses optimisations ; il est sans doute préférable de le laisser dans la chaîne entre le reverse-proxy frontal et le conteneur peertube.

Ah oui, je n’ai pas percuté qu’il y a le service webserver dans cette configuration. Si le reverse-proxy est basé sur nginx (comme nginx-proxy) alors webserver devient superflu et la conf d’optimisation nginx peut être faite directement sur le reverse-proxy.

Je complète ma réponse. Ah non en fait, justement webserver n’est pas utilisé ici (j’aurais dû relire le docker-compose.yml avant de répondre). Donc le serveur écoute bien sur le port 9000.

Merci beaucoup à tous les deux. Grâce à la modification de la configuration des ports, cela fonctionne maintenant, dans le sens où je peux afficher mon instance dans mon navigateur.

@rigelk je n’ai pas bien compris s’il fallait donc laisser la configuration webserver, même si j’utilise un Apache2 en frontal sur le host de mon serveur ?

Cela pourrait-il expliquer le fait que l’authentification OAuth ne semble pas fonctionner, j’ai maintenant l’erreur suivante:

Invalid client: client is invalid 

Lors que je tente de me connecter. Et au chargement de la page j’ai l’erreur suivante:

Erreur

Impossible de récupérer les identifiants du Client OAuth : undefined. Assurez-vous d'avoir correctement configuré PeerTube (dossier config/), en particulier la section "serveur web".

Je vais essayer de réintégrer la configuration webserver: (sans certbot) et je verrai si c’était la solution.

Oui. Il faut bien distinguer les rôles si l’on veut faire fonctionner PeerTube avec d’autres reverse proxies que Nginx : le reverse proxy (ici Apache) doit se contenter de s’occuper de la terminaison TLS, et le serveur web (ici le service webserver) s’occupe de paramétrages essentiels à PeerTube.

Après plusieurs mois où j’ai mis ça de côté j’ai enfin pu configurer mon instance PeerTube (jusque là c’était une version 1.2.1 hébergée sur une VM, mais je ne parvenais pas à faire une mise à jour incrémentale, donc j’ai fait une installation from scratch).

Tout fonctionne, mais comme je tourne sans webserver (c’est Apache2 qui fait office de reverse proxy et de TLS), je ne peux pas m’abonner à d’autres instances car mon instance n’est pas HTTPS.

Le problème c’est que si je laisse le webserver répondre sur le port 443 de mon serveur, je ne peux plus utiliser mon Apache2 pour mes autres applications tournant sur la même machine.

Quel serait le meilleur moyen de procéder ?

En configurant le webserver (ports 2280:80, 22443:443), ça fonctionne, l’instance tourne bien en https, les vidéos sont jouées et je peux suivre d’autres instances.