\chapter{Action: migration des services de jails FreeBSD vers docker}
\label{chap:migration_docker}

\large \paragraph{} L'intégralité des services utilisés par le service
informatique fonctionnaient dans des \textit{jails FreeBSD}\footnote{Système de
conteneur propre aux systèmes BSD. La première version est sortie en mars 2000
avec FreeBSD 4}. Étant la seule personne au service informatique a avoir des
compétences dans l'administration de serveur FreeBSD, et afin d'anticiper
mon départ prévu début août 2021, nous avons décidé de tout migrer vers des 
conteneurs \textit{Docker}.

\normalsize
\paragraph{} \textit{Docker} a l'avantage d'être une solution beaucoup plus
répandue et accessible. Notre alternant Lucas la maîtrisait déjà, ce qui 
n'était pas mon cas. Nous avons donc travailler ensemble sur ce point.

\section{Migration de services existants}

\subsection{Inventaire}

\paragraph{} Nous avons commencé par faire un inventaire complet de l'existant.
Tous les conteneurs fonctionnaient sur une seule machine physique, il y en avait
 3 en production~:

\begin{itemize}
    \item \textbf{un serveur web} avec dessus GLPI, NextCloud et Dokuwiki
    \item \textbf{un serveur MariaDB} pour les bases GLPI et Nextcloud
    \item \textbf{une instance Gitea}, utilisant  le serveur web comme frontal
\end{itemize}

\paragraph{} Le tout était sauvegardé sur une machine distante en SSH avec
\link{https://www.borgbackup.org/}{Borg Backup} piloté par un script maison.

\subsection{Défintion de la nouvelle architecture}

\paragraph{} Nous sommes partis du principe d'un conteneur par service, mais
aussi pour les bases de données attachées. En frontal,
\link{https://taefik.io}{Træfik} a été retenu pour son intégration poussée avec
Docker. Il fera office de reverse-proxy et de chiffrer le traffic. Un schéma du
fonctionnement attendu de la nouvelle installation est disponible figure
\ref{Fig:docker} (page \pageref{Fig:docker}).

\begin{figure}[H]
    \includegraphics[width=\linewidth]{generated/plan_docker}
    \caption{Installation attendue des conteneurs Docker afin de remplacer les
    \textit{Jails BSD}}
    \label{Fig:docker}
\end{figure}

\section{L'installation en laboratoire}

\subsection{La machine hôte}

\paragraph{} Le système retenu pour la machine hôte est \textit{Debian
Stable}\footnote{Debian 10 au moment de l'installation du serveur}. Le
système est installé sur un ensemble en \textit{RAID 1} afin d'être tolérant à
la panne. Il a fallu prendre des précautions afin d'obtenir une vraie tolérance.
Ainsi le chargeur de démarrage est installé \textbf{sur les deux disques}.

\subsection{Les conteneurs}

\paragraph{} La définition des conteneurs s'est faite avec
\textit{Docker-Compose}. Ce fichier contient les paramètres relatifs aux
conteneurs~: source des images, variables d'environnement, volumes de données.

\paragraph{} Lucas s'est chargé de l'écriture du premier jet de ce fichier
pendant que je me chargeais de tester l'importation des données dans des
conteneurs.

\subsubsection{Le cas GLPI}

\paragraph{} Le principe des images docker est simple~: il suffit souvent d'aller
faire \textit{\flqq ses courses\frqq} sur le \textit{dockerhub} où l'on trouve
des images toutes faites pour beaucoup de services. \textbf{Problème}~: aucune
des images GLPI testée ne fonctionne.

\paragraph{} Lucas a donc décidé de créer une image à partir d'une de
base. Je suis intervenu ensuite pour intégrer le plugin \textit{Fusion
inventory}, le point d'entrée des agents et des tâches
\textit{cron}\footnote{système de planification des tâches}.

Cette Dockerfile est présentée annexe \ref{chap:dockerfile} (page
\pageref{chap:dockerfile}).

\subsubsection{Le cas Gitea}

\paragraph{} La migration de cette application impliquait aussi la migration de
sa base de données de \textit{SQLite} vers \textit{MariaDB}. J'ai passé deux
jours complets afin de \textbf{tester plusieurs systèmes de migration} mais rien
n'a fonctionné correctement~:

\begin{itemize}

    \item utilisation de la fonction d'export de Gitea dans un format compatible
        MariaDB

    \item écriture d'un script transformant l'export SQLite en fichier SQL
        compatible MariaDB.

\end{itemize}

\paragraph{} Comme les données des dépôts pouvaient être \textbf{facilement
restaurées} avec l'export réalisé depuis la \textit{Jail}, j'ai décidé de
repartir de zéro du côté de la base de données. J'ai donc recréé les comptes
uilisateurs\footnote{nous n'utilisions aucune fonctionnalité liée à la base de
données à part l'authentification}; évitant de perdre davantage de temps.

\subsection{Mise en place des sauvegardes}

\paragraph{} Nous avons décidé avec Lucas de conserver \textit{BorgBackup} pour
les sauvegardes des données. Cette solution a déjà fait ses preuves et montré sa
fiabilité. Celle-ci est effectuée sur un serveur distant en utilisant SSH.

\paragraph{} Le pricipe est simple~: sauvegarder les volumes Docker et les
exports des différentes base de données. Un exemple de script simplifié est
disponible en annexe \ref{chap:script_borg} (page \pageref{chap:script_borg}).

\section{Le passage en production}

\paragraph{} Une fois l'écriture du \textit{Docker-Compose} par Lucas finalisée,
je suis intervenu sur la correction de certains problèmes et le peaufinage des
configurations. Nous avons ensuite plannifié le passage en production.

\paragraph{} Pour le passage en production, il nous a fallu réutiliser le
serveur FreeBSD. Les services à migrer étant exclusivement utilisés par le
service informatique, nous avons défini une demi-journée de coupure de
l'ensemble des services pour la migration.

\paragraph{} Comme nous avions passé beaucoup de temps à tester --- que se soit
la mise en place du système hôte ou les conteneurs --- la mise en production
s'est \textbf{globalement bien passée}.

\section{Conclusion}

\paragraph{} Ce projet a sûrement été \textbf{le plus intéressant de ces
derniers mois}. Travailler de concert avec Lucas a été source de motivation et
de plaisir. Nos échanges de compétences ont permis d'avancer sereinement et
d'atteindre nos objectifs \textbf{sans difficulté majeure}.

\paragraph{} Nous avons réussi à migrer toute l'infrastructure dans les temps et
même commencé à tester
\link{https://github.com/dani-garcia/vaultwarden}{VaultWarden}. Lucas a
d'ailleurs continué sur sa lancée et l'a mis en production, ainsi que d'autres 
conteneurs, après mon départ.
