Skip to content

Commit

Permalink
Partial dump script (#3370)
Browse files Browse the repository at this point in the history
* add basis for partial dump script

* feat(scripts): create partial dump script

* feat(scripts): finish partial dump script

* docs(CONTRIBUTING): add documentation to contributing.md

* fix(scripts): limit traversal through company to users

* fix(partial-backup): catch db errors and cleanup comments

* fix(scripts): limit traversal through MembershipRequest

* fix(Partial Dump): small fixes after review
  • Loading branch information
silto authored Jul 23, 2024
1 parent ba52be5 commit 1a73a7a
Show file tree
Hide file tree
Showing 8 changed files with 1,824 additions and 0 deletions.
56 changes: 56 additions & 0 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -626,6 +626,62 @@ $ ./restore-db.sh
# La première question détermine si vous souhaitez utiliser un backup distant ou local
```

#### Procédure automatique de restauration partielle d'une base de donnée de production

Un script permettant de faire un dump partiel d'une DB a été créé. Il part d'un BSD spécifique qui doit être testé, et traverse récursivement la db pour trouver tous les objets qui y sont reliés, de façon à avoir un environnement de test complet pour reproduire un problème.

Etapes préliminaires:

- créer une nouvelle DB vide et la mettre dans la variable _DATABASE_URL_ du fichier .env
- appliquer `npx prisma migrate dev`
- ouvrir un tunnel SSH vers la db à dumper en utilisant le client scalingo
- `scalingo login` (nécéssite d'avoir une clé SSH renseignée dans Scalingo)
- `scalingo -a <id de la db scalingo> db-tunnel SCALINGO_POSTGRESQL_URL`
- ajouter l'url de la DB tunnelée dans _TUNNELED_DB_ dans le fichier .env. Utiliser un utilisateur read-only pour l'accès, voir avec l'équipe pour en créer un ou obtenir ses credentials.

Utilisation du script:

```bash
$ npx nx run partial-backup:run
```

Le script vous demandera l'id du BSD de départ (utiliser le readableId "BSD-..." pour les BSDD/Form), puis se chargera de charger tous les objets en relation. Une fois le chargement fait, vous aurez un aperçu des données sous cette forme :

```
What will be copied :
{
Bsdasri: 3,
Company: 297,
AnonymousCompany: 3,
User: 78,
TransporterReceipt: 65,
CompanyAssociation: 408,
MembershipRequest: 65,
VhuAgrement: 54,
BrokerReceipt: 12,
AccessToken: 77,
Grant: 12,
Application: 3,
WorkerCertification: 35,
SignatureAutomation: 40,
TraderReceipt: 11,
UserActivationHash: 3,
UserResetPasswordHash: 11,
FeatureFlag: 1
}
```

Si les informations semblent raisonnables, vous pouvez accepter d'écrire dans votre DB de destination en tapant "Y".

Si une erreur survient lors du processus d'écriture, il est possible que ce soit dû à:

- le schema utilisé en local ne correspond pas à celui de la db source
- le schema Prisma ne correspond pas au schema de la db source
- la DB de destination n'est pas vide
- le schema de la DB de destination n'a pas été créé (`npx prisma migrate dev`)

Si tout se passe correctement, il ne vous reste plus qu'à reconstruire l'index elastic avec les données chargées en appliquant `npx nx run back:reindex-all-bsds-bulk -- -f`.

#### Procédure manuelle

1. Télécharger un backup de la base de donnée nommée `prisma` que vous souhaitez restaurer
Expand Down
18 changes: 18 additions & 0 deletions libs/back/partial-backup/.eslintrc.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
{
"extends": ["../../../.eslintrc.json"],
"ignorePatterns": ["!**/*"],
"overrides": [
{
"files": ["*.ts", "*.tsx", "*.js", "*.jsx"],
"rules": {}
},
{
"files": ["*.ts", "*.tsx"],
"rules": {}
},
{
"files": ["*.js", "*.jsx"],
"rules": {}
}
]
}
54 changes: 54 additions & 0 deletions libs/back/partial-backup/project.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
{
"name": "partial-backup",
"$schema": "../../../node_modules/nx/schemas/project-schema.json",
"sourceRoot": "libs/back/partial-backup/src",
"projectType": "application",
"targets": {
"build": {
"executor": "@nx/esbuild:esbuild",
"outputs": ["{options.outputPath}"],
"defaultConfiguration": "production",
"options": {
"platform": "node",
"outputPath": "dist/libs/back/partial-backup",
"format": ["cjs"],
"bundle": false,
"main": "libs/back/partial-backup/src/main.ts",
"tsConfig": "libs/back/partial-backup/tsconfig.app.json",
"assets": ["libs/back/partial-backup/src/assets"],
"generatePackageJson": true,
"esbuildOptions": {
"sourcemap": true,
"outExtension": {
".js": ".js"
}
}
},
"configurations": {
"development": {},
"production": {
"esbuildOptions": {
"sourcemap": false,
"outExtension": {
".js": ".js"
}
}
}
}
},
"run": {
"executor": "@nx/js:node",
"defaultConfiguration": "development",
"options": {
"buildTarget": "partial-backup:build",
"watch": false
},
"configurations": {
"development": {
"buildTarget": "partial-backup:build:development"
}
}
}
},
"tags": []
}
Loading

0 comments on commit 1a73a7a

Please sign in to comment.