#+SETUPFILE: /home/vaab/dev/el/org-html-themes/setup/theme-readtheorg.setup
#+PROPERTY: Effort_ALL 0 0:30 1:00 2:00 0.5d 1d 1.5d 2d 3d 4d 5d
#+PROPERTY: Max_effort_ALL 0 0:30 1:00 2:00 0.5d 1d 1.5d 2d 3d 4d 5d
#+PROPERTY: header-args:python :var filename=(buffer-file-name)
#+PROPERTY: header-args:sh :var filename=(buffer-file-name)
#+TODO: TODO WIP BLOCKED POSTPONED | DONE CANCELED
#+LATEX_HEADER: \usepackage[margin=0.5in]{geometry}
#+LaTeX_CLASS: article
#+OPTIONS: H:8 ^:nil prop:("Effort" "Max_effort") tags:not-in-toc
#+COLUMNS: %50ITEM %Effort(Min Effort) %Max_effort(Max Effort)
#+begin_LaTeX
\hypersetup{
linkcolor=blue,
pdfborder={0 0 0 0}
}
#+end_LaTeX
#+TITLE: Architecture 0k.io
#+LATEX: \pagebreak
* Process de déploiement
Description du process de déploiement pour une nouvelle installation
** Base myc
*** Qu'est ce c'est ?
A partir d'une debian 9 ou debian 10, on peut installer la machine
pour être prête à utiliser un déploiement myc.
Une fois executé, la machine aura toute les deps pour lancer une
commande compose qui fera peut-être appel à des registry de
mycéliandre. Un compose de base est aussi proposé.
*** Déploiement
**** Hôte linux base debian 9, 10, 11 ou 12, Ubuntu 22.04
***** Accès ssh standardisé
Via la commande =0km=, depuis votre poste, permet de standardiser
l'accès avec vos clés SSH, et positionner le nom de domaine si
nécessaire.
#+BEGIN_SRC sh
0km vps-setup HOST
#+END_SRC
Note: ceci fonctionnera que si vous avez un fichier de configuration
dans =/etc/0km/config.yml= (si vous allez l'utiliser en root) ou dans
=~/.config/0km/config.yml= autrement. Ce fichier doit au moins contenir
une clé ssh (ou plusieurs) ainsi:
#+begin_src yaml
ssh-access:
public-keys:
- ssh-rsa AAAAB3NzaC1yc2EAAAAD...qGy20KlAOGPf nom_clef
#+end_src
***** Déploiement de la solution pour compose
Depuis le VPS, en root:
#+BEGIN_SRC sh
export WITHOUT_DOCKER_CLEAN=1 ## only if you want to remove docker clean from cron
wget https://git.myceliandre.fr/Myceliandre/myc-manage/raw/branch/master/bin/myc-install -qO - | bash
#+END_SRC
Si vous souhaitez positionner le nom de domaine:
#+BEGIN_SRC sh
export WITHOUT_DOCKER_CLEAN=1 ## only if you want to remove docker clean from cron
export DOMAIN=myhost.com
wget https://git.myceliandre.fr/Myceliandre/myc-manage/raw/branch/master/bin/myc-install -qO - | bash
#+END_SRC
***** Déploiement de la solution pour mailcow
****** Sur un vps sans mailcow de pre-installé
#+BEGIN_SRC sh
export WITHOUT_DOCKER_CLEAN=1 ## only if you want to remove docker clean from cron
wget https://git.myceliandre.fr/Myceliandre/myc-manage/raw/branch/master/bin/myc-install -qO - | bash
#+END_SRC
****** Sur un vps avec mailcow de pre-installé
#+BEGIN_SRC sh
export WITHOUT_DOCKER_CLEAN=1 ## only if you want to remove docker clean from cron
export NO_DOCKER_RESTART=1 ## Can use that only if mailcow is pre-existing
wget https://git.myceliandre.fr/Myceliandre/myc-manage/raw/branch/master/bin/myc-install -qO - | bash
#+END_SRC
**** Hôte macosx
- install bash, docker
- Uncheck "Securely store docker logins in macOS keychain"
*** Ce que cela fait
**** Mettre la machine en état charm-ready
- installation du strict minimu pour lancer les =charms=
- téléchargement de la dernière version des =0k-charms= (collection
de recettes d'installation et de gestion de docker)
**** Mettre la machine en état compose ready (notre docker qui va bien)
via le lancement du charm =docker-host= qui installe:
- docker, docker-compose, compose avec des versions qui vont bien
- paquets maisons (kal-scripts, 0k-manage, 0k-pgm, lxc-scripts, 0k-docker)
- accès pour le repository deb de kalysto.org
- clé SSH pour repos git.kal.fr
- login sur le docker registry docker.0k.io
**** Commandes spécifique à myc
- login sur le registry myc
- téléchargement du compose de base dans =/opt/apps/myc-deploy=
** Modification du compose
*** Qu'est-ce que c'est ?
Il y a des update client à faire souvent sur le compose. Cette étape
doit être externalisée au plus possible, sont consigné ici ce qu'il
faut encore faire à la main.
*** Commande
**** Création de clé OVH pour letsencrypt/lexicon
Ceci n'est nécessaire qu'en cas d'utilisation de la méthode DNS
pour valider la possession du domaine auprès de letsencrypt.
#+BEGIN_SRC shell
APPLICATION_KEY=XXXXXXXXXXXXXXXXX
REDIR_WEBSITE=https://0k.io
req=$(cat < /usr/local/bin/st
#!/bin/bash
echo "Trying mosh to $1"
TERM=xterm-256color mosh "$1" -- bash -c "tmux attach || { tmux; }"
if [ "$?" == "5" ]; then
echo "Fallback to ssh $1"
ssh "$1" -tM "TERM=xterm-256color tmux attach || TERM=xterm-256color tmux"
fi
EOF
chmod +x /usr/local/bin/st
apt install mosh
#+end_src
*** utilisation de la commande =st=
=st= utilise =ssh= ou =mosh= et se met dans un =tmux= sur la destination.
#+begin_src sh
st root@monvps.fr
#+end_src
On note qu'il faut penser à mettre les clé SSH sur la destination.
** Mise à jour de l'ensemble
Pour mettre à jour un VPS:
#+BEGIN_SRC sh
myc-update
#+END_SRC
Cette commande va ré-appliquer l'installation du charm =docker-host=
qui installe ou met à jour chaque composant.
*** Mise à jour de docker
Par défaut =myc-update= ne met pas à jour le service docker pour éviter
de couper les services. Si cela est souhaité, il est possible de faire:
#+begin_src sh
ALLOW_DOCKER_CHANGE=1 myc-update
#+end_src
Aussi, par défaut, =myc-update= pré-selectionne une version cible commune de
docker pour une distribution donnée.
** Gestion des dockers
*** Relancement
si on veut relancer parce que le compose a changé :
on fait pareil qu'au lancement : lors du "up", docker-compose se
rend compte que la définition des services a changé et relance les
docker voulu.
*** Arrêt
#+BEGIN_SRC sh
compose --debug down
#+END_SRC
*** Voir les logs
#+BEGIN_SRC sh
cd /opt/apps/myc-deploy
compose --debug logs odoo
#+END_SRC
*** Obtenir les IPs des dockers
#+BEGIN_SRC sh
docker-ip
#+END_SRC
*** Obtenir des statistiques d'utilisation des resources
**** Consommation
La commande ~docker stats~ permet d'afficher en temps réel la consommation des
différentes ressources (mémoire, processeur, réseau...).
À noter, la commande ~vps stats~ fait la même chose, et rempli la base
de donnée pour l'historique des utilisations. Cette commande est
normalement lancée par cron régulièrement.
Les bases de données d'utilisation sont stockée dans ~/var/lib/vps/rrd~
**** Historique de la consommation des ressources
Depuis ~0km~ il est possible de grapher les informations d'un VPS:
#+begin_src sh
0km vps-stats [--timespan START[..END]] VPS [VPS...]
#+end_src
Exemples:
#+begin_src sh
0km vps-stats vps-{01,02}.0k.io ## dernier jour de donnée
0km vps-stats vps-{01,02}.0k.io -t e-1w ## end moins 1 semaine de donnée
0km vps-stats vps-{01,02}.0k.io -t e-5d ## end moins 5 jours de donnée
0km vps-stats vps-01.0k.io -t n-3h..n-2h ## now(maintenant) moins 3h à now moins 2h
0km vps-stats vps-01.0k.io -t 17:40..17:50 ## de 17:40 à 17:50 (heure locale !)
0km vps-stats vps-01.0k.io -t "20230811..17:50" ## du début de la journée de 2023-08-11 à 17:50 ajd
## graphe dynamique qui se met à jour sur les 2 dernière heures
0km vps-stats vps-01.0k.io -t "n-2h" -f
#+end_src
Pour plus de détail sur le format de début et de fin, se rapporter à
la fin de la page man de [[https://linux.die.net/man/1/rrdfetch][rrdfetch]].
*** Limiter la mémoire utilisée par un container
Certains container vont demander beaucoup de memoire par défaut et
doivent être contenu dans des environment limités.
Aussi, on peut limiter la mémoire d'un docker dans le fichier
=compose.yml=:
#+begin_src yaml
mon-service:
# ...
docker-compose:
mem_limit: 2g
memswap_limit: 2g ## Au cas où l'on a du swap
# ...
#+end_src
*** Vérification de santé générale
La commande =vps check-fix= contrôler les containers en cours de
fonctionnement pour vérifier s'ils ne sont pas touché par quelques
problème identifiés et connus. Et elle va réparer ce qu'elle peut.
#+begin_src sh
vps check-fix
#+end_src
Il est possible de lancer ces vérifications sur une liste de service
spécifique ou de sélectionner le test voulu. Voir =vps check-fix
--help= pour plus d'info.
Il peut être opportun d'ajouter dans sur l'hôte, par exemple, une
vérification périodique et automatique:
#+begin_src sh
cat < /etc/cron.d/vps-check
SHELL=/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
*/15 * * * * root vps check-fix -s -c container-aliveness 2>&1 | logger -t check-fix
*/5 * * * * root vps check-fix -s rocketchat 2>&1 | logger -t check-fix
EOF
#+end_src
** Par services
*** odoo
**** Backups
***** Backuping odoo account (filestore and database)
****** Via =vps= command
A few examples:
#+begin_src sh
## dump default database of default service to file db.zip
vps odoo dump db.zip
## dump default database of 'odoo2' service
vps odoo dump /tmp/db.zip -s odoo2
## dump 'odoodev' database of default 'odoo' service
vps odoo dump /tmp/db.zip -d odoodev
#+end_src
****** Via charm only actions
Be sure that your odoo instance should be already up.
#+BEGIN_SRC sh
MYODOOSERVICENAME=odoo
DBNAME="$MYODOOSERVICENAME"
OUTPUTFILE=backup-odoo.zip
compose save "$MYODOOSERVICENAME" "$DBNAME" > "$OUTPUTFILE"
#+END_SRC
***** Restoring odoo account (filestore and database)
*IMPORTANT* you might want to consider the usage of =docker-cutoff= if
you are restoring a production odoo onto a dev or staging odoo that you
don't want to allow to go mess around with sending mails or fetching mails.
#+BEGIN_SRC yaml
docker-cutoff 25 993 465
#+END_SRC
****** Via =vps= command
#+begin_src sh
## restore default database of default service from file db.zip
vps odoo restore db.zip
## restore default database of 'odoo2' service
vps odoo restore /tmp/db.zip -s odoo2
## restore 'odoodev' database of default 'odoo' service
vps odoo restore /tmp/db.zip -d odoodev
## restore on database of default 'odoo' service, and neutralize the restored base
vps odoo restore -n /tmp/db.zip
#+end_src
****** Via standard charm action
Be sure that your odoo instance is already up.
These are the normal loading instructions:
#+BEGIN_SRC sh
MYODOOSERVICENAME=odoo
DBNAME="$MYODOOSERVICENAME"
SOURCEFILE=backup-odoo.zip
compose load "$MYODOOSERVICENAME" "$DBNAME" < "$SOURCEFILE"
#+END_SRC
**** Update de modules
#+BEGIN_SRC sh
compose update odoo MABASE [MODULE [MODULE ...]]
#+END_SRC
**** lancement d'une commande odoo
Si l'ensemble n'est pas up:
#+BEGIN_SRC sh
compose --debug run odoo --help
#+END_SRC
**** Mod dev d'odoo
Il est souhaitable de lancer odoo en mode dev avec un terminal prêt à
accueillir un pdb par exemple, et pouvoir changer facilement la ligne de commande.
On peut tout a fait lancer odoo directement, par exempe:
#+BEGIN_SRC sh
compose run --rm --use-aliases odoo --dev=wdb --config=/opt/odoo/auto/odoo.conf
#+END_SRC
On récupère ainsi tous les volumes et autres options (sauf ce qui est
dans =command:=) défini dans =compose.yml=.
Un problème cependant: si on utilise apache comme frontend, celui-ci
ne pourra pas résoudre le nom =odoo= à cause de problèmes autour de
=docker-compose= et/ou =docker network=. En effet, si on fait un =up=
comme d'habitude, et qu'on souhaite simplement arrêter le service
classique pour ensuite le remplacer par la commande au dessus, cela ne
fonctionnera pas. En effet, l'alias réseau =odoo= n'est plus adjoignable
(même avec les commandes =docker network {dis,}connect=), et même si
le container original de odoo est détruit ou éjecté du réseau, ou que l'on
essaye de connecter soi-même le nouveau container.
Un moyen (bancal) de passer outre cependant:
- =down= pour fermer le réseau
- =create= sur le service apache, puis =restart=.
- enfin, le =run= tel que décrit au dessus
Soit:
#+BEGIN_SRC sh
compose down &&
compose create apache &&
compose restart apache &&
compose run --rm --use-aliases odoo --dev=wdb --config=/opt/odoo/auto/odoo.conf
#+END_SRC
Le container odoo crée par la dernière ligne se retirera proprement des tables DNS
interne, et donc peut tout a fait être relancée autant de fois que l'on souhaitera.
**** Single Sign On en carafe
L'installation du module =website= et =galicia= pour l'authentication
Single Sign On peut aboutir à une situation où le sign on est
automatique et arrive sur un mauvais utilisateur.
Il s'agit de l'utilisateur attaché à l'objet =website= surlequel le sign on
du service tiers a été configuré pour pointer.
En effet, l'objet ~website~ possède un ~user_id~ qui va être utilisé en guise
d'utilisateur par défaut. Si celui-ci ne correspond pas à l'utilisateur odoo ~public_user~,
alors =galicia= considère que cet utilisateurs est déjà loggé et offre son accès.
La solution est de forcer le ~user_id~ des objets ~website~ à l'id de l'utilisateur ~public_user~.
C'est ce que fait la commande:
#+begin_src sh
vps odoo fix-sso
#+end_src
*** letsencrypt
Le service letsencrypt fourni des certificat SSL à la demande et les
renouvelle automatiquement.
**** configuration dans compose
***** Authentification HTTP
Il n'y a besoin d'aucune option dans le service =letsencrypt=.
Le charm =apache= doit trouver un service utilisant le charm =letsencrypt=, cette
connection se fera automatiquement si un servce de type =letsencrypt= est lancé soit
parce que directement mentionné dans la racine ou dans une relation explicite.
La relation construite automatiquement (ou manuellement) d'un service
=apache= vers un service =letsencrypt= s'appelle =cert-provider=.
Une fois que ce service est relié à apache, on peut s'en servir comme clé dans
la configuration =ssl= des relations =*-->web-proxy-->apache=.
Par défaut, =apache= utilisera du ssl pour tout se virtual-host s'il trouve un
=cert-provider= à disposition.
Aussi la configuration suivante est suffisante pour avoir un site publié en SSL:
#+BEGIN_SRC yaml
www.mydomain.org:
charm: odoo
apache:
letsencrypt:
#+END_SRC
Cela équivaut à :
#+BEGIN_SRC yaml
www.mydomain.org:
charm: odoo
relations:
web-proxy:
myapache:
domain: www.mydomain.org
ssl:
myletsencrypt:
challenge-type: http
myapache:
charm: apache
myletsencrypt:
charm: letsencrypt
#+END_SRC
***** Authentification DNS
****** créer un nouveau jeu de clé OVH pour l'authentification DNS
When =letsencrypt= is setup and running::
#+BEGIN_SRC sh
compose --debug add letsencrypt DOMAIN [DOMAIN...]
#+END_SRC
Exemple de setup (dans =compose.yml=):
#+BEGIN_SRC yaml
letsencrypt:
options:
email: admin@0k.io
ovh:
entrypoint: ovh-eu
application:
key: ZZZ
secret: XXX
consumer_key: YYYYY
#+END_SRC
Le résultat est dans =/srv/datastore/data/letsencrypt/etc/letsencrypt/live/DOMAIN1=
Il apparaît entre 30sec et 1 minute après la demande.
****** Vérifier que le jeu de clé ovh est bon
Cette commande prend le compose yml et va vérifier que les accès sont valides:
#+BEGIN_SRC shell
check-compose-ovh-credentials compose.yml
#+END_SRC
**** Utilisation manuelle
On peut utiliser le service =letsencrypt= manuellement
***** creation d'un certificat http
#+BEGIN_SRC shell
compose crt letsencrypt create DOMAIN [DOMAIN...]
#+END_SRC
Cette action crée un certificat (et force le renouvellement si existant).
On peut y injecter une configuration via =--add-compose-content= si nécessaire::
#+BEGIN_SRC shell
compose --add-compose-content='
letsencrypt:
ovh:
## see: https://api.ovh.com/g934.first_step_with_api
entrypoint: ovh-eu
application:
key: XXX
secret: YYY
consumer_key: ZZZ
challenge-type: dns
#renew-before-expiry: 30' crt letsencrypt create DOMAIN [DOMAIN...]
#+END_SRC
***** Renew de tous les certificats
Cela renew uniquement les certificats dont la date de validité est inférieure à 30j
#+BEGIN_SRC shell
compose crt letsencrypt renew
#+END_SRC
***** Liste des certificats gérés et infos connexes
#+BEGIN_SRC shell
compose run letsencrypt crt list
#+END_SRC
***** suppression d'un certificat
#+BEGIN_SRC shell
compose run letsencrypt certbot delete --cert-name DOMAIN
#+END_SRC
*** apache
**** Utiliser letsencrypt
Pour ajouter la fonctionalité de génération automatique de certificat
via le service =letsencrypt=, il faut:
- déclarer un service =letsencrypt= si cela n'est pas déjà fait
- le lier au charm apache via une relation =cert-provider=:
#+BEGIN_SRC yaml
frontend:
charm: apache
relations:
cert-provider: letsencrypt
letsencrypt:
...
#+END_SRC
Et l'on peut alors utiliser la valeur =letsencrypt= (le nom du service qui implémente
qui est en relation =cert-provider= avec apache) dans le champ =ssl=::
#+BEGIN_SRC yaml
web-proxy:
apache:
...
ssl: letsencrypt
#+END_SRC
**** Changer les clés SSL
Voici un exemple de ce qu'on peut mettre dans les options de la relation apache
pour déclarer le certificat que l'on souhaite:
#+BEGIN_SRC yaml
ssl:
ca-cert:
-----BEGIN CERTIFICATE-----
MIIF6TCCA9GgAwIBAgIQBeTcO5Q4qzuFl8umoZhQ4zANBgkqhkiG9w0BAQwFADCB
iDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0pl
...
m9T8bJUox04FB6b9HbwZ4ui3uRGKLXASUoWNjDNKD/yZkuBjcNqllEdjB+dYxzFf
BT02Vf6Dsuimrdfp5gJ0iHRc2jTbkNJtUQoj1iM=
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIFdzCCBF+gAwIBAgIQE+oocFv07O0MNmMJgGFDNjANBgkqhkiG9w0BAQwFADBv
MQswCQYDVQQGEwJTRTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFk
...
Le9Gclc1Bb+7RrtubTeZtv8jkpHGbkD4jylW6l/VXxRTrPBPYer3IsynVgviuDQf
Jtl7GQVoP7o81DgGotPmjw7jtHFtQELFhLRAlSv0ZaBIefYdgWOWnU914Ph85I6p
0fKtirOMxyHNwu8=
-----END CERTIFICATE-----
cert: |
-----BEGIN CERTIFICATE-----
MIIF/TCCBOWgAwIBAgIRALUydpTpCApfYMuJchDJv5AwDQYJKoZIhvcNAQELBQAw
XzELMAkGA1UEBhMCRlIxDjAMBgNVBAgTBVBhcmlzMQ4wDAYDVQQHEwVQYXJpczEO
...
lIxY9HJanHrWvjiz7+eToxXpZJtAPXTx5hxzcJrtWROlq7IJCMIhzr/EVA37jTCk
Xs5S6mr0T6Dqx6MQkPATSsEEJlLH5wq3DxXQcrMqnM/WHMRYUCkoTl37sXplflHe
jw==
-----END CERTIFICATE-----
key: |
-----BEGIN PRIVATE KEY-----
MIIJRQIBADANBgkqhkiG9w0BAQEFAASCCS8wggkrAgEAAoICAQDONqqTCS4CiSi/
XeNpp2nUsq1299spGc7mlRs+PDrXNHscB5lUB5/yo2yEetYXrJacQ8n4NV9hkID5
...
44eHDYsofcnRbidGR+QT8PQgiiDNCkbpi2u4QnLTs0w4oW+53ZTyHYEYF2rcLbIb
vRt4kR4KG6ULXrmsRA4WQjBDJ9vZw2aK+w==
-----END PRIVATE KEY-----
#+END_SRC
**** Ajouter des rêgles particulière de apache
#+BEGIN_SRC yaml
relations:
web-proxy:
apache:
...
apache-custom-rules: |
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [R=302,L,QSA]
#+END_SRC
**** Vérification des derniers logs de renouvellement automatique
#+BEGIN_SRC shell
tail -f /srv/datastore/data/cron/var/log/cron/letsencrypt-renew_script.log -n 200
#+END_SRC
*** postgres
**** utilisation de pgm
récupérer l'IP du docker postgres via =docker-ip=
#+BEGIN_SRC sh
PGHOST=172.19.0.2 PGUSER=postgres pgm ls
#+END_SRC
**** base corrompue, réparation
Il s'agit de lancer un =pg_resetwal=, il faut veiller à plusieurs élément:
- bien arréter tout process utilisant le répertoire de =data= du
postgres en question, généralement un =compose stop postgres=
suffit.
- utiliser l'image du postgres via son nom (habituellement =myc_postgres=).
- monter le répertoire data =directement=
Le tout peut se faire ainsi dans une installation qui fait tourner un postgres
actuellement:
#+begin_src sh
compose stop postgres &&
docker run --rm --entrypoint pg_resetwal \
-u postgres -v /srv/datastore/data/postgres/var/lib/postgresql/data:/var/lib/postgresql/data \
myc_postgres \
/var/lib/postgresql/data &&
docker start myc_postgres_1
#+end_src
*** mysql
**** sur installation mailcow
Le script =vps= fourni via =myc-manage=, permet la commande =vps
install backup MYBACKUPDEST=, qui s'occupe de mettre en place le dump
de =mysql=, et le système pour envoyer les backup régulièrement via
rsync.
**** docker sans compose
#+begin_src sh
export MYSQL_ROOT_PASSWORD=xxx
export MYSQL_CONTAINER=mailcowdockerized_mysql-mailcow_1
/srv/charm-store/mysql/hooks/install.d/60-backup.sh
#+end_src
*** rsync-backup
**** Installation du backup de compose / mailcow
Les commandes suivantes permettent l'installation du backup sur les
deux type de serveur suivant :
- un serveur =compose= est un serveur ayant des services géré par
=compose= à backupper.
- un serveur =mailcow= est un serveur faisant tourner l'installation =mailcow=.
***** Via la commande 0km sur un hôte admin
L'instruction suivante doit être executée sur un hôte ayant la
commande =0km= d'installée et les accès SSH vers le VPS et un compte
d'administration du service =rsync-backup-target= sur le serveur
d'archivage.
Dans l'exemple suivant on utilise le compte administration du service
=rsync-backup-target= nommé =myadmin=... pour avoir la liste des
compte admin, se reporter au contenu du fichier =compose.yml= sur le
serveur d'archivage et plus spécifiquement la configuration du service
=rsync-backup-target=. Les noms des comptes admin y sont défini ainsi
que les clés publiques y ayant accès.
#+begin_src sh
0km vps-install backup myadmin@core-06.0k.io:10023 myvps.fr
#+end_src
Note: on peut spécifier autant de vps que l'on souhaite en fin de
ligne de commande. L'installation des vps se fera en parallèle et
vers le serveur d'archive spécifié en premier argument.
Note: cette commande peut-être executé plusieurs fois sur le même
hôte : si tout est déjà installé, cette commande n'aura pour seul
effet que de relancer une synchronisation vers le backup.
***** Via la commande vps sur le vps lui-même
A faire depuis le serveur compose ou mailcow:
#+begin_src sh
vps install backup core-06.0k.io:10023
#+end_src
Ici =core-06.0k.io:10023= est le serveur cible d'archivage (à modifier
si nécessaire).
A la fin de l'opération, une commande est proposée pour ajouter
facilement la nouvelle clé à l'hôte s'occupant de l'archivage.
Cette commande doit être executée sur un hôte ayant les accès vers un
compte administration du serveur d'archivage.
Dans le cas d'un VPS sur installation compose, il s'agira également de
relancer sur le VPS lui-même, un =compose up= pour intégrer et lancer
le nouveau container de backup.
Une fois la clé enregistrée du coté du serveur d'archivage, un premier
archivage peut être déclenché via:
#+begin_src sh
vps backup
#+end_src
Ceci permet de lancer le premier backup et de valider que tout fonctionne
**** Installation du backup sur un host debian
Cela fonctionnera sur tout host ayant une base debian.
#+begin_src sh
DOMAIN=mail.xxxx.fr
BACKUP_SERVER=core-06.0k.io:10023
cd /srv/charm-store/rsync-backup/
./hooks/install.d/60-install.sh
#+end_src
Note, il est possible de spécifier des exclusions pour chaque
répértoire mirroré de telle façon:
#+begin_src sh
cat <> /etc/mirror-dir/config.yml
/home:
exclude:
- /*/.cache/
- /*/.gvfs/
- /*/.local/share/Trash/files/
- /*/.Trash/
- /*/.mozilla/firefox/*/Cache/
- /*/.mozilla/firefox/*/storage/default/*/cache/
/media/data:
exclude:
- /binary/games/_steam
- /incoming
- /.Trash*
- /lost+found
- /backup/device
EOF
#+end_src
*** nextcloud
**** Mise à jour en dernière version
Cette commande permet d'appliquer successivement les version de
nextcloud, elle modifie le =compose.yml=. Et installe la dernière
version disponible donnée par =docker-tags-fetch docker.0k.io/nextcloud=.
Étant donné que la commande est un peu nouvelle et la tâche assez
fastidieuse et risquée, ne pas hésiter à la lancer dans un =tmux= pour
être prêt à demander de l'aide. Également, lancer un =myc-update= avant.
Aussi, il est toujours bon de vérifier que le backup fonctionne et que
la version sur le serveur de backup est à jour (lancer =vps backup= est
un bon moyen de voir cela).
#+begin_src sh
vps nextcloud upgrade
#+end_src
*** mongo
**** Mise à jour en dernière version
Cette commande permet d'appliquer successivement les version de
mongo, elle modifie le =compose.yml=. Et installe la dernière
version disponible donnée par =docker-tags-fetch docker.0k.io/mongo=.
Étant donné que la commande est un peu nouvelle et la tâche assez
fastidieuse et risquée, ne pas hésiter à la lancer dans un =tmux= pour
être prêt à demander de l'aide. Également, lancer un =myc-update= avant.
Aussi, il est toujours bon de vérifier que le backup fonctionne et que
la version sur le serveur de backup est à jour (lancer =vps backup= est
un bon moyen de voir cela).
#+begin_src sh
vps mongo upgrade
#+end_src
*** onlyoffice
**** Troubleshooting
Il y eu de nombreux cas où onlyoffice pète ses propres
fichiers de config. Une bonne façon de le régler:
#+begin_src sh
docker stop myc_onlyoffice_1
rm -rf /srv/datastore/config/onlyoffice
compose --debug up
#+end_src
Ceci permet d'effacer la config mise en place par compose et de la
reconstruire, et tout ce qui est dans
`/srv/datastore/config/onlyoffice` se reconstruit tout seul via les
charms au moment du `compose up`.
* Interventions avancées
Description des process avancés d'intervention sur une installation existante.
** Modification du compose
Y a un exemple en commentaire dans le =/opt/apps/myc-deploy/compose.yml=
Petit exemple:
#+BEGIN_SRC yaml
odoo:
...
docker-compose:
## Important to keep as a list: otherwise it'll overwrite charm's arguments.
command:
- "--log-level=debug"
environment:
TOTO: TUTU
image: masuperimage
#+END_SRC
** Récupération de donnée
*** Depuis le VPS backuppé
Les VPS backuppés peuvent avoir besoin de récupérer les données
archivées. Pour le moment, comme il n'y pas d'accès aux versions
précédentes des backups, l'intérêt de cette fonctionnalité reste
limité.
**** Par répertoire
Via la commande =vps=, l'action =recover-target= permet de recouvrir
les données du service d'archivage (si celui-ci à été correctement
installé avec les commandes spécifiée dans la [[*rsync-backup][section =rsync-backup=]]).
Récupération d'un répertoire:
#+begin_src sh
vps recover-target "cron/" /tmp/cron
#+end_src
Cette commande va récupérer le contenu archivé dans "cron/" pour le mettre
sur l'hôte courant dans "/tmp/cron".
Il est possible de spécifier l'option =--dry-run= (ou =-n=) pour ne
rien modifier et voir quels sont les actions qui seront menées.
Attention à l'usage de cette commande, en effet le répertoire de
destination peut-être entièrement modifié : cette commande effacera et
modifiera le contenu du répertoire de destination.
*** Depuis un hôte d'administration
**** Récupération d'un VPS complet
***** Mailcow
Depuis un hôte d'adminstration, et via la command =0km=, nous
pouvons re-déployer un backup existant sur un nouveau VPS.
#+begin_src sh
0km vps-backup recover myadmin@core-06.0k.io:10023#mail.mybackupedvps.com mynewvps.com
#+end_src
Attention, cela supprimera toute installation =mailcow= précédente
(donnée comprise) sur le VPS de destination.
***** Compose
La commande complète n'est pas implémentée, mais il s'agit surtout de faire un
recover partiel:
#+begin_src sh
0km vps-backup recover myadmin@core-06.0k.io:10023#mail.mybackupedvps.com:/ mynewvps.com:/srv/datastore/data
#+end_src
Puis de copier le fichier =/srv/datastore/data/compose.yml= sur =/opt/apps/myc-deploy/compose.yml=:
#+begin_src sh
cp /srv/datastore/data/compose.yml /opt/apps/myc-deploy/compose.yml
#+end_src
Puis s'occuper des bases de données:
****** récupération des bases postgres
Dans le répertoire =/srv/datastore/data/postgres/var/backups/pg=
Récupération des derniers dumps:
#+begin_src sh
compose --debug up postgres
for dump in /srv/datastore/data/postgres/var/backups/pg; do
pgm cp "$dump" postgres@"${dump%%.*}"
done
#+end_src
****** récupération des bases mongo
Dans le répertoire =/srv/datastore/data/mongo/var/backups/mongo=
#+begin_src sh
compose --debug up mongo
docker run -ti --rm \
-v /srv/datastore/data/mongo/var/backups/mongo:/tmp/backups \
-w /tmp/backups \
--entrypoint mongorestore \
--network myc_default \
myc_mongo --host rs01/mongo /tmp/backups/
#+end_src
****** Finalisation
Tout devrait être bon.
Un ~compose --debug up~ devrait faire l'affaire.
**** Récupération partielle
***** Récupération d'un répertoire ou fichier précis
Depuis un hôte d'administration, et via la command =0km=, nous pouvons
récupérer un répertoire ou un fichier précis d'un backup existant sur
un nouveau VPS.
C'est la même commande que pour la récupération complète, on rajoute à
la source un chemin et possible aussi à la destination.
#+begin_src sh
0km vps-backup recover myadmin@core-06.0k.io:10023#mail.mybackupedvps.com:/mon/chemin mynewvps.com
0km vps-backup recover myadmin@core-06.0k.io:10023#mail.mybackupedvps.com:/mon/chemin mynewvps.com:/ma/dest
#+end_src
***** Récupération d'un composant
Suivant si le type de backup est reconnu et le supporte, il est
possible de nommer un composant précis en lieu et place d'un
répertoire ou d'un fichier.
Par exemple, les backup de type 'mailcow' supportent les composants
suivants: =mailcow=, =postfix=, =rspamd=, =redis=, =crypt=, =vmail=,
=vmail-attachments=, =mysql=.
#+begin_src sh
0km vps-backup recover myadmin@core-06.0k.io:10023#mail.mybackupedvps.com:mailcow,mysql mynewvps.com
0km vps-backup recover myadmin@core-06.0k.io:10023#mail.mybackupedvps.com:postfix mynewvps.com
#+end_src
** Usage de l’alerting
Une commande ~send~ est fourni pour envoyer des alertes via [[https://docs.ntfy.sh/][ntfy]], et
par défaut, enverra ces notifications sur http://ntfy.0k.io .
Par défaut, le VPS dispose d'un topic qui lui est propre (et surlequel
il a les droits de publication). Et il est possible de rediriger les
différent type de notification vers les topics que l'on souhaite pour
permettre une administration de ces VPS.
Donc, pour les admin, via la commande ~0km vps-subscribe~, on pourra
facilement gérer l'addition de nouveau topic et en même temps
s'assurer de donner les droit au VPS de publication sur ces topics.
*** Commande ~send~
Sur le VPS, la commande ~send~ permet d’envoyer un message sur un ou
plusieurs topics. (voir ~send --help~ pour plus d’info). La fonction
envoie un message sur un channel, et ce message est envoyé à tous les
topics associés à ce channel.
**** Configuration du serveur de notification
La configuration du serveur de notification et les identifiant unique
du VPS sont dans le fichier ~/etc/ntfy/ntfy.conf~.
**** Configuration des topics
La configuration des channels/topics est faite dans le fichier
~/etc/ntfy/topics.yml~.
Exemple:
- Configuration par défaut
#+begin_src yaml
.*\.(emerg|alert|crit|err|warning|notice):
- ${LOGIN}_main
#+end_src
On pourra utiliser:
#+begin_src sh
send -c backup.crit "no backup done in 24h"
#+end_src
qui sera notifié sur le serveur =ntfy= de la configuration en cours, dans le
topic ~${LOGIN}_main~. Ainsi que tout autre message dans les channels se terminant
par ~.emerg~, ~.alert~, ... etc...
- Configuration spécifique
#+begin_src yaml
.*\.alert:
- elabore_alert
#+end_src
Si on **ajoute** la précédente configuration, la commande suivante:
#+begin_src sh
send -c disk.alert "no space left"
#+end_src
... va envoyer le message aussi bien au précédent topic
~${LOGIN}_main~, mais aussi au topic ~elabore_alert~ car il se
termine par ~.alert~.
-
#+begin_src yaml
main:
- maintenance
- debug_foo
- ${LOGIN}_main
#+end_src
La commande:
#+begin_src sh
send -c main "no space left"
#+end_src
.. enverra sur les topics ~maintenance~ et ~debug_foo~ et
~${LOGIN}_main~ (qui est un topic créé pour le VPS par défaut).
*** Ajouter/Enlever des droits d’écriture sur les topics
Sur un poste d'admin (via la commande ~0km~), et après avoir demandé
un accès au serveur ntfy de destination (une clé SSH sera nécessaire),
on pourra utiliser la sous-commande ~0km vps-subscribe~.
#+begin_src sh
## Ajouter
0km vps-subscribe add CHANNEL TOPIC VPS
## Enlever
0km vps-subscribe rm CHANNEL TOPIC VPS
#+end_src
** Troubleshooting
S'il semble qu'il y a un soucis, il est possible de visualiser le
=docker-compose.yml= qui est généré à la fin via l'ajout de =--debug=
AVANT la commande:
#+begin_src sh
compose --debug up odoo frontend
#+end_src
*** en cas de soucis important ou inédit
**** Lancer un ~compose --debug up~
La simple action de relancer un ~compose --debug up~ permet à compose
de repasser sur tous les scripts et notamment cela permet de recréer
toutes les configurations, aussi certains des containers peuvent être
également recréés et relancés. Notamment si de nouvelles images de
services ont été ~pull~ récemment.
#+begin_src sh
compose --debug up
#+end_src
Si cette commande ne fonctionne pas, prendre le temps de bien lire le
message d'erreur.
**** Vider les cache de ~compose~
En cas de problème non expliqués et inédits, il est bon de vérifier si
l'effacement des caches de compose ne permet pas de corriger le
problème :
#+begin_src sh
compose --debug cache clear
#+end_src
Puis relancer la commande qui ne fonctionne pas (par exemple ~compose
--debug up~).
**** Redémarrage du service =docker=
Il y a de nombreux bugs répertoriés sur ~docker~ qui n'ont pas été
réglés depuis de nombreuses années qui sont corrigés par un ~restart~ de
tous les containers et du service docker lui-même.
#+begin_src sh
systemctl restart docker.service
#+end_src
va redémarrer le service docker sur la machine et donc tous les
services gérés par docker (tous les services en somme).
La coupure de service de cette commande est relativement courte
(inférieure à la minute).
**** Redéploiement des services
Ce dernier cas est long, et n'est pas souvent efficace, mais il peut
l'être dans certains cas. Cela va stopper et effacer tous les
containers des services, puis reconstruire toute leur configuration et
les relancer.
Attention cela engendre une coupure de service qui peut être longue (le temps
d'un ~compose up~ complet).
#+begin_src sh
compose --debug down &&
compose --debug up
#+end_src
* Comment ça marche
La surcouche =compose= a pour responsabilité de:
- créer graduellement un =docker-compose.yml= et lancer =docker-compose=.
- à partir des *charms* qui factorisent les parties réutilisables
- et à partir du =compose.yml= qui offre une interface plus haut niveau
et permet d'exprimer plus succintement les intentions de déploiement sans
entrer dans la logique technique de l'implémentation des services.
- lancer des executable et des instructions au fur et à mesure si nécessaire.
Il part du =compose.yml= et accède aux définitions en yaml des charms
à déployer et qui sont dans /srv/charms ... (qui en fait sont dans
=/opt/apps/0k-charms=).
Chaque charm possède une définition générale (le =metadata.yml=) qui
permet également l'injection d'élément dans le =docker-compose.yml=
final.
Et puis il y a des =hooks= : des scripts bash lancés avec des
information contextuelle dans des variables d'environment, et qui vont
généralement mettre en place des services à l'initialisation ou pour
s'assurer de la bonne liaison entre les services.