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.

618 lines
15 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 http://docker.0k.io/get/myc -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 http://docker.0k.io/get/myc -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. #+BEGIN_SRC sh
  172. compose save odoo DBNAME OUTPUT_FILE
  173. #+END_SRC
  174. ***** Restoring odoo account (filestore and database)
  175. #+BEGIN_SRC sh
  176. compose load odoo SOURCE_FILE DBNAME
  177. #+END_SRC
  178. ***** charger un dump SQL dans odoo
  179. Supporte *.dump ou sql (non compressé), *.gz ou *.bz2:
  180. #+BEGIN_SRC sh
  181. compose load-db odoo MONFICHIER.dump.bz2
  182. #+END_SRC
  183. ***** sauvegarder dump db de odoo
  184. Pour l'instant on passe par pgm
  185. #+BEGIN_SRC sh
  186. compose save-db odoo MONFICHIER.dump.bz2
  187. #+END_SRC
  188. **** Update de modules
  189. #+BEGIN_SRC sh
  190. compose update odoo MABASE [MODULE [MODULE ...]]
  191. #+END_SRC
  192. **** lancement d'une commande odoo
  193. Si l'ensemble n'est pas up:
  194. #+BEGIN_SRC sh
  195. compose --debug run odoo --help
  196. #+END_SRC
  197. **** Mod dev d'odoo
  198. Il est souhaitable de lancer odoo en mode dev avec un terminal prêt à
  199. accueillir un pdb par exemple, et pouvoir changer facilement la ligne de commande.
  200. On peut tout a fait lancer odoo directement, par exempe:
  201. #+BEGIN_SRC sh
  202. compose run --rm --use-aliases odoo --dev=wdb --config=/opt/odoo/auto/odoo.conf
  203. #+END_SRC
  204. On récupère ainsi tous les volumes et autres options (sauf ce qui est
  205. dans =command:=) défini dans =compose.yml=.
  206. Un problème cependant: si on utilise apache comme frontend, celui-ci
  207. ne pourra pas résoudre le nom =odoo= à cause de problèmes autour de
  208. =docker-compose= et/ou =docker network=. En effet, si on fait un =up=
  209. comme d'habitude, et qu'on souhaite simplement arrêter le service
  210. classique pour ensuite le remplacer par la commande au dessus, cela ne
  211. fonctionnera pas. En effet, l'alias réseau =odoo= n'est plus adjoignable
  212. (même avec les commandes =docker network {dis,}connect=), et même si
  213. le container original de odoo est détruit ou éjecté du réseau, ou que l'on
  214. essaye de connecter soi-même le nouveau container.
  215. Un moyen (bancal) de passer outre cependant:
  216. - =down= pour fermer le réseau
  217. - =create= sur le service apache, puis =restart=.
  218. - enfin, le =run= tel que décrit au dessus
  219. Soit:
  220. #+BEGIN_SRC sh
  221. compose down &&
  222. compose create apache &&
  223. compose restart apache &&
  224. compose run --rm --use-aliases odoo --dev=wdb --config=/opt/odoo/auto/odoo.conf
  225. #+END_SRC
  226. Le container odoo crée par la dernière ligne se retirera proprement des tables DNS
  227. interne, et donc peut tout a fait être relancée autant de fois que l'on souhaitera.
  228. *** letsencrypt
  229. Le service letsencrypt fourni des certificat SSL à la demande et les
  230. renouvelle automatiquement.
  231. **** configuration dans compose
  232. ***** Authentification HTTP
  233. Il n'y a besoin d'aucune option dans le service =letsencrypt=.
  234. Le charm =apache= doit trouver un service utilisant le charm =letsencrypt=, cette
  235. connection se fera automatiquement si un servce de type =letsencrypt= est lancé soit
  236. parce que directement mentionné dans la racine ou dans une relation explicite.
  237. La relation construite automatiquement (ou manuellement) d'un service
  238. =apache= vers un service =letsencrypt= s'appelle =cert-provider=.
  239. Une fois que ce service est relié à apache, on peut s'en servir comme clé dans
  240. la configuration =ssl= des relations =*-->web-proxy-->apache=.
  241. Par défaut, =apache= utilisera du ssl pour tout se virtual-host s'il trouve un
  242. =cert-provider= à disposition.
  243. Aussi la configuration suivante est suffisante pour avoir un site publié en SSL:
  244. #+BEGIN_SRC yaml
  245. www.mydomain.org:
  246. charm: odoo
  247. apache:
  248. letsencrypt:
  249. #+END_SRC
  250. Cela équivaut à :
  251. #+BEGIN_SRC yaml
  252. www.mydomain.org:
  253. charm: odoo
  254. relations:
  255. web-proxy:
  256. myapache:
  257. domain: www.mydomain.org
  258. ssl:
  259. myletsencrypt:
  260. challenge-type: http
  261. myapache:
  262. charm: apache
  263. myletsencrypt:
  264. charm: letsencrypt
  265. #+END_SRC
  266. ***** Authentification DNS
  267. ****** créer un nouveau jeu de clé OVH pour l'authentification DNS
  268. When =letsencrypt= is setup and running::
  269. #+BEGIN_SRC sh
  270. compose --debug add letsencrypt DOMAIN [DOMAIN...]
  271. #+END_SRC
  272. Exemple de setup (dans =compose.yml=):
  273. #+BEGIN_SRC yaml
  274. letsencrypt:
  275. options:
  276. email: admin@0k.io
  277. ovh:
  278. entrypoint: ovh-eu
  279. application:
  280. key: ZZZ
  281. secret: XXX
  282. consumer_key: YYYYY
  283. #+END_SRC
  284. Le résultat est dans =/srv/datastore/data/letsencrypt/etc/letsencrypt/live/DOMAIN1=
  285. Il apparaît entre 30sec et 1 minute après la demande.
  286. ****** Vérifier que le jeu de clé ovh est bon
  287. Cette commande prend le compose yml et va vérifier que les accès sont valides:
  288. #+BEGIN_SRC shell
  289. check-compose-ovh-credentials compose.yml
  290. #+END_SRC
  291. **** Utilisation manuelle
  292. On peut utiliser le service =letsencrypt= manuellement
  293. ***** creation d'un certificat http
  294. #+BEGIN_SRC shell
  295. compose crt letsencrypt create DOMAIN [DOMAIN...]
  296. #+END_SRC
  297. Cette action crée un certificat (et force le renouvellement si existant).
  298. On peut y injecter une configuration via =--add-compose-content= si nécessaire::
  299. #+BEGIN_SRC shell
  300. compose --add-compose-content='
  301. letsencrypt:
  302. ovh:
  303. ## see: https://api.ovh.com/g934.first_step_with_api
  304. entrypoint: ovh-eu
  305. application:
  306. key: XXX
  307. secret: YYY
  308. consumer_key: ZZZ
  309. challenge-type: dns
  310. #renew-before-expiry: 30' crt letsencrypt create DOMAIN [DOMAIN...]
  311. #+END_SRC
  312. ***** Renew de tous les certificats
  313. Cela renew uniquement les certificats dont la date de validité est inférieure à 30j
  314. #+BEGIN_SRC shell
  315. compose crt letsencrypt renew
  316. #+END_SRC
  317. ***** Liste des certificats gérés et infos connexes
  318. #+BEGIN_SRC shell
  319. compose run letsencrypt crt list
  320. #+END_SRC
  321. ***** suppression d'un certificat
  322. #+BEGIN_SRC shell
  323. compose run letsencrypt certbot delete --cert-name DOMAIN
  324. #+END_SRC
  325. *** apache
  326. **** Utiliser letsencrypt
  327. Pour ajouter la fonctionalité de génération automatique de certificat
  328. via le service =letsencrypt=, il faut:
  329. - déclarer un service =letsencrypt= si cela n'est pas déjà fait
  330. - le lier au charm apache via une relation =cert-provider=:
  331. #+BEGIN_SRC yaml
  332. frontend:
  333. charm: apache
  334. relations:
  335. cert-provider: letsencrypt
  336. letsencrypt:
  337. ...
  338. #+END_SRC
  339. Et l'on peut alors utiliser la valeur =letsencrypt= (le nom du service qui implémente
  340. qui est en relation =cert-provider= avec apache) dans le champ =ssl=::
  341. #+BEGIN_SRC yaml
  342. web-proxy:
  343. apache:
  344. ...
  345. ssl: letsencrypt
  346. #+END_SRC
  347. **** Changer les clés SSL
  348. Voici un exemple de ce qu'on peut mettre dans les options de la relation apache
  349. pour déclarer le certificat que l'on souhaite:
  350. #+BEGIN_SRC yaml
  351. ssl:
  352. ca-cert:
  353. -----BEGIN CERTIFICATE-----
  354. MIIF6TCCA9GgAwIBAgIQBeTcO5Q4qzuFl8umoZhQ4zANBgkqhkiG9w0BAQwFADCB
  355. iDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0pl
  356. ...
  357. m9T8bJUox04FB6b9HbwZ4ui3uRGKLXASUoWNjDNKD/yZkuBjcNqllEdjB+dYxzFf
  358. BT02Vf6Dsuimrdfp5gJ0iHRc2jTbkNJtUQoj1iM=
  359. -----END CERTIFICATE-----
  360. -----BEGIN CERTIFICATE-----
  361. MIIFdzCCBF+gAwIBAgIQE+oocFv07O0MNmMJgGFDNjANBgkqhkiG9w0BAQwFADBv
  362. MQswCQYDVQQGEwJTRTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFk
  363. ...
  364. Le9Gclc1Bb+7RrtubTeZtv8jkpHGbkD4jylW6l/VXxRTrPBPYer3IsynVgviuDQf
  365. Jtl7GQVoP7o81DgGotPmjw7jtHFtQELFhLRAlSv0ZaBIefYdgWOWnU914Ph85I6p
  366. 0fKtirOMxyHNwu8=
  367. -----END CERTIFICATE-----
  368. cert: |
  369. -----BEGIN CERTIFICATE-----
  370. MIIF/TCCBOWgAwIBAgIRALUydpTpCApfYMuJchDJv5AwDQYJKoZIhvcNAQELBQAw
  371. XzELMAkGA1UEBhMCRlIxDjAMBgNVBAgTBVBhcmlzMQ4wDAYDVQQHEwVQYXJpczEO
  372. ...
  373. lIxY9HJanHrWvjiz7+eToxXpZJtAPXTx5hxzcJrtWROlq7IJCMIhzr/EVA37jTCk
  374. Xs5S6mr0T6Dqx6MQkPATSsEEJlLH5wq3DxXQcrMqnM/WHMRYUCkoTl37sXplflHe
  375. jw==
  376. -----END CERTIFICATE-----
  377. key: |
  378. -----BEGIN PRIVATE KEY-----
  379. MIIJRQIBADANBgkqhkiG9w0BAQEFAASCCS8wggkrAgEAAoICAQDONqqTCS4CiSi/
  380. XeNpp2nUsq1299spGc7mlRs+PDrXNHscB5lUB5/yo2yEetYXrJacQ8n4NV9hkID5
  381. ...
  382. 44eHDYsofcnRbidGR+QT8PQgiiDNCkbpi2u4QnLTs0w4oW+53ZTyHYEYF2rcLbIb
  383. vRt4kR4KG6ULXrmsRA4WQjBDJ9vZw2aK+w==
  384. -----END PRIVATE KEY-----
  385. #+END_SRC
  386. **** Ajouter des rêgles particulière de apache
  387. #+BEGIN_SRC yaml
  388. relations:
  389. web-proxy:
  390. apache:
  391. ...
  392. apache-custom-rules: |
  393. RewriteEngine On
  394. RewriteCond %{HTTPS} off
  395. RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [R=302,L,QSA]
  396. #+END_SRC
  397. *** postgres
  398. **** utilisation de pgm
  399. récupérer l'IP du docker postgres via =docker-ip=
  400. #+BEGIN_SRC sh
  401. PGHOST=172.19.0.2 PGUSER=postgres pgm ls
  402. #+END_SRC
  403. ***** Vérification des derniers logs de renouvellement automatique
  404. #+BEGIN_SRC shell
  405. tail -f /srv/datastore/data/cron/var/log/cron/letsencrypt-renew_script.log -n 200
  406. #+END_SRC
  407. * Interventions avancées
  408. Description des process avancés d'intervention sur une installation existante.
  409. ** Modification du compose
  410. Y a un exemple en commentaire dans le =/opt/apps/myc-deploy/compose.yml=
  411. Petit exemple:
  412. #+BEGIN_SRC yaml
  413. odoo:
  414. ...
  415. docker-compose:
  416. ## Important to keep as a list: otherwise it'll overwrite charm's arguments.
  417. command:
  418. - "--log-level=debug"
  419. environment:
  420. TOTO: TUTU
  421. image: masuperimage
  422. #+END_SRC
  423. ** Troubleshooting
  424. S'il semble qu'il y ait un soucis, tu peux visualiser le =docker-compose.yml= qui est
  425. généré à la fin via l'ajout de =--debug= AVANT la commande:
  426. #+BEGIN_EXAMPLE
  427. compose --debug up odoo frontend
  428. #+END_EXAMPLE
  429. * Comment ça marche
  430. La surcouche =compose= est là pour créer un =docker-compose.yml= et le
  431. lancer tout a fait normalement. Le long du chemin, il peut aussi
  432. préparer des trucs utiles si c'est nécessaire.
  433. Il part du =compose.yml= et accède aux définitions en yaml des charms à déployer
  434. et qui sont dans /srv/charms ... (qui en fait sont dans =/opt/apps/0k-charms=).
  435. Chaque charm possède une définition générale (le =metadata.yml=) qui peut aussi
  436. injecter des trucs dans le =docker-compose.yml= final.
  437. Et puis il y a des =hooks=, qui sont juste des scripts bash qui sont
  438. lancés avec des infos dans des variables d'environment, qui vont généralement
  439. créer des trucs à l'init ou lors de liaison avec d'autres charms.