Installation de Decidim sur un serveur Ubuntu 22.04

J'ai utilisé ces deux liens comme base documentaire que j'ai repris dans la majorité de ce tutoriel , n'hésitez pas à les parcourir :

J'ai également été sur le channel Matrix de Decidim https://matrix.to/#/#decidimdevs:matrix.org pour avoir de l'aide. N'hésitez pas à y faire un tour!

Ces instructions devraient fonctionner sur n'importe quelle installation propre d'Ubuntu 22.04. Mais je promets rien! J'ai essayé de lister toute les difficultés que j'ai rencontrées dans ce parcours du combattant donc j'espère que cela sera exhaustif. Après j'avoue que si vous avez déjà des notions de Ruby et Webpack, c'est un gros plus! Vous galérerez moins que moi 8-)

Des bases saines

Tout d'abord, mettons notre système à jour :

  sudo apt update
  sudo apt upgrade
  sudo apt autoremove

Maintenant, configurons le bon fuseau horaire pour notre serveur :

sudo dpkg-reconfigure tzdata

Ensuite, installons quelques paquets nécessaires :

sudo apt install autoconf bison build-essential libssl-dev libyaml-dev libreadline6-dev zlib1g-dev libncurses5-dev libffi-dev libgdbm-dev

Installons rbenv

  git clone https://github.com/rbenv/rbenv.git ~/.rbenv
  echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bashrc
  echo 'eval "$(rbenv init -)"' >> ~/.bashrc
  source ~/.bashrc

Puis installons ruby-build :

git clone https://github.com/rbenv/ruby-build.git ~/.rbenv/plugins/ruby-build

Nous allons utiliser la version 3.1.1 de Ruby pour Decidim 0.28 :

rbenv install 3.1.1
rbenv global 3.1.1

Ensuite, nous devons configurer Gem, le gestionnaire de paquets pour Ruby, après quoi nous serons prêts à installer Decidim. Pour configurer Gem, exécutons

echo "gem : --no-document" > ~/.gemrc
gem install bundler

Bien, maintenant que nous avons la configuration de base du serveur en place, la prochaine étape c'est d'installer Decidim.

Installation de Decidim

Decidim utilise Postgresql comme base de données SQL, nous allons donc l'installer. Même si votre base Postgre se trouve sur un autre serveur, il faut installer le paquet libpq-dev pour que Decidim fonctionne

sudo apt install -y postgresql libpq-dev

Nous avons également besoin d'imageMagick:

sudo apt install -y imagemagick libicu-dev

Decidim 0.28 nécessite NodeJS 18.17.xx , pour me faciliter l'installation de la version voulue j'ai utilisé Nodemanager

  curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.3/install.sh | bash
  source ~/.bashrc
  nvm install 18.17

Pour finir on installe Yarn (version >=1 et ⇐4, dans les dépôts d'Ubuntu 22.04 c'est une version 0.9x donc je passe par npm)

npm install --global yarn
yarn --version

On passe enfin à Decidim. Installez la gem Decidim (c'est long, c'est normal :-?) :

gem install decidim

Maintenant, lancez le générateur pour créer notre application :

decidim decidim-app

> Note : Si comme moi ce n'est pas votre premier essai, il se peut que la commande ci-dessus vous retourne une erreur du type “NameError: uninitialized constant Gem::BundlerVersionFinder”. Dans ce cas, faites “gem update –system” puis relancez la génération de l'application Decidim.

A ce stade, nous avons créé un nouveau dossier dans ~/decidim-app avec notre code. Nous devons maintenant configurer la base de données.

Pour ce faire, nous devons d'abord créer l'utilisateur et le mot de passe dans la base de données :

sudo -u postgres psql -c "CREATE USER decidim_app WITH SUPERUSER CREATEDB NOCREATEROLE PASSWORD 'TonbeaumotDEpasse'"

Une fois l'utilisateur créé, il est temps de configurer Decidim pour qu'il utilise ces informations d'identification.

Parce que nous ne voulons pas stocker directement ces données sensibles dans le code lui-même, nous allons utiliser un fichier YAML supplémentaire qui stockera tous les secrets en un seul endroit.

Afin de traduire ce fichier dans le système de configuration de Decidim, nous allons inclure la gemme Ruby “figaro” dans notre application pour s'en occuper.

Tout d'abord, allons dans le dossier de Decidim :

cd ~/decidim-app

Ensuite, éditons le fichier Gemfile :

nano Gemfile

Nous allons modifier ce fichier pour ajouter une section “production” avec nos gemmes supplémentaires, nous ajoutons cette ligne avant la première déclaration de groupe :

gem "figaro"

Et nous allons créer une autre section de groupe avec les paramètres de production qui installera également quelques gemmes supplémentaires nécessaires plus tard.

Ajoutez à la fin du fichier Gemfile :

  group :production do
    gem "passenger"
    gem 'delayed_job_active_record'
    gem "daemons"
  fin

Après cela, nous devons mettre à jour notre application pour inclure les gemmes supplémentaires, exécutons la commande suivante (dans le dossier de l'application) :

bundle install

Maintenant, il est temps de créer le fichier de configuration avec nos valeurs personnalisées. Nous avons déjà les identifiants de la base de données (nous avons créé l'utilisateur auparavant) et nous avons besoin d'une chaîne aléatoire qui sera utilisée par Decidim pour crypter les cookies et d'autres éléments de sécurité.

Générons une chaîne aléatoire en exécutant la commande rake secret dans le dossier de l'application :

cd ~/decidim-app
rake secret

Copions la chaîne générée et créez un nouveau fichier de configuration :

nano ~/decidim-app/config/application.yml

Collons à l'intérieur ce contenu :

DATABASE_URL : postgres://decidim_app:Password1@localhost/decidim_prod

SECRET_KEY_BASE: LaChaineGénéréeJusteAvantAvecLaCommandeRakeSecret

Maintenant, par sécurité, incluons ce fichier dans le fichier .gitignore, au cas où on pousse tout ça sur GIT.

echo "/config/application.yml" >> ~/decidim-app/.gitignore

Il est de temps de créer la base de données.

  cd ~/decidim-app
  bin/rails db:create RAILS_ENV=production
  bin/rails assets:precompile db:migrate RAILS_ENV=production
Note: Ca c'est quand tout va bien car la dernière commande n'a pas fonctionné comme attendu pour moi. Je n'avais pas la bonne version de Yarn (je l'ai déjà mentionné avant au moment de l'installation de Node) et ensuite j'ai du passer la commande :
bin/rails decidim:upgrade

J'ai refait à nouveau la commande

  bin/rails assets:precompile db:migrate RAILS_ENV=production

Et une nouvelle erreur de compilation Webpack est survenue “Error: No PostCSS config found”. J'ai donc crée un fichier postcss.config.js

nano ~/decidim-app/postcss.config.js

Et j'ai mis ça dans le fichier postcss.config.js.

module.exports = {
  syntax: 'postcss-scss',
  plugins: [
    // postcss-import must be the very first plugin https://tailwindcss.com/docs/using-with-preprocessors#build-time-imports
    require('postcss-import'),
    require('tailwindcss'),
    require('postcss-flexbugs-fixes'),
    require('postcss-preset-env')({
      autoprefixer: {
        flexbox: 'no-2009'
      },
      stage: 3
    }),
    require('autoprefixer')
  ]
}

Finalement, la commande est bien passé cette fois

bin/rails assets:precompile db:migrate RAILS_ENV=production

Il est temps de créer maintenant un admin en base de donnée, pour cela on utilise la console Decidim Rails

bin/rails console -e production

Un nouveau prompt apparaît, il faut copier ces 4 lignes d'un bloc (en mettant vos valeurs bien sûr) et faisons ensuite “Entrée”.

email = "my-admin@email"
password = "<TonMotDePasse>"
user = Decidim::System::Admin.new(email: email, password: password, password_confirmation: password)
user.save!

Il suffit de taper “quit” pour quitter le prompt.

Installation de Nginx et Passenger

Maintenant que Decidim semble en place, il faut passer au serveur web qu'il faudra installer avec Passenger car Nginx ne prend pas en charge Ruby nativement.

Nginx

C'est la partie simple que vous devez déjà connaître ;-)

sudo apt install nginx

Et on autorise le trafic web du firewall

sudo ufw allow http
sudo ufw allow https

Passenger

Vous trouverez plein d'infos ici –> https://www.phusionpassenger.com/library/walkthroughs/deploy/ruby/ownserver/nginx/oss/bionic/install_passenger.html mais pour résumer l'installation se fait avec ces commandes

sudo apt install -y dirmngr gnupg
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 561F9B9CAC40B2F7
sudo apt install -y apt-transport-https ca-certificates
sudo sh -c 'echo deb https://oss-binaries.phusionpassenger.com/apt/passenger focal main > /etc/apt/sources.list.d/passenger.list'
sudo apt update
sudo apt install -y libnginx-mod-http-passenger

Ensuite nous activons Passenger et relançons Nginx

if [ ! -f /etc/nginx/modules-enabled/50-mod-http-passenger.conf ]; then sudo ln -s /usr/share/nginx/modules-available/mod-http-passenger.load /etc/nginx/modules-enabled/50-mod-http-passenger.conf ; fi
sudo service nginx restart

Pour vérifier l'installation de Passenger on passe cette commande:

passenger-config validate-install

On a une réponse avec un warning signalant 2 installations de Passenger comme ceci

ubuntu@ns322222561:~$ passenger-config validate-install
What would you like to validate?
Use <space> to select.
If the menu doesn't display correctly, press '!'
 
 ‣ ⬢  Passenger itself
   ⬡  Apache
 
-------------------------------------------------------------------------
 
 * Checking whether this Passenger install is in PATH... ✓
 * Checking whether there are no other Passenger installations... (!)
 
   You are currently validating against Phusion Passenger(R) 6.0.20, located in:
 
     /home/ubuntu/.rbenv/versions/3.1.1/lib/ruby/gems/3.1.0/gems/passenger-6.0.20/bin/passenger
 
   Besides this Passenger installation, the following other
   Passenger installations have also been detected:
 
     /usr/bin/passenger
 
   Please uninstall these other Passenger installations to avoid
   confusion or conflicts.
 
 
Detected 0 error(s), 1 warning(s).

On va donc vérifier que nous utilisons bien la bonne configuration en faisant

sudo nano /etc/nginx/conf.d/mod-http-passenger.conf

Et on vérifie que la ligne passenger_ruby pointe bien vers notre .rbenv dans mon cas ça donne ceci

### Begin automatically installed Phusion Passenger config snippet ###
passenger_root /usr/lib/ruby/vendor_ruby/phusion_passenger/locations.ini;
passenger_ruby /home/chezmoi/.rbenv/shims/ruby;   <<< CETTE LIGNE!!

passenger_instance_registry_dir /var/run/passenger-instreg;

### End automatically installed Phusion Passenger config snippet ###

On fait ensuite un configuration Nginx pour Decidim

sudo nano /etc/nginx/sites-enabled/decidim.conf

Et on colle cette configuration ultra simple qui servira pour tester (qui ne suffira pas pour la production mais c'est pas le but de ce tutoriel ;-))

server {
    listen 80;
    listen [::]:80 ipv6only=on;

    server_name my-chezmoi.org;
    client_max_body_size 32M;

    passenger_enabled on;
    passenger_ruby /home/chezmoi/.rbenv/shims/ruby;

    rails_env    production;
    root         /home/chezmoi/decidim-app/public;
}

Un dernier restart de Nginx

sudo service nginx restart

Normalement vous pouvez accéder à Decidim !!

Note: Ce nest pas mon cas car j'ai eu une erreur Passenger dans les logs de Nginx au redémarrage du service…
PassengerAgent: error while loading shared libraries: libcrypto.so.1.1: cannot open shared object file: No such file or directory

J'ai du installer la librairie libssl1.1_1.1.1f-1ubuntu2.22_amd64.deb présente ici http://nz2.archive.ubuntu.com/ubuntu/pool/main/o/openssl/libssl1.1_1.1.1f-1ubuntu2.22_amd64.deb

Puis j'ai eu une seconde erreur

Error opening '/home/ubuntu/decidim-app/Passengerfile.json' for reading: Permission denied (errno=13); This error means that the Nginx worker process (PID 41075, running as UID 33) does not have permission to access this file. Please read this page to learn how to fix this problem: https://www.phusionpassenger.com/library/admin/nginx/troubleshooting/?a=upon-accessing-the-web-app-nginx-reports-a-permission-denied-error;

Problème corrigé en donnant les bonnes permissions au dossier pour que le worker Nginx puisse y accéder

sudo chmod g+x,o+x /home/chezmoi/decidim-app

Pour finir j'ai installé Certbot pour avoir du https et voici maintenant mon fichier de configuration Nginx pour Decidim

server {
 
    server_name decidim.craac.org;
    client_max_body_size 32M;
 
    passenger_enabled on;
    passenger_ruby /home/ubuntu/.rbenv/shims/ruby;
 
    rails_env    production;
    root         /home/ubuntu/decidim-app/public;
 
    listen [::]:443 ssl ipv6only=on; # managed by Certbot
    listen 443 ssl; # managed by Certbot
    ssl_certificate /etc/letsencrypt/live/decidim.craac.org/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/decidim.craac.org/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
 
}
server {
    if ($host = decidim.craac.org) {
        return 301 https://$host$request_uri;
    } # managed by Certbot
 
    listen 80;
    listen [::]:80 ipv6only=on;
 
    server_name decidim.craac.org;
    return 404; # managed by Certbot
}

J'ai maintenant accès ENFIN à la page d'administration

C'était dur mais on l'a fait!

installer_decidim_sur_un_serveur_ubuntu_22.04.txt · Dernière modification : 2024/03/24 14:25 de siick