---
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
- 
- Migrations → la table dans pour logs

### 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 /!\

=> INTRANET.EPFL.CH
Next → VIDE



→ currently-installed version

→ Maintenaner version

→ currently-installed version


→ currently-installed version (à cause des crontab)

→ a cause du sendEnv GIT_* (au moins)

→ continue

→ reboot
Fin [16:08] donc environ 35 minutes de downtime !