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.

664 lines
17 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
  30. #+BEGIN_SRC sh
  31. wget https://justodooit.myceliandre.fr/r/deploy -qO - | bash
  32. #+END_SRC
  33. If you want to setup odoo admin password and domain in one go:
  34. #+BEGIN_SRC sh
  35. export DOMAIN=myhost.com
  36. wget https://justodooit.myceliandre.fr/r/deploy -qO - | bash
  37. #+END_SRC
  38. **** Hôte macosx
  39. - install bash, docker
  40. - Uncheck "Securely store docker logins in macOS keychain"
  41. *** Ce que cela fait
  42. **** Mettre la machine en état charm-ready
  43. - installation du strict minimu pour lancer les =charms=
  44. - téléchargement de la dernière version des =0k-charms= (collection
  45. de recettes d'installation et de gestion de docker)
  46. **** Mettre la machine en état compose ready (notre docker qui va bien)
  47. via le lancement du charm =docker-host= qui installe:
  48. - docker, docker-compose, compose avec des versions qui vont bien
  49. - paquets maisons (kal-scripts, 0k-manage, 0k-pgm, lxc-scripts, 0k-docker)
  50. - accès pour le repository deb de kalysto.org
  51. - clé SSH pour repos git.kal.fr
  52. - login sur le docker registry docker.0k.io
  53. **** Commandes spécifique à myc
  54. - login sur le registry myc
  55. - téléchargement du compose de base dans =/opt/apps/myc-deploy=
  56. ** Modification du compose
  57. *** Qu'est-ce que c'est ?
  58. Il y a des update client à faire souvent sur le compose. Cette étape
  59. doit être externalisée au plus possible, sont consigné ici ce qu'il
  60. faut encore faire à la main.
  61. *** Commande
  62. **** Création de clé OVH pour letsencrypt/lexicon
  63. Ceci n'est nécessaire qu'en cas d'utilisation de la méthode DNS
  64. pour valider la possession du domaine auprès de letsencrypt.
  65. #+BEGIN_SRC shell
  66. APPLICATION_KEY=XXXXXXXXXXXXXXXXX
  67. REDIR_WEBSITE=https://0k.io
  68. req=$(cat <<EOF
  69. {
  70. "accessRules": [
  71. {
  72. "method": "GET",
  73. "path": "/*"
  74. },
  75. {
  76. "method": "POST",
  77. "path": "/*"
  78. },
  79. {
  80. "method": "PUT",
  81. "path": "/*"
  82. },
  83. {
  84. "method": "DELETE",
  85. "path": "/*"
  86. }
  87. ],
  88. "redirection":"$REDIR_WEBSITE"
  89. }
  90. EOF
  91. )
  92. res=$(curl -X POST \
  93. -H "X-Ovh-Application: ${APPLICATION_KEY}" \
  94. -H "Content-type: application/json" \
  95. https://eu.api.ovh.com/1.0/auth/credential \
  96. -d "$req")
  97. consumer_key=$(echo "$res" | jq -r .consumerKey)
  98. validation_url=$(echo "$res" | jq -r .validationUrl)
  99. echo "Visit: $validation_url"
  100. echo "ConsumerKey: $consumer_key"
  101. #+END_SRC
  102. Il s'agit alors de remplir le compose.yml
  103. #+BEGIN_SRC yaml
  104. ovh:
  105. ## see: https://api.ovh.com/g934.first_step_with_api
  106. entrypoint: ovh-eu
  107. application:
  108. key: XXXXXXXXXXXXXXXX
  109. secret: YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY
  110. consumer_key: ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
  111. #+END_SRC
  112. Puis de valider que tout est ok:
  113. #+BEGIN_SRC shell
  114. check-compose-ovh-credentials compose.yml
  115. #+END_SRC
  116. ** Lancement/Deploy de service odoo
  117. *** Qu'est ce que c'est ?
  118. A partir d'une base myc, cette commande permet d'envoyer la
  119. construction et l'assemblage de tous les services décrit dans le
  120. =compose.yml= fourni par défaut.
  121. *** commandes
  122. #+BEGIN_SRC sh
  123. cd /opt/apps/myc-deploy
  124. compose --debug up odoo frontend
  125. #+END_SRC
  126. De manière générale:
  127. #+BEGIN_SRC sh
  128. compose [--debug] up [SERVICES...]
  129. #+END_SRC
  130. *** Ce que ça fait
  131. Les charms vont s'occuper de séparer la config des
  132. donnée, de tout stocker dans =/srv/datastore=, il vont
  133. s'occuper de la petite maintenance:
  134. - le charm postgres (qui est une dépendance du service odoo) va créer
  135. un mot de passe et le filer à odoo
  136. - le charm apache (qui implémente le service frontend)
  137. va créer les fichiers de conf apache pour déclarer un virtualhost
  138. et mettre les clés SSL s'il y a lieu.
  139. * Gestion
  140. Description des process de gestion d'une installation existante.
  141. ** Mise à jour de l'ensemble
  142. Pour mettre à jour un VPS:
  143. #+BEGIN_SRC sh
  144. myc-update
  145. #+END_SRC
  146. Cette commande va ré-appliquer l'installation du charm =docker-host=
  147. qui installe ou met à jour chaque composant.
  148. ** Gestion des dockers
  149. *** Relancement
  150. si on veut relancer parce que le compose a changé :
  151. on fait pareil qu'au lancement : lors du "up", docker-compose se
  152. rend compte que la définition des services a changé et relance les
  153. docker voulu.
  154. *** Arrêt
  155. #+BEGIN_SRC sh
  156. compose --debug down
  157. #+END_SRC
  158. *** Voir les logs
  159. #+BEGIN_SRC sh
  160. cd /opt/apps/myc-deploy
  161. compose --debug logs odoo
  162. #+END_SRC
  163. *** Obtenir les IPs des dockers
  164. #+BEGIN_SRC sh
  165. docker-ip
  166. #+END_SRC
  167. ** Par services
  168. *** odoo
  169. **** Backups
  170. ***** Backuping odoo account (filestore and database)
  171. There are still some quirks, so be sure:
  172. - to change your current directory to =/opt/apps/myc-deploy=
  173. - your odoo instance should be already up.
  174. - to have =admin-password= defined in your =compose.yml=, in your
  175. =odoo= service's =options=.
  176. #+BEGIN_SRC yaml
  177. odoo:
  178. options:
  179. admin-password: XXXXXX
  180. #+END_SRC
  181. #+BEGIN_SRC sh
  182. MYODOOSERVICENAME=odoo
  183. DBNAME="$MYODOOSERVICENAME"
  184. OUTPUTFILE=backup-odoo.zip
  185. cd /opt/apps/myc-deploy &&
  186. compose save "$MYODOOSERVICENAME" "$DBNAME" "$OUTPUT_FILE"
  187. #+END_SRC
  188. The backup file should be in the same directory.
  189. ***** Restoring odoo account (filestore and database)
  190. There are still some quirks, so be sure:
  191. - to change your current directory to =/opt/apps/myc-deploy=
  192. and put your backup file in the same directory
  193. - your odoo instance should be already up.
  194. - to have =admin-password= defined in your =compose.yml=, in your
  195. =odoo= service's =options=.
  196. #+BEGIN_SRC yaml
  197. odoo:
  198. options:
  199. admin-password: XXXXXX
  200. #+END_SRC
  201. *IMPORTANT* you might want to consider the usage of docker-cutoff if
  202. you are restoring a production odoo onto a dev or staging odoo that you
  203. don't want to allow to go mess around with sending mails or fetching mails.
  204. #+BEGIN_SRC yaml
  205. docker-cutoff 25 993 465
  206. #+END_SRC
  207. These are the normal loading instructions:
  208. #+BEGIN_SRC sh
  209. MYODOOSERVICENAME=odoo
  210. DBNAME="$MYODOOSERVICENAME"
  211. SOURCEFILE=backup-odoo.zip
  212. cd /opt/apps/myc-deploy &&
  213. compose load "$MYODOOSERVICENAME" "$SOURCEFIE" "$DBNAME"
  214. #+END_SRC
  215. ***** charger un dump SQL dans odoo
  216. Supporte *.dump ou sql (non compressé), *.gz ou *.bz2:
  217. #+BEGIN_SRC sh
  218. compose load-db odoo MONFICHIER.dump.bz2
  219. #+END_SRC
  220. ***** sauvegarder dump db de odoo
  221. Pour l'instant on passe par pgm
  222. #+BEGIN_SRC sh
  223. compose save-db odoo MONFICHIER.dump.bz2
  224. #+END_SRC
  225. **** Update de modules
  226. #+BEGIN_SRC sh
  227. compose update odoo MABASE [MODULE [MODULE ...]]
  228. #+END_SRC
  229. **** lancement d'une commande odoo
  230. Si l'ensemble n'est pas up:
  231. #+BEGIN_SRC sh
  232. compose --debug run odoo --help
  233. #+END_SRC
  234. **** Mod dev d'odoo
  235. Il est souhaitable de lancer odoo en mode dev avec un terminal prêt à
  236. accueillir un pdb par exemple, et pouvoir changer facilement la ligne de commande.
  237. On peut tout a fait lancer odoo directement, par exempe:
  238. #+BEGIN_SRC sh
  239. compose run --rm --use-aliases odoo --dev=wdb --config=/opt/odoo/auto/odoo.conf
  240. #+END_SRC
  241. On récupère ainsi tous les volumes et autres options (sauf ce qui est
  242. dans =command:=) défini dans =compose.yml=.
  243. Un problème cependant: si on utilise apache comme frontend, celui-ci
  244. ne pourra pas résoudre le nom =odoo= à cause de problèmes autour de
  245. =docker-compose= et/ou =docker network=. En effet, si on fait un =up=
  246. comme d'habitude, et qu'on souhaite simplement arrêter le service
  247. classique pour ensuite le remplacer par la commande au dessus, cela ne
  248. fonctionnera pas. En effet, l'alias réseau =odoo= n'est plus adjoignable
  249. (même avec les commandes =docker network {dis,}connect=), et même si
  250. le container original de odoo est détruit ou éjecté du réseau, ou que l'on
  251. essaye de connecter soi-même le nouveau container.
  252. Un moyen (bancal) de passer outre cependant:
  253. - =down= pour fermer le réseau
  254. - =create= sur le service apache, puis =restart=.
  255. - enfin, le =run= tel que décrit au dessus
  256. Soit:
  257. #+BEGIN_SRC sh
  258. compose down &&
  259. compose create apache &&
  260. compose restart apache &&
  261. compose run --rm --use-aliases odoo --dev=wdb --config=/opt/odoo/auto/odoo.conf
  262. #+END_SRC
  263. Le container odoo crée par la dernière ligne se retirera proprement des tables DNS
  264. interne, et donc peut tout a fait être relancée autant de fois que l'on souhaitera.
  265. *** letsencrypt
  266. Le service letsencrypt fourni des certificat SSL à la demande et les
  267. renouvelle automatiquement.
  268. **** configuration dans compose
  269. ***** Authentification HTTP
  270. Il n'y a besoin d'aucune option dans le service =letsencrypt=.
  271. Le charm =apache= doit trouver un service utilisant le charm =letsencrypt=, cette
  272. connection se fera automatiquement si un servce de type =letsencrypt= est lancé soit
  273. parce que directement mentionné dans la racine ou dans une relation explicite.
  274. La relation construite automatiquement (ou manuellement) d'un service
  275. =apache= vers un service =letsencrypt= s'appelle =cert-provider=.
  276. Une fois que ce service est relié à apache, on peut s'en servir comme clé dans
  277. la configuration =ssl= des relations =*-->web-proxy-->apache=.
  278. Par défaut, =apache= utilisera du ssl pour tout se virtual-host s'il trouve un
  279. =cert-provider= à disposition.
  280. Aussi la configuration suivante est suffisante pour avoir un site publié en SSL:
  281. #+BEGIN_SRC yaml
  282. www.mydomain.org:
  283. charm: odoo
  284. apache:
  285. letsencrypt:
  286. #+END_SRC
  287. Cela équivaut à :
  288. #+BEGIN_SRC yaml
  289. www.mydomain.org:
  290. charm: odoo
  291. relations:
  292. web-proxy:
  293. myapache:
  294. domain: www.mydomain.org
  295. ssl:
  296. myletsencrypt:
  297. challenge-type: http
  298. myapache:
  299. charm: apache
  300. myletsencrypt:
  301. charm: letsencrypt
  302. #+END_SRC
  303. ***** Authentification DNS
  304. ****** créer un nouveau jeu de clé OVH pour l'authentification DNS
  305. When =letsencrypt= is setup and running::
  306. #+BEGIN_SRC sh
  307. compose --debug add letsencrypt DOMAIN [DOMAIN...]
  308. #+END_SRC
  309. Exemple de setup (dans =compose.yml=):
  310. #+BEGIN_SRC yaml
  311. letsencrypt:
  312. options:
  313. email: admin@0k.io
  314. ovh:
  315. entrypoint: ovh-eu
  316. application:
  317. key: ZZZ
  318. secret: XXX
  319. consumer_key: YYYYY
  320. #+END_SRC
  321. Le résultat est dans =/srv/datastore/data/letsencrypt/etc/letsencrypt/live/DOMAIN1=
  322. Il apparaît entre 30sec et 1 minute après la demande.
  323. ****** Vérifier que le jeu de clé ovh est bon
  324. Cette commande prend le compose yml et va vérifier que les accès sont valides:
  325. #+BEGIN_SRC shell
  326. check-compose-ovh-credentials compose.yml
  327. #+END_SRC
  328. **** Utilisation manuelle
  329. On peut utiliser le service =letsencrypt= manuellement
  330. ***** creation d'un certificat http
  331. #+BEGIN_SRC shell
  332. compose crt letsencrypt create DOMAIN [DOMAIN...]
  333. #+END_SRC
  334. Cette action crée un certificat (et force le renouvellement si existant).
  335. On peut y injecter une configuration via =--add-compose-content= si nécessaire::
  336. #+BEGIN_SRC shell
  337. compose --add-compose-content='
  338. letsencrypt:
  339. ovh:
  340. ## see: https://api.ovh.com/g934.first_step_with_api
  341. entrypoint: ovh-eu
  342. application:
  343. key: XXX
  344. secret: YYY
  345. consumer_key: ZZZ
  346. challenge-type: dns
  347. #renew-before-expiry: 30' crt letsencrypt create DOMAIN [DOMAIN...]
  348. #+END_SRC
  349. ***** Renew de tous les certificats
  350. Cela renew uniquement les certificats dont la date de validité est inférieure à 30j
  351. #+BEGIN_SRC shell
  352. compose crt letsencrypt renew
  353. #+END_SRC
  354. ***** Liste des certificats gérés et infos connexes
  355. #+BEGIN_SRC shell
  356. compose run letsencrypt crt list
  357. #+END_SRC
  358. ***** suppression d'un certificat
  359. #+BEGIN_SRC shell
  360. compose run letsencrypt certbot delete --cert-name DOMAIN
  361. #+END_SRC
  362. *** apache
  363. **** Utiliser letsencrypt
  364. Pour ajouter la fonctionalité de génération automatique de certificat
  365. via le service =letsencrypt=, il faut:
  366. - déclarer un service =letsencrypt= si cela n'est pas déjà fait
  367. - le lier au charm apache via une relation =cert-provider=:
  368. #+BEGIN_SRC yaml
  369. frontend:
  370. charm: apache
  371. relations:
  372. cert-provider: letsencrypt
  373. letsencrypt:
  374. ...
  375. #+END_SRC
  376. Et l'on peut alors utiliser la valeur =letsencrypt= (le nom du service qui implémente
  377. qui est en relation =cert-provider= avec apache) dans le champ =ssl=::
  378. #+BEGIN_SRC yaml
  379. web-proxy:
  380. apache:
  381. ...
  382. ssl: letsencrypt
  383. #+END_SRC
  384. **** Changer les clés SSL
  385. Voici un exemple de ce qu'on peut mettre dans les options de la relation apache
  386. pour déclarer le certificat que l'on souhaite:
  387. #+BEGIN_SRC yaml
  388. ssl:
  389. ca-cert:
  390. -----BEGIN CERTIFICATE-----
  391. MIIF6TCCA9GgAwIBAgIQBeTcO5Q4qzuFl8umoZhQ4zANBgkqhkiG9w0BAQwFADCB
  392. iDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0pl
  393. ...
  394. m9T8bJUox04FB6b9HbwZ4ui3uRGKLXASUoWNjDNKD/yZkuBjcNqllEdjB+dYxzFf
  395. BT02Vf6Dsuimrdfp5gJ0iHRc2jTbkNJtUQoj1iM=
  396. -----END CERTIFICATE-----
  397. -----BEGIN CERTIFICATE-----
  398. MIIFdzCCBF+gAwIBAgIQE+oocFv07O0MNmMJgGFDNjANBgkqhkiG9w0BAQwFADBv
  399. MQswCQYDVQQGEwJTRTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFk
  400. ...
  401. Le9Gclc1Bb+7RrtubTeZtv8jkpHGbkD4jylW6l/VXxRTrPBPYer3IsynVgviuDQf
  402. Jtl7GQVoP7o81DgGotPmjw7jtHFtQELFhLRAlSv0ZaBIefYdgWOWnU914Ph85I6p
  403. 0fKtirOMxyHNwu8=
  404. -----END CERTIFICATE-----
  405. cert: |
  406. -----BEGIN CERTIFICATE-----
  407. MIIF/TCCBOWgAwIBAgIRALUydpTpCApfYMuJchDJv5AwDQYJKoZIhvcNAQELBQAw
  408. XzELMAkGA1UEBhMCRlIxDjAMBgNVBAgTBVBhcmlzMQ4wDAYDVQQHEwVQYXJpczEO
  409. ...
  410. lIxY9HJanHrWvjiz7+eToxXpZJtAPXTx5hxzcJrtWROlq7IJCMIhzr/EVA37jTCk
  411. Xs5S6mr0T6Dqx6MQkPATSsEEJlLH5wq3DxXQcrMqnM/WHMRYUCkoTl37sXplflHe
  412. jw==
  413. -----END CERTIFICATE-----
  414. key: |
  415. -----BEGIN PRIVATE KEY-----
  416. MIIJRQIBADANBgkqhkiG9w0BAQEFAASCCS8wggkrAgEAAoICAQDONqqTCS4CiSi/
  417. XeNpp2nUsq1299spGc7mlRs+PDrXNHscB5lUB5/yo2yEetYXrJacQ8n4NV9hkID5
  418. ...
  419. 44eHDYsofcnRbidGR+QT8PQgiiDNCkbpi2u4QnLTs0w4oW+53ZTyHYEYF2rcLbIb
  420. vRt4kR4KG6ULXrmsRA4WQjBDJ9vZw2aK+w==
  421. -----END PRIVATE KEY-----
  422. #+END_SRC
  423. **** Ajouter des rêgles particulière de apache
  424. #+BEGIN_SRC yaml
  425. relations:
  426. web-proxy:
  427. apache:
  428. ...
  429. apache-custom-rules: |
  430. RewriteEngine On
  431. RewriteCond %{HTTPS} off
  432. RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [R=302,L,QSA]
  433. #+END_SRC
  434. *** postgres
  435. **** utilisation de pgm
  436. récupérer l'IP du docker postgres via =docker-ip=
  437. #+BEGIN_SRC sh
  438. PGHOST=172.19.0.2 PGUSER=postgres pgm ls
  439. #+END_SRC
  440. ***** Vérification des derniers logs de renouvellement automatique
  441. #+BEGIN_SRC shell
  442. tail -f /srv/datastore/data/cron/var/log/cron/letsencrypt-renew_script.log -n 200
  443. #+END_SRC
  444. * Interventions avancées
  445. Description des process avancés d'intervention sur une installation existante.
  446. ** Modification du compose
  447. Y a un exemple en commentaire dans le =/opt/apps/myc-deploy/compose.yml=
  448. Petit exemple:
  449. #+BEGIN_SRC yaml
  450. odoo:
  451. ...
  452. docker-compose:
  453. ## Important to keep as a list: otherwise it'll overwrite charm's arguments.
  454. command:
  455. - "--log-level=debug"
  456. environment:
  457. TOTO: TUTU
  458. image: masuperimage
  459. #+END_SRC
  460. ** Troubleshooting
  461. S'il semble qu'il y ait un soucis, tu peux visualiser le =docker-compose.yml= qui est
  462. généré à la fin via l'ajout de =--debug= AVANT la commande:
  463. #+BEGIN_EXAMPLE
  464. compose --debug up odoo frontend
  465. #+END_EXAMPLE
  466. * Comment ça marche
  467. La surcouche =compose= est là pour créer un =docker-compose.yml= et le
  468. lancer tout a fait normalement. Le long du chemin, il peut aussi
  469. préparer des trucs utiles si c'est nécessaire.
  470. Il part du =compose.yml= et accède aux définitions en yaml des charms à déployer
  471. et qui sont dans /srv/charms ... (qui en fait sont dans =/opt/apps/0k-charms=).
  472. Chaque charm possède une définition générale (le =metadata.yml=) qui peut aussi
  473. injecter des trucs dans le =docker-compose.yml= final.
  474. Et puis il y a des =hooks=, qui sont juste des scripts bash qui sont
  475. lancés avec des infos dans des variables d'environment, qui vont généralement
  476. créer des trucs à l'init ou lors de liaison avec d'autres charms.