Stack Docker compose pour mon serveur Thrall
This repository has been archived on 2022-06-22. You can view files and clone it, but cannot push or open issues/pull-requests.
Go to file
Draconis c0c0ab8cf6 suppression 2022-06-22 09:16:21 +02:00
build/pixelfed ajout de pixelfed 2022-05-23 09:43:12 +02:00
env.files ajout des exemples de .env pour drone et gitea 2022-06-22 08:48:04 +02:00
logos Rédaction du README.md 2021-11-29 11:44:33 +01:00
scripts suppression de cachet et corrections restart.sh 2022-05-23 08:31:22 +02:00
.gitignore préparation pour hugo 2021-11-16 10:25:28 +01:00
README.md Rédaction du README.md 2021-11-30 09:51:17 +01:00
docker-compose.yml modification traefik 2022-06-22 09:15:43 +02:00

README.md

Thrall

logo

Mon serveur cloud personnel hébergé sur une VPS OVH (thrall) avec 2 Go de Ram et un SSD de 20Go. Le tout orchestré par Docker-Compose et Debian. Le serveur s'appelle Thrall en hommage au chef de la Horde dans l'univers de Warcraft.

Contenu

  • Traefik - reverse-proxy pour l'accès internet des applications qui en ont l'usage) - reverse-proxy pour l'accès internet des applications qui en ont l'usage.
  • Baikal - synchroniser mes contacts et mes calendriers.
  • Homepage - Ma page d'accueil sous Firefox. Un simple fichier HTML.
  • Shaarli - Pour sauvegarder, trier, synchroniser et partager mes favoris internet.
  • Bitwarden - Coffre-fort pour mes mots de passes et autre en ligne.
  • Cachet - Partage létat de mon infrastructure.
  • Koken - Gestion de ma galerie photo public.

Composition

.
├── env.files
├── logos
├── scripts
├── docker-compose.yml
└── README.md

env.files : les fichiers .env utilisés pour la gestion des variables d'environnement.

logos: logos utilisés pour la rédaction du README.

scripts : tous les exécutables pour configurer, démarrer, gérer la stack

Configuration

Pour configurer la stack il suffit d'exécuter le script setup.sh dans le répertoire scripts. Celui-ci créera les volumes persistants nécessaire pour chaque application et les différents réseaux docker.

cd scripts
./setup.sh

Ensuite il faut copier le fichier env.files/env à la racine de thrall.

cd thrall
cp env.files/env .env

Et renseigner les lignes DOMAIN= et DATA_DIR=.

  • DOMAIN - définit le nom de domaine utilisé par la stack pour l'utilisation via internet
  • DATA_DIR - définit le répertoire où seront stockés les différents volumes persistants.

Ensuite configurer chaque application de la stack en suivants les liens ci-dessous :

Démarrage, arrêt, redémarrage de la stack.

Le répertoire scripts contient tous les exécutables nécessaires pour piloter la stack, ainsi pour

  • start.sh - permet de démarrer la stack
  • stop.sh - permet d'arrêter la stack
  • restart.sh - permet de redémarrer la stack.

Fonctions scpéciales

logs.sh - permet de visualiser les logs d'un conteneur en cours fonctionnement, il fonctionne comme suit :

./logs.sh nom_du_conteneur

Pour trouver le nom de chaque conteneur il suffit de chercher la valeur de la ligne container_name: pour chaque conteneur configurés dans le fichier docker-compose.yml.

clean.sh - ATTENTION RISQUE DE PERTE DE DONNEES DEFINITF ! permet de nettoyer la stack en supprimant les conteneurs, les volumes, les réseaux, les images et le système docker. Je m'en sert en cas de migration de la stack sur nouveau serveur et que je veux nettoyer l'ancien. Ou lorsque je veux repartir de zéro.

TRAEFIK

logo

Traefik est un répartiteur de charge/proxy qui me sert principalement pour :

  • Gérer les connections.
  • Exposez des services et des applications spécifiques en fonction de leurs noms de domaine.
  • Gérez plusieurs domaines. Similaire aux "hôtes virtuels".
  • Gérer le HTTPS.
  • Générer des certificats HTTPS automatiquement (y compris les renouvellements) avec Let's Encrypt.
  • Ajoutez une authentification HTTP de base pour tout service que vous devez protéger et qui n'a pas sa propre sécurité.
  • Générer automatiquement les configurations à partir des labels Docker définis dans mes docker-compose (pas besoin de mettre à jour les fichiers de configuration).

1. Volumes

J'utilise deux volumes locaux le premier pour les certificats générés par Let'sencrypt, le second pour les secrets contenant les identifiants. Je monte aussi le volume Docker pour que traefik puisse lire les labels des autres conteneurs.

 [...]
 volumes:
      # Add Docker as a mounted volume, so that Traefik can read the labels of other services
      - /var/run/docker.sock:/var/run/docker.sock:ro
      # Mount the volume to store the certificates
      - ./${DATA_DIR}/traefik:/certificates
      - ./secrets:/secrets
 [...]

2. Identifiant de connexion

L'identifiant de connexion se présente sous la forme d'un ligne de texte a ajouter tel quel dans le fichier traefik_auth_file , contenant le nom d'utilisateur et le mot de passe qui sera chiffré ave openssl. Création du dossier secrets à la racine et du fichier traefik_auth_file.

mkdir secrets
touch traefik_auth_file

Création de l'identifiant.

user:mot_de_passe_chiffré

Pour chiffrer le mot de passe avec openssl.

openssl passwd -apr1 mon_mot_de_passe

Le mot de passe chiffré doit ressembler à cela.

$apr1$89eqM5Ro$CxaFELthUKV21DpI3UTQO.

On copie-colle avec le nom d'utilisateur.

user:$apr1$89eqM5Ro$CxaFELthUKV21DpI3UTQO.

On mettra une ligne par utilisateurs.

3. Variables

Les variables d'environnements sont présentes dans le fichier .env copié précédement, il faut ensuite renseigner les variables TRAEFIKEMAILet TRAEFIKTOKEN.

  • TRAEFIKEMAIL qui définit l'adresse courriel utiliser par let's encrypt pour le renouvellement des certificats.
  • TRAEFIKTOKEN qui définit le jeton d'accès pour l'utilisation du pilot de traefik.

4. Réseau Web

Je crée le réseau web qui sera partagé avec Traefik et les conteneurs qui devront être accessibles de l'extérieur.

docker network create web

BAIKAL

baikal

Baïkal est un serveur CalDAV+CardDAV léger. Il offre une interface Web complète avec une gestion facile des utilisateurs, des carnets d'adresses et des calendriers.

Par défaut Baïkal utilise SQLite comme base données, je préfère utiliser Mariadb.

1. Volumes

Les répertoires pour les volumes persistants sont créer par le scripts setup.sh pour vérifier leur présence il suffit de se rendre dans ${DATA_DIR} et vérifier que le dossier baikalavec ses deux sous dossiers config et data, ainsi que le dossier db pour le serveur Mariadb sont présents. Si ce n'est pas le cas il faut les créer.

[ ... ]
baikal:
    image: ckulka/baikal:nginx
    restart: unless-stopped
    container_name: baikal
volumes:
      - ./${DATA_DIR}/baikal/config:/var/www/baikal/config
      - ./${DATA_DIR}/baikal/data:/var/www/baikal/Specific
[ ... ]
baikal-db:
    image: mariadb:10
    restart: unless-stopped
    container_name: baikal-db
    ...
    volumes:
      - ./${DATA_DIR}/baikal/db:/var/lib/mysql
[ ... ]

2. Variables

Les variables d'environnements nécessaire pour le serveur Mariadb il faut copier le fichier env.baikal du répertoire env.files à la racine de thrall et renseigner les variables :

  • MYSQL_ROOT_PASSWORD= Mot de passe root du serveur Mariadb
  • MYSQL_DATABASE= Nom de la basé de donnée de baïkal
  • MYSQL_USER= L'utilisateur mariadb lié à cette base de donnée
  • MYSQL_PASSWORD= Son mot de passe.

3. Traefik

Vous pouvez adapter la configuration de votre domaine en modifiant ces deux lignes traefik.http.routers.baikal-http.rule= et traefik.http.routers.baikal-https.rule=.

HOMEPAGE

Une simple page en php avec mes favoris, aucun configuration particulière tout est en lecture seule.

SHAARLI

shaarli

Shaarli est un logiciel libre permettant de sauvegarder, trier, synchroniser et partager des adresses web. Il est à la fois léger et simple d'utilisation.

1. Volumes

Les répertoires pour les volumes persistants sont créer par le scripts setup.sh pour vérifier leur présence il suffit de se rendre dans ${DATA_DIR} et vérifier que le dossier shaarliet ses deux sous dossiers cache et data sont présents. Si ce n'est pas le cas il faut les créer.

[ ... ]
volumes:
      - ./${DATA_DIR}/shaarli/cache:/var/www/shaarli/cache
      - ./${DATA_DIR}/shaarli/data:/var/www/shaarli/data
[ ... ]

2. Traefik

Vous pouvez adapter la configuration de votre domaine en modifiant ces deux lignes traefik.http.routers.shaarli-http.rule= et traefik.http.routers.shaarli-https.rule=.

BITWARDEN

bitwarden

Bitwarden vous propose un espace sécurisé pour stocker et synchroniser votre coffre-fort accessible via navigateur, mobile, web. Attention ! cette stack n'utilise par les images docker officielles (beaucoup trop lourdes et complexes à utiliser) mais celles d'un projet non-officiel Vaultwarden plus légères, écritent en rust et plus adptées pour une utilisation en auto-hébergé.

1. Volumes

Les répertoires pour les volumes persistants sont créer par le scripts setup.sh pour vérifier leur présence il suffit de se rendre dans ${DATA_DIR} et vérifier que le dossier bitwarden et son sous dossier data sont bien présents. Si ce n'est pas le cas il faut les créer.

2. Variables

Les variables d'environnements nécessaire au conteneur sont stockées dans env.files/env.bitwarden pour les activer il faut copier ce fichier à la racine de thrall.

cd thrall
cp env.files/env.bitwarden .env.bitwarden

Et renseigner les variables.

  • SIGNUPS_ALLOWED=true Active true/Désactive false les nouvelles inscriptions.
  • DATABASE_URL=data/db.sqlite3 indique le chemin vers la bas de données
  • ADMIN_TOKEN= Activation de la page d'administration
  • DOMAIN= Nom de domaine pour acéder à bitwarden
  • SMTP_HOST= Serveur d'envoi pour les courriels exemple : smtp.monserveur.com
  • SMTP_FROM= Adresse d'envoi des courriels bitwarden exemple: no-reply@monserveur.com
  • SMTP_FROM_NAME= Domaine d'envois des courriels
  • SMTP_PORT= Port d'envois des courriel
  • SMTP_SSL=true Active true/Désactive false le chiffrage SSL pour les courriels
  • SMTP_USERNAME= Authentification sur le serveur d'envoi de courriels
  • SMTP_PASSWORD= Mont de passe de l'authentification
  • SMTP_AUTH_MECHANISM=Login Méthode d'authentification du serveur de courriels
  • SMTP_TIMEOUT=15 Durée de la connexion smtp sur le serveur
  • SIGNUPS_VERIFY=true Active true/Désactive false la vérification des nouvelles inscriptions
  • EMAIL_ATTEMPTS_LIMIT=3 Nombre maximal de tentatives avant qu'un jeton d'e-mail ne soit réinitialisé et qu'un nouvel e-mail doive être envoyé.
  • EMAIL_TOKEN_SIZE=6 Taille du jeton d'e-mail

3. Création de la page d'administration

Pour activer la page d'administration, vous devez définir un jeton d'authentification ADMIN_TOKEN. Je génère mon jeton en utilisatn la commande openssl sur une longueur de 48 caratères.

openssl rand -base64 48

Celle-ci doit ressembler à cela

uBkluSCcPgcI0HJtl5l1Cbe+GBNY50WXUmf+tL6qyIbqtMeJWk3zCqIbqW5FhU5Z

Je copie-colle la chaîne de caractères ainsi générée sur la variable ADMIN_TOKEN dans le fichier .env.bitwarden.

4. Traefik

Vous pouvez adapter la configuration de votre domaine en modifiant ces deux lignes traefik.http.routers.bitwarden-http.rule= et traefik.http.routers.bitwarden-https.rule=.

CACHET

cachet

Cachet est un magnifique et puissant système de page d'état open source.

1. Volumes

Les répertoires pour les volumes persistants sont créer par le scripts setup.sh pour vérifier leur présence il suffit de se rendre dans ${DATA_DIR} et vérifier que le dossier cachetavec son sous dossiers app , ainsi que le dossier postgres pour le serveur PostgreSQL sont présents. Si ce n'est pas le cas il faut les créer.

[ ... ]
cachet:
    image: cachethq/docker
    restart: unless-stopped
    container_name: cachet-app
    ...
    volumes:
     - ./${DATA_DIR}/cachet/app:/var/www/html/
[ ... ]
cachet-postgres:
    image: postgres:12-alpine
    restart: unless-stopped
    container_name: cachet-postgres
    ...
    volumes:
     - ./${DATA_DIR}/cachet/postgres:/var/lib/postgresql/data
[ ... ]

2. Variables

Les variables d'environnements nécessaire au conteneur sont stockées dans env.files/env.cachet pour les activer il faut copier ce fichier à la racine de thrall.

cd thrall
cp env.files/env.cachet .env.cachet

Et renseigner les variables.

Variables pour Cachet.

  • DB_DATABASE= Nom de la base de données pour cahcet
  • DB_DRIVER=pgsql Driver de la bas de données pgsql pour PostgreSQL
  • DB_HOST=cachet-postgres Nom de l'hôte de la base de données
  • DB_PASSWORD= Mot de passe de la base de données
  • DB_PORT= Port d'ecoute du serveur postgres
  • DB_PREFIX= Préfix des table de la base de données
  • DB_USERNAME= Utilisateur ayant accès à la base de données
  • APP_KEY= Voir ici
  • APP_LOG=errorlog Niveau de journalisation
  • APP_ENV=production Définition de mode de fonctionnement
  • APP_DEBUG=false Active true/Désactive false le mode débug
  • DEBUG=false Active true/Désactive false le mode débug

Variables pour PostgreSQL

  • POSTGRES_USER= Utilisateur ayant accès à la base de données
  • POSTGRES_PASSWORD= Mot de passe root du serveur postgres

3. Traefik

Vous pouvez adapter la configuration de votre domaine en modifiant ces deux lignes traefik.http.routers.cachet-http.rule= et traefik.http.routers.cachet-https.rule=.

KOKEN

koken

Koken est un CMS de gestion de galerie photos. Il est en fin de vie mais n'ayant pour le moment pas trouvé d'alternative qui me convienne, je continue de l'utiliser

1. Volumes

Les répertoires pour les volumes persistants sont créer par le scripts setup.sh pour vérifier leur présence il suffit de se rendre dans ${DATA_DIR} et vérifier que le dossier kokenavec son sous dossiers app , ainsi que le dossier db pour le serveur Mariadb sont présents. Si ce n'est pas le cas il faut les créer.

[ ... ]
koken:
    image: nicokaiser/koken:php7.3-apache
    restart: unless-stopped
    container_name: koken
    ...
    volumes:
      - ./${DATA_DIR}/koken/app:/var/www/html
[ ... ]
koken-db:
    image: mariadb
    restart: unless-stopped
    container_name: koken-db
    ...
    volumes:
      - ./${DATA_DIR}/koken/db:/var/lib/mysql
[ ... ]

2. Variables

Les variables d'environnements nécessaire au conteneur sont stockées dans env.files/env.koken pour les activer il faut copier ce fichier à la racine de thrall.

cd thrall
cp env.files/env.koken .env.koken

Et renseigner les varaibles.

  • MYSQL_ROOT_PASSWORD= Mot de passe du root de Mariadb
  • MYSQL_DATABASE= Nom de la base de données koken
  • MYSQL_USER= L'utilisateur autorisé à utilisé la base de données
  • MYSQL_PASSWORD= Son mot de passe

3. Post-configuration

3.1 Le thème n'est pas en mesure de contacter l'API de Koken. Assurez-vous que votre hôte ne bloque pas les connexions.

Pour corriger l'erreur, ajoutez la ligne suivante dans le fichier www/storage/configuration/user_setup.php.

define('LOOPBACK_HOST_HEADER', true);

3.2 Erreur d'API

Afin de corriger l'erreur d'API. Modifier le fichier www/app/site/Koken.php ; remplacez self::$protocol par http.

/* Original */
curl_setopt($curl, CURLOPT_URL, self::$protocol .'://' . $host . self::$location['real_root_folder'] . '/api.php?' . $url);

/* Après */
curl_setopt($curl, CURLOPT_URL, 'http://' . $host . self::$location['real_root_folder'] . '/api.php?' . $url);

3.3 Erreur de chargement d'image (404)

Pour résoudre le problème de chargement de l'image (Erreur 404). Modifiez le fichier www/app/koken/Utils/KokenAPIphp. Ajoutez $this->protocol = 'http'; à la fin de la fonction __construct.

function __construct()
{
  ...
  $this->protocol = 'http';
}

3.4 Mise à jour vers PHP7 - Impossible de se connecter à l'API lors de la connexion

Lors l'utilisation de koken avec PHP7+ un message d'erreur rouge peut apparaître avec "Impossible de se connecter à l'API" à la connexion sur la page d'administration /admin/.

Pour corriger l'erreur, recherchez /app/database/DB_Driver.php et jetez un œil à la ligne 1018 et vous devriez voir quelque chose comme ceci :

 else
        {
            $args = (func_num_args() > 1) ? array_splice(func_get_args(), 1) : null;
            if (is_null($args))
            {
                return call_user_func($function);
            }
            else
            {
                return call_user_func_array($function, $args);
            }
        }

Maintenant, remplacez la ligne 1028 (la déclaration $args) par les deux lignes suivantes :

$func_args = func_get_args();
$args = (func_num_args() > 1) ? array_splice($func_args, 1) : null;

Le code devrait maintenant ressembler à :

  else
        {
            $func_args = func_get_args();
            $args = (func_num_args() > 1) ? array_splice($func_args, 1) : null;
            if (is_null($args))
            {
                return call_user_func($function);
            }
            else
            {
                return call_user_func_array($function, $args);
            }
        }

3.5 Les images ne se chargent pas

Vous ne le remarquerez peut-être pas immédiatement si vous avez mis des images en cache, mais si vous avez vidé le cache ou téléchargé une nouvelle image, vous constaterez peut-être qu'elle n'est pas visible.

Recherchez /i.php à la racine de votre installation. Sur les lignes 13 et 14, il y a :

require $root . '/app/koken/Shutter/Shutter.php';
require $root . '/app/koken/Utils/KokenAPI.php';

Remplacez ces lignes par :

require_once $root . '/app/koken/Shutter/Shutter.php';
require_once $root . '/app/koken/Utils/KokenAPI.php';

Vous devez également ouvrir /app/koken/Shutter/Shutter.php et à la ligne 274 remplacer ce qui suit :

include dirname(__DIR__) . '/Utils/KokenAPI.php';

par

include_once dirname(__DIR__) . '/Utils/KokenAPI.php';

Traefik

Vous pouvez adapter la configuration de votre domaine en modifiant ces deux lignes traefik.http.routers.koken-http.rule= et traefik.http.routers.koken-https.rule=.