Files
crm_ecosplay/ansible/vault.yml

64 lines
3.8 KiB
YAML
Raw Normal View History

2026-04-01 15:42:52 +02:00
cloudflare_api_token: cfk_wXHshV0AmOoKbWE19CIPoWJBeUCtSDUXo2mgkGuNe99eeac8
cloudflare_zone_id: f9e2a44aa512b455c99286d2ae845862
app_secret: 533326ee6417086112c42b1fc1843ff1db82b881988f87442118178ea4469cc2
mailer_dsn: ses+smtp://AKIAWTT2T22CWBRBBDYN:BBdgb6KxRQ8mNcpWFJsZCJxbSGNdgLhKFiITMErfBlQP@default?region=eu-west-3&timeout=120
stripe_pk: pk_live_51SUA1rP4ub49xK2ThoRH8efqGYNi1hrcWMzrqmDtJpMv12cmTzLa8ncJLUKLbOQNZTkm1jgptLfwt4hxEGqkVsHB00AK3ieZNl
stripe_sk: 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
stripe_webhook_secret: whsec_ivqY8C05aJ9mho2N3opJLriO2AuxIqOi
stripe_webhook_secret_connect: whsec_0sG9BPYDysxQst9W6FTp44GpwtO2F6WQ
smime_passphrase: 'EVz5zNV8h4ndSLOCWO9JeaQnIertQm7k'
meilisearch_api_key: b9b0994ee46d9826a4ac58306c171fdd00c03ac6f8ff6a68cdd8f9f977ab415a
meilisearch_master_key: 9e6a86cb9e9b09cdabf30a81e43bdb18892ee0d0ab478a16c50749b8f2ed83e4
db_password: 46eafec68e1e7bc8015790998a2e8ea8b5e31461479588b7
redis_password: 51f7559d1d14a6cf422628537fa562a94481936228e9291d
sonarqube_badge_token: sqb_dc1d0f73af1016295f49d1c56bf60e115e43bf48
keycloak_admin_client_secret: QqYnQc6p9aio4sBJYKNhpPsdrvpUtt2z
feat: refactoring complet de la verification DNS avec services separes Architecture: - Les domaines (siteconseil.fr, esy-web.dev) sont definis en constante dans la commande uniquement, pas dans les services - 3 services independants reutilisables: src/Service/DnsCheckService.php (nouveau): - Methodes publiques checkSpf(), checkDmarc(), checkDkim(), checkMx(), checkBounce() qui prennent le domaine en parametre - Verification SPF: presence des includes amazonses.com et mail.esy-web.dev - Verification DMARC: politique, presence de rua - Verification DKIM: test de 10 selecteurs en CNAME et TXT - Verification MX: le MX attendu est passe en parametre par la commande - Verification Bounce: MX/CNAME/TXT sur bounce.* src/Service/AwsSesService.php (nouveau): - Authentification AWS Signature V4 via HTTP direct (pas de SDK) - isDomainVerified(): verification du statut du domaine dans SES - getDkimStatus(): statut DKIM (enabled, verified, tokens) - getNotificationStatus(): bounce_topic, complaint_topic, forwarding - listVerifiedIdentities(): liste des domaines verifies - isAvailable(): test de connectivite API src/Service/CloudflareService.php (nouveau): - Authentification Bearer token via HTTP direct (pas de SDK) - getZoneId(): recupere le zone ID dynamiquement par nom de domaine (plus besoin de CLOUDFLARE_ZONE_ID en dur) - getDnsRecords(): tous les enregistrements d'une zone - getDnsRecordsByType(): filtrage par type (TXT, MX, CNAME...) - getZone(): informations d'une zone - isAvailable(): verification du token API src/Command/CheckDnsCommand.php (reecrit): - Utilise les 3 services pour orchestrer les verifications - Affichage console colore avec icones OK/ERREUR/ATTENTION - Envoie un rapport email via le template Twig dns_report.html.twig templates/emails/dns_report.html.twig (nouveau): - Template email compatible tous clients (table-based, CSS inline, margin/padding longhand, mso-line-height-rule, pas de rgba/border-radius) - Bandeau colore vert/jaune/rouge selon le statut global - Section succes avec checkmarks verts dans un tableau alterne - Section erreurs en rouge avec croix dans un tableau fond #fef2f2 - Section avertissements en jaune avec triangles fond #fffbeb - Detail par domaine avec tableau type/verification/statut - Utilise le template email/base.html.twig (header gold, footer dark) Variables d'environnement ajoutees: - .env: AWS_PK, AWS_SECRET, AWS_REGION (eu-west-3), CLOUDFLARE_KEY (vides) - .env.local: valeurs reelles des cles AWS et Cloudflare - ansible/vault.yml: aws_pk, aws_secret, cloudflare_key - ansible/env.local.j2: AWS_PK, AWS_SECRET, AWS_REGION, CLOUDFLARE_KEY avec references au vault - CLOUDFLARE_ZONE_ID supprime (recupere dynamiquement via l'API) Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-02 21:28:24 +02:00
aws_pk: AKIAWTT2T22CWBRBBDYN
aws_secret: BBdgb6KxRQ8mNcpWFJsZCJxbSGNdgLhKFiITMErfBlQP
cloudflare_key: cfut_xqEEvg5LDezheCI9rWsd4JdfflvLH5vjmeMp7QHO442dd83b
feat: ajout service Mailcow et integration dans la verification DNS src/Service/MailcowService.php (nouveau): - Connexion a l'API Mailcow via X-API-Key header - getDomains(): liste tous les domaines configures - getDomain(): informations d'un domaine specifique - getDomainStatus(): statut actif, nombre de boites, quota, quota utilise - getDkimKey(): recupere la cle DKIM TXT configuree dans Mailcow - getExpectedDnsRecords(): retourne la liste des enregistrements DNS attendus par Mailcow pour un domaine (MX, SPF, DMARC, DKIM, autodiscover CNAME, autoconfig CNAME, SRV _autodiscover, _mta-sts TXT) - getMailboxes(): liste les boites mail d'un domaine - isAvailable(): test de connectivite API via /api/v1/get/status/containers src/Command/CheckDnsCommand.php: - Ajout de MailcowService dans le constructeur - Nouvelle methode checkMailcow() qui: - Verifie si le domaine existe et est actif dans Mailcow - Recupere la cle DKIM Mailcow et la compare avec celle du DNS (comparaison partielle des 40 premiers caracteres) - Verifie chaque enregistrement DNS attendu par Mailcow: - MX, SPF, DMARC, DKIM : marques comme erreur si absents - autodiscover, autoconfig, SRV, _mta-sts : marques comme warning (optionnels) - Methodes utilitaires: getDkimFromDns(), checkDnsRecordExists(), checkMxExists(), checkTxtContains(), getCnameRecord() Variables d'environnement: - .env: MAILCOW_URL=https://mail.esy-web.dev, MAILCOW_API_KEY (vide) - .env.local: MAILCOW_API_KEY=DF0E7E-0FD059-16226F-8ECFF1-E558B3 - ansible/vault.yml: mailcow_api_key ajoutee - ansible/env.local.j2: MAILCOW_URL et MAILCOW_API_KEY ajoutees Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-02 21:31:54 +02:00
mailcow_api_key: DF0E7E-0FD059-16226F-8ECFF1-E558B3
2026-04-01 15:42:52 +02:00
docuseal_api: pgAU116mCFmeF7WQSezHqxtZW8V1fgo31u5d2FXoaKe
docuseal_webhooks_secret: CRM_COSLAY
fix: corrections SonarQube - qualité code, accessibilité, complexité cognitive Propriétés inutilisées supprimées : - CheckDnsCommand : suppression de $urlGenerator (jamais lu, seulement injecté) - PurgeEmailTrackingCommand : suppression de $repository (jamais lu, requêtes via $em->createQueryBuilder directement), suppression import EmailTrackingRepository Corrections PHPStan / types : - SyncController : suppression $wh['status'] ?? 'created' redondant, accès direct à $wh['status'] car le type retour inclut désormais status: string - StripeWebhookService : PHPDoc createAllWebhooks corrigé de list<array{type, url, id}> vers list<array{type, url, id, status, secret?}> pour refléter les clés status et secret effectivement présentes - DnsReportController : suppression ?? '' sur EXPECTED_MX[$domain] (clé toujours existante) - CloudflareService : ajout @param array<string, mixed> $query sur request() - CheckDnsCommand : suppression ?? '' sur EXPECTED_MX[$domain], ajout PHPDoc @param list<array<string, mixed>> $cfRecords sur checkMailcow Méthode manquante : - DnsCheckService : ajout getDkimTxtRecord() qui parcourt les TXT records et retourne le premier commençant par 'v=DKIM1', appelé dans checkDkim() Code mort supprimé : - MailcowService : suppression is_array($data) toujours vrai sur retour de $response->toArray(false), retour direct - DnsInfraHelper : suppression getFirstTxtValueRaw() identique à getFirstTxtValue(), simplification de getActualDnsValue() qui n'appelle plus le fallback Constantes pour littéraux dupliqués : - DnsInfraHelper : ajout LABEL_AWS_SES, LABEL_MAILCOW, LABEL_MAILCOW_DNS, NOT_FOUND, NOT_CONFIGURED — remplace les chaînes 'AWS SES' (10×), 'Non trouve' (4×), 'Non configure' (3×), 'Mailcow' et 'Mailcow DNS' - Utilisation dans CheckDnsCommand (checkAwsSes, checkSesDomain, checkSesDkim, checkSesMailFrom, checkSesBounce, checkMailcow) Réduction complexité cognitive checkAwsSes (61 → ~10 par méthode) : - Extraction checkSesDomain() : vérifie isDomainVerified, ajoute check + erreur/succès - Extraction checkSesDkim() : vérifie getDkimStatus (enabled+verified), parcourt les tokens DKIM CNAME avec enrichLastCheck - Extraction checkSesMailFrom() : vérifie getMailFromStatus, MAIL FROM MX (checkMxExists + getMxValues), MAIL FROM TXT (checkTxtContains + getTxtSpfValue) - Extraction checkSesBounce() : vérifie getNotificationStatus (forwarding ou bounce_topic) Accessibilité WCAG AA : - app.scss : contraste sidebar-nav-item augmenté de rgba(255,255,255,0.6) à rgba(255,255,255,0.75) pour ratio de contraste suffisant sur fond sombre - tarification/index.html.twig : ajout for/id sur les 5 paires label/input (title-{id}, priceHt-{id}, monthPrice-{id}, period-{id}, description-{id}) - membres.html.twig : ajout for/id sur les 15 checkboxes de groupes (group-member, group-admin, group-esy-web, ..., group-esy-ndd), remplacement du label titre par <span> (n'est pas associé à un contrôle) - 2fa_google.html.twig : ajout for="trusted-device" et id="trusted-device" sur le checkbox de confiance appareil - tarif.html.twig : ajout <thead class="sr-only"> avec <th>Option</th><th>Tarif</th> sur la table options Esy-Mail (table sans en-têtes) Ansible : - vault.yml : ajout discord_webhook pour le déploiement prod Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 09:41:17 +02:00
discord_webhook: https://discord.com/api/webhooks/1419573620602044518/ikAdxWxsrrTqMTb5Gh_8ylcoJHlOnq7aJZvR5udoS_fCK56Jk3qpEnJHVKdD8fwuNJF3
esymail_hostname: mail.esy-web.dev
vault_url: https://kms.esy-web.dev
vault_token: CHANGE_ME_IN_PROD
feat: comptabilite + prestataires + rapport financier + stats dynamiques Comptabilite (Super Admin) : - ComptabiliteController avec 7 exports CSV/JSON compatibles SAGE (journal ventes, grand livre, FEC, balance agee, reglements, commissions Stripe 1.5%+0.25E, couts services) - Export PDF via ComptaPdf (FPDF) avec bloc legal pre-rempli, tableau pagine, champ signature DocuSeal - Signature electronique DocuSeal + callback + envoi email signe avec template dedie (compta_export_signed.html.twig) - Rapport financier public (RapportFinancierPdf) : recettes par service, depenses (Stripe, infra, prestataires), bilan excedent/deficit - Codes comptables clients EC-XXXX (plus de 411xxx) Prestataires (Super Admin) : - Entite Prestataire (raisonSociale, siret, email, phone, adresse) - Entite FacturePrestataire (numFacture, montantHt, montantTtc, year, month, isPaid, PDF via Vich) - CRUD complet avec recherche SIRET via proxy API data.gouv.fr - Commande cron app:reminder:factures-prestataire (5 du mois) - Factures prestataires integrees dans export couts services - Sidebar Super Admin : entree Prestataires + Comptabilite Stats (/admin/stats) : - Cout prestataire dynamique depuis FacturePrestataire - Fusion Infra + Prestataire en "Cout de fonctionnement" - Commission Stripe corrigee (1.5% + 0.25E par transaction) Divers : - DocuSealService::sendComptaForSignature() + getApi() - Customer::generateCodeComptable() format EC-XXXX-XXXXX - Protection double prefixe EC- a la creation client - Bouton regenerer PDF cache quand advert state=accepted - Modals sans script inline (data-modal-open/close dans app.js) Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-07 23:39:31 +02:00
tva_enabled: 'false'
tva_rate: '0.20'
ovh_key: 34bc2c2eb416b67d
ovh_secret: 12239d273975b5ab53318907fb66d355
ovh_customer: 56c387eb9ca4b9a2de4d4d97fd3d7f22
2026-04-01 15:42:52 +02:00
smime_private_key: |
Bag Attributes
localKeyID: 75 15 E3 C2 1D 7B 61 75 99 B9 22 D8 FD A4 19 AC 6B BE 1F 8F
feat: comptabilite + prestataires + rapport financier + stats dynamiques Comptabilite (Super Admin) : - ComptabiliteController avec 7 exports CSV/JSON compatibles SAGE (journal ventes, grand livre, FEC, balance agee, reglements, commissions Stripe 1.5%+0.25E, couts services) - Export PDF via ComptaPdf (FPDF) avec bloc legal pre-rempli, tableau pagine, champ signature DocuSeal - Signature electronique DocuSeal + callback + envoi email signe avec template dedie (compta_export_signed.html.twig) - Rapport financier public (RapportFinancierPdf) : recettes par service, depenses (Stripe, infra, prestataires), bilan excedent/deficit - Codes comptables clients EC-XXXX (plus de 411xxx) Prestataires (Super Admin) : - Entite Prestataire (raisonSociale, siret, email, phone, adresse) - Entite FacturePrestataire (numFacture, montantHt, montantTtc, year, month, isPaid, PDF via Vich) - CRUD complet avec recherche SIRET via proxy API data.gouv.fr - Commande cron app:reminder:factures-prestataire (5 du mois) - Factures prestataires integrees dans export couts services - Sidebar Super Admin : entree Prestataires + Comptabilite Stats (/admin/stats) : - Cout prestataire dynamique depuis FacturePrestataire - Fusion Infra + Prestataire en "Cout de fonctionnement" - Commission Stripe corrigee (1.5% + 0.25E par transaction) Divers : - DocuSealService::sendComptaForSignature() + getApi() - Customer::generateCodeComptable() format EC-XXXX-XXXXX - Protection double prefixe EC- a la creation client - Bouton regenerer PDF cache quand advert state=accepted - Modals sans script inline (data-modal-open/close dans app.js) Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-07 23:39:31 +02:00
friendlyName: contact@e-cosplay.fr
2026-04-01 15:42:52 +02:00
Key Attributes: <No Attributes>
-----BEGIN PRIVATE KEY-----
MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQC60+PtobUKQsjH
vrRizgwIfR06OkOqYosn17wurYUCZquhGfaRL5nf+qDcOF2liczRfXOsTxnEK0J0
s38JF9zWXTkIms4yfyL9xKOCBEPkNSe03wIcaKQjNB1iuDqW6npUm/ke6VmIAj4q
ig6wwiViqWxkzcE2824RFBI0H4rtkxDNhEXOk6ccVzxz/MwxAvmKHuJQG7LtbysI
KIZcGbNjlm2YmIebVYU44kpI0ZMzfvKsfy9eWX3VyYubpL4Rwsc9I+Z2jsun+nEc
4heHamNu8NrKHWQP802NZvRkMR7t39APYnGcEOBe6eagDkn9DQpZrkxfXYUcteBA
5y3RVBxJAgMBAAECggEASCuXNlJL0blnv0WLgEmRO2w9cKNWRUkI8Wy0rKFqKrnH
nhWd+orVWcEDB98cSdi4Dsrz9sGdtfpyEwvNzJDzxblAUXMfqUEUnswpz41fPpZM
DuJA+gFwOoskuOBq/aZ5eBrCeu7wn4oiQqOPNjfhYkIJdc1H0Lbrs1w6BfmTXN9S
ilSL4GMv7YpEBPt86wiReIbE0DIqaR9Vm1UupkJe7WMc9LrxW6OM4kD5xQTFdJLC
n6QbbX+TE3q+d6TrckK8PeBm+gIX2+NdEuuz7gpZGSybfqN1wqbkziUsifi+7gQi
pxwxhDmCQ08DHplcBdjg1ZldVhaAdHEqCyWZtIZQGwKBgQD9RNXOskPhGBP28oZz
a7APhROKHcEtb9BRj3mwzwIMr3SzJjoBI4SfRR3QcU8jD2uCLNio/cSqjAJVyk2f
Z9wDONnXy4aNrsze0Fx+0t1VqIOVocFDJJHndHCiq2HHorqArvHtZxkj/0xIUx+K
nVltevm7qLSAtR/vWTM1c9Zp/wKBgQC816PZxNEpyg5mgO+3gn5yONsObh2ZyZ/v
KPEmFBjl69AfAxKeaEZaj35RmzdnAFKlv9QzNdAM67+oOIThcaQ+diyNUQegaJwc
amUZHWjQ7RAJNM7lQz85zn9s/MZVC8iNF7xlPWK8Y/ifMwk5e+pAQ79PVwxKiW8y
doXv1uuptwKBgQCPfVJNGr5OZx/YhysZdWd4Q4MAez8ZCQJTUyA0xfN5UGajoQK3
5nGa8sOjdq7JRFE6nUHa7HthzJT+GfHEYElMIgd5tTt0RhaYHiBpUfpIL4LtYYln
Cu8G3Pd7kfGB83YKthMm14Rs2pVTXJTAKcmit0uJwFkTmoqPRlA29nwB7QKBgQCp
iVtzxcwWnW1iPz13XfNRbpPTl66Bg89PMk2VZxOXT6cQQHz1tB39bbf1YclScqrA
XcEPnK9E+l2dk+hQUesnnIaQ9H9JVsFYjXhoHMweTcZIzZ01nLLlnesumJ0ieyq4
6OddaMf85C+wFWyhrAr5WRknDLpfLJWlE11ZnnUCbwKBgQCXOLstj7bEi8N3H8PV
UQlkFKrAmmEE4i3Y3Qqa1DMbm2XJBzPQQJIrDlCeIWs0jk0upOY34W+deWH5gbvW
a/6bpvSzbWqgFD5DnayVkb7CvgEg+CKdUoUumRSs38pet29c/pdKPUxhMq8voIEg
HpnyJcapAiLw0hv4ql380onf0A==
-----END PRIVATE KEY-----