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.

909 lines
23 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, on peut installer la machine pour être prête
  24. à 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. ** Par services
  224. *** odoo
  225. **** Backups
  226. ***** Backuping odoo account (filestore and database)
  227. There are still some quirks, so be sure:
  228. - to change your current directory to =/opt/apps/myc-deploy=
  229. - your odoo instance should be already up.
  230. - to have =admin-password= defined in your =compose.yml=, in your
  231. =odoo= service's =options=.
  232. #+BEGIN_SRC yaml
  233. odoo:
  234. options:
  235. admin-password: XXXXXX
  236. #+END_SRC
  237. #+BEGIN_SRC sh
  238. MYODOOSERVICENAME=odoo
  239. DBNAME="$MYODOOSERVICENAME"
  240. OUTPUTFILE=backup-odoo.zip
  241. cd /opt/apps/myc-deploy &&
  242. compose save "$MYODOOSERVICENAME" "$DBNAME" "$OUTPUT_FILE"
  243. #+END_SRC
  244. The backup file should be in the same directory.
  245. ***** Restoring odoo account (filestore and database)
  246. There are still some quirks, so be sure:
  247. - to change your current directory to =/opt/apps/myc-deploy=
  248. and put your backup file in the same directory
  249. - your odoo instance should be already up.
  250. - to have =admin-password= defined in your =compose.yml=, in your
  251. =odoo= service's =options=.
  252. #+BEGIN_SRC yaml
  253. odoo:
  254. options:
  255. admin-password: XXXXXX
  256. #+END_SRC
  257. *IMPORTANT* you might want to consider the usage of docker-cutoff if
  258. you are restoring a production odoo onto a dev or staging odoo that you
  259. don't want to allow to go mess around with sending mails or fetching mails.
  260. #+BEGIN_SRC yaml
  261. docker-cutoff 25 993 465
  262. #+END_SRC
  263. These are the normal loading instructions:
  264. #+BEGIN_SRC sh
  265. MYODOOSERVICENAME=odoo
  266. DBNAME="$MYODOOSERVICENAME"
  267. SOURCEFILE=backup-odoo.zip
  268. cd /opt/apps/myc-deploy &&
  269. compose load "$MYODOOSERVICENAME" "$SOURCEFIE" "$DBNAME"
  270. #+END_SRC
  271. ***** charger un dump SQL dans odoo
  272. Supporte *.dump ou sql (non compressé), *.gz ou *.bz2:
  273. #+BEGIN_SRC sh
  274. compose load-db odoo MONFICHIER.dump.bz2
  275. #+END_SRC
  276. ***** sauvegarder dump db de odoo
  277. Pour l'instant on passe par pgm
  278. #+BEGIN_SRC sh
  279. compose save-db odoo MONFICHIER.dump.bz2
  280. #+END_SRC
  281. **** Update de modules
  282. #+BEGIN_SRC sh
  283. compose update odoo MABASE [MODULE [MODULE ...]]
  284. #+END_SRC
  285. **** lancement d'une commande odoo
  286. Si l'ensemble n'est pas up:
  287. #+BEGIN_SRC sh
  288. compose --debug run odoo --help
  289. #+END_SRC
  290. **** Mod dev d'odoo
  291. Il est souhaitable de lancer odoo en mode dev avec un terminal prêt à
  292. accueillir un pdb par exemple, et pouvoir changer facilement la ligne de commande.
  293. On peut tout a fait lancer odoo directement, par exempe:
  294. #+BEGIN_SRC sh
  295. compose run --rm --use-aliases odoo --dev=wdb --config=/opt/odoo/auto/odoo.conf
  296. #+END_SRC
  297. On récupère ainsi tous les volumes et autres options (sauf ce qui est
  298. dans =command:=) défini dans =compose.yml=.
  299. Un problème cependant: si on utilise apache comme frontend, celui-ci
  300. ne pourra pas résoudre le nom =odoo= à cause de problèmes autour de
  301. =docker-compose= et/ou =docker network=. En effet, si on fait un =up=
  302. comme d'habitude, et qu'on souhaite simplement arrêter le service
  303. classique pour ensuite le remplacer par la commande au dessus, cela ne
  304. fonctionnera pas. En effet, l'alias réseau =odoo= n'est plus adjoignable
  305. (même avec les commandes =docker network {dis,}connect=), et même si
  306. le container original de odoo est détruit ou éjecté du réseau, ou que l'on
  307. essaye de connecter soi-même le nouveau container.
  308. Un moyen (bancal) de passer outre cependant:
  309. - =down= pour fermer le réseau
  310. - =create= sur le service apache, puis =restart=.
  311. - enfin, le =run= tel que décrit au dessus
  312. Soit:
  313. #+BEGIN_SRC sh
  314. compose down &&
  315. compose create apache &&
  316. compose restart apache &&
  317. compose run --rm --use-aliases odoo --dev=wdb --config=/opt/odoo/auto/odoo.conf
  318. #+END_SRC
  319. Le container odoo crée par la dernière ligne se retirera proprement des tables DNS
  320. interne, et donc peut tout a fait être relancée autant de fois que l'on souhaitera.
  321. *** letsencrypt
  322. Le service letsencrypt fourni des certificat SSL à la demande et les
  323. renouvelle automatiquement.
  324. **** configuration dans compose
  325. ***** Authentification HTTP
  326. Il n'y a besoin d'aucune option dans le service =letsencrypt=.
  327. Le charm =apache= doit trouver un service utilisant le charm =letsencrypt=, cette
  328. connection se fera automatiquement si un servce de type =letsencrypt= est lancé soit
  329. parce que directement mentionné dans la racine ou dans une relation explicite.
  330. La relation construite automatiquement (ou manuellement) d'un service
  331. =apache= vers un service =letsencrypt= s'appelle =cert-provider=.
  332. Une fois que ce service est relié à apache, on peut s'en servir comme clé dans
  333. la configuration =ssl= des relations =*-->web-proxy-->apache=.
  334. Par défaut, =apache= utilisera du ssl pour tout se virtual-host s'il trouve un
  335. =cert-provider= à disposition.
  336. Aussi la configuration suivante est suffisante pour avoir un site publié en SSL:
  337. #+BEGIN_SRC yaml
  338. www.mydomain.org:
  339. charm: odoo
  340. apache:
  341. letsencrypt:
  342. #+END_SRC
  343. Cela équivaut à :
  344. #+BEGIN_SRC yaml
  345. www.mydomain.org:
  346. charm: odoo
  347. relations:
  348. web-proxy:
  349. myapache:
  350. domain: www.mydomain.org
  351. ssl:
  352. myletsencrypt:
  353. challenge-type: http
  354. myapache:
  355. charm: apache
  356. myletsencrypt:
  357. charm: letsencrypt
  358. #+END_SRC
  359. ***** Authentification DNS
  360. ****** créer un nouveau jeu de clé OVH pour l'authentification DNS
  361. When =letsencrypt= is setup and running::
  362. #+BEGIN_SRC sh
  363. compose --debug add letsencrypt DOMAIN [DOMAIN...]
  364. #+END_SRC
  365. Exemple de setup (dans =compose.yml=):
  366. #+BEGIN_SRC yaml
  367. letsencrypt:
  368. options:
  369. email: admin@0k.io
  370. ovh:
  371. entrypoint: ovh-eu
  372. application:
  373. key: ZZZ
  374. secret: XXX
  375. consumer_key: YYYYY
  376. #+END_SRC
  377. Le résultat est dans =/srv/datastore/data/letsencrypt/etc/letsencrypt/live/DOMAIN1=
  378. Il apparaît entre 30sec et 1 minute après la demande.
  379. ****** Vérifier que le jeu de clé ovh est bon
  380. Cette commande prend le compose yml et va vérifier que les accès sont valides:
  381. #+BEGIN_SRC shell
  382. check-compose-ovh-credentials compose.yml
  383. #+END_SRC
  384. **** Utilisation manuelle
  385. On peut utiliser le service =letsencrypt= manuellement
  386. ***** creation d'un certificat http
  387. #+BEGIN_SRC shell
  388. compose crt letsencrypt create DOMAIN [DOMAIN...]
  389. #+END_SRC
  390. Cette action crée un certificat (et force le renouvellement si existant).
  391. On peut y injecter une configuration via =--add-compose-content= si nécessaire::
  392. #+BEGIN_SRC shell
  393. compose --add-compose-content='
  394. letsencrypt:
  395. ovh:
  396. ## see: https://api.ovh.com/g934.first_step_with_api
  397. entrypoint: ovh-eu
  398. application:
  399. key: XXX
  400. secret: YYY
  401. consumer_key: ZZZ
  402. challenge-type: dns
  403. #renew-before-expiry: 30' crt letsencrypt create DOMAIN [DOMAIN...]
  404. #+END_SRC
  405. ***** Renew de tous les certificats
  406. Cela renew uniquement les certificats dont la date de validité est inférieure à 30j
  407. #+BEGIN_SRC shell
  408. compose crt letsencrypt renew
  409. #+END_SRC
  410. ***** Liste des certificats gérés et infos connexes
  411. #+BEGIN_SRC shell
  412. compose run letsencrypt crt list
  413. #+END_SRC
  414. ***** suppression d'un certificat
  415. #+BEGIN_SRC shell
  416. compose run letsencrypt certbot delete --cert-name DOMAIN
  417. #+END_SRC
  418. *** apache
  419. **** Utiliser letsencrypt
  420. Pour ajouter la fonctionalité de génération automatique de certificat
  421. via le service =letsencrypt=, il faut:
  422. - déclarer un service =letsencrypt= si cela n'est pas déjà fait
  423. - le lier au charm apache via une relation =cert-provider=:
  424. #+BEGIN_SRC yaml
  425. frontend:
  426. charm: apache
  427. relations:
  428. cert-provider: letsencrypt
  429. letsencrypt:
  430. ...
  431. #+END_SRC
  432. Et l'on peut alors utiliser la valeur =letsencrypt= (le nom du service qui implémente
  433. qui est en relation =cert-provider= avec apache) dans le champ =ssl=::
  434. #+BEGIN_SRC yaml
  435. web-proxy:
  436. apache:
  437. ...
  438. ssl: letsencrypt
  439. #+END_SRC
  440. **** Changer les clés SSL
  441. Voici un exemple de ce qu'on peut mettre dans les options de la relation apache
  442. pour déclarer le certificat que l'on souhaite:
  443. #+BEGIN_SRC yaml
  444. ssl:
  445. ca-cert:
  446. -----BEGIN CERTIFICATE-----
  447. MIIF6TCCA9GgAwIBAgIQBeTcO5Q4qzuFl8umoZhQ4zANBgkqhkiG9w0BAQwFADCB
  448. iDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0pl
  449. ...
  450. m9T8bJUox04FB6b9HbwZ4ui3uRGKLXASUoWNjDNKD/yZkuBjcNqllEdjB+dYxzFf
  451. BT02Vf6Dsuimrdfp5gJ0iHRc2jTbkNJtUQoj1iM=
  452. -----END CERTIFICATE-----
  453. -----BEGIN CERTIFICATE-----
  454. MIIFdzCCBF+gAwIBAgIQE+oocFv07O0MNmMJgGFDNjANBgkqhkiG9w0BAQwFADBv
  455. MQswCQYDVQQGEwJTRTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFk
  456. ...
  457. Le9Gclc1Bb+7RrtubTeZtv8jkpHGbkD4jylW6l/VXxRTrPBPYer3IsynVgviuDQf
  458. Jtl7GQVoP7o81DgGotPmjw7jtHFtQELFhLRAlSv0ZaBIefYdgWOWnU914Ph85I6p
  459. 0fKtirOMxyHNwu8=
  460. -----END CERTIFICATE-----
  461. cert: |
  462. -----BEGIN CERTIFICATE-----
  463. MIIF/TCCBOWgAwIBAgIRALUydpTpCApfYMuJchDJv5AwDQYJKoZIhvcNAQELBQAw
  464. XzELMAkGA1UEBhMCRlIxDjAMBgNVBAgTBVBhcmlzMQ4wDAYDVQQHEwVQYXJpczEO
  465. ...
  466. lIxY9HJanHrWvjiz7+eToxXpZJtAPXTx5hxzcJrtWROlq7IJCMIhzr/EVA37jTCk
  467. Xs5S6mr0T6Dqx6MQkPATSsEEJlLH5wq3DxXQcrMqnM/WHMRYUCkoTl37sXplflHe
  468. jw==
  469. -----END CERTIFICATE-----
  470. key: |
  471. -----BEGIN PRIVATE KEY-----
  472. MIIJRQIBADANBgkqhkiG9w0BAQEFAASCCS8wggkrAgEAAoICAQDONqqTCS4CiSi/
  473. XeNpp2nUsq1299spGc7mlRs+PDrXNHscB5lUB5/yo2yEetYXrJacQ8n4NV9hkID5
  474. ...
  475. 44eHDYsofcnRbidGR+QT8PQgiiDNCkbpi2u4QnLTs0w4oW+53ZTyHYEYF2rcLbIb
  476. vRt4kR4KG6ULXrmsRA4WQjBDJ9vZw2aK+w==
  477. -----END PRIVATE KEY-----
  478. #+END_SRC
  479. **** Ajouter des rêgles particulière de apache
  480. #+BEGIN_SRC yaml
  481. relations:
  482. web-proxy:
  483. apache:
  484. ...
  485. apache-custom-rules: |
  486. RewriteEngine On
  487. RewriteCond %{HTTPS} off
  488. RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [R=302,L,QSA]
  489. #+END_SRC
  490. **** Vérification des derniers logs de renouvellement automatique
  491. #+BEGIN_SRC shell
  492. tail -f /srv/datastore/data/cron/var/log/cron/letsencrypt-renew_script.log -n 200
  493. #+END_SRC
  494. *** postgres
  495. **** utilisation de pgm
  496. récupérer l'IP du docker postgres via =docker-ip=
  497. #+BEGIN_SRC sh
  498. PGHOST=172.19.0.2 PGUSER=postgres pgm ls
  499. #+END_SRC
  500. **** base corrompue, réparation
  501. Il s'agit de lancer un =pg_resetwal=, il faut veiller à plusieurs élément:
  502. - bien arréter tout process utilisant le répertoire de =data= du
  503. postgres en question, généralement un =compose stop postgres=
  504. suffit.
  505. - utiliser l'image du postgres via son nom (habituellement =myc_postgres=).
  506. - monter le répertoire data =directement=
  507. Le tout peut se faire ainsi dans une installation qui fait tourner un postgres
  508. actuellement:
  509. #+begin_src sh
  510. compose stop postgres &&
  511. docker run --rm --entrypoint pg_resetwal \
  512. -u postgres -v /srv/datastore/data/postgres/var/lib/postgresql/data:/var/lib/postgresql/data \
  513. myc_postgres \
  514. /var/lib/postgresql/data &&
  515. docker start myc_postgres_1
  516. #+end_src
  517. *** mysql
  518. **** sur installation mailcow
  519. Le script =vps= fourni via =myc-manage=, permet la commande =vps
  520. install backup MYBACKUPDEST=, qui s'occupe de mettre en place le dump
  521. de =mysql=, et le système pour envoyer les backup régulièrement via
  522. rsync.
  523. **** docker sans compose
  524. #+begin_src sh
  525. export MYSQL_ROOT_PASSWORD=xxx
  526. export MYSQL_CONTAINER=mailcowdockerized_mysql-mailcow_1
  527. /srv/charm-store/mysql/hooks/install.d/60-backup.sh
  528. #+end_src
  529. *** rsync-backup
  530. **** Installation du backup via compose / mailcow
  531. - un serveur =compose= est un serveur ayant des services géré par
  532. =compose= à backupper.
  533. - un serveur =mailcow= est un serveur faisant tourner l'installation =mailcow=.
  534. ***** Via la commande 0km sur un hôte admin
  535. L'instruction suivante doit être executée sur un hôte ayant la commande
  536. =0km= d'installée et les accès vers le VPS et un compte administration
  537. du serveur d'archivage.
  538. #+begin_src sh
  539. 0km vps-install backup myadmin@core-06.0k.io:10023 myvps.fr
  540. #+end_src
  541. Note: on peut spécifier autant de vps que l'on souhaite en fin de
  542. ligne de commande. L'installation des vps se fera en parallèle et
  543. vers le serveur d'archive spécifié en premier argument.
  544. Note: cette commande peut-être executé plusieurs fois sur le même
  545. hôte : si tout est déjà installé, cette commande n'aura pour seul
  546. effet que de relancer une synchronisation vers le backup.
  547. ***** Via la commande vps sur le vps lui-même
  548. A faire depuis le serveur compose ou mailcow:
  549. #+begin_src sh
  550. vps install backup core-06.0k.io:10023
  551. #+end_src
  552. Ici =core-06.0k.io:10023= est le serveur cible d'archivage (à modifier
  553. si nécessaire).
  554. A la fin de l'opération, une commande est proposée pour ajouter
  555. facilement la nouvelle clé à l'hôte s'occupant de l'archivage.
  556. Cette commande doit être executée sur un hôte ayant les accès vers un
  557. compte administration du serveur d'archivage. Plusieurs clés peuvent
  558. être ajoutée avant de redémarrer le service d'archivage du coté du
  559. serveur.
  560. Dans le cas d'un VPS sur installation compose, il s'agira également de
  561. relancer sur le VPS lui-même, un =compose up= pour intégrer et lancer
  562. le nouveau container de backup.
  563. Une fois la clé enregistrée du coté du serveur d'archivage, un premier
  564. archivage peut être déclenché via:
  565. #+begin_quote
  566. vps backup
  567. #+end_quote
  568. Ceci permet de lancer le premier backup et de valider que tout fonctionne
  569. **** Installation du backup sur un host debian
  570. Cela fonctionnera sur tout host ayant une base debian.
  571. #+begin_src sh
  572. DOMAIN=mail.xxxx.fr
  573. BACKUP_SERVER=core-06.0k.io:10023
  574. cd /srv/charm-store/rsync-backup/
  575. ./hooks/install.d/60-install.sh
  576. #+end_src
  577. Note, il est possible de spécifier des exclusions pour chaque
  578. répértoire mirroré de telle façon:
  579. #+begin_src sh
  580. cat <<EOF >> /etc/mirror-dir/config.yml
  581. /home:
  582. exclude:
  583. - /*/.cache/
  584. - /*/.gvfs/
  585. - /*/.local/share/Trash/files/
  586. - /*/.Trash/
  587. - /*/.mozilla/firefox/*/Cache/
  588. - /*/.mozilla/firefox/*/storage/default/*/cache/
  589. /media/data:
  590. exclude:
  591. - /binary/games/_steam
  592. - /incoming
  593. - /.Trash*
  594. - /lost+found
  595. - /backup/device
  596. EOF
  597. #+end_src
  598. * Interventions avancées
  599. Description des process avancés d'intervention sur une installation existante.
  600. ** Modification du compose
  601. Y a un exemple en commentaire dans le =/opt/apps/myc-deploy/compose.yml=
  602. Petit exemple:
  603. #+BEGIN_SRC yaml
  604. odoo:
  605. ...
  606. docker-compose:
  607. ## Important to keep as a list: otherwise it'll overwrite charm's arguments.
  608. command:
  609. - "--log-level=debug"
  610. environment:
  611. TOTO: TUTU
  612. image: masuperimage
  613. #+END_SRC
  614. ** Récupération de donnée
  615. Via la commande =vps=, l'action =recover-target= permet de recouvrir
  616. les données du service d'archivage (si celui-ci à été correctement
  617. installé avec les commandes spécifiée dans la [[*rsync-backup][section =rsync-backup=]]).
  618. Récupération d'un répertoire:
  619. #+begin_src sh
  620. vps recover-target "cron/" /tmp/cron
  621. #+end_src
  622. Cette commande va récupérer le contenu archivé dans "cron/" pour le mettre
  623. sur l'hôte courant dans "/tmp/cron".
  624. Il est possible de spécifier l'option =--dry-run= (ou =-n=) pour ne
  625. rien modifier et voir quels sont les actions qui seront menées.
  626. Attention à l'usage de cette commande, en effet le répertoire de
  627. destination peut-être entièrement modifié : cette commande effacera et
  628. modifiera le contenu du répertoire de destination.
  629. ** Troubleshooting
  630. S'il semble qu'il y ait un soucis, tu peux visualiser le =docker-compose.yml= qui est
  631. généré à la fin via l'ajout de =--debug= AVANT la commande:
  632. #+BEGIN_EXAMPLE
  633. compose --debug up odoo frontend
  634. #+END_EXAMPLE
  635. * Comment ça marche
  636. La surcouche =compose= est là pour créer un =docker-compose.yml= et le
  637. lancer tout a fait normalement. Le long du chemin, il peut aussi
  638. préparer des trucs utiles si c'est nécessaire.
  639. Il part du =compose.yml= et accède aux définitions en yaml des charms à déployer
  640. et qui sont dans /srv/charms ... (qui en fait sont dans =/opt/apps/0k-charms=).
  641. Chaque charm possède une définition générale (le =metadata.yml=) qui peut aussi
  642. injecter des trucs dans le =docker-compose.yml= final.
  643. Et puis il y a des =hooks=, qui sont juste des scripts bash qui sont
  644. lancés avec des infos dans des variables d'environment, qui vont généralement
  645. créer des trucs à l'init ou lors de liaison avec d'autres charms.