---
# System prepended metadata

title: go.epfl.ch → road to prod
tags: [go.epfl.ch]

---

---
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 !







