Installer Directus sur un cloud Hetzner

hetzner+directus.png

Pour installer le CMS Headless Directus, vous devez au préalable vous créer un compte Hetzner, posséder un nom de domaine et un accès à une base de données MySQL. Ces trois critères réunis, allons-y.

Créer un projet

  • Connectez-vous au service Hetzner Cloud.

  • Créer votre projet si ce n'est déjà fait. Un projet regroupe un ensemble de serveurs.

Ajouter une clé SSH

Si vous éprouvez des difficultés avec les clés SSH sur Hetzner, peut-être bien que cet article pourrait vous aider : Se connecter en SSH sur un server cloud Hetzner.

Ajouter un serveur

  • Ajouter un nouveau serveur à votre projet. Préférez un emplacement européen, sélectionner l'OS images > Ubuntu 22.04.

  • Sélectionner le type de serveur que vous désirez en fonction de votre budget et de la puissance que vous désirez.

  • La clé SSH que vous avez renseigné précédemment devrait être sélectionné par défaut.

  • Nommer et créer votre nouveau serveur.

Mettre à jour votre serveur

  • Récupérer l'adresse IP de votre serveur sur votre interface Hetzner.

  • Ouvrir un terminal (invite de commandes) et connecter en SSH à votre serveur :

ssh root@ipduserveur
  • Mettre à jour tous les versions de packages du serveur :
apt update
  • Télécharger et installer les nouvelles versions :
apt upgrade

Installer NodeJS et NPM

  • Télécharger la version LTS :
curl -sL https://deb.nodesource.com/setup_lts.x | sudo -E bash -
  • Mettre à jour l'information du paquet
apt update
  • Installer les paquets
apt install nodejs
  • Vérifier qu'ils sont installés en affichant leurs versions :
node -v; npm -v

Installer Directus

  • Créer un utilisateur System (nommer le comme vous voulez en place de master) avec son mot de passe :
adduser master
  • Ajouter l'utilisateur au sudo group
usermod -aG sudo master
  • Se connecter avec celui-ci
su - master
  • Créer un dossier directus
mkdir directus
  • Ouvrir ce dossier
cd directus
  • Créer le projet (package.json)
npm init
  • Ajouter Directus
npm install directus
  • Initialiser un nouveau projet Directus
npx directus init
  • A la question "Ok to proceed?", répondez y

  • A la question "Choose your database client", sélectionnez Mysql / MariaDB / Aurora

  • Renseignez la configuration de connexion, valider

  • Créer votre premier utilisateur admin, valider, votre Directus est installé.

Vous pouvez modifier à votre convenance le fichier .env pour configurer plus finement votre Directus. Pensez à redémarrer votre instance Directus (cf PM2) pour que celui-ci soit pris en compte.

Initialiser PM2

  • Installer PM2 globalement en root donc le mot de passe sera requit :
sudo npm install pm2 -g
  • Tester s'il est bien installé :
pm2 -v

Vous devriez avoir un beau logo et un numéro de version.

  • Démarrer Directus avec PM2 :
pm2 start npm --name "directus" -- start
  • Pour redémarrer Directus au besoin :
pm2 restart directus
  • Pour consulter en live les logs de Directus :
pm2 logs directus

Initialiser NGINX

  • Installer NGINX en mode root
sudo apt install nginx
  • Vérifier si NGINX s'est bien lancé après l'installation :
sudo systemctl status nginx
  • Créer le fichier de configuration NGINX de votre Directus
sudo nano /etc/nginx/sites-enabled/api.yourdomain.com.conf
  • Copier la configuration suivante :
server {
	# listen 443 ssl http2;
	server_name api.yourdomain.com;

    # upload max size
    client_max_body_size 8m;

	# Include your SSL details here #

	location / {
		proxy_pass http://localhost:8055;
		proxy_set_header Host $host;
		proxy_set_header X-Real-IP $remote_addr;
		proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
		proxy_set_header REMOTE-HOST $remote_addr;
		add_header X-Cache $upstream_cache_status;

		proxy_connect_timeout 30s;
		proxy_read_timeout 86400s;
		proxy_send_timeout 30s;
		proxy_http_version 1.1;
		proxy_set_header Upgrade $http_upgrade;
		proxy_set_header Connection "upgrade";
	}

	access_log  /var/log/nginx/api.yourdomain.com.log;
	error_log  /var/log/nginx/api.yourdomain.com.error.log;
}
  • Sauvegarder et vérifier s'il n'y a pas d'erreurs :
sudo nginx -t
  • Redémarrer NGINX
sudo systemctl restart nginx

Installer le certificat SSL

  • Toujours en root, exécuter la commande suivante :
sudo apt install python3-certbot-nginx -y
  • Certifier votre domaine que vous avez bien-sûr au préalable fait pointer sur votre serveur :
sudo certbot certonly -d api.yourdomain.com
  • Première question, sélectionner 1 pour NGINX

  • Deuxième question, saisir votre e-mail sur lequel vous allez recevoir vos notifications Let’s Encrypt

  • Troisième question, saisir y pour accepter les conditions générales

  • Quatrième question, saisir n pour ne pas recevoir la newsletter de Let’s Encrypt. Sauf si vous le souhaitez

  • Votre certificat a été généré avec succès.

  • Copier / coller les lignes suivantes :

Certificate is saved at: /etc/letsencrypt/live/api.yourdomain.com/fullchain.pem
Key is saved at: /etc/letsencrypt/live/api.yourdomain.com/privkey.pem
  • Ouvrir de nouveau la configuration de NGINX :
sudo nano /etc/nginx/sites-enabled/api.yourdomain.com.conf
  • Modifier comme suit :
server {
        listen 443 ssl http2;
        server_name api.yourdomain.com;

        # upload max size
        client_max_body_size 8m;

        # Include your SSL details here
        ssl_certificate /etc/letsencrypt/live/api.yourdomain.com/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/api.yourdomain.com/privkey.pem;

        location / {
                proxy_pass http://localhost:8055;
                proxy_set_header Host $host;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header REMOTE-HOST $remote_addr;
                add_header X-Cache $upstream_cache_status;

                proxy_connect_timeout 30s;
                proxy_read_timeout 86400s;
                proxy_send_timeout 30s;
                proxy_http_version 1.1;
                proxy_set_header Upgrade $http_upgrade;
                proxy_set_header Connection "upgrade";
        }

        access_log  /var/log/nginx/api.yourdomain.com.log;
        error_log  /var/log/nginx/api.yourdomain.com.error.log;
}

server {
    listen 80;
    server_name api.yourdomain.com;
    return 301 https://api.yourdomain.com$request_uri;
}
  • Sauvegarder et vérifier s'il n'y a pas d'erreurs :
sudo nginx -t
  • Redémarrer NGINX
sudo systemctl restart nginx

Vous devriez pourvoir accéder à votre api https://api.yourdomain.com, redirection vers https comprise ;)

  • Problème de renouvellement du certificat alors que Cerbot vous indique que celui-ci est bon (Certificate not yet due for renewal) :
sudo certbot renew --dry-run

Et ça devrait être bon ;)

Activer UFW

// todo

Envoyer les mails en SMTP

  • Mettre à jour les paquets disponibles :
sudo apt update
  • Installer Sendmail
sudo apt install sendmail
  • Vérifier que Sendmail est en cours d'exécution
sudo systemctl status sendmail
  • Modifier la configuration de votre fichier .env en suivant la documentation de Directus

  • Redémarrer votre instance Directus :

pm2 restart directus
  • Enfin, si ce n'est pas déjà fait, il faut demander auprès d'Hetzner de débloquer les ports qu'utilise sendmail (onglet Networking de votre serveur) :

Problèmes que vous pouvez rentrer

  • Problème de droits d'écriture sur le dossier uploads, exécuter la commande suivante adaptée à votre serveur :
sudo chown -R 1000:1000 /home/master/directus/uploads

Mettre à jour Directus

  • Stopper le serveur :
pm2 stop directus
  • Mettre à jour les paquets :
npm i --save directus@latest
  • Mettre à jour la base de données
npx directus database migrate:latest
  • Démarrer le serveur :
pm2 start directus

Enjoy ^^