Stage 2 : Vikunja

DGA MI - PĂŽle Sup de La Salle

📜 Introduction aux Scripts d'Exploitation

Afin de simplifier le déploiement et la maintenance quotidienne de l'instance Vikunja, j'ai conçu et rédigé un ensemble de 7 scripts d'automatisation Bash. Ces scripts permettent de s'affranchir de la saisie manuelle des commandes Podman.

🚀 1. Automatisation de l'Installation

Le script ./install_start.sh automatise la création de l'infrastructure complÚte. Il configure l'environnement (réseaux, volumes) et provisionne les services en une seule exécution.

📂 Voir le code source : install_start.sh
#!/bin/bash
#!/bin/bash

set -eu

# --- CONFIGURATION ---

echo ""
echo " --- Configuration des paramĂštres de Globaux --- "
echo ""

IP_VM=`ip route get 1.2.3.4 | awk '{print $7}'`	# L'adresse IP de votre machine linux hébergeur
read -p "L'ip utilisĂ© va ĂȘtre celle-ci : ${IP_VM}. Voulez vous la modifier ? (o/n) " -n 1 -r
echo
if [[ $REPLY =~ ^[Oo]$ ]]
then
	read -p "Entrez l'adresse IP de votre machine linux hébergeur au format X.X.X.X : "
	IP_VM=$REPLY
fi

echo ""
read -sp "Entrez le mot de passe Root de MariaDB sans espace : "
DB_ROOT_PASS=$REPLY				# Mot de passe Root de MariaDB
echo ""
read -sp "Entrez le Mot de passe Utilisateur de Vikunja sans espace : "
DB_USER_PASS=$REPLY				# Mot de passe Utilisateur Vikunja
echo ""
echo ""
read -p "Entrez le Nom de votre image MariaDb avec la version donnée dans podman images (ex : mariadb:11.4) : "
IMG_MARIADB=$REPLY				# Nom de votre image MariaDB (A retenir afin de le réutiliser dans les autres scripts)
read -p "Entrez le Nom de votre image MariaDb avec la version donnée dans podman images (ex : vikunja:latest) : "
IMG_VIKUNJA=$REPLY				# Nom de votre image MariaDB (A retenir afin de le réutiliser dans les autres scripts)

# --- Démmarage de l'application ---

echo ""
echo "--- Démarrage du déploiment de Vikunja ---"
echo ""
# 1. Création du réseau (ne fait rien s'il existe déjà)
podman network exists vikunja-net || podman network create vikunja-net
echo "Réseau vérifié."
echo ""

# 2. Création des volumes (ne fait rien s'ils existent déjà)
podman volume inspect vikunja_db_data >/dev/null 2>&1 || podman volume create vikunja_db_data
podman volume inspect vikunja_db_files >/dev/null 2>&1 || podman volume create vikunja_db_files
echo "Volumes vérifiés."
echo ""

# 3. Lancement de MariaDB
# Note : On supprime l'ancien conteneur s'il existe, meme arrĂȘtĂ©, pour Ă©viter les conflits de noms
podman rm -f vikunja_db >/dev/null 2>&1 || true

echo "Lancement de la base de données ..."
podman run --privileged -d \
  --name vikunja-db \
  --network vikunja-net \
  -v vikunja_db_data:/var/lib/mysql:Z \
  -e MYSQL_ROOT_PASSWORD=${DB_ROOT_PASS} \
  -e MYSQL_USER=vikunja \
  -e MYSQL_PASSWORD=${DB_USER_PASS} \
  -e MYSQL_DATABASE=vikunja \
  ${IMG_MARIADB}

#on attend quelques secondes que la db soit prĂȘte avant de lancer l'app
sleep 20

# 4. Lancement de Vikunja

echo ""
echo " --- Configuration des paramĂštres de Vikunja --- "

podman rm -f vikunja >/dev/null 2>&1 || true

# Valeur par défault pour la création de compte depuis la page login : false
OPT_CREATE="-e VIKUNJA_SERVICE_ENABLEREGISTRATION=false"

echo ""
read -p "Voulez-vous autoriser n'importe quelle personne à créer un compte en se rendant sur la page de login de votre vikunja ? (o/n) " -n 1 -r
echo
if [[ $REPLY =~ ^[Oo]$ ]]
then
	# Valeur par défault pour la création de compte depuis la page login : true
	OPT_CREATE="-e VIKUNJA_SERVICE_ENABLEREGISTRATION=true"
fi

echo ""
echo "Lancement de Vikunja ..."
podman run -d \
  --name vikunja \
  --network vikunja-net \
  -p 3456:3456 \
  -v vikunja_db_files:/app/vikunja/files:Z \
  -e XDG_CACHE_HOME=/app/vikunja/files/.cache \
  -e VIKUNJA_DATABASE_HOST=vikunja-db \
  -e VIKUNJA_DATABASE_PASSWORD=${DB_USER_PASS} \
  -e VIKUNJA_DATABASE_TYPE=mysql \
  -e VIKUNJA_DATABASE_USER=vikunja \
  -e VIKUNJA_SERVICE_PUBLICURL=http://${IP_VM}:3456/ \
  ${OPT_CREATE} \
  -e VIKUNJA_AUTH_LDAP_ENABLED=false \
  -e VIKUNJA_AUTH_LDAP_HOST=pc.active.directory \
  -e VIKUNJA_AUTH_LDAP_PORT=389 \
  -e VIKUNJA_AUTH_LDAP_USETLS=false \
  -e VIKUNJA_AUTH_LDAP_VERIFYTLS=false \
  -e VIKUNJA_AUTH_LDAP_BINDDN="CN=svc-compte",OU=Utilisateurs,DC=active,DC=directory" \
  -e VIKUNJA_AUTH_LDAP_BINDPASSWORD=mdp_scv-compte \
  -e VIKUNJA_AUTH_LDAP_BASEDN="DC=active,DC=directory" \
  -e VIKUNJA_AUTH_LDAP_USERFILTER="(&(objectClass=user)(sAMAccountName=%[1]s))" \
  -e VIKUNJA_AUTH_LDAP_ATTRIBUTE_USERNAME=sAMAccountName \
  -e VIKUNJA_AUTH_LDAP_ATTRIBUTE_MAIL=mail \
  -e VIKUNJA_AUTH_LDAP_GROUPSYNCENABLED=true \
  -e VIKUNJA_AUTH_LDAP_GROUPSYNCFILTER="(objectClass=group)" \
  -e VIKUNJA_SERVICE_LOGLEVEL=DEBUG \
  ${IMG_VIKUNJA}

echo ""
echo "Terminé ! Vikunja est accessible sur : "
echo " --- http://${IP_VM}:3456 ---"
echo ""

🔄 2. Gestion de l'État du Service

Ces scripts manipulent les conteneurs existants sans affecter les données. Ils se basent sur les noms de conteneurs par défaut définis lors de l'installation.

Script Action Usage
Démarrage Lance les conteneurs MariaDB et Vikunja. ./start.sh
ArrĂȘt Stoppe proprement les services. ./stop.sh
Redémarrage Relance les services (utile aprÚs une modif de conf). ./restart.sh
📂 Voir le code source : start.sh
#!/bin/bash
#!/bin/bash

set -eu

echo "Démarrage des services Vikunja ..."
podman start vikunja-db

#on attend quelques secondes que la db soit prĂȘte avant de lancer l'app
sleep 20

podman start vikunja
echo "Services démmarés."
📂 Voir le code source : stop.sh
#!/bin/bash
#!/bin/bash

set -eu

echo "Arret des services Vikunja ..."
podman stop vikunja
podman stop vikunja-db
echo "Services arrĂȘtĂ©s"
📂 Voir le code source : restart.sh
#!/bin/bash
#!/bin/bash

set -eu

echo "Redémarrage des services ..."
podman restart vikunja-db

#on attend quelques secondes que la db soit prĂȘte avant de relancer l'app
sleep 20

podman restart vikunja
echo "Redémarrage terminé."

đŸ§č 3. Maintenance et Nettoyage

Deux scripts distincts permettent de nettoyer l'environnement selon le besoin :

Suppression des conteneurs

Exécution : ./remove.sh

Supprime les instances MariaDB et Vikunja (mĂȘme actives).

Sécurité : Les volumes (BDD et fichiers) et le réseau Podman sont conservés. Idéal pour appliquer une mise à jour d'image sans perte de données.

Suppression totale

Exécution : ./purge_data.sh

Réinitialise complÚtement l'environnement Podman.

⚠ Risque : Supprime le rĂ©seau, les conteneurs ET les volumes de donnĂ©es. À utiliser uniquement pour repartir totalement de zĂ©ro.

📂 Voir le code source : remove.sh
#!/bin/bash
#!/bin/bash

set -eu

echo "Supression des conteneurs vikunja (Les données sont conservées) ..."

#ArrĂȘt forcĂ© et supression
podman rm -f vikunja
podman rm -f vikunja-db

echo "Conteneurs supprimés. Vous pouvez relancer install.sh"
⚠ Voir le code source : purge_data.sh
#!/bin/bash
#!/bin/bash

set -eu

read -p "ATTENTON: Cela va effacer toutes les données définitivement. Etes-vous sûr ? (o/n) " -n 1 -r
echo
if [[ $REPLY =~ ^[Oo]$ ]]
then
	echo "Destruction Totale ..."
	podman rm -f vikunja vikunja-db
	podman volume rm vikunja_db_data vikunja_db_files
	podman network rm vikunja-net
	echo "Tout a été effacé."
fi

đŸ‘€ 4. Administration des Utilisateurs

J'ai développé un gestionnaire interactif (./manage_user.sh) en ligne de commande pour administrer les comptes directement depuis le serveur hÎte.

L'exécution de ce script ouvre un menu proposant 4 options :

  1. Lister : Affiche un tableau récapitulatif (ID, Username, Email) des utilisateurs enregistrés.
  2. Créer : Ajoute un nouvel utilisateur (demande Username, Password, Email en prompt).
  3. Supprimer : Affiche la liste des comptes puis demande l'ID de l'utilisateur à révoquer.
  4. Quitter : Sortie propre du script.

L'interface CLI permet d'interagir directement avec la base de données Vikunja via Podman sans passer par l'interface Web.

📂 Voir le code source : manage_user.sh
#!/bin/bash
#!/bin/bash

set -eu

list_users() {
    echo "Listes d'utilisateurs"
    #Listes des utilisateurs			       Permet d'enlever les messages level=INFO dans le terminal
    podman exec vikunja /app/vikunja/vikunja user list | grep -v "level=INFO"
}

create_user() {
    # Entrer du nom d'utilisateur
    read -p "Entrez un nom d'utilisateur : "
    username=$REPLY
    # Entrer du mot de passe de l'utilisateur (sans le voir)
    read -sp "Entrez le mot de passe de l'utilisateur : "
    password=$REPLY
    # Entrer du mail de l'utilisateur
    echo ""
    read -p "Entrez le mail de l'utilisateur : "
    email=$REPLY
    
    #Execution de la commande avec les valeurs entrer. grep : Permet d'enlever les messages level=INFO dans le terminal
    podman exec vikunja /app/vikunja/vikunja user create -e "$email" -p "$password" -u "$username" | grep -v "level=INFO"
}

delete_user() {
    # Liste des utilisaateurs pour connaitre l'ID      Permet d'enlever les messages level=INFO dans le terminal
    podman exec vikunja /app/vikunja/vikunja user list | grep -v "level=INFO"
    
    #Entrer de l'ID de l'utilisateur Ă  supprimer
    read -p "Entrez l'ID de l'utilisateur que vous souhaitez supprimer : "
    id="$REPLY"
    
    # Execution de la commande avec l'id entrer			     Permet d'enlever les messages level=INFO dans le terminal
    podman exec vikunja /app/vikunja/vikunja user delete "$id" -c -n | grep -v "level=INFO"
}

#Fontion Main
main() {
    while true; do
      echo "Quelle actions voulez-vous effectuez ? "
      echo "1. Lister les utilisateurs"
      echo "2. Créer un utilisateur"
      echo "3. Supprimer un utilisateur"
      echo "4. Sortir"
      
      read -p "Entrez le numéro de l'action que vous voulez effectuer : " option
      
      case $option in
      
        1)
          list_users
          ;;
        2)
          create_user
          ;;
        3)
          delete_user
          ;;
        4)
          echo "Sorti du programme"
          exit 0
          ;;
        *)
          echo "Option Invalide. Séléctionnez une option valide."
      esac
    done
}

#Appelle de la fonction main
main