Introduction

Peut-être le saviez-vous, ma curiosité m’a amenée à parcourir les réseaux sociaux. Ainsi je réside sur GNU Social, un réseau alternatif. Àla Twitter. Mais décentralisé. Depuis début 2018, ce réseau évolue rapidement. De nouvelles applications basées sur celui-ci fleurissent :

  • Mastodon : encore meilleur que Twitter !
  • PeerTube : YouTube sans la censure
  • Funkwhale : Groovshark chez soi, à partager en famille
  • PixelFed : alternative à Instagram
  • etc.

Nous allons nous intéresser au dernier de la liste : PixelFed, un outil pour publier et partager des photos. Un tutoriel plus accessible sur son installation manque cruellement sur le web, alors pourquoi ne pas se lancer ici ?

Je vous expliquerai en plusieurs étapes ma procédure d’installation. Le logiciel n’est pas encore stable, je préfère donc en parler ici plutôt que sur mon recueil d’astuces.

Logo de PixelFed : sorte de fleur à plusieurs pétales des couleurs de l’arc en ciel dont le centre forme un P blanc

Avant-propos

Ce « tutoriel » est très probablement réservé à des personnes ayant un minimum d’assurance avec la ligne de commande ; les serveurs et probablement d’autres compétences dont je ne me rends pas compte. La lecture sera probablement longue, prenez votre temps et achevez les tâches progressivement.

PixelFed est un outil récent qui n’a pas été testé ni longtemps ni sur énormément d’instances. Je crois qu’il est sage de dire qu’il est réservé aux têtes brûlées. Ces personnes qui souhaitent être à la fois « hype » mais se casser les dents sur des soucis. Cela m’est arrivé : j’ai mis plusieurs heures à trouver ce qui n’allait pas.

Je ne serais en aucun cas tenu pour responsable de toute perte de données, de problèmes ou de catastrophe résultant de l’application des commandes de ce tutoriel. Vous êtes assez intelligents pour vous renseigner si le besoin s’en fait sentir. D’ailleurs un canal IRC pour PixelFed existe pour vous aider. Vous n’êtes pas seul, l’univers que nous connaissons est rempli d’aliens comme vous et moi :)

Prérequis

Sur la page du dépôt du projet on lit que l’application requièrt PHP supérieur ou égal à 7.1. Pour Debian c’est mort, à moins que vous soyez le roi du pinning. Pour Ubuntu, c’est déjà mieux : PHP 7.1 (sous bionic).

Dans le présent tutoriel j’ai travaillé sur une machine possédant ArchLinux et PHP 7.2. J’ai donc utilisé les éléments suivants :

J’ai installé les paquets suivants :

sudo pacman -S php php-fpm php-gd php-pgsql git postgresql redis

Puis à la lecture du fichier README sur le dépôt git officiel de PixelFed, j’ai du installer plusieurs autres logiciels, y compris sur les dépôts AUR d’ArchLinux en utilisant l’outil trizen - que je recommande.

Voici les logiciels supplémentaires :

trizen -S optipng jpegoptim pngquant gifsicle svgo composer

Éditez également le fichier /etc/php/php.ini et décommentez (enlever le “;”) devant les lignes suivantes :

extension=bcmath.so
extension=gd.so
extension=iconv.so
extension=pdo_pgsql.so
extension=pgsql.so
extension=zip.so

Nous lancerons les différents services plus tard, passons déjà à l’installation de PixelFed.

Installation

Nous vérifions que le dossier /srv/http/ existe :

sudo mkdir -p /srv/http

puis nous créeons le dossier pixelfed et lançons l’installation des dépendances :

cd /srv/http
sudo git clone https://github.com/dansup/pixelfed.git
cd pixelfed
composer install

Le plus gros de l’installation est faite ! Faisons de la configuration avant le grand lancement !

Configuration

La configuration va se passer en quelques étapes :

  • configuration d’un fichier pour php-fpm, spécifique à PixelFed
  • configuration du fichier .env de PixelFed
  • lancement de postgreSQL
  • configuration d’une base de données pour postgreSQL
  • ajout d’un fichier de service pour systemd afin de lancer horizon pour PixelFed
  • configuration de Nginx
  • création d’une clé pour PixelFed
  • création du lien sur les storage de PixelFed
  • modification des permissions du dossier /srv/http/pixelfed

On crée le fichier /etc/php/php-fpm.d/pixelfed.conf avec le contenu suivant :

[pixelfed]
user = http
group = http
listen = /run/php-fpm/php-fpm-pixelfed.sock
listen.owner = http
listen.group = http
pm = dynamic
pm.max_children = 5
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 3

Au cas où, on crée nous même le fichier /run/php-fpm/php-fpm-pixelfed.sock :

sudo mkdir -p /run/php-fpm
sudo touch /run/php-fpm/php-fpm-pixelfed.sock && sudo chown http:http /run/php-fpm/php-fpm-pixelfed.sock

Rendons-nous dans le dossier PixelFed pour créer le fichier de configuration et l’éditer :

cd /srv/http/pixelfed
sudo cp .env.example .env

avec le contenu suivant :

APP_NAME="Le plus terrible des noms d'instance que tu peux trouver"
APP_ENV=production
APP_DEBUG=false
APP_URL=http://tondomaine.tld

# Language configuration
#APP_LOCALE=fr
#APP_FALLBACK_LOCALE=fr

ADMIN_DOMAIN="tondomaine.tld"
APP_DOMAIN="tondomaine.tld"

LOG_CHANNEL=stack

DB_CONNECTION=pgsql
DB_HOST=127.0.0.1
DB_PORT=5432
DB_DATABASE="pixelfed"
DB_USERNAME="roidumonde"
DB_PASSWORD="ilestdesnôootres,ilabusonverrecommeuxlesôÔtres"

BROADCAST_DRIVER=log
CACHE_DRIVER=redis
SESSION_DRIVER=redis
SESSION_LIFETIME=120
QUEUE_DRIVER=redis

REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null
REDIS_PORT=6379

MAIL_DRIVER=smtp
MAIL_HOST=smtp.tondomaine.tld
MAIL_PORT=587
MAIL_USERNAME=tonpseudo@tondomaine.tld
MAIL_PASSWORD=mot2passe
MAIL_ENCRYPTION=tls
MAIL_FROM_ADDRESS="contact@tondomaine.tld"
MAIL_FROM_NAME="Le nom d'expéditeur que tu veux que les personnes voient"

SESSION_DOMAIN=".tondomaine.tld"
SESSION_SECURE_COOKIE=true
API_BASE="/api/1/"
API_SEARCH="/api/search"

OPEN_REGISTRATION=true
RECAPTCHA_ENABLED=false
ENFORCE_EMAIL_VERIFICATION=false

MAX_PHOTO_SIZE=15000
MAX_CAPTION_LENGTH=150
MAX_ALBUM_LENGTH=4

MIX_PUSHER_APP_KEY="${PUSHER_APP_KEY}"
MIX_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}"
MIX_APP_URL="${APP_URL}"
MIX_API_BASE="${API_BASE}"
MIX_API_SEARCH="${API_SEARCH}"

Pour certaines variables vous trouverez des informations dans la documentation de Laravel, outil utilisé pour crée PixelFed.

Puis on lance postgreSQL et on crée une base de données suivant les informations ajoutées dans le fichier de configuration précédent :

sudo systemctl start postgresql.service
sudo systemctl enable postgresql.service
sudo su - postgres
createuser roidumonde
createdb -O roidumonde -E UTF-8 pixelfed
psql pixelfed
ALTER USER roidumonde WITH PASSWORD 'ilestdesnôootres,ilabusonverrecommeuxlesôÔtres';
\q
exit

Maintenant on va créer le fichier de service systemd pour lancer horizon. Éditez /etc/systemd/system/horizon.service et mettez y ceci :

[Unit]
Description=Service horizon pour PixelFed
After=network.target

[Service]
Type=simple
User=http
WorkingDirectory=/srv/http/pixelfed
ExecStart=php artisan horizon
Restart=on-failure

[Install]
WantedBy=multi-user.target

suivi de :

sudo systemctl daemon-reload

Edit : À la lecture d’un ticket sur Github qui m’a été signalé par raphgilles, le fichier /etc/systemd/system/horizon.service peut ressembler à ceci :

[Unit]
Description=Service horizon pour PixelFed
After=network.target

[Service]
Type=simple
ExecStart=/usr/bin/php7.2 /srv/http/pixelfed/artisan horizon
Restart=on-failure

[Install]
WantedBy=multi-user.target

De là on édite le fichier /etc/nginx/nginx.conf et on rajoute la section suivante sous la ligne :

# HTTPS Server

avec :

server {
  listen         *:80;
  listen         [::]:80;
  server_name    tondomaine.tld;

  root /srv/http/pixelfed/public;
  index index.php index.html;

  location / {
    try_files $uri $uri/ /$is_args$args;
  }

  location ~ \.php$ {
    try_files $uri =404;
    fastcgi_split_path_info  ^(.+\.php)(.*)$;
    fastcgi_pass unix:/run/php-fpm/php-fpm-pixelfed.sock;
    fastcgi_index index.php;
    include fastcgi.conf;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_param PATH_INFO $fastcgi_path_info;
  }

}

Il n’y a plus qu’à lancer redis, générer une clé pour PixelFed, générer le lien vers le dossier storage, migrer la base de données et changer les permissions du dossier :

sudo systemctl start redis.service
sudo systemctl enable redis.service
cd /srv/http/pixelfed
php artisan key:generate
php artisan storage:link
php artisan migrate
cd /srv/http
sudo chown http:http pixelfed -R

Chaud bouillant pour tester si tout va bien ? C’est parti !

Ça passe ou ça casse !

Tout est prêt, il ne reste plus qu’à :

  • lancer horizon
  • lancer php-fpm
  • lancer Nginx
  • tout casser 😭

Faites :

sudo systemctl start horizon.service
sudo systemctl enable horizon.service
sudo systemctl start php-fpm.service
sudo systemctl enable php-fpm.service
sudo systemctl start nginx.service
sudo systemctl enable nginx.service

Alors, si vous allez sur tondomaine.tld, tout fonctionne ?

Accéder au Dashboard admin

Au moment où j’ai écris ce tutoriel, le bug 327 avait encore cours. Pour pallier à ce problème, j’ai lancé la commande suivante :

sudo mkdir -p /srv/http/pixelfed/storage/app/public/m && sudo chown http:http /srv/http/pixelfed/storage/app/public/m

Et pour devenir administrateur, sachant que nous sommes le premier utilisateur (id : 1) à s’être enregistré :

sudo su - postgres
psql pixelfed
UPDATE users SET is_admin = 't' WHERE id = 1;
\q
exit

Et vous voilà administrateur !

Conclusion

Je dois avouer que l’installation est non seulement longue, mais compliquée. Le nombre de problèmes à régler est plus important que pour l’installation d’une autre application PHP que j’ai eu l’occasion d’utiliser.

J’ai par exemple encore quelques soucis pour comprendre comment personnaliser les pages d’à propos, de licence, la page d’accueil, etc. sans casser mon installation et ses mises à jours. J’aimerais également savoir si le lien entre PixelFed et Redis fonctionne réellement, parce que d’après le Dashboard admin, Redis est inactif…

Je suis pressé d’être à l’année prochaine pour voir ce que ce projet donnera ! Et peut-être aurons-nous une application mobile pour faciliter l’envoi de données ? Voire la possibilité d’utiliser AndStatus, Twidere ou Tusky pour envoyer nos belles images et nos têtes curieuses 👽 .