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é)
- Mettre à jour les paquets :
sudo apt-get update
- Installer les paquets nécessaires à la récupération de la clé PGP de Docker :
sudo apt-get install ca-certificates curl
- 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
- 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
- Mise à jour de la liste des paquets pour première synchronisation avec le dépôt de Docker :
sudo apt-get update
- 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 !