Skip to content

Commit 128348a

Browse files
committed
tech: ajout script dump db pour app de test
1 parent b8da991 commit 128348a

File tree

7 files changed

+116
-0
lines changed

7 files changed

+116
-0
lines changed

.scalingo/first-deploy.sh

+6
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,12 @@ echo "First deploy"
44

55
if [[ $APP =~ "pa-back-staging-pr" ]] ; then
66
echo "Dump de la DB de staging"
7+
8+
if [[ $DATABASE_URL == *"pa_back_pro_817"* ]]; then
9+
echo "Error: Target must not be production"
10+
exit 1
11+
fi
12+
713
export PATH=$HOME/bin:$PATH
814
dbclient-fetcher psql 13
915
psql --dbname $DATABASE_URL -c "CREATE extension postgis;"

.scalingo/post-deploy.sh

+8
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,15 @@
11
#!/bin/bash
22

3+
echo "Post deploy"
4+
35
if [[ $APP =~ "pa-back-staging-pr" ]] ; then
46
echo "Dump de la DB de staging"
7+
8+
if [[ $DATABASE_URL == *"pa_back_pro_817"* ]]; then
9+
echo "Error: Target must not be production"
10+
exit 1
11+
fi
12+
513
export PATH=$HOME/bin:$PATH
614
dbclient-fetcher psql 13
715
pg_dump --clean --if-exists --format c --no-owner --no-privileges --no-comments -n 'public' -n 'sequelize' --exclude-schema 'information_schema' --exclude-schema '^pg_*' --exclude-schema 'tiger' --exclude-schema 'tiger_data' --exclude-schema 'topology' --dbname $STAGING_DATABASE_URL --file dump.pgsql

package.json

+2
Original file line numberDiff line numberDiff line change
@@ -58,13 +58,15 @@
5858
"tasks:maj-segments": "IS_WEB=false TASK_NAME=MAJ_SEGMENTS node dist/main",
5959
"tasks:monitorer-jobs": "IS_WEB=false TASK_NAME=MONITORER_JOBS node dist/main",
6060
"tasks:suivre-events-milo": "IS_WEB=false TASK_NAME=SUIVRE_FILE_EVENEMENTS_MILO node dist/main",
61+
"tasks:dump-perfs": "IS_WEB=false TASK_NAME=DUMP_PERFS node dist/main",
6162
"tasks:dump-analytics": "IS_WEB=false TASK_NAME=DUMP_ANALYTICS node dist/main",
6263
"tasks:charger-evenements": "IS_WEB=false TASK_NAME=CHARGER_EVENEMENTS_ANALYTICS node dist/main",
6364
"tasks:enrichir-evenements": "IS_WEB=false TASK_NAME=ENRICHIR_EVENEMENTS_ANALYTICS node dist/main",
6465
"tasks:charger-vues": "IS_WEB=false TASK_NAME=CHARGER_LES_VUES_ANALYTICS node dist/main",
6566
"tasks:initialiser-les-vues": "IS_WEB=false TASK_NAME=INITIALISER_LES_VUES node dist/main",
6667
"tasks:creer-tables-ae-annuelles": "IS_WEB=false TASK_NAME=CREER_TABLES_AE_ANNUELLES_ANALYTICS node dist/main",
6768
"tasks:notifier-bonne-alternance": "IS_WEB=false TASK_NAME=NOTIFIER_BONNE_ALTERNANCE node dist/main",
69+
"dump-restore-db-perfs": "scripts/perfs/db_dump_restore.sh 2>&1",
6870
"dump-restore-db": "scripts/analytics/0_db_dump_restore.sh 2>&1",
6971
"dump-restore-db:local": "dotenv -e .environment yarn dump-restore-db",
7072
"release:patch": "scripts/release_version_only.sh patch",

scripts/perfs/db_dump_restore.sh

+52
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
#!/usr/bin/env bash
2+
3+
if [[ $APP =~ "pa-back-prod-test" ]] ; then
4+
echo "Dump de la DB de prod vers la db de perfs"
5+
6+
if [ -z "$PROD_DATABASE_URL" ]; then
7+
echo "error: env var PROD_DATABASE_URL must be set"
8+
exit 1
9+
fi
10+
11+
if [ -z "$DATABASE_URL" ]; then
12+
echo "error: env var DATABASE_URL must be set"
13+
exit 1
14+
fi
15+
16+
if [[ $DATABASE_URL == *"pa_back_pro_817"* ]]; then
17+
echo "Error: Target must not be production"
18+
exit 1
19+
fi
20+
21+
export PATH=$HOME/bin:$PATH
22+
dbclient-fetcher psql 13
23+
24+
echo "Drop conflicting extensions (if they exist)"
25+
psql --dbname $DATABASE_URL -c "DROP EXTENSION IF EXISTS postgis CASCADE;"
26+
psql --dbname $DATABASE_URL -c "DROP EXTENSION IF EXISTS postgis_tiger_geocoder CASCADE;"
27+
psql --dbname $DATABASE_URL -c "DROP EXTENSION IF EXISTS postgis_topology CASCADE;"
28+
psql --dbname $DATABASE_URL -c "DROP EXTENSION IF EXISTS pg_trgm CASCADE;"
29+
30+
echo "Dump production database (excluding unnecessary schemas)"
31+
pg_dump --clean --if-exists --format c --no-owner --no-privileges --no-comments \
32+
-n 'public' -n 'sequelize' \
33+
--exclude-schema 'information_schema' --exclude-schema '^pg_*' \
34+
--exclude-schema 'tiger' --exclude-schema 'tiger_data' --exclude-schema 'topology' \
35+
--dbname $PROD_DATABASE_URL --file dump.pgsql
36+
37+
echo "Restore database dump (WITHOUT extensions yet)"
38+
pg_restore --clean --if-exists --no-owner --no-privileges --no-comments --dbname $DATABASE_URL dump.pgsql
39+
40+
echo "Recreate extensions AFTER restore"
41+
psql --dbname $DATABASE_URL -c "CREATE EXTENSION postgis;"
42+
psql --dbname $DATABASE_URL -c "CREATE EXTENSION postgis_tiger_geocoder CASCADE;"
43+
psql --dbname $DATABASE_URL -c "CREATE EXTENSION postgis_topology;"
44+
psql --dbname $DATABASE_URL -c "CREATE EXTENSION pg_trgm;"
45+
46+
echo "Grant correct privileges"
47+
psql --dbname $DATABASE_URL -c "GRANT USAGE, CREATE ON SCHEMA public TO pa_back_pro_4110;"
48+
psql --dbname $DATABASE_URL -c "GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO pa_back_pro_4110;"
49+
50+
fi
51+
52+
rm -f dump.pgsql

src/app.module.ts

+2
Original file line numberDiff line numberDiff line change
@@ -366,6 +366,7 @@ import { GetCJETokenQueryHandler } from './application/queries/get-cje-token.que
366366
import { NotifierBonneAlternanceJobHandler } from './application/jobs/notifier-bonne-alternance.job.handler.db'
367367
import { NotifierCampagneJobHandler } from './application/jobs/notifier-campagne.job.handler.db'
368368
import { GetNotificationsJeuneQueryHandler } from './application/queries/get-notifications-jeune.query.handler.db'
369+
import { DumpForPerfsJobHandler } from './application/jobs/perfs/dump-for-perfs.job'
369370

370371
export const buildModuleMetadata = (): ModuleMetadata => ({
371372
imports: [
@@ -820,6 +821,7 @@ export const JobHandlerProviders = [
820821
SuivreEvenementsMiloCronJobHandler,
821822
TraiterEvenementMiloJobHandler,
822823
DumpForAnalyticsJobHandler,
824+
DumpForPerfsJobHandler,
823825
ChargerEvenementsJobHandler,
824826
NettoyerEvenementsChargesAnalyticsJobHandler,
825827
EnrichirEvenementsJobHandler,
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
import { Inject, Injectable } from '@nestjs/common'
2+
import { exec } from 'child_process'
3+
import { promisify } from 'util'
4+
import { JobHandler } from '../../../building-blocks/types/job-handler'
5+
import { Planificateur, ProcessJobType } from '../../../domain/planificateur'
6+
import { SuiviJob, SuiviJobServiceToken } from '../../../domain/suivi-job'
7+
import { DateService } from '../../../utils/date-service'
8+
9+
@Injectable()
10+
@ProcessJobType(Planificateur.JobType.DUMP_PERFS)
11+
export class DumpForPerfsJobHandler extends JobHandler<Planificateur.Job> {
12+
constructor(
13+
@Inject(SuiviJobServiceToken)
14+
suiviJobService: SuiviJob.Service,
15+
private dateService: DateService
16+
) {
17+
super(Planificateur.JobType.DUMP_PERFS, suiviJobService)
18+
}
19+
20+
async handle(): Promise<SuiviJob> {
21+
let erreur
22+
const maintenant = this.dateService.now()
23+
24+
const cmd = 'yarn run dump-restore-db-perfs'
25+
const { stdout, stderr } = await promisify(exec)(cmd)
26+
27+
if (stdout) {
28+
this.logger.log(stdout)
29+
}
30+
31+
if (stderr) {
32+
this.logger.error(stderr)
33+
erreur = stderr
34+
}
35+
36+
return {
37+
jobType: this.jobType,
38+
nbErreurs: 0,
39+
succes: erreur ? false : true,
40+
dateExecution: maintenant,
41+
tempsExecution: DateService.calculerTempsExecution(maintenant),
42+
resultat: {}
43+
}
44+
}
45+
}

src/domain/planificateur.ts

+1
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@ export namespace Planificateur {
6666
SUIVRE_FILE_EVENEMENTS_MILO = 'SUIVRE_FILE_EVENEMENTS_MILO',
6767
TRAITER_EVENEMENT_MILO = 'TRAITER_EVENEMENT_MILO',
6868
DUMP_ANALYTICS = 'DUMP_ANALYTICS',
69+
DUMP_PERFS = 'DUMP_PERFS',
6970
CHARGER_EVENEMENTS_ANALYTICS = 'CHARGER_EVENEMENTS_ANALYTICS',
7071
NETTOYER_EVENEMENTS_CHARGES_ANALYTICS = 'NETTOYER_EVENEMENTS_CHARGES_ANALYTICS',
7172
ENRICHIR_EVENEMENTS_ANALYTICS = 'ENRICHIR_EVENEMENTS_ANALYTICS',

0 commit comments

Comments
 (0)