You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

1035 lines
28 KiB

  1. #+SETUPFILE: /home/vaab/dev/el/org-html-themes/setup/theme-readtheorg.setup
  2. #+PROPERTY: Effort_ALL 0 0:30 1:00 2:00 0.5d 1d 1.5d 2d 3d 4d 5d
  3. #+PROPERTY: Max_effort_ALL 0 0:30 1:00 2:00 0.5d 1d 1.5d 2d 3d 4d 5d
  4. #+PROPERTY: header-args:python :var filename=(buffer-file-name)
  5. #+PROPERTY: header-args:sh :var filename=(buffer-file-name)
  6. #+TODO: TODO WIP BLOCKED POSTPONED | DONE CANCELED
  7. #+LATEX_HEADER: \usepackage[margin=0.5in]{geometry}
  8. #+LaTeX_CLASS: article
  9. #+OPTIONS: H:8 ^:nil prop:("Effort" "Max_effort") tags:not-in-toc
  10. #+COLUMNS: %50ITEM %Effort(Min Effort) %Max_effort(Max Effort)
  11. #+begin_LaTeX
  12. \hypersetup{
  13. linkcolor=blue,
  14. pdfborder={0 0 0 0}
  15. }
  16. #+end_LaTeX
  17. #+TITLE: Architecture 0k.io
  18. #+LATEX: \pagebreak
  19. * Process de déploiement
  20. Description du process de déploiement pour une nouvelle installation
  21. ** Base myc
  22. *** Qu'est ce c'est ?
  23. A partir d'une debian 9 ou debian 10, on peut installer la machine
  24. pour être prête à utiliser un déploiement myc.
  25. Une fois executé, la machine aura toute les deps pour lancer une
  26. commande compose qui fera peut-être appel à des registry de
  27. mycéliandre. Un compose de base est aussi proposé.
  28. *** Déploiement
  29. **** Hôte linux base debian 9 et debian 10
  30. ***** Accès ssh standardisé
  31. Via la commande =0km=, depuis votre poste, permet de standardiser
  32. l'accès avec vos clés SSH, et positionner le nom de domaine si
  33. nécessaire.
  34. #+BEGIN_SRC sh
  35. 0km vps-setup HOST
  36. #+END_SRC
  37. Note: ceci fonctionnera que si vous avez un fichier de configuration
  38. dans =/etc/0km/config.yml= (si vous allez l'utiliser en root) ou dans
  39. =~/.config/0km/config.yml= autrement. Ce fichier doit au moins contenir
  40. une clé ssh (ou plusieurs) ainsi:
  41. #+begin_src yaml
  42. ssh-access:
  43. public-keys:
  44. - ssh-rsa AAAAB3NzaC1yc2EAAAAD...qGy20KlAOGPf nom_clef
  45. #+end_src
  46. ***** Déploiement de la solution pour compose
  47. Depuis le VPS, en root:
  48. #+BEGIN_SRC sh
  49. export WITHOUT_DOCKER_CLEAN=1 ## only if you want to remove docker clean from cron
  50. wget https://justodooit.myceliandre.fr/r/deploy -qO - | bash
  51. #+END_SRC
  52. Si vous souhaitez positionner le nom de domaine:
  53. #+BEGIN_SRC sh
  54. export WITHOUT_DOCKER_CLEAN=1 ## only if you want to remove docker clean from cron
  55. export DOMAIN=myhost.com
  56. wget https://justodooit.myceliandre.fr/r/deploy -qO - | bash
  57. #+END_SRC
  58. ***** Déploiement de la solution pour mailcow
  59. ****** Sur un vps sans mailcow de pre-installé
  60. #+BEGIN_SRC sh
  61. export WITHOUT_DOCKER_CLEAN=1 ## only if you want to remove docker clean from cron
  62. wget https://justodooit.myceliandre.fr/r/deploy -qO - | bash
  63. #+END_SRC
  64. ****** Sur un vps avec mailcow de pre-installé
  65. #+BEGIN_SRC sh
  66. export WITHOUT_DOCKER_CLEAN=1 ## only if you want to remove docker clean from cron
  67. export NO_DOCKER_RESTART=1 ## Can use that only if mailcow is pre-existing
  68. wget https://justodooit.myceliandre.fr/r/deploy -qO - | bash
  69. #+END_SRC
  70. **** Hôte macosx
  71. - install bash, docker
  72. - Uncheck "Securely store docker logins in macOS keychain"
  73. *** Ce que cela fait
  74. **** Mettre la machine en état charm-ready
  75. - installation du strict minimu pour lancer les =charms=
  76. - téléchargement de la dernière version des =0k-charms= (collection
  77. de recettes d'installation et de gestion de docker)
  78. **** Mettre la machine en état compose ready (notre docker qui va bien)
  79. via le lancement du charm =docker-host= qui installe:
  80. - docker, docker-compose, compose avec des versions qui vont bien
  81. - paquets maisons (kal-scripts, 0k-manage, 0k-pgm, lxc-scripts, 0k-docker)
  82. - accès pour le repository deb de kalysto.org
  83. - clé SSH pour repos git.kal.fr
  84. - login sur le docker registry docker.0k.io
  85. **** Commandes spécifique à myc
  86. - login sur le registry myc
  87. - téléchargement du compose de base dans =/opt/apps/myc-deploy=
  88. ** Modification du compose
  89. *** Qu'est-ce que c'est ?
  90. Il y a des update client à faire souvent sur le compose. Cette étape
  91. doit être externalisée au plus possible, sont consigné ici ce qu'il
  92. faut encore faire à la main.
  93. *** Commande
  94. **** Création de clé OVH pour letsencrypt/lexicon
  95. Ceci n'est nécessaire qu'en cas d'utilisation de la méthode DNS
  96. pour valider la possession du domaine auprès de letsencrypt.
  97. #+BEGIN_SRC shell
  98. APPLICATION_KEY=XXXXXXXXXXXXXXXXX
  99. REDIR_WEBSITE=https://0k.io
  100. req=$(cat <<EOF
  101. {
  102. "accessRules": [
  103. {
  104. "method": "GET",
  105. "path": "/*"
  106. },
  107. {
  108. "method": "POST",
  109. "path": "/*"
  110. },
  111. {
  112. "method": "PUT",
  113. "path": "/*"
  114. },
  115. {
  116. "method": "DELETE",
  117. "path": "/*"
  118. }
  119. ],
  120. "redirection":"$REDIR_WEBSITE"
  121. }
  122. EOF
  123. )
  124. res=$(curl -X POST \
  125. -H "X-Ovh-Application: ${APPLICATION_KEY}" \
  126. -H "Content-type: application/json" \
  127. https://eu.api.ovh.com/1.0/auth/credential \
  128. -d "$req")
  129. consumer_key=$(echo "$res" | jq -r .consumerKey)
  130. validation_url=$(echo "$res" | jq -r .validationUrl)
  131. echo "Visit: $validation_url"
  132. echo "ConsumerKey: $consumer_key"
  133. #+END_SRC
  134. Il s'agit alors de remplir le compose.yml
  135. #+BEGIN_SRC yaml
  136. ovh:
  137. ## see: https://api.ovh.com/g934.first_step_with_api
  138. entrypoint: ovh-eu
  139. application:
  140. key: XXXXXXXXXXXXXXXX
  141. secret: YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY
  142. consumer_key: ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
  143. #+END_SRC
  144. Puis de valider que tout est ok:
  145. #+BEGIN_SRC shell
  146. check-compose-ovh-credentials compose.yml
  147. #+END_SRC
  148. ** Lancement/Deploy de service odoo
  149. *** Qu'est ce que c'est ?
  150. A partir d'une base myc, cette commande permet d'envoyer la
  151. construction et l'assemblage de tous les services décrit dans le
  152. =compose.yml= fourni par défaut.
  153. *** commandes
  154. #+BEGIN_SRC sh
  155. cd /opt/apps/myc-deploy
  156. compose --debug up odoo frontend
  157. #+END_SRC
  158. De manière générale:
  159. #+BEGIN_SRC sh
  160. compose [--debug] up [SERVICES...]
  161. #+END_SRC
  162. *** Ce que ça fait
  163. Les charms vont s'occuper de séparer la config des
  164. donnée, de tout stocker dans =/srv/datastore=, il vont
  165. s'occuper de la petite maintenance:
  166. - le charm postgres (qui est une dépendance du service odoo) va créer
  167. un mot de passe et le filer à odoo
  168. - le charm apache (qui implémente le service frontend)
  169. va créer les fichiers de conf apache pour déclarer un virtualhost
  170. et mettre les clés SSL s'il y a lieu.
  171. * Gestion
  172. Description des process de gestion d'une installation existante.
  173. ** Connection aux serveurs
  174. *** installation commande =st=
  175. Le mieux est d'utiliser la commande =st= que l'on peut installer ainsi
  176. sur un poste linux ayant =apt=:
  177. Se mettre en =root=:
  178. #+begin_src sh
  179. cat <<'EOF' > /usr/local/bin/st
  180. #!/bin/bash
  181. echo "Trying mosh to $1"
  182. TERM=xterm-256color mosh "$1" -- bash -c "tmux attach || { tmux; }"
  183. if [ "$?" == "5" ]; then
  184. echo "Fallback to ssh $1"
  185. ssh "$1" -tM "TERM=xterm-256color tmux attach || TERM=xterm-256color tmux"
  186. fi
  187. EOF
  188. chmod +x /usr/local/bin/st
  189. apt install mosh
  190. #+end_src
  191. *** utilisation de la commande =st=
  192. =st= utilise =ssh= ou =mosh= et se met dans un =tmux= sur la destination.
  193. #+begin_src sh
  194. st root@monvps.fr
  195. #+end_src
  196. On note qu'il faut penser à mettre les clé SSH sur la destination.
  197. ** Mise à jour de l'ensemble
  198. Pour mettre à jour un VPS:
  199. #+BEGIN_SRC sh
  200. myc-update
  201. #+END_SRC
  202. Cette commande va ré-appliquer l'installation du charm =docker-host=
  203. qui installe ou met à jour chaque composant.
  204. ** Gestion des dockers
  205. *** Relancement
  206. si on veut relancer parce que le compose a changé :
  207. on fait pareil qu'au lancement : lors du "up", docker-compose se
  208. rend compte que la définition des services a changé et relance les
  209. docker voulu.
  210. *** Arrêt
  211. #+BEGIN_SRC sh
  212. compose --debug down
  213. #+END_SRC
  214. *** Voir les logs
  215. #+BEGIN_SRC sh
  216. cd /opt/apps/myc-deploy
  217. compose --debug logs odoo
  218. #+END_SRC
  219. *** Obtenir les IPs des dockers
  220. #+BEGIN_SRC sh
  221. docker-ip
  222. #+END_SRC
  223. *** Limiter la mémoire utilisée par un container
  224. Certains container vont demander beaucoup de memoire par défaut et
  225. doivent être contenu dans des environment limités.
  226. Aussi, on peut limiter la mémoire d'un docker dans le fichier
  227. =compose.yml=:
  228. #+begin_src yaml
  229. mon-service:
  230. # ...
  231. docker-compose:
  232. mem_limit: 2g
  233. memswap_limit: 2g ## Au cas où l'on a du swap
  234. # ...
  235. #+end_src
  236. *** Vérification de santé générale
  237. La commande =vps check-fix= contrôler les containers en cours de
  238. fonctionnement pour vérifier s'ils ne sont pas touché par quelques
  239. problème identifiés et connus. Et elle va réparer ce qu'elle peut.
  240. #+begin_src sh
  241. vps check-fix
  242. #+end_src
  243. Il est possible de lancer ces vérifications sur une liste de service
  244. spécifique ou de sélectionner le test voulu. Voir =vps check-fix
  245. --help= pour plus d'info.
  246. Il peut être opportun d'ajouter dans sur l'hôte, par exemple, une
  247. vérification périodique et automatique:
  248. #+begin_src sh
  249. cat <<EOF > /etc/cron.d/vps-check
  250. SHELL=/bin/bash
  251. PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
  252. */15 * * * * root vps check-fix -s -c container-aliveness 2>&1 | logger -t check-fix
  253. */5 * * * * root vps check-fix -s rocketchat 2>&1 | logger -t check-fix
  254. EOF
  255. #+end_src
  256. ** Par services
  257. *** odoo
  258. **** Backups
  259. ***** Backuping odoo account (filestore and database)
  260. ****** Via =vps= command
  261. A few examples:
  262. #+begin_src sh
  263. ## dump default database of default service to file db.zip
  264. vps odoo dump db.zip
  265. ## dump default database of 'odoo2' service
  266. vps odoo dump /tmp/db.zip -s odoo2
  267. ## dump 'odoodev' database of default 'odoo' service
  268. vps odoo dump /tmp/db.zip -d odoodev
  269. #+end_src
  270. ****** Via charm only actions
  271. Be sure that your odoo instance should be already up.
  272. #+BEGIN_SRC sh
  273. MYODOOSERVICENAME=odoo
  274. DBNAME="$MYODOOSERVICENAME"
  275. OUTPUTFILE=backup-odoo.zip
  276. compose save "$MYODOOSERVICENAME" "$DBNAME" > "$OUTPUTFILE"
  277. #+END_SRC
  278. ***** Restoring odoo account (filestore and database)
  279. *IMPORTANT* you might want to consider the usage of =docker-cutoff= if
  280. you are restoring a production odoo onto a dev or staging odoo that you
  281. don't want to allow to go mess around with sending mails or fetching mails.
  282. #+BEGIN_SRC yaml
  283. docker-cutoff 25 993 465
  284. #+END_SRC
  285. ****** Via =vps= command
  286. #+begin_src sh
  287. ## restore default database of default service from file db.zip
  288. vps odoo restore db.zip
  289. ## restore default database of 'odoo2' service
  290. vps odoo restore /tmp/db.zip -s odoo2
  291. ## restore 'odoodev' database of default 'odoo' service
  292. vps odoo restore /tmp/db.zip -d odoodev
  293. #+end_src
  294. ****** Via standard charm action
  295. Be sure that your odoo instance is already up.
  296. These are the normal loading instructions:
  297. #+BEGIN_SRC sh
  298. MYODOOSERVICENAME=odoo
  299. DBNAME="$MYODOOSERVICENAME"
  300. SOURCEFILE=backup-odoo.zip
  301. compose load "$MYODOOSERVICENAME" "$DBNAME" < "$SOURCEFILE"
  302. #+END_SRC
  303. **** Update de modules
  304. #+BEGIN_SRC sh
  305. compose update odoo MABASE [MODULE [MODULE ...]]
  306. #+END_SRC
  307. **** lancement d'une commande odoo
  308. Si l'ensemble n'est pas up:
  309. #+BEGIN_SRC sh
  310. compose --debug run odoo --help
  311. #+END_SRC
  312. **** Mod dev d'odoo
  313. Il est souhaitable de lancer odoo en mode dev avec un terminal prêt à
  314. accueillir un pdb par exemple, et pouvoir changer facilement la ligne de commande.
  315. On peut tout a fait lancer odoo directement, par exempe:
  316. #+BEGIN_SRC sh
  317. compose run --rm --use-aliases odoo --dev=wdb --config=/opt/odoo/auto/odoo.conf
  318. #+END_SRC
  319. On récupère ainsi tous les volumes et autres options (sauf ce qui est
  320. dans =command:=) défini dans =compose.yml=.
  321. Un problème cependant: si on utilise apache comme frontend, celui-ci
  322. ne pourra pas résoudre le nom =odoo= à cause de problèmes autour de
  323. =docker-compose= et/ou =docker network=. En effet, si on fait un =up=
  324. comme d'habitude, et qu'on souhaite simplement arrêter le service
  325. classique pour ensuite le remplacer par la commande au dessus, cela ne
  326. fonctionnera pas. En effet, l'alias réseau =odoo= n'est plus adjoignable
  327. (même avec les commandes =docker network {dis,}connect=), et même si
  328. le container original de odoo est détruit ou éjecté du réseau, ou que l'on
  329. essaye de connecter soi-même le nouveau container.
  330. Un moyen (bancal) de passer outre cependant:
  331. - =down= pour fermer le réseau
  332. - =create= sur le service apache, puis =restart=.
  333. - enfin, le =run= tel que décrit au dessus
  334. Soit:
  335. #+BEGIN_SRC sh
  336. compose down &&
  337. compose create apache &&
  338. compose restart apache &&
  339. compose run --rm --use-aliases odoo --dev=wdb --config=/opt/odoo/auto/odoo.conf
  340. #+END_SRC
  341. Le container odoo crée par la dernière ligne se retirera proprement des tables DNS
  342. interne, et donc peut tout a fait être relancée autant de fois que l'on souhaitera.
  343. *** letsencrypt
  344. Le service letsencrypt fourni des certificat SSL à la demande et les
  345. renouvelle automatiquement.
  346. **** configuration dans compose
  347. ***** Authentification HTTP
  348. Il n'y a besoin d'aucune option dans le service =letsencrypt=.
  349. Le charm =apache= doit trouver un service utilisant le charm =letsencrypt=, cette
  350. connection se fera automatiquement si un servce de type =letsencrypt= est lancé soit
  351. parce que directement mentionné dans la racine ou dans une relation explicite.
  352. La relation construite automatiquement (ou manuellement) d'un service
  353. =apache= vers un service =letsencrypt= s'appelle =cert-provider=.
  354. Une fois que ce service est relié à apache, on peut s'en servir comme clé dans
  355. la configuration =ssl= des relations =*-->web-proxy-->apache=.
  356. Par défaut, =apache= utilisera du ssl pour tout se virtual-host s'il trouve un
  357. =cert-provider= à disposition.
  358. Aussi la configuration suivante est suffisante pour avoir un site publié en SSL:
  359. #+BEGIN_SRC yaml
  360. www.mydomain.org:
  361. charm: odoo
  362. apache:
  363. letsencrypt:
  364. #+END_SRC
  365. Cela équivaut à :
  366. #+BEGIN_SRC yaml
  367. www.mydomain.org:
  368. charm: odoo
  369. relations:
  370. web-proxy:
  371. myapache:
  372. domain: www.mydomain.org
  373. ssl:
  374. myletsencrypt:
  375. challenge-type: http
  376. myapache:
  377. charm: apache
  378. myletsencrypt:
  379. charm: letsencrypt
  380. #+END_SRC
  381. ***** Authentification DNS
  382. ****** créer un nouveau jeu de clé OVH pour l'authentification DNS
  383. When =letsencrypt= is setup and running::
  384. #+BEGIN_SRC sh
  385. compose --debug add letsencrypt DOMAIN [DOMAIN...]
  386. #+END_SRC
  387. Exemple de setup (dans =compose.yml=):
  388. #+BEGIN_SRC yaml
  389. letsencrypt:
  390. options:
  391. email: admin@0k.io
  392. ovh:
  393. entrypoint: ovh-eu
  394. application:
  395. key: ZZZ
  396. secret: XXX
  397. consumer_key: YYYYY
  398. #+END_SRC
  399. Le résultat est dans =/srv/datastore/data/letsencrypt/etc/letsencrypt/live/DOMAIN1=
  400. Il apparaît entre 30sec et 1 minute après la demande.
  401. ****** Vérifier que le jeu de clé ovh est bon
  402. Cette commande prend le compose yml et va vérifier que les accès sont valides:
  403. #+BEGIN_SRC shell
  404. check-compose-ovh-credentials compose.yml
  405. #+END_SRC
  406. **** Utilisation manuelle
  407. On peut utiliser le service =letsencrypt= manuellement
  408. ***** creation d'un certificat http
  409. #+BEGIN_SRC shell
  410. compose crt letsencrypt create DOMAIN [DOMAIN...]
  411. #+END_SRC
  412. Cette action crée un certificat (et force le renouvellement si existant).
  413. On peut y injecter une configuration via =--add-compose-content= si nécessaire::
  414. #+BEGIN_SRC shell
  415. compose --add-compose-content='
  416. letsencrypt:
  417. ovh:
  418. ## see: https://api.ovh.com/g934.first_step_with_api
  419. entrypoint: ovh-eu
  420. application:
  421. key: XXX
  422. secret: YYY
  423. consumer_key: ZZZ
  424. challenge-type: dns
  425. #renew-before-expiry: 30' crt letsencrypt create DOMAIN [DOMAIN...]
  426. #+END_SRC
  427. ***** Renew de tous les certificats
  428. Cela renew uniquement les certificats dont la date de validité est inférieure à 30j
  429. #+BEGIN_SRC shell
  430. compose crt letsencrypt renew
  431. #+END_SRC
  432. ***** Liste des certificats gérés et infos connexes
  433. #+BEGIN_SRC shell
  434. compose run letsencrypt crt list
  435. #+END_SRC
  436. ***** suppression d'un certificat
  437. #+BEGIN_SRC shell
  438. compose run letsencrypt certbot delete --cert-name DOMAIN
  439. #+END_SRC
  440. *** apache
  441. **** Utiliser letsencrypt
  442. Pour ajouter la fonctionalité de génération automatique de certificat
  443. via le service =letsencrypt=, il faut:
  444. - déclarer un service =letsencrypt= si cela n'est pas déjà fait
  445. - le lier au charm apache via une relation =cert-provider=:
  446. #+BEGIN_SRC yaml
  447. frontend:
  448. charm: apache
  449. relations:
  450. cert-provider: letsencrypt
  451. letsencrypt:
  452. ...
  453. #+END_SRC
  454. Et l'on peut alors utiliser la valeur =letsencrypt= (le nom du service qui implémente
  455. qui est en relation =cert-provider= avec apache) dans le champ =ssl=::
  456. #+BEGIN_SRC yaml
  457. web-proxy:
  458. apache:
  459. ...
  460. ssl: letsencrypt
  461. #+END_SRC
  462. **** Changer les clés SSL
  463. Voici un exemple de ce qu'on peut mettre dans les options de la relation apache
  464. pour déclarer le certificat que l'on souhaite:
  465. #+BEGIN_SRC yaml
  466. ssl:
  467. ca-cert:
  468. -----BEGIN CERTIFICATE-----
  469. MIIF6TCCA9GgAwIBAgIQBeTcO5Q4qzuFl8umoZhQ4zANBgkqhkiG9w0BAQwFADCB
  470. iDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0pl
  471. ...
  472. m9T8bJUox04FB6b9HbwZ4ui3uRGKLXASUoWNjDNKD/yZkuBjcNqllEdjB+dYxzFf
  473. BT02Vf6Dsuimrdfp5gJ0iHRc2jTbkNJtUQoj1iM=
  474. -----END CERTIFICATE-----
  475. -----BEGIN CERTIFICATE-----
  476. MIIFdzCCBF+gAwIBAgIQE+oocFv07O0MNmMJgGFDNjANBgkqhkiG9w0BAQwFADBv
  477. MQswCQYDVQQGEwJTRTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFk
  478. ...
  479. Le9Gclc1Bb+7RrtubTeZtv8jkpHGbkD4jylW6l/VXxRTrPBPYer3IsynVgviuDQf
  480. Jtl7GQVoP7o81DgGotPmjw7jtHFtQELFhLRAlSv0ZaBIefYdgWOWnU914Ph85I6p
  481. 0fKtirOMxyHNwu8=
  482. -----END CERTIFICATE-----
  483. cert: |
  484. -----BEGIN CERTIFICATE-----
  485. MIIF/TCCBOWgAwIBAgIRALUydpTpCApfYMuJchDJv5AwDQYJKoZIhvcNAQELBQAw
  486. XzELMAkGA1UEBhMCRlIxDjAMBgNVBAgTBVBhcmlzMQ4wDAYDVQQHEwVQYXJpczEO
  487. ...
  488. lIxY9HJanHrWvjiz7+eToxXpZJtAPXTx5hxzcJrtWROlq7IJCMIhzr/EVA37jTCk
  489. Xs5S6mr0T6Dqx6MQkPATSsEEJlLH5wq3DxXQcrMqnM/WHMRYUCkoTl37sXplflHe
  490. jw==
  491. -----END CERTIFICATE-----
  492. key: |
  493. -----BEGIN PRIVATE KEY-----
  494. MIIJRQIBADANBgkqhkiG9w0BAQEFAASCCS8wggkrAgEAAoICAQDONqqTCS4CiSi/
  495. XeNpp2nUsq1299spGc7mlRs+PDrXNHscB5lUB5/yo2yEetYXrJacQ8n4NV9hkID5
  496. ...
  497. 44eHDYsofcnRbidGR+QT8PQgiiDNCkbpi2u4QnLTs0w4oW+53ZTyHYEYF2rcLbIb
  498. vRt4kR4KG6ULXrmsRA4WQjBDJ9vZw2aK+w==
  499. -----END PRIVATE KEY-----
  500. #+END_SRC
  501. **** Ajouter des rêgles particulière de apache
  502. #+BEGIN_SRC yaml
  503. relations:
  504. web-proxy:
  505. apache:
  506. ...
  507. apache-custom-rules: |
  508. RewriteEngine On
  509. RewriteCond %{HTTPS} off
  510. RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [R=302,L,QSA]
  511. #+END_SRC
  512. **** Vérification des derniers logs de renouvellement automatique
  513. #+BEGIN_SRC shell
  514. tail -f /srv/datastore/data/cron/var/log/cron/letsencrypt-renew_script.log -n 200
  515. #+END_SRC
  516. *** postgres
  517. **** utilisation de pgm
  518. récupérer l'IP du docker postgres via =docker-ip=
  519. #+BEGIN_SRC sh
  520. PGHOST=172.19.0.2 PGUSER=postgres pgm ls
  521. #+END_SRC
  522. **** base corrompue, réparation
  523. Il s'agit de lancer un =pg_resetwal=, il faut veiller à plusieurs élément:
  524. - bien arréter tout process utilisant le répertoire de =data= du
  525. postgres en question, généralement un =compose stop postgres=
  526. suffit.
  527. - utiliser l'image du postgres via son nom (habituellement =myc_postgres=).
  528. - monter le répertoire data =directement=
  529. Le tout peut se faire ainsi dans une installation qui fait tourner un postgres
  530. actuellement:
  531. #+begin_src sh
  532. compose stop postgres &&
  533. docker run --rm --entrypoint pg_resetwal \
  534. -u postgres -v /srv/datastore/data/postgres/var/lib/postgresql/data:/var/lib/postgresql/data \
  535. myc_postgres \
  536. /var/lib/postgresql/data &&
  537. docker start myc_postgres_1
  538. #+end_src
  539. *** mysql
  540. **** sur installation mailcow
  541. Le script =vps= fourni via =myc-manage=, permet la commande =vps
  542. install backup MYBACKUPDEST=, qui s'occupe de mettre en place le dump
  543. de =mysql=, et le système pour envoyer les backup régulièrement via
  544. rsync.
  545. **** docker sans compose
  546. #+begin_src sh
  547. export MYSQL_ROOT_PASSWORD=xxx
  548. export MYSQL_CONTAINER=mailcowdockerized_mysql-mailcow_1
  549. /srv/charm-store/mysql/hooks/install.d/60-backup.sh
  550. #+end_src
  551. *** rsync-backup
  552. **** Installation du backup de compose / mailcow
  553. Les commandes suivantes permettent l'installation du backup sur les
  554. deux type de serveur suivant :
  555. - un serveur =compose= est un serveur ayant des services géré par
  556. =compose= à backupper.
  557. - un serveur =mailcow= est un serveur faisant tourner l'installation =mailcow=.
  558. ***** Via la commande 0km sur un hôte admin
  559. L'instruction suivante doit être executée sur un hôte ayant la
  560. commande =0km= d'installée et les accès SSH vers le VPS et un compte
  561. d'administration du service =rsync-backup-target= sur le serveur
  562. d'archivage.
  563. Dans l'exemple suivant on utilise le compte administration du service
  564. =rsync-backup-target= nommé =myadmin=... pour avoir la liste des
  565. compte admin, se reporter au contenu du fichier =compose.yml= sur le
  566. serveur d'archivage et plus spécifiquement la configuration du service
  567. =rsync-backup-target=. Les noms des comptes admin y sont défini ainsi
  568. que les clés publiques y ayant accès.
  569. #+begin_src sh
  570. 0km vps-install backup myadmin@core-06.0k.io:10023 myvps.fr
  571. #+end_src
  572. Note: on peut spécifier autant de vps que l'on souhaite en fin de
  573. ligne de commande. L'installation des vps se fera en parallèle et
  574. vers le serveur d'archive spécifié en premier argument.
  575. Note: cette commande peut-être executé plusieurs fois sur le même
  576. hôte : si tout est déjà installé, cette commande n'aura pour seul
  577. effet que de relancer une synchronisation vers le backup.
  578. ***** Via la commande vps sur le vps lui-même
  579. A faire depuis le serveur compose ou mailcow:
  580. #+begin_src sh
  581. vps install backup core-06.0k.io:10023
  582. #+end_src
  583. Ici =core-06.0k.io:10023= est le serveur cible d'archivage (à modifier
  584. si nécessaire).
  585. A la fin de l'opération, une commande est proposée pour ajouter
  586. facilement la nouvelle clé à l'hôte s'occupant de l'archivage.
  587. Cette commande doit être executée sur un hôte ayant les accès vers un
  588. compte administration du serveur d'archivage.
  589. Dans le cas d'un VPS sur installation compose, il s'agira également de
  590. relancer sur le VPS lui-même, un =compose up= pour intégrer et lancer
  591. le nouveau container de backup.
  592. Une fois la clé enregistrée du coté du serveur d'archivage, un premier
  593. archivage peut être déclenché via:
  594. #+begin_src sh
  595. vps backup
  596. #+end_src
  597. Ceci permet de lancer le premier backup et de valider que tout fonctionne
  598. **** Installation du backup sur un host debian
  599. Cela fonctionnera sur tout host ayant une base debian.
  600. #+begin_src sh
  601. DOMAIN=mail.xxxx.fr
  602. BACKUP_SERVER=core-06.0k.io:10023
  603. cd /srv/charm-store/rsync-backup/
  604. ./hooks/install.d/60-install.sh
  605. #+end_src
  606. Note, il est possible de spécifier des exclusions pour chaque
  607. répértoire mirroré de telle façon:
  608. #+begin_src sh
  609. cat <<EOF >> /etc/mirror-dir/config.yml
  610. /home:
  611. exclude:
  612. - /*/.cache/
  613. - /*/.gvfs/
  614. - /*/.local/share/Trash/files/
  615. - /*/.Trash/
  616. - /*/.mozilla/firefox/*/Cache/
  617. - /*/.mozilla/firefox/*/storage/default/*/cache/
  618. /media/data:
  619. exclude:
  620. - /binary/games/_steam
  621. - /incoming
  622. - /.Trash*
  623. - /lost+found
  624. - /backup/device
  625. EOF
  626. #+end_src
  627. *** nextcloud
  628. **** Mise à jour en dernière version
  629. Cette commande permet d'appliquer successivement les version de
  630. nextcloud, elle modifie le =compose.yml=. Et installe la dernière
  631. version disponible donnée par =docker-tags-fetch docker.0k.io/nextcloud=.
  632. Étant donné que la commande est un peu nouvelle et la tâche assez
  633. fastidieuse et risquée, ne pas hésiter à la lancer dans un =tmux= pour
  634. être prêt à demander de l'aide. Également, lancer un =myc-update= avant.
  635. Aussi, il est toujours bon de vérifier que le backup fonctionne et que
  636. la version sur le serveur de backup est à jour (lancer =vps backup= est
  637. un bon moyen de voir cela).
  638. #+begin_src sh
  639. vps nextcloud upgrade
  640. #+end_src
  641. * Interventions avancées
  642. Description des process avancés d'intervention sur une installation existante.
  643. ** Modification du compose
  644. Y a un exemple en commentaire dans le =/opt/apps/myc-deploy/compose.yml=
  645. Petit exemple:
  646. #+BEGIN_SRC yaml
  647. odoo:
  648. ...
  649. docker-compose:
  650. ## Important to keep as a list: otherwise it'll overwrite charm's arguments.
  651. command:
  652. - "--log-level=debug"
  653. environment:
  654. TOTO: TUTU
  655. image: masuperimage
  656. #+END_SRC
  657. ** Récupération de donnée
  658. *** Depuis le VPS backuppé
  659. Les VPS backuppés peuvent avoir besoin de récupérer les données
  660. archivées. Pour le moment, comme il n'y pas d'accès aux versions
  661. précédentes des backups, l'intérêt de cette fonctionnalité reste
  662. limité.
  663. **** Par répertoire
  664. Via la commande =vps=, l'action =recover-target= permet de recouvrir
  665. les données du service d'archivage (si celui-ci à été correctement
  666. installé avec les commandes spécifiée dans la [[*rsync-backup][section =rsync-backup=]]).
  667. Récupération d'un répertoire:
  668. #+begin_src sh
  669. vps recover-target "cron/" /tmp/cron
  670. #+end_src
  671. Cette commande va récupérer le contenu archivé dans "cron/" pour le mettre
  672. sur l'hôte courant dans "/tmp/cron".
  673. Il est possible de spécifier l'option =--dry-run= (ou =-n=) pour ne
  674. rien modifier et voir quels sont les actions qui seront menées.
  675. Attention à l'usage de cette commande, en effet le répertoire de
  676. destination peut-être entièrement modifié : cette commande effacera et
  677. modifiera le contenu du répertoire de destination.
  678. *** Depuis un hôte d'administration
  679. **** Récupération d'un VPS complet
  680. Depuis un hôte d'adminstration, et via la command =0km=, nous
  681. pouvons re-déployer un backup existant sur un nouveau VPS.
  682. #+begin_src sh
  683. 0km vps-backup recover myadmin@core-06.0k.io:10023#mail.mybackupedvps.com mynewvps.com
  684. #+end_src
  685. Attention, cela supprimera toute installation =mailcow= précédente
  686. (donnée comprise) sur le VPS de destination.
  687. **** Récupération partielle
  688. ***** Récupération d'un répertoire ou fichier précis
  689. Depuis un hôte d'adminstration, et via la command =0km=, nous pouvons
  690. récupérer un répertoire ou un fichier précis d'un backup existant sur
  691. un nouveau VPS.
  692. C'est la même commande que pour la récupération complète, on rajoute à
  693. la source un chemin et possible aussi à la destination.
  694. #+begin_src sh
  695. 0km vps-backup recover myadmin@core-06.0k.io:10023#mail.mybackupedvps.com:/mon/chemin mynewvps.com
  696. 0km vps-backup recover myadmin@core-06.0k.io:10023#mail.mybackupedvps.com:/mon/chemin mynewvps.com:/ma/dest
  697. #+end_src
  698. ***** Récupération d'un composant
  699. Suivant si le type de backup est reconnu et le supporte, il est
  700. possible de nommer un composant précis en lieu et place d'un
  701. répertoire ou d'un fichier.
  702. Par exemple, les backup de type 'mailcow' supportent les composants
  703. suivants: =mailcow=, =postfix=, =rspamd=, =redis=, =crypt=, =vmail=,
  704. =vmail-attachments=, =mysql=.
  705. #+begin_src sh
  706. 0km vps-backup recover myadmin@core-06.0k.io:10023#mail.mybackupedvps.com:mailcow,mysql mynewvps.com
  707. 0km vps-backup recover myadmin@core-06.0k.io:10023#mail.mybackupedvps.com:postfix mynewvps.com
  708. #+end_src
  709. ** Troubleshooting
  710. S'il semble qu'il y ait un soucis, tu peux visualiser le =docker-compose.yml= qui est
  711. généré à la fin via l'ajout de =--debug= AVANT la commande:
  712. #+begin_src sh
  713. compose --debug up odoo frontend
  714. #+end_src
  715. * Comment ça marche
  716. La surcouche =compose= a pour responsabilité de:
  717. - créer graduellement un =docker-compose.yml= et lancer =docker-compose=.
  718. - à partir des *charms* qui factorisent les parties réutilisables
  719. - et à partir du =compose.yml= qui offre une interface plus haut niveau
  720. et permet d'exprimer plus succintement les intentions de déploiement sans
  721. entrer dans la logique technique de l'implémentation des services.
  722. - lancer des executable et des instructions au fur et à mesure si nécessaire.
  723. Il part du =compose.yml= et accède aux définitions en yaml des charms
  724. à déployer et qui sont dans /srv/charms ... (qui en fait sont dans
  725. =/opt/apps/0k-charms=).
  726. Chaque charm possède une définition générale (le =metadata.yml=) qui
  727. permet également l'injection d'élément dans le =docker-compose.yml=
  728. final.
  729. Et puis il y a des =hooks= : des scripts bash lancés avec des
  730. information contextuelle dans des variables d'environment, et qui vont
  731. généralement mettre en place des services à l'initialisation ou pour
  732. s'assurer de la bonne liaison entre les services.