init
This commit is contained in:
@@ -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."
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -214,10 +214,10 @@
|
||||
<span class="px-2 py-0.5 bg-red-500/20 text-red-700 font-bold uppercase text-[9px]">Nouveau tarif</span>
|
||||
</div>
|
||||
<div class="flex items-end gap-2 mb-3">
|
||||
<span class="text-3xl font-bold" style="color: #fabf04;">100 €</span>
|
||||
<span class="text-3xl font-bold" style="color: #fabf04;">50 €</span>
|
||||
<span class="text-sm text-gray-500 mb-1">/ mois HT</span>
|
||||
</div>
|
||||
<p class="text-xs text-gray-500 mb-3">Soit <strong>1 200 € HT / an</strong></p>
|
||||
<p class="text-xs text-gray-500 mb-3">Soit <strong>600 € HT / an</strong></p>
|
||||
<div class="glass p-3">
|
||||
<p class="text-[9px] font-bold uppercase tracking-wider text-gray-400 mb-1">Ancien tarif SITECONSEIL</p>
|
||||
<p class="text-sm text-gray-400 line-through">365 € HT / an</p>
|
||||
@@ -254,7 +254,7 @@
|
||||
<p class="text-xs text-gray-500 mb-3">Soit <strong>1 200 € HT / an</strong> - Hebergement uniquement</p>
|
||||
<div class="glass p-3 mb-3" style="border-left: 3px solid #dc2626;">
|
||||
<p class="text-xs text-red-700 font-bold">Ce tarif est non negociable.</p>
|
||||
<p class="text-xs text-gray-500 mt-1">Votre site etant hors de notre CMS Esy-Web, il necessite une infrastructure dediee (machine a part).</p>
|
||||
<p class="text-xs text-gray-500 mt-1">Votre site etant hors du CMS Esy-Web, il necessite une infrastructure dediee (machine a part).</p>
|
||||
</div>
|
||||
<div class="glass p-3" style="border-left: 3px solid #ea580c;">
|
||||
<p class="text-xs text-orange-700 font-bold">Aucune maintenance incluse</p>
|
||||
@@ -314,11 +314,27 @@
|
||||
<div class="glass-heavy p-8 mb-8" style="border-left: 4px solid #7c3aed;">
|
||||
<h2 class="text-lg font-bold uppercase tracking-wider mb-3 text-purple-700">Developpement sur-mesure</h2>
|
||||
<p class="text-sm text-gray-600 leading-relaxed mb-3">
|
||||
Si vous disposez d'un <strong>developpement sur-mesure lie a SARL SITECONSEIL</strong> (CRM, application metier, outil interne, etc.), l'Association E-Cosplay sera <strong>dans l'obligation de refuser de vous prendre en charge</strong>, sauf si le developpement est entierement termine et livre.
|
||||
</p>
|
||||
<p class="text-sm text-gray-600 leading-relaxed">
|
||||
<strong>Raison :</strong> 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 <strong>developpement sur-mesure realise par la SARL SITECONSEIL</strong> (CRM, application metier, outil interne, plateforme specifique, etc.), celui-ci devra etre <strong>integralement termine, livre et en production</strong> a la date de la migration pour pouvoir etre repris par l'association.
|
||||
</p>
|
||||
<div class="glass p-4" style="border-left: 3px solid #7c3aed;">
|
||||
<p class="text-xs font-bold uppercase tracking-wider text-purple-700 mb-2">Et si mon developpement sur-mesure n'est pas termine ?</p>
|
||||
<p class="text-xs text-gray-600 leading-relaxed mb-2">
|
||||
Si votre projet sur-mesure est <strong>encore en cours de developpement</strong> a la date de la migration, plusieurs options s'offrent a vous :
|
||||
</p>
|
||||
<ul class="text-xs text-gray-600 leading-relaxed list-disc pl-5 space-y-1">
|
||||
<li><strong>Finalisation anticipee par SITECONSEIL :</strong> demander a la SARL SITECONSEIL de terminer et livrer le developpement <strong>avant</strong> la date de migration, afin qu'il puisse etre integre au perimetre repris par l'association.</li>
|
||||
<li>
|
||||
<strong>Reprise et finalisation par l'Association E-Cosplay :</strong> dans certains cas, l'association peut accepter de <strong>poursuivre et terminer le developpement</strong> du projet. Cette option est soumise a un <strong>double accord prealable</strong> : celui du client et celui de l'association, en fonction de la nature du projet, de son etat d'avancement et des ressources disponibles.
|
||||
<br>
|
||||
<span class="text-gray-500">Si l'accord est conclu, une <strong>facture ou un financement differe</strong> (echelonnement, paiement a la livraison, etc.) sera alors etabli pour couvrir les travaux restants.</span>
|
||||
</li>
|
||||
<li><strong>Reprise par un autre prestataire :</strong> 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.</li>
|
||||
<li><strong>Abandon du projet :</strong> si aucune des options ci-dessus n'est envisageable, le developpement sera <strong>interrompu</strong> et ne sera ni repris, ni heberge, ni maintenu par l'Association E-Cosplay.</li>
|
||||
</ul>
|
||||
<p class="text-xs text-gray-500 leading-relaxed mt-3 italic">
|
||||
Nous vous invitons a <strong>nous contacter au plus tot</strong> pour faire le point sur votre situation et anticiper la meilleure solution avant la migration.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{# Avertissement important #}
|
||||
|
||||
Reference in New Issue
Block a user