Tuto : Déployer un wiki outline chez Clever Cloud

À la Mob, comme dans n’importe quelle autre société, on a besoin de communiquer et de centraliser des informations.

Pour passer directement au côté tutoriel, rendez-vous ici !
Rayons d'une librairie avec beaucoup de livres
Trouver de la documentation au bout d’un certain temps relève parfois d’un parcours du combattant (source: pexels.com)

On n’utilise pas mal Google Drive, mais arrivé à un point on avait besoin de 2 choses

  • Plus de structure dans l’organisation des documents
  • Un référentiel simple et unique où aller chercher des choses

De plus, je tenais à avoir une solution self hostable car les prix en SaaS ne sont tout simplement pas compétitifs au vu de la taille de notre société aujourd’hui comparée à gérer quelques montées de versions nous-mêmes.

A titre d’exemple, gitbook nous couterait environ $320 / mois en teams pour 50 utilisateurs. (prix au 31/08/202)

Les ingrédients

Outline

Outline est une solution de documentation centralisée open source, qui offre plusieurs choses importantes :

  • Une interface complète mais qui sait rester simple (même pour les non techniques)
  • La possibilité de se connecter avec Google
  • Une gestion de droits basique mais suffisante
  • L’intégration plutôt correcte de nos outils (figma, drive, slack, github, etc.)
  • Open source et self-hostable
Capture d'écran de Outline via le site officiel
Source : getoutline.com

Au niveau de l’hébergement, pour outline, on serait sur du 79€/mois en SaaS, loin des $300 de gitbook. Cependant, en l’hébergeant nous-mêmes, nous sommes aux alentours de 30€/mois chez Clever Cloud !

Estimation du coût avec la calculatrice d'estimation chez Clever Cloud : 27.39€
Tarification sur le site de Clever Cloud (au 31/08/2022)

NDLR 06/09/2022 : en fait, nous sommes passés sur un S pour docker, donc cela nous coûte un peu plus cher. 14.40€ de plus pour être précis. Donc 44€/mois.

Nous allons donc partir sur cette option, qui nous convient pour l’instant.

Clever Cloud

Clever Cloud est un outil de type PaaS, l’idée en quelques mots : nous simplifier la vie sur l’hébergement et le déploiement.

Image d'en-tête du site de Clever Cloud

Depuis quelque temps, nous utilisons la plateforme Clever Cloud, cela fera (ou fait) l’objet d’un article spécifique sur ce même blog !

La recette

Sur le site d’outline, la méthode d’installation conseillée est de passer par docker compose.

Dommage j’ai envie de dire.

Pourquoi docker compose semble une bonne option ?

outline repose sur plusieurs choses pour fonctionner correctement :

Et comme c’est relou de prévoir de lancer tous ces services et de faire les liens à la main, bah un docker-compose c’est quand même pas mal ! Ça lance les 4 services sans qu’on y comprenne rien et ça tourne

via GIPHY

Seulement voilà, chez Clever, pas de docker compose !

Pourquoi docker compose n’est pas une bonne option ?

docker compose cache un peu le fait de devoir avoir tous ces services, qu’est-ce qui se passe si j’ai une BDD ailleurs ? Si j’ai un redis ailleurs ? Si je veux gérer mon certificat https en amont ?

Bah il faut modifier le fichier, et c’est là où le bât blesse.

Admettons, mais c’est pire pour le provider ! La facturation de Clever Cloud c’est aussi que chaque service ne fasse pas grand-chose mais le fasse très bien (de ce que j’en ai compris).
Un docker : ça fait tourner un container ! (Pas 14)
Une BDD : c’est optimisé sur des machines pour
Un redis : j’imagine pareil

Et en matière de facturation, pourquoi on payerait pareil pour une machine qui a 0 stockage froid mais blindée de stockage chaud (genre pour redis) que pour une machine qui fait tourner ma pwa en react ?

Ça n’a pas de sens, donc chez Clever Cloud, on a tous ces services, PostgreSQL, Redis, même un Cellar (qui est leur S3 maison).

Du coup, docker compose c’est mort ! Alors il faut faire une image docker à la main pour la déployer.

La préparation sur la console Clever Cloud

Ce qui est chouette chez Clever Cloud, c’est que quand on configure une app, il nous propose les add-on directement.

On a donc (où vous pouvez créer)

  1. Une application principale de type docker
  2. Un add-on PostgreSQL
  3. Un add-on Redis
  4. Un add-on Cellar

Et ce qui est encore plus cool, c’est que derrière, toutes les variables intéressantes de ces add-on sont passées en variables d’environnement aux applications liées.

Qu’est-ce que ça veut dire ?

Si je crée une base de données PostgreSQL, le host, le port, le name, le password, le name de la base, etc… seront automatiquement liés aux applications liées via des variables d’environnement !

Donc une fois nos 3 add-ons créés, il nous reste une petite chose à faire avant de jouer avec notre app docker.

Créer un bucket sur Cellar

Cellar fonctionne comme S3, c’est-à-dire que c’est un service qui fournit des espaces de stockage.

Ces espaces de stockage ne sont pas là de base, il faut les créer ! On appelle ça des buckets.

Pour créer un espace, j’ai cherché dans la console web, mais rien. En fait, il faut passer par un outil en CLI s3cmd.

Une fois installée, la documentation de Clever Cloud sur Cellar est suffisamment limpide pour créer son bucket !

Pour notre part, histoire de rendre les choses simples, nous avons généré un uuidv4 en guide de nom pour notre bucket.

Mettre à jour les environnements

On se dit qu’il ne nous reste plus qu’à lancer l’app, mais non !

Le hic, c’est que les noms des variables d’environnement injectés ne sont pas ceux utilisés par l’image officielle d’outline.

Par exemple, pour l’url de la base de données, côté outline, on attend une variable appelée DATABASE_URL, mais côté Clever Cloud, elle s’appelle POSTGRESQL_ADDON_URI.

En même temps, c’est logique, Clever Cloud ne peut pas connaître à l’avance les noms que les devs vont utiliser.

Du coup, pour notre docker de outline, on va éditer nos variables d’environnement pour mettre les nôtres en copiant collant les valeurs.

Comment les connaître ? En se basant sur le fichier d’environnement donné en exemple sur github.

Pour l’instant il n’est pas possible de faire des références malheureusement, peut-être un jour chez Clever Cloud ?

>>XX<< est à remplacer par la valeur de la variable importée

AWS_ACCESS_KEY_ID=">>CELLAR_ADDON_KEY_ID<<"
AWS_REGION="us-west-1"
AWS_S3_FORCE_PATH_STYLE="true"
AWS_S3_UPLOAD_BUCKET_NAME=">>VOTRE_BUCKET_NAME<<"
AWS_S3_UPLOAD_BUCKET_URL="https://cellar-c2.services.clever-cloud.com"
AWS_S3_UPLOAD_MAX_SIZE="26214400"
AWS_SECRET_ACCESS_KEY=">>CELLAR_ADDON_KEY_SECRET<<"
DATABASE_URL=">>POSTGRESQL_ADDON_HOST (de la DB principale)<<"
DATABASE_URL_TEST=">>POSTGRESQL_ADDON_HOST (de la DB de test)<<"
DEFAULT_LANGUAGE="fr_FR"
PORT="8080"
RATE_LIMITER_DURATION_WINDOW="60"
RATE_LIMITER_ENABLED="true"
RATE_LIMITER_REQUESTS="1000"
REDIS_URL=">>REDIS_URL<<"
SECRET_KEY=">>UNE_CLE_GENEREE<<"
URL=">>L'URL DE L'APP CLEVER<<"
UTILS_SECRET=">>UNE_CLE_GENEREE<<"

Et si vous voulez vous connecter avec Google, suivez la procédure pour activer l’authentification, avoir vos client id et client secret et ajoutez

GOOGLE_CLIENT_ID=">>VOTRE_CLIENT_ID_GOOGLE<<"
GOOGLE_CLIENT_SECRET=">>VOTRE_CLIENT_SECRET_GOOGLE<<"

Note : pour les UTILS_SECRET et SECRET_KEY, suivant la documentation, il vous faudra utiliser openssl rand -hex 32

L’image docker

Vient l’image docker !

En soi elle est plutôt simple à faire mais nous a quand même donné du fil à retordre, merci à David pour son aide précieuse sur le sujet !

FROM outlinewiki/outline:0.65.2
EXPOSE 8080
WORKDIR /opt/outline
COPY ./startup.sh .
CMD ["./startup.sh"]

Plutôt simple en fait.

On part de l’image de base d’outline en 0.65.2 (n’utilisez jamais latest), on change le port (par défaut 3000) pour utiliser 8080 qui est celui utilisé par Clever Cloud.

Et surtout on lance un script startup.sh ! Mais que contient-il ?

#!/bin/sh

yarn db:migrate
exec yarn start

Pourquoi est-ce qu’on fait ça ?

Tout simplement parce que outline doit, pour chaque version, migrer la base de données s’il y a besoin.
En passant par docker-compose, on doit faire cette commande à la main avant de déployer.

En faisant ça, on s’assure qu’à chaque lancement de notre app, la base de données sera dans la bonne version !

Le résultat

Plutôt content du résultat, on a réussi à héberger notre wiki à nous de façon plutôt simple finalement !

Les Mobilous y ont tous accès directement via leur compte Google et ça tourne plutôt bien 🙂

capture d'écran du outline La Mobilery

Il ne reste qu’à animer tout cela pour en faire un outil collaboratif intéressant et utile pour tout le monde.

Quentin Klein

Tech Leader de l'agence de Paris
25 novembre 2022

Quentin est CTO de La Mobilery. Accro au développement mobile, il est particulièrement intéressé par Android et Flutter.