|
||
---|---|---|
build/pixelfed | ||
env.files | ||
logos | ||
scripts | ||
.gitignore | ||
README.md | ||
docker-compose.yml |
README.md
Thrall
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 internetDATA_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 stackstop.sh
- permet d'arrêter la stackrestart.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
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 TRAEFIKEMAIL
et 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
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 baikal
avec 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 MariadbMYSQL_DATABASE=
Nom de la basé de donnée de baïkalMYSQL_USER=
L'utilisateur mariadb lié à cette base de donnéeMYSQL_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 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 shaarli
et 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 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 Activetrue
/Désactivefalse
les nouvelles inscriptions.DATABASE_URL=data/db.sqlite3
indique le chemin vers la bas de donnéesADMIN_TOKEN=
Activation de la page d'administrationDOMAIN=
Nom de domaine pour acéder à bitwardenSMTP_HOST=
Serveur d'envoi pour les courriels exemple : smtp.monserveur.comSMTP_FROM=
Adresse d'envoi des courriels bitwarden exemple: no-reply@monserveur.comSMTP_FROM_NAME=
Domaine d'envois des courrielsSMTP_PORT=
Port d'envois des courrielSMTP_SSL=true
Activetrue
/Désactivefalse
le chiffrage SSL pour les courrielsSMTP_USERNAME=
Authentification sur le serveur d'envoi de courrielsSMTP_PASSWORD=
Mont de passe de l'authentificationSMTP_AUTH_MECHANISM=Login
Méthode d'authentification du serveur de courrielsSMTP_TIMEOUT=15
Durée de la connexion smtp sur le serveurSIGNUPS_VERIFY=true
Activetrue
/Désactivefalse
la vérification des nouvelles inscriptionsEMAIL_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 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 cachet
avec 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 cahcetDB_DRIVER=pgsql
Driver de la bas de données pgsql pour PostgreSQLDB_HOST=cachet-postgres
Nom de l'hôte de la base de donnéesDB_PASSWORD=
Mot de passe de la base de donnéesDB_PORT=
Port d'ecoute du serveur postgresDB_PREFIX=
Préfix des table de la base de donnéesDB_USERNAME=
Utilisateur ayant accès à la base de donnéesAPP_KEY=
Voir iciAPP_LOG=errorlog
Niveau de journalisationAPP_ENV=production
Définition de mode de fonctionnementAPP_DEBUG=false
Activetrue
/Désactivefalse
le mode débugDEBUG=false
Activetrue
/Désactivefalse
le mode débug
Variables pour PostgreSQL
POSTGRES_USER=
Utilisateur ayant accès à la base de donnéesPOSTGRES_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 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 koken
avec 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 MariadbMYSQL_DATABASE=
Nom de la base de données kokenMYSQL_USER=
L'utilisateur autorisé à utilisé la base de donnéesMYSQL_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=
.