Skip to main content

Installation d'Iceshrimp avec Docker, du début à la fin (Ubuntu/Debian)

Prérequis : accès root.

Nous allons voir, dans cet ordre :

  • l'installation de docker
  • la configuration d'Iceshrimp (.config/default.yaml)
  • la configuration de la base de données (.config/docker.env)
  • la création et la rédaction du fichier docker-compose.yml
  • le reverse proxy nginx

Installation de Docker

Via les dépôts de Docker (recommandé)
  1. Mettre à jour les paquets : sudo apt-get update
  2. Installer les paquets nécessaires à la récupération de la clé PGP de Docker : sudo apt-get install ca-certificates curl
  3. Installer la clé de Docker, qui lui permettre de signer son dépôt
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc
  1. Ajouter le dépôt Docker aux listes d'apt
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
  $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
  1. Mise à jour de la liste des paquets pour première synchronisation avec le dépôt de Docker : sudo apt-get update
  2. Installation de Docker et de ses dépendances : sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
Via les dépôts Ubuntu/Debian
  • apt update
  • apt install docker docker-compose

Et basta. Docker n'est pas vraiment à jour mais il marche.

ATTENTION, cette version étant vieille, la commande docker compose (sans tiret) n'existe pas. Dans ce tutoriel, vous devrez remplacer docker compose par docker-compose systématiquement.

Création d'un dossier pour le conteneur Iceshrimp

J'ai l'habitude de créer un dossier par conteneur dans /home. Pour Iceshrimp, ce sera donc /home/iceshrimp. C'est cet exemple que j'utiliserai : sudo mkdir /home/iceshrimp

Configuration de l'instance

Dans le dossier /home/iceshrimp, ou celui que vous avez choisi, créez un répertoire .config : mkdir -p /home/iceshrimp/.config

Dans ce répertoire, ouvrez un fichier default.yaml : nano /home/iceshrimp/.config/default.yaml.

Choix du nom de domaine
Si je veux un domaine différent pour l'instance et la fédération (utilisation avancée)

Les deux premières variables permettent, si vous le souhaitez, d'avoir votre instance sur social.example.org, mais avec des pseudos de la forme @example.org. Cela vous permet d'héberger autre chose à l'adresse example.org, tout en conservant la fédération. Cela nécessite une configuration supplémentaire dans nginx. Il faudra alors configurer ces variables comme cela dans default.yaml :

  • La variable url correspond à là où se trouvera concrètement l'interface web d'Iceshrimp, dans notre exemple, nous devrions la définir à https://social.example.org/
  • La variable accountDomain correspond au domaine de pseudo visible des autres instances, dans notre exemple, nous devrions la définir à example.org

Voir plus tard une spécificité pas bien complexe dans la configuration de `nginx`

Le fichier de conf

(Je fais beaucoup de digressions, mais on en était à éditer ce fichier : nano /home/iceshrimp/.config/default.yaml)

url: https://example.org/
accountDomain: example.org

db:
  host: db # on laisse db, car ce sera le nom de notre conteneur. Docker-compose s'occupera de transformer "db" en adresse IP
  port: 5432
  db: iceshrimp
  user: iceshrimp
  pass: example-iceshrimp-pass

# PRENEZ NOTE DE CES IDENTIFIANTS D'ACCÈS À LA BASE DE DONNÉES, ILS SONT DEMANDÉS À L'ÉTAPE SUIVANTE

redis:
  host: redis # même observation que pour la db
  port: 6379

reservedUsernames: [
  'root',
  'admin',
  'administrator',
  'me',
  'system'
]

# L'instance doit-elle télécharger automatiquement les médias distants, les stocker et les servir elle-même ?
proxyRemoteFiles: true

# Si oui, à quelle fréquence supprimer les anciens médias ?
mediaCleanup:
  cron: true
  maxAgeDays: 30
  cleanAvatars: false
  cleanHeaders: false

Configuration de la base de données

Toujours dans le dossier .config, créer un fichier docker.env et remplissez-le avec ceci :

POSTGRES_PASSWORD=example-iceshrimp-pass
POSTGRES_USER=iceshrimp
POSTGRES_DB=iceshrimp

On y est presque : le docker-compose.yml 👀

Maintenant qu'on a tout configuré, il reste simplement à faire le petit docker-compose.yml qui va bien dans /home/iceshrimp (on quitte le dossier .config). Et on lance nano /home/iceshrimp/docker-compose.yml :

services:
  web:
    image: iceshrimp.dev/iceshrimp/iceshrimp:dev
    restart: unless-stopped
    depends_on:
      - db
      - redis
    ports:
      - "127.0.0.1:3000:3000"
    environment:
      NODE_ENV: production
    volumes:
      - ./files:/iceshrimp/files
      - ./.config:/iceshrimp/.config:ro

  redis:
    restart: unless-stopped
    image: docker.io/redis:7.0-alpine
    volumes:
      - ./redis:/data

  db:
    restart: unless-stopped
    image: docker.io/postgres:12.2-alpine
    env_file:
      - ./.config/docker.env
    volumes:
      - ./db:/var/lib/postgresql/data

Modifiez au besoin les points de montage des dossiers, par exemple si vous voulez mettre les fichiers d'Iceshrimp sur un disque plus gros parce que vous avez activé le proxy média. Si votre disque est /mnt/disk, remplacez les occurrences comme ceci :

volumes:
   - /mnt/disk/iceshrimp/files:/iceshrimp/files
   - ./config:/iceshrimp/.config:ro

Pour les autres, la configuration fonctionnera à merveille sans aucune modification.

Et UUUUUUUUP !!! 🎉

On se lance, on ferme ce fichier et on lance : docker compose up -d

On peut checker le log avec docker compose logs pour voir comment ça se passe, ajouter le flag -f pour suivre le log en direct et préciser le service, par exemple docker compose logs web pour filtrer les logs de la base de données et de redis.

Le reverse proxy nginx

sudo apt update && sudo apt install nginx

Reverse proxy nginx, étape 1 : obtenir un certificat SSL

Optez pour la solution que vous préférez. Moi je préfère la mienne et j'ai raison, mais vous avez le droit d'avoir tort aussi.

(Notez l'emplacement du certificat et de la clé)

Reverse proxy nginx, étape 2 : configurer le chiffrement

C'est l'étape par laquelle je commence après avoir obtenu mon certificat. Je crée un snippet par host dans nginx pour pouvoir l'inclure dans mes fichiers de configuration de sites sans me faire chier.

Ouvrons donc /etc/nginx/snippets/ssl/example.org.conf et remplissons-le :

ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;

ssl_certificate '/home/coco/.acme.sh/example.org/fullchain.cer';
ssl_certificate_key '/home/coco/.acme.sh/example.org/example.org.key';

server_tokens off;
ssl_session_timeout 1d;
ssl_session_cache shared:MozSSL:10m;
ssl_session_tickets off;
ssl_buffer_size 8k;

ssl_ciphers ECDHE-RSA-CHACHA20-POLY1305:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-CCM:DHE-RSA-AES256-CCM8:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-CCM:DHE-RSA-AES128-CCM8:DHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256;

ssl_stapling on;
ssl_stapling_verify on;

add_header Strict-Transport-Security "max-age=15552001; includeSubdomains; preload";
add_header X-XSS-Protection "1; mode=block";
add_header X-Content-Type-Options nosniff;
add_header Content-Security-Policy "object-src 'none'; base-uri 'none'; frame-ancestors 'self';";

Vérifiez l'emplacement de `ssl_certificate` et de `ssl_certificate_key` !

Reverse proxy nginx, étape 3 : reverse proxy, tout simplement

On va faire ça proprement. On ouvre donc /etc/nginx/sites-available/iceshrimp.conf et on le remplit :

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

proxy_cache_path /tmp/iceshrimp_cache levels=1:2 keys_zone=cache1:16m max_size=1g inactive=720m use_temp_path=off;

server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;

    include snippets/ssl/example.org.conf; # ici on inclut notre fichier pour SSL précédemment créé !!

    server_name example.org; # doit être égal à l'adresse configurée dans `default.yaml`

    client_max_body_size 80m;

    location / {
        proxy_pass http://127.0.0.1:3000;
        proxy_set_header Host $host;
        proxy_http_version 1.1;
        proxy_redirect off;

        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 https;

        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection $connection_upgrade;

        proxy_cache cache1;
        proxy_cache_lock on;
        proxy_cache_use_stale updating;
        add_header X-Cache $upstream_cache_status;
    }

}

Ensuite on active le site en créant un lien symbolique dans le dossier des configurations activées : ln -s /etc/nginx/sites-enabled/iceshrimp.conf /etc/nginx/sites-available/iceshrimp.conf

Configuration supplémentaire pour les personnes ayant choisi l'option 2 (domaine de l'instance et des pseudos différents)

En plus des configurations ci-dessus, il nous faudra mettre en place ou modifier votre configuration actuelle pour votre domaine racine example.org, comme ceci : nano /etc/nginx/sites-available/example.org.conf

Ajoutez simplement ceci dans le bloc server :

    location = /.well-known/host-meta {
        return 301 https://social.example.org$request_uri;
    }

Si ce fichier n'existe pas encore, collez simplement ceci :

server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;

    include snippets/ssl/example.org.conf;

    server_name example.org;

    location = /.well-known/host-meta {
        return 301 https://social.example.org$request_uri;
    }
}

Puis activez ces configs : ln -s /etc/nginx/sites-enabled/example.org.conf /etc/nginx/sites-available/example.org.conf

Reverse proxy nginx, étape bonus

Vous remarquerez que je n'écoute pas sur le port 80. Il est pourtant important, pour pouvoir upgrade les connexions vers HTTPS.

En fait, mon nginx upgrade toutes ces connexions dans sa config /etc/nginx/sites-enabled/default, que j'ai modifiée comme suit :

server {
        listen 80 default_server;
        listen [::]:80 default_server;
        server_name _;

        return 301 https://$host$request_uri;
}

On lance sudo nginx -t et on croise les doigts. Si c'est pas bon, on se chie dessus et on cherche pourquoi pendant 10 minutes à 3h. Si c'est bon, on peut faire sudo nginx -s reload.

N'oubliez pas le DNS !

Voilà, n'oubliez pas de créer un enregistrement DNS pour votre instance.

Enjoy

Rendez vous ensuite sur votre instance à son adresse et créez le premier utilisateur, qui sera administrateur.

Bienvenue sur le Fédi !