Mobilizon


Mobilizon est un logiciel actuellement en cours de développement par Framasoft.
Il permettra à chaque organisation ou individu de proposer sa propre plateforme de gestion d'évènements, afin de mieux s’émanciper des géants du web.

Il sera possible de :

  • Publier des évènements
  • Créer des groupes
  • Dialoguer par messagerie
  • Avoir plusieurs identités avec un seul compte
  • Fédérer plusieurs instances Mobilizon pour échanger avec d’autres instances, afficher plus d’événements que juste ceux de son instance et favoriser les interactions

Mobilizon est un logiciel éthique permettant de s'émanciper de Facebook, Meetup, Eventbrite... Il respecte la vie privée et les données personnelles de ses utilisateurs.

L'association Défis est actuellement en train de tester la version Beta du service, disponible ici.

L'enssemble de nos services se trouve derrière un reverse proxy Nginx. Le fichier de configuration ngnix du container sur lequel est installé Mobilizon est minimaliste. Le fichier de configuration principal, bien plus complet, se trouve en effet au sein du container du reverse proxy.
Les deux fichiers de conf dont on a besoin sont les suivants :


server {
    if ($host = mobilizon.defis.info) {
        return 301 https://$host$request_uri;
    } # managed by Certbot

    server_name mobilizon.defis.info;

    listen [::]:80;
    listen 80;
    return 404; # managed by Certbot

}

server {
    server_name mobilizon.defis.info;

    listen [::]:443 ssl http2; # managed by Certbot
    listen 443 ssl http2; # managed by Certbot
    ssl_session_timeout 5m;
    ssl_certificate /etc/letsencrypt/live/mobilizon.defis.info/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/mobilizon.defis.info/privkey.pem; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot

# Add TLSv1.3 if it's supported by your system
     ssl_protocols TLSv1.2;
     ssl_ciphers 'EECDH+aRSA+AESGCM:EECDH+aRSA+SHA384:EECDH+aRSA+SHA256:EECDH:+CAMELLIA256:+AES256:+CAMELLIA128:+AES128:+SSLv3:!aNULL:!eNULL:!LOW:!3DES:!MD5:!EXP:!PSK:!DSS:!RC4:!SEED:!ECDSA';
     ssl_prefer_server_ciphers on;
     ssl_ecdh_curve prime256v1;
     # ssl_ecdh_curve X25519:prime256v1:secp384r1:secp521r1;
     ssl_stapling on;
     ssl_stapling_verify on;

     gzip on;
     gzip_disable "msie6";
     gzip_vary on;
     gzip_proxied any;
     gzip_comp_level 6;
     gzip_buffers 16 8k;
     gzip_http_version 1.1;
     gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript application/activity+json application/atom+xml;

     # the nginx default is 1m, not enough for large media uploads
     client_max_body_size 16m;

     # Let's Encrypt keeps its files here
     location ^~ '/.well-known/acme-challenge' {
         root /var/www/certbot;
         default_type "text/plain";
     }
     location / {
         gzip off;
         proxy_http_version 1.1;
         proxy_set_header X-Real-IP $remote_addr;
         proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

         # For Websocket support
         proxy_set_header Upgrade $http_upgrade;
         proxy_set_header Connection "upgrade";
         proxy_set_header Host $http_host;

         proxy_redirect off;

         proxy_pass http://XXX.XXX.XXX.XXX:4000;

         client_max_body_size 16m;
     }

}



server {
    server_name    mobilizon.defis.info;

    listen         80;
    listen         [::]:80;
    location ~* \.(css|js)$ {
        root /home/mobilizon/live/priv/static;
        etag off;
        expires 1y;
        access_log off;
        add_header Cache-Control public;
    }
}


Mise en place

Prérequis


  • Un ordinateur fonctionnant sous Linux machine avec les droits d'accès Root
  • Un nom de domaine ou sous-domaine réservé au service mobilizon, par exemple votre-mobilizon.domaine.fr
  • Un serveur SMTP pour envoyer les emails

Préparations des dépendances


Mobilizon étant actuelement encore en Bêta, certaines dépendances vont très certainement changer. Nous vous renvoyons donc sur la page d'installation des dépendances du site internet de Mobilizon.

Préparatifs


Nous avons besoin d'un utilisateur dédié au service mobilizon que nous appelons mobilizon et dont le dossier utilisateur sera /home/mobilizon :

sudo adduser --disabled-login mobilizon

Connectons nous en tant que l'utilisateur précédement créé :

sudo -i -u mobilizon

Commençons par cloner le dépôt dans un répertoire nommé live avant de nous déplacer dans ce dernier :

git clone https://framagit.org/framasoft/mobilizon live && cd live

Installation des dépendances


Installation des dépendancees Elexir :

mix deps.get

Si vous vous retrouvez face à une erreur similaire à celle-ci :

warning: the VM is running with native name encoding of latin1 which may cause Elixir to malfunction as it expects utf8. Please ensure your locale is set to UTF-8 (which can be verified by running "locale" in your shell)

Vous devez changer l'encodage de caractère de votre distribution linux, pour ce faire, lancez la commande suivante :

dpkg-reconfigure locales

Vous vous retrouverez alors face à une interface similaire :

image Capture_du_20200723_144336.png (30.6kB)
















Appuyez alors sur la touche "Entrée" :

image Capture_du_20200723_144513.png (26.7kB)
















Déplacez vous dans ce menu à l'aides des touches fléchées, et trouvez l'option "fr_FR.UTF-8 UTF-8" à l'aide de la touche "Espace". Une fois ceci fait, appuez sur la touche "Tabulation", puis sur la touche "Entrée" à deux reprises :

image Capture_du_20200723_144811.png (28.3kB)
















Vous arriverez alors sur cette interface :

image Capture_du_20200723_145238.png (14.4kB)
















Selectionez "fr_FR.UTF-8", déplacez vous sur "Ok" et appuyez sur la touche "entrée".
Lorsque l'on vous demande "Shall I install Hex ?", appuyez sur la touche entrée pour confirmer.
Maintenant, compilez ces dépendances et Mobilizon (cela peut prendre quelques minutes et peut produire toutes sortes d'avertissements, tels que les problèmes de dépréciation) :

MIX_ENV=prod mix compile

Rendez vous maintenant dans le répertorie js :

cd js

Et installez les dépendances Javascript :

yarn install

Nous pouvont désormais générer le front-end du service :

Attention ! La compilation du front-end peut consommer jusqu'à 512 Mo de RAM par défaut. Si cela ne correspond pas à votre configuration, vous pouvez ajuster la mémoire maximale utilisée en utilisant la commande suivante :

NODE_OPTIONS=--max_old_space_size=4096

Retournez désormais dans le répertoire principal :

cd ..

Configuration

Avant goût


Mobilizon fournit un outil en ligne de commande pour générer la configuration

MIX_ENV=prod mix mobilizon.instance gen

Lorsque l'on vous demande "Shall I install Shall I install rebar3 ?", appuyez sur la touche entrée pour confirmer.
Des questions vous seront posées sur votre configuration et votre instance pour générer un fichier "prod.secret.exs" dans le dossier "config/", et un fichier "setup_db.psql" pour configurer la base de données :

  • What domain will your instance use? (e.g mobilizon.org) : entrez le nom de domaine de votre instance Mobilizon
  • What is the name of your instance? (e.g. Mobilizon) : entrez le nom que vous souhaitez donner à votre instance Mobilizon
  • What's the address email will be send with? : entrez l'adresse mail à laquelle vous recevrez les informations
  • What is the hostname of your database? : entrez le nom d'hôte de votre service Mobilizon
  • What is the name of your database? : entrez le nom que vous assignerez à votre future base de donnée (eg mobilizon_prod)
  • What is the user used to connect to your database? : entrez le nom de l'utilisateur qui se connectera à la base de donnée (eg localhost)
  • What is the password used to connect to your database? : entrez le mot de passe de l'utilisateur qui se connectera à la base de donnée (eg autogenerated (autogénéré))
  • What port will the app listen to (leave it if you are using the default setup with nginx)? : entrez le port que le service mobilizon utilisera pour recevoir les requêtes. Si vous utilisez la configuration par défaut de nginx, appuyez sur entrée pour utiliser le port 4000

Configuration de la base de données


Le fichier setup_db.psql contient des instructions SQL pour créer un utilisateur et une base de données PostgreSQL avec les informations d'identification choisies et ajouter les extensions requises à la base de données Mobilizon.

Quittez l'exécution en tant qu'utilisateur mobilizon via la commande exit (car il ne devrait pas avoir les droits root/sudo) et exécutez dans le répertoire /home/mobilizon/live la commande suivante :

sudo -u postgres psql -f setup_db.psql

La commande devrait retourner quelque chose comme ceci :

CREATE ROLE
CREATE DATABASE
You are now connected to database "mobilizon_prod" as user "postgres".
CREATE EXTENSION
CREATE EXTENSION
CREATE EXTENSION

Reconnectez vous à l'utilisateur mobilizon via la commande :

sudo -i -u mobilizon

et placez vous dans le dossier live :

sudo -i -u mobilizon
cd live


Puis, suprimez le fichier intitulé "setup_db.psql" :

rm setup_db.psql

Migration de la base de données


Lancez la commande :

MIX_ENV=prod mix ecto.migrate

Remarquez ce préfixe "MIX_ENV=prod" devant la commande mix. Vous devrez l'employer comme préfixe à chaque commande mix à l'avenir.
Vous aurez à effectuer cette commande après la majorité des mises à jours.

Si certaines migrations échouent, cela signifie probablement que vous n'utilisez pas une version suffisamment récente de PostgreSQL, ou que vous n'avez pas installé les extensions requises.
Déconectez vous de nouveau de l'utilisateur mobilizon via la commande:

exit

Systemd


Systemd


Copiez le fichier ce trouvant dans support/systemd/mobilizon.service vers le répertoire /etc/systemd/system :

sudo cp support/systemd/mobilizon.service /etc/systemd/system/

Relancez Systemd pour qu'il détecte votre nouveau fichier :

sudo systemctl daemon-reload

Et activez le service Mobilizon :

systemctl enable --now mobilizon.service

La commande précédente lancera Mobilizon au démarage.

Vous pouvez suivre les logs avec la commande suivante :

sudo journalctl -fu mobilizon.service

Vous devriez voir apparaitre quelque-chose comme ceci parmis les logs :

Running Mobilizon.Web.Endpoint with cowboy 2.8.0 at :::4000 (http)
Access Mobilizon.Web.Endpoint at https://your-mobilizon-domain.com

Le serveur Mobilizon est actif sur le port 4000 seulement sur l'interface locale. Il est alors necessaire d'ajouter un reverse proxy, dont la configuration et la procédure de déploiment est détaillée ci-dessous.

Nginx

La configuration qui vous est présentée ici est celle du service Mobilizon de Défis, installé au sein d'un conteneur qui se trouve derrière un Reverse Proxy qui se trouve dans un autre conteneur, tous les deux gérés par le système de virtualisation Proxmox.

Configuration du Reverse Proxy Nginx


Nous nous connectons au conteneur du Reverse Proxy Nginx.
Afin de créer le fichier de configuration du reverse proxy menant vers Mobilizon nous nous plaçons dans le répertoire /etc/nginx/sites-available/ afin d'y trouver notre fichier modèle contenu modele_avant_certbot.conf :


server {
    location / {
        include proxy_params;
        proxy_pass http://XXX.XXX.XXX.XXX;
    }
    server_name container.defis.info;
    listen [::]:80;
    listen 80;
}


Nous copions et renomons ce fichier de configuration qui va servir de base à la construction du fichier de configuration du service :

cp modele_avant_certbot.conf mobilizon.defis.info.conf

Puis nous créons un lien symbolique vers le répertoire /etc/nginx/sites-enabled/ :

ln -s /etc/nginx/sites-available/mobilizon.defis.info.conf /etc/nginx/sites-enabled/mobilizon.defis.info.conf'

Nous testons la validité de la syntaxe du fichier de configuration grâce à la commande suivante :

nginx -t

Si la commande renvoie quelque chose de similaire, notre fichier de configuration est valide :

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

Nous redémarrons nginx afin que les modifications soient prisent prises en compte :

service nginx restart


Afin de sécuriser les connexion entre l'utilisateur et le service Mobilizon, nous utilisons Certbot afin de générer un ceritficat TLS, le sucesseur du SSL :

certbot --nginx -d mobilizon.defis.info

À la fin de cette commande, il est demandé si nous souhaitons forcer la redirection vers le protocole TLS. Nous choisissons de forcer la redirection (l'option numéro 2).

Voici alors le contenu du fichier de configuration mobilizon.defis.info.conf après l'execution de certbot :



server {
    if ($host = mobilizon.defis.info) {
        return 301 https://$host$request_uri;
    } # managed by Certbot

    server_name mobilizon.defis.info;
    
    listen [::]:80;
    listen 80;
    return 404; # managed by Certbot
}

server {
    server_name mobilizon.defis.info;

    listen [::]:443 ssl; # managed by Certbot
    listen 443 ssl; # managed by Certbot
    ssl_certificate /etc/letsencrypt/live/wiki.defis.info/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/wiki.defis.info/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
    
    location  / {
        include proxy_params;
        proxy_pass http://XXX.XXX.XXX.XXX;
    }
    
}



Cette procédure est la même pour l'installation de presque tous nos services sur notre infrastructure.


En nous basant sur les informations du site joinmobilizon.org, nous modifions ce fichier de configuration à l'aide de la commande suivante :

nano mobilizon.defis.info.conf

afin d'obtenir le fichier suivant :


server {
    if ($host = mobilizon.defis.info) {
        return 301 https://$host$request_uri;
    } # managed by Certbot

    server_name mobilizon.defis.info;

    listen [::]:80;
    listen 80;
    return 404; # managed by Certbot

}

server {
    server_name mobilizon.defis.info;

    listen [::]:443 ssl http2; # managed by Certbot
    listen 443 ssl http2; # managed by Certbot
    ssl_session_timeout 5m;
    ssl_certificate /etc/letsencrypt/live/mobilizon.defis.info/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/mobilizon.defis.info/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

# Add TLSv1.3 if it's supported by your system
     ssl_protocols TLSv1.2;
     ssl_ciphers 'EECDH+aRSA+AESGCM:EECDH+aRSA+SHA384:EECDH+aRSA+SHA256:EECDH:+CAMELLIA256:+AES256:+CAMELLIA128:+AES128:+SSLv3:!aNULL:!eNULL:!LOW:!3DES:!MD5:!EXP:!PSK:!DSS:!RC4:!SEED:!ECDSA';
     ssl_prefer_server_ciphers on;
     ssl_ecdh_curve prime256v1;
     # ssl_ecdh_curve X25519:prime256v1:secp384r1:secp521r1;
     ssl_stapling on;
     ssl_stapling_verify on;

     gzip on;
     gzip_disable "msie6";
     gzip_vary on;
     gzip_proxied any;
     gzip_comp_level 6;
     gzip_buffers 16 8k;
     gzip_http_version 1.1;
     gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript application/activity+json application/atom+xml;

     # the nginx default is 1m, not enough for large media uploads
     client_max_body_size 16m;

     # Let's Encrypt keeps its files here
     location ^~ '/.well-known/acme-challenge' {
         root /var/www/certbot;
         default_type "text/plain";
     }
     location / {
         gzip off;
         proxy_http_version 1.1;
         proxy_set_header X-Real-IP $remote_addr;
         proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

         # For Websocket support
         proxy_set_header Upgrade $http_upgrade;
         proxy_set_header Connection "upgrade";
         proxy_set_header Host $http_host;

         proxy_redirect off;

         proxy_pass http://XXX.XXX.XXX.XXX:4000;

         client_max_body_size 16m;
     }

#     location ~* \.(css|js)$ {
#         root /home/mobilizon/live/priv/static;
#         etag off;
#         expires 1y;
#         access_log off;
#         add_header Cache-Control public;
#     }

}



Nous vérifions la syntaxe du fichier de configuration :

nginx -t

Si la commande renvoie quelque chose de similaire, notre fichier de configuration est valide :

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful


Redémarrons le Reverse Proxy Nginx afin que les modifications soient prises en compte.

Configuration du serveur WEB Nginx


Vous avez peut-être remarqué que cette partie
# location ~* \.(css|js)$ { # root /home/mobilizon/live/priv/static; # etag off; # expires 1y; # access_log off; # add_header Cache-Control public; # }
est commentée.
C'est la partie qui doit être explicité dans le fichier de configuration du serveur web Nginx du conteneur du service mobilizon (et non dans le fichier de configuration du Reverse Proxy Nginx).

Aussi, dans le conteneur sur lequel est installé l'instance de Mobilizon, nous créons et éditons le fichier de configuration du
seveur web Nginx :

nano /etc/nginx/sites-available/mobilizon.conf

Pour y ajouter la configuration suivante :


server {
    server_name    mobilizon.defis.info;

    listen         80;
    listen         [::]:80;
    location ~* \.(css|js)$ {
        root /home/mobilizon/live/priv/static;
        etag off;
        expires 1y;
        access_log off;
        add_header Cache-Control public;
    }
}


Nous créons un lien symbolique vers le répertoire /etc/nginx/sites-enabled/ :

ln -s /etc/nginx/sites-available/mobilizon.conf /etc/nginx/sites-enabled/mobilizon.conf'

Nous vérifions la syntaxe du fichier de configuration :

nginx -t

Si la commande renvoie quelque chose de similaire, notre fichier de configuration est valide :

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful


Redémarrons le serveur web Nginx afin que les modifications soient prises en compte :

service nginx restart


Utilisateurs

Créez votre premier utilisateur


Reconnectez vous à l'identifiant mobilizon :

sudo -i -u mobilizon

Déplacez vous dans le répertoire live :

cd live

Puis créez un nouvel utilisateur administrateur :

MIX_ENV=prod mix mobilizon.users.new "votre@email.com" --admin --password "votre_mot_de_passe"

Attention ! n'oubliez pas de rajouter un espace devant la commande afin que le mot de passe que vous venez d'associer à votre utilisateur administrateur ne soit pas conservé dans l'historique de votre terminal.
Vous pouvez ignorer l'option --password, Mobilizon vous en générera alors un.
Si tout fonctionne correctement, vous pourrez retrouver votre interface Mobilizon en entrant votre Adresse IP ou nom de domaine dans votre barre d'URL, pour ensuite vous y connecter avec vos identifiants nouvellement créés.

SMTP

Configuration SMTP


Mobilizon considère par défaut qu'il existe un serveur SMTP en local qui écoute sur le port 25. Pour spécifier un serveur SMTP spécifique, il faut éditer le fichier /home/mobilizon/live/config/prod.secret.exs et ajouter à la fin, en fonction de votre propre serveur SMTP, quelque chose ressemblant à ceci :

config :mobilizon, Mobilizon.Web.Email.Mailer,
  adapter: Bamboo.SMTPAdapter,
  server: "localhost",
  hostname: "localhost",
  port: 25,
  username: nil,
  password: nil,
  # can be `:always` or `:never`
  tls: :if_available,
  allowed_tls_versions: [:tlsv1, :"tlsv1.1", :"tlsv1.2"],
  # can be `true`
  ssl: false,
  retries: 1,
  # can be `true`
  no_mx_lookups: false,
  # can be `:always`. If your smtp relay requires authentication set it to `:always`.
  auth: :if_available

Pour nous, cela donne :

config :mobilizon, Mobilizon.Web.Email.Mailer,
  adapter: Bamboo.SMTPAdapter,
  server: "ssl0.ovh.net",
  hostname: "mobilizon.defis.info",
  port: 587,
  username: "mobilizon@defis.info",
  password: "*****",
  tls: :always,
  allowed_tls_versions: [:tlsv1, :"tlsv1.1", :"tlsv1.2"],
  retries: 1,
  no_mx_lookups: false,
  auth: :always


Il faut ensuite redémarrer Mobilizon pour recompiler le service et appliquer les nouveaux paramètres :

sudo systemctl restart mobilizon

Geolocalisation


Mobilizon peut utiliser la géolocalisation à partir de données au format MMDB provenant de sources telles que les bases de données MaxMind GeoIP ou db-ip.com. Cela permet d'afficher les événements se déroulant à proximité de l'endroit où se trouve l'utilisateur.

Vous devrez télécharger la base de données de la ville et la placer dans priv/data/GeoLite2-City.mmdb.

Pour que les moidifications prennent effet, redémarer le service Mobilizon :

sudo systemctl restart mobilizon.service

Mobilizon n'affiche un avertissement au démarrage que si la base de données est manquante, mais qu'elle n'est pas requise.