--- tags: go.epfl.ch title: go.epfl.ch → road to prod --- # go.epfl.ch → road to prod ## Après la mise en prod - Vue Materialisée - essayer de créer la même vue avec un autre nom - est-ce que le App\\Alias vs App\\Models\\Alias - ![](https://i.imgur.com/8f8qcUF.png) - Migrations → la table dans pour logs ![](https://i.imgur.com/P0vk9aS.png) ### Restauration de la DB de prod en qual Copie et déplacement du dump utilisé hisr ``` scp -v dumpALL.sql root@10.95.96.249:/srv/go.epfl.ch/dumpALL-PROD.sql mv /srv/go.epfl.ch/dumpALL-PROD.sql /srv/go.epfl.ch/data/dumpALL-PROD.sql cd /srv/go.epfl.ch ``` Modification du volume postgres: ` - ../${DATA_DIRECTORY_HOST}/dumpALL-PROD.sql:/data/dumpALL-PROD.sql` Relancer avec le volume: `just down up` Vérifier la présence du fichier: `just exec postgres ls -alh /data` Se connecter dans le container postgres: `just exec postgres psql -U postgres` Utiliser `\l` pour lister les DB Effacer la db goepfl: `DROP DATABASE goepfl;` Créer la DB: `CREATE DATABASE goepfl;` Sortir, et re-rentrer avec `just exec postgres bash` `psql -U postgres -d goepfl < /data/dumpALL-PROD.sql` just exec postgres psql -U postgres goepfl # Avec Dominique Obtenir des infos grâce à `EXPLAIN` sur la requête qui crée la vue matérialisée ``` goepfl=# EXPLAIN SELECT a.id, a.alias, url.url, truncateURL(url.url) as truncatedurl, a.created_at, a.updated_at, a.hidden, url.status_code, goepfl-# (SELECT COUNT(l.id) FROM public.logs l WHERE l.alias_id = a.id) AS clicks, goepfl-# (SELECT COUNT(f.id) FROM public.flags f WHERE ((f.object_id = a.id) AND (f.object_type = 'App\\Models\\Alias'))) AS flags, goepfl-# a.obsolete FROM public.aliases a goepfl-# LEFT JOIN public.urls url ON (a.url_id = url.id) goepfl-# ORDER BY a.id DESC goepfl-# ; QUERY PLAN ----------------------------------------------------------------------------------------------------- Nested Loop Left Join (cost=0.57..5271286709.16 rows=10439 width=168) -> Index Scan Backward using aliases_pkey on aliases a (cost=0.29..395.43 rows=10439 width=36) -> Index Scan using urls_pkey on urls url (cost=0.29..0.39 rows=1 width=92) Index Cond: (id = a.url_id) SubPlan 1 -> Aggregate (cost=504701.19..504701.20 rows=1 width=8) -> Seq Scan on logs l (cost=0.00..504695.85 rows=2136 width=4) Filter: (alias_id = a.id) SubPlan 2 -> Aggregate (cost=259.00..259.01 rows=1 width=8) -> Seq Scan on flags f (cost=0.00..259.00 rows=1 width=4) Filter: ((object_id = a.id) AND ((object_type)::text = 'App\\Models\\Alias'::text)) JIT: Functions: 19 Options: Inlining true, Optimization true, Expressions true, Deforming true (15 rows) ``` On a créé les index manquant sur la DB de prod ``` goepfl=# CREATE INDEX "AliasIdLog" ON public.logs USING btree (alias_id); ERROR: relation "AliasIdLog" already exists goepfl=# CREATE INDEX "AliasLog" ON public.logs USING btree (alias); CREATE INDEX goepfl=# CREATE INDEX flags_flag_type_index ON public.flags USING btree (flag_type); CREATE INDEX goepfl=# CREATE INDEX flags_object_id_index ON public.flags USING btree (object_id); CREATE INDEX goepfl=# CREATE INDEX flags_object_type_index ON public.flags USING btree (object_type); CREATE INDEX goepfl=# CREATE INDEX idx_logs_click_time ON public.logs USING brin (click_time) WITH (pages_per_range='128'); CREATE INDEX goepfl=# CREATE INDEX jobs_queue_index ON public.jobs USING btree (queue); CREATE INDEX goepfl=# CREATE UNIQUE INDEX v_aliases_alias ON public.v_aliases USING btree (alias); CREATE INDEX ``` Puis on a lancé le refresh de la vue matérialisée à 9h30 ``` goepfl=# refresh materialized view v_aliases; ``` ## Lors de la mis en prod 1. Problème traefik 2.4 renouvellememnt certificat 2. Problème de création de la vue materialisée (lancée vers 22:00, arrêtée vers 00:00, relancée) 3. donwnotifier → alerte 04:12 4. 06:35 arrêt du refresh lancé vers 00:00, les logs postgres "repartent" 5. → tout semble OK ## Pour la mise en prod Ce qu'il y a faire en prod pour accueillir la nouvelle version : 1. ✓ Préparer un change assez à l'avance (Jeudi 18 à 20:00) 2. ✓ Merger dans la branche de prod et tagger 3. ✓ Faire un BACKUP de la VM! 4. ✓ Lancer un TMUX 5. ✓ Backup le dossier go.epfl.ch et vérifier qu'il contient les 2 .env 6. ✓ Faire un `docker-compose -f docker/docker-compose-qual.yml exec postgres pg_dumpall -U postgres > dump.sql` équivalent pour la prod. (`root@idevfsdsrv1:~/go.epfl.ch# docker-compose -f docker/docker-compose-prod.yml exec postgres pg_dumpall -U postgres > dumpALL.sql`) 7. Mettre à jour l'OS d'ubuntu 18.04 vers 20.04 8. Migrer la DB Doc: - https://josepostiga.com/how-to-upgrade-postgresql-version-and-transfer-your-old-data-using-docker/ - https://www.bojankomazec.com/2019/10/what-do-you-need-to-do-before-upgrading.html Attention: cela resulte en un fichier de plus de 2.6Go et cela prend approximativement 40 minutes. Pour l'import: relancer le container dans la nouvelle version avec un répertoire data vide, monter dans un autre path le fichier de dump. Puis se connecter dans le container avec un `just exec postgres bash` puis reloader le fichier dans la DB avec la commande `psql -U {postgres_user} -d {default_postgres_database} < {mapped_volume_folder_path}/dump.sql`. Fix fuxxor logs: - `docker run -v `pwd`/data/postgresprod:/data -it postgres:11.4-alpine bash` - `su postgres` - `pg_resetwal /data -f` 9. Télécharger et builder les containers - utiliser `postgres:13-alpine` ! 7. Ne pas oublier de faire un `just composer update` 10. Comme les "objects_type" de la table flags on changés de path (Models), il faut truncate la table `public.flags` avec la commande: `TRUNCATE public.flags;` mais si cela ne fonctionne pas ou prend trop de temps, faire un: `DELETE FROM public.flags;` 8. Mettre à jour le code // git pull tags 9. editer les .env (y.c. changer la version) 10. just build 11. just dumbfix 12. just up Ce qu'il faut tester avant : 1. ✓ La mise à jour d'Ubuntu ! (compter 35 minutes) 2. Est-ce que le volume postgresql est toujours "valide" avec le Docker-compose actuel (e.g. version de postgres) ## Test de la mise à jour d'ubuntu en qual https://www.google.com/search?channel=fs&client=ubuntu&q=upgrade+ubuntu+from+18.04+to+20.04+command+line 1. Mise à jour de l'actuel `apt update` `apt upgrade` → /etc/cloud/cloud.cfg modifié pour preserve_hostname: true 2. `apt dist-upgrade` 3. `do-release-upgrade` 4. [15:35] do-release-upgrade Checking for a new Ubuntu release Please install all available updates for your release before upgrading. 4. `apt dist-upgrade` 5. `do-relance-upgrade` → DOWN /!\ ![](https://i.imgur.com/wCvwQMT.png) => INTRANET.EPFL.CH Next → VIDE ![](https://i.imgur.com/qYGRMkK.png) ![](https://i.imgur.com/0nVgz7b.png) ![](https://i.imgur.com/ZszAwVn.png) → currently-installed version ![](https://i.imgur.com/bbUTj2o.png) → Maintenaner version ![](https://i.imgur.com/ssFa2Pr.png) → currently-installed version ![](https://i.imgur.com/9g2LvSE.png) ![](https://i.imgur.com/7FdlRiy.png) → currently-installed version (à cause des crontab) ![](https://i.imgur.com/G8eEZ3g.png) → a cause du sendEnv GIT_* (au moins) ![](https://i.imgur.com/A1tSuyg.png) → continue ![](https://i.imgur.com/4Ud5YeE.png) → reboot Fin [16:08] donc environ 35 minutes de downtime !