From 857683cf7041a0f343b6651847688aea33a558f8 Mon Sep 17 00:00:00 2001 From: Serreau Jovann Date: Fri, 10 Apr 2026 17:47:54 +0200 Subject: [PATCH] init --- ansible/backup.sh.j2 | 118 +++++++++++++++++++++------ sonar-project.properties | 5 +- templates/move/siteconseil.html.twig | 30 +++++-- 3 files changed, 118 insertions(+), 35 deletions(-) diff --git a/ansible/backup.sh.j2 b/ansible/backup.sh.j2 index 4456186..f87a56b 100644 --- a/ansible/backup.sh.j2 +++ b/ansible/backup.sh.j2 @@ -1,34 +1,100 @@ #!/bin/bash -# CRM SITECONSEIL database backup script -# Runs every 30 minutes via cron +# CRM SITECONSEIL - Backup script (database + files) +# Usage: /usr/local/bin/crm-siteconseil-backup.sh +# Schedule via cron (ex: every 30 minutes) -BACKUP_DIR="/var/backups/crm-siteconseil" -DATE=$(date +%Y%m%d_%H%M%S) -FILENAME="crm_siteconseil_${DATE}.sql.gz" -KEEP_DAYS=1 +set -euo pipefail -# Dump database via Docker -docker compose -f /var/www/crm-siteconseil/docker-compose-prod.yml exec -T db-master pg_dump -U {{ db_user | default('crm-siteconseil') }} {{ db_name | default('crm-siteconseil') }} | gzip > "${BACKUP_DIR}/${FILENAME}" +####################################### +# Configuration +####################################### +APP_DIR="{{ app_dir | default('/var/www/crm-siteconseil') }}" +COMPOSE_FILE="${APP_DIR}/docker-compose-prod.yml" +BACKUP_DIR="{{ backup_dir | default('/var/backups/crm-siteconseil') }}" +KEEP_DAYS="{{ backup_keep_days | default(7) }}" -# Check if backup was created -if [ -f "${BACKUP_DIR}/${FILENAME}" ] && [ -s "${BACKUP_DIR}/${FILENAME}" ]; then - echo "[$(date)] DB Backup OK: ${FILENAME} ($(du -h "${BACKUP_DIR}/${FILENAME}" | cut -f1))" -else - echo "[$(date)] ERROR: DB Backup failed" - exit 1 +DB_SERVICE="{{ db_service | default('db-master') }}" +DB_USER="{{ db_user | default('crm-siteconseil') }}" +DB_NAME="{{ db_name | default('crm-siteconseil') }}" + +DATE="$(date +%Y%m%d_%H%M%S)" +TARGET_DIR="${BACKUP_DIR}/${DATE}" +LOG_PREFIX="[$(date '+%Y-%m-%d %H:%M:%S')]" + +####################################### +# Helpers +####################################### +log() { echo "${LOG_PREFIX} $*"; } +fail() { echo "${LOG_PREFIX} ERROR: $*" >&2; exit 1; } + +mkdir -p "${TARGET_DIR}" + +####################################### +# 1. Database (PostgreSQL custom format) +####################################### +DB_FILE="${TARGET_DIR}/database.dump" +log "Dumping database ${DB_NAME} from service ${DB_SERVICE}..." + +if ! docker compose -f "${COMPOSE_FILE}" exec -T "${DB_SERVICE}" \ + pg_dump -U "${DB_USER}" -d "${DB_NAME}" --format=custom --no-owner --no-acl \ + > "${DB_FILE}"; then + fail "pg_dump failed" fi -# Backup uploads -UPLOADS_FILENAME="uploads_${DATE}.tar.gz" -tar -czf "${BACKUP_DIR}/${UPLOADS_FILENAME}" -C /var/www/crm-siteconseil/public uploads 2>/dev/null - -if [ -f "${BACKUP_DIR}/${UPLOADS_FILENAME}" ]; then - echo "[$(date)] Uploads Backup OK: ${UPLOADS_FILENAME} ($(du -h "${BACKUP_DIR}/${UPLOADS_FILENAME}" | cut -f1))" -else - echo "[$(date)] WARNING: Uploads backup failed" +if [ ! -s "${DB_FILE}" ]; then + fail "database dump is empty" fi -# Remove backups older than KEEP_DAYS days -find "${BACKUP_DIR}" -name "crm_siteconseil_*.sql.gz" -mtime +${KEEP_DAYS} -delete -find "${BACKUP_DIR}" -name "uploads_*.tar.gz" -mtime +${KEEP_DAYS} -delete -echo "[$(date)] Cleaned backups older than ${KEEP_DAYS} days" +log "DB Backup OK: $(du -h "${DB_FILE}" | cut -f1)" + +####################################### +# 2. Files: public/uploads +####################################### +UPLOADS_FILE="${TARGET_DIR}/uploads.tar.gz" +if [ -d "${APP_DIR}/public/uploads" ]; then + log "Archiving public/uploads..." + if tar -czf "${UPLOADS_FILE}" -C "${APP_DIR}/public" uploads; then + log "Uploads Backup OK: $(du -h "${UPLOADS_FILE}" | cut -f1)" + else + log "WARNING: uploads archive failed" + fi +else + log "WARNING: ${APP_DIR}/public/uploads not found, skipping" +fi + +####################################### +# 3. Files: var/share (APP_SHARE_DIR) +####################################### +SHARE_FILE="${TARGET_DIR}/share.tar.gz" +if [ -d "${APP_DIR}/var/share" ]; then + log "Archiving var/share..." + if tar -czf "${SHARE_FILE}" -C "${APP_DIR}/var" share; then + log "Share Backup OK: $(du -h "${SHARE_FILE}" | cut -f1)" + else + log "WARNING: share archive failed" + fi +else + log "WARNING: ${APP_DIR}/var/share not found, skipping" +fi + +####################################### +# 4. Manifest +####################################### +MANIFEST="${TARGET_DIR}/manifest.txt" +{ + echo "CRM SITECONSEIL backup" + echo "Date : ${DATE}" + echo "Hostname : $(hostname)" + echo "DB : ${DB_NAME}@${DB_SERVICE}" + echo "Files :" + ls -lh "${TARGET_DIR}" | tail -n +2 +} > "${MANIFEST}" + +log "Backup directory: ${TARGET_DIR} ($(du -sh "${TARGET_DIR}" | cut -f1))" + +####################################### +# 5. Retention (delete backups older than KEEP_DAYS) +####################################### +log "Cleaning backups older than ${KEEP_DAYS} days..." +find "${BACKUP_DIR}" -mindepth 1 -maxdepth 1 -type d -mtime "+${KEEP_DAYS}" -exec rm -rf {} + +log "Done." diff --git a/sonar-project.properties b/sonar-project.properties index d1598c9..e0d6a86 100644 --- a/sonar-project.properties +++ b/sonar-project.properties @@ -1,5 +1,6 @@ -sonar.projectKey=crm_siteconseil -sonar.token=sqp_3e02f4de4c73f6d9cc5b6ce6546a7871d6ac0756 +sonar.projectKey=crm +sonar.token=sqp_a055f41ea46e79fd66c9cfead82a795f394155bd +sonar.host.url=https://sn.e-cosplay.fr/ sonar.projectName=CRM SITECONSEIL sonar.sources=src,assets,templates sonar.tests=tests diff --git a/templates/move/siteconseil.html.twig b/templates/move/siteconseil.html.twig index 3f6d8d3..298361b 100644 --- a/templates/move/siteconseil.html.twig +++ b/templates/move/siteconseil.html.twig @@ -214,10 +214,10 @@ Nouveau tarif
- 100 € + 50 € / mois HT
-

Soit 1 200 € HT / an

+

Soit 600 € HT / an

Ancien tarif SITECONSEIL

365 € HT / an

@@ -254,7 +254,7 @@

Soit 1 200 € HT / an - Hebergement uniquement

Ce tarif est non negociable.

-

Votre site etant hors de notre CMS Esy-Web, il necessite une infrastructure dediee (machine a part).

+

Votre site etant hors du CMS Esy-Web, il necessite une infrastructure dediee (machine a part).

Aucune maintenance incluse

@@ -314,11 +314,27 @@

Developpement sur-mesure

- Si vous disposez d'un developpement sur-mesure lie a SARL SITECONSEIL (CRM, application metier, outil interne, etc.), l'Association E-Cosplay sera dans l'obligation de refuser de vous prendre en charge, sauf si le developpement est entierement termine et livre. -

-

- Raison : l'association n'aura pas la capacite de gerer ou poursuivre des developpements sur-mesure inities par la SARL SITECONSEIL. Seuls les services standards (sites vitrine, e-commerce, emails, domaines) sont concernes par la migration. + Si vous beneficiez d'un developpement sur-mesure realise par la SARL SITECONSEIL (CRM, application metier, outil interne, plateforme specifique, etc.), celui-ci devra etre integralement termine, livre et en production a la date de la migration pour pouvoir etre repris par l'association.

+
+

Et si mon developpement sur-mesure n'est pas termine ?

+

+ Si votre projet sur-mesure est encore en cours de developpement a la date de la migration, plusieurs options s'offrent a vous : +

+
    +
  • Finalisation anticipee par SITECONSEIL : demander a la SARL SITECONSEIL de terminer et livrer le developpement avant la date de migration, afin qu'il puisse etre integre au perimetre repris par l'association.
  • +
  • + Reprise et finalisation par l'Association E-Cosplay : dans certains cas, l'association peut accepter de poursuivre et terminer le developpement du projet. Cette option est soumise a un double accord prealable : celui du client et celui de l'association, en fonction de la nature du projet, de son etat d'avancement et des ressources disponibles. +
    + Si l'accord est conclu, une facture ou un financement differe (echelonnement, paiement a la livraison, etc.) sera alors etabli pour couvrir les travaux restants. +
  • +
  • Reprise par un autre prestataire : confier la suite du projet a un developpeur ou une agence de votre choix. Le code source et les elements techniques pourront vous etre remis sur demande.
  • +
  • Abandon du projet : si aucune des options ci-dessus n'est envisageable, le developpement sera interrompu et ne sera ni repris, ni heberge, ni maintenu par l'Association E-Cosplay.
  • +
+

+ Nous vous invitons a nous contacter au plus tot pour faire le point sur votre situation et anticiper la meilleure solution avant la migration. +

+
{# Avertissement important #}