Repository navigation
Expand file tree
/
Copy pathenv.example
More file actions
281 lines (259 loc) · 12 KB
/
Copy pathenv.example
File metadata and controls
281 lines (259 loc) · 12 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
# Configuration ProspectLab
# Copiez ce fichier en .env puis adaptez les valeurs.
# ============================================
# Application / securite
# ============================================
APP_ENV=development
FLASK_DEBUG=0
# Genere une vraie cle avant production:
# python -c "import secrets; print(secrets.token_hex(32))"
SECRET_KEY=dev-secret-key-change-in-production
# ============================================
# Base de donnees
# ============================================
# --- Developpement (SQLite) : APP_ENV=development (voir section Application)
DATABASE_PATH=prospectlab.db
# --- Production (PostgreSQL obligatoire) ---
# APP_ENV=production
# DATABASE_URL=postgresql://prospectlab:password@localhost:5432/prospectlab
# Ne pas definir DATABASE_PATH en prod (evite SQLite par erreur)
# Pool connexions (auto si APP_ENV=production, ou DATABASE_POOL_ENABLED=true)
# DATABASE_POOL_MIN=2
# DATABASE_POOL_MAX=20
# DATABASE_POOL_WAIT_SEC=20
# DATABASE_CONNECT_TIMEOUT_SEC=10
# DATABASE_STATEMENT_TIMEOUT_MS=600000
# DATABASE_CONNECT_RETRIES=3
# DATABASE_CONNECT_RETRY_DELAY_SEC=0.75
# ============================================
# Redis / Celery
# ============================================
CELERY_BROKER_URL=redis://localhost:6379/0
CELERY_RESULT_BACKEND=redis://localhost:6379/0
CELERY_WORKERS=4
# Files Celery à consommer (défaut si absent dans .env côté code: inclut aussi les queues dédiées)
# scraping_interactive : relances UI/WebSocket (prioritaire vs gros lots sur `scraping`)
# Si tu n'écoutes que `celery,heavy`, les tâches routées sur `scraping/technical/seo/osint/pentest`
# ne seront jamais exécutées et tu verras "aucun log".
CELERY_WORKER_QUEUES=celery,scraping,scraping_interactive,mini_scrape,technical,seo,screenshot,osint,pentest,heavy,website_full,landing
# Option cluster (script Linux) : CELERY_WORKER_QUEUE_PRESET=scraping_only | non_scraping (voir start_celery_worker.sh)
# Pack « analyse site complet » : file d’enqueue (défaut : technical — même file que les analyses lourdes)
# Pour un worker dédié uniquement au pack : CELERY_FULL_ANALYSIS_QUEUE=website_full (+ website_full dans CELERY_WORKER_QUEUES)
# CELERY_FULL_ANALYSIS_QUEUE=technical
# Scraping : 0 (défaut) = parallèle selon le worker Celery. 1 = verrou global Redis (un scrape à la fois).
# SCRAPING_GLOBAL_LOCK_ENABLED=0
# SCRAPING_LOCK_RETRY_SEC=10
# SCRAPING_LOCK_WAIT_MAX_SEC=86400
# Orchestrateur scraping d'analyse (scrape_analysis_orchestrator_task)
# SCRAPE_ANALYSIS_BATCH_SIZE=20
# SCRAPE_ANALYSIS_BATCH_RETRY_MAX=1
# ============================================
# Rapports d'audit site (API publique)
# POST /api/public/website-audit-report → analyse simple (technique+SEO) + PDF local
# POST /api/public/website-audit-report/complete → pack complet + rapport expert + PDF
# GET /api/public/website-audit-report/<task_id>
# Auth : Authorization Bearer <token API> OU header X-Website-Audit-Key (si clé lead ci-dessous)
# Prérequis : MAIL_* (envoi PDF), workers Celery queue "technical" (simple)
# et queue analyse complète + screenshots/osint/pentest pour le mode /complete
# Doc : docs/guides/API_PUBLIQUE.md — tests : python scripts/tests/test_website_audit_report.py
# ============================================
# Dossier des PDF générés (relatif au projet si chemin relatif)
# AUDIT_REPORTS_DIR=exports/audit_reports
# Objet du mail ({company} = nom entreprise ou domaine)
# WEBSITE_AUDIT_EMAIL_SUBJECT=Votre rapport d'audit web — {company}
# Clé formulaire lead (header X-Website-Audit-Key ou X-ProspectLab-Audit-Key)
# PUBLIC_WEBSITE_AUDIT_LEAD_KEY=
# Rapport complet payant (production distante SSH — voir LANDING_VARIANTS_REMOTE_*)
# WEBSITE_AUDIT_AGENT_ENABLED=true
# WEBSITE_AUDIT_AGENT_SCRIPT_PATH=scripts/experiments/gen_audit_report/generate_website_audit_cursor_remote.py
# WEBSITE_AUDIT_AGENT_TIMEOUT=900
# WEBSITE_AUDIT_AGENT_REMOTE_TEMP_ROOT=C:\Temp\cursor_prompt_runner
# WEBSITE_AUDIT_AGENT_REMOTE_OUTPUT_ROOT=C:\Temp\cursor_generated_audit_reports
# Alias rétrocompat : WEBSITE_AUDIT_SERV1_* (mêmes valeurs)
# Timeouts modules (secondes, 0=illimité) — évite blocage sur technique/pentest
# WEBSITE_AUDIT_SOFT_FAIL_MODULES=true
# WEBSITE_AUDIT_TECHNICAL_TIMEOUT_SEC=600
# WEBSITE_AUDIT_SEO_TIMEOUT_SEC=900
# WEBSITE_AUDIT_PENTEST_TIMEOUT_SEC=1200
# Échec agent PDF : pause + mail admin avec lien GET de reprise (WEBSITE_AUDIT_CURSOR_ALERT_EMAIL)
# URL publique (un seul BASE_URL dans .env — pas de doublon localhost + prod)
# BASE_URL=https://votre-domaine.fr
# Override explicite liens reprise audit : WEBSITE_AUDIT_PUBLIC_BASE_URL=https://votre-domaine.fr
# WEBSITE_AUDIT_AGENT_PAUSE_ON_AGENT_FAILURE=true
# WEBSITE_AUDIT_AGENT_FALLBACK_LOCAL=false
# WEBSITE_AUDIT_CURSOR_ALERT_EMAIL=contact@danielcraft.fr
# WEBSITE_AUDIT_USAGE_LIMIT_RETRIES=1
# WEBSITE_AUDIT_USAGE_LIMIT_RETRY_DELAY_SEC=300
# Logs : logs/website_audit_report.log, logs/website_audit_api.log, logs/full_website_analysis.log
# SSH / agent distant (réutilisés par l'audit complet + landing variants)
# Sur le Pi : sudo apt install -y openssh-client
# Doc : docs/configuration/SSH_SERV1_ET_AUDIT.md
# LANDING_VARIANTS_REMOTE_HOST=loicDaniel@serv1.lan
# LANDING_VARIANTS_REMOTE_CURSOR_COMMAND=agent.cmd
# LANDING_VARIANTS_REMOTE_WORKSPACE=
# Clé sur le serveur app (ex. Pi) : /home/pi/.ssh/id_rsa
# LANDING_VARIANTS_SSH_KEY_PATH=/home/pi/.ssh/id_rsa
# LANDING_VARIANTS_SERV1_MAX_CONCURRENT=1
# Après copie .env.prod → .env sur le serveur : bash scripts/linux/fix_env_crlf.sh
# ============================================
# Email (SMTP)
# ============================================
MAIL_SERVER=smtp.gmail.com
MAIL_PORT=587
MAIL_USE_TLS=True
MAIL_USERNAME=votre-email@gmail.com
MAIL_PASSWORD=votre-mot-de-passe-app
MAIL_DEFAULT_SENDER="Votre Nom <votre-email@gmail.com>"
MAIL_DEFAULT_RECIPIENT="contact@votre-domaine.com"
CAMPAIGN_REPORT_RECIPIENT="loic5488@gmail.com"
# ============================================
# Boite mail (IMAP) - récupération des bounces
# ============================================
# La boite qui reçoit les retours "Undelivered / Mail delivery failed".
# Utilisé par scripts/fetch_bounces_imap.py (support multi-profils)
# IMAP_HOST=imap.votre-domaine.com
# IMAP_PORT=993
# IMAP_SSL=true
# IMAP_USERNAME=votre-email@gmail.com
# IMAP_PASSWORD=votre-mot-de-passe
# IMAP_MAILBOX=INBOX
# IMAP_SINCE_DAYS=14
#
# Pour gérer plusieurs boites:
# - définir IMAP_PROFILES=gmail,domain
# - puis fournir les variables suffixées:
# IMAP_HOST_GMAIL=imap.gmail.com
# IMAP_USERNAME_GMAIL=...
# IMAP_PASSWORD_GMAIL=...
# IMAP_MAILBOX_GMAIL=INBOX
# IMAP_HOST_DOMAIN=imap.votre-domaine.com
# IMAP_PORT_DOMAIN=993
# IMAP_SSL_DOMAIN=true
# IMAP_USERNAME_DOMAIN=contact
# IMAP_PASSWORD_DOMAIN=...
# IMAP_MAILBOX_DOMAIN=INBOX
#
# Scan bounces automatique (Celery)
# true = active la tâche auto (après lancement campagne + 2x/jour via beat)
BOUNCE_SCAN_ENABLED=true
# Profils IMAP à scanner (doit correspondre à IMAP_PROFILES)
BOUNCE_SCAN_PROFILES=default
# Fenêtre de scan périodique (jours)
BOUNCE_SCAN_DAYS=14
# Fenêtre de scan du run "post-campagne" (jours)
BOUNCE_SCAN_AFTER_CAMPAIGN_DAYS=2
# 0 = sans limite de messages à scanner, >0 = limite
BOUNCE_SCAN_LIMIT=0
# Supprimer/déplacer les bounces déjà traités en IMAP
BOUNCE_SCAN_DELETE_PROCESSED=true
# Délai après lancement campagne avant le scan auto (secondes)
BOUNCE_SCAN_POST_CAMPAIGN_DELAY_SEC=1800
# Cache-buster assets (JS/CSS) - optionnel
# Change cette valeur à chaque déploiement si tu veux forcer le navigateur à recharger les assets.
# APP_BUILD_ID=20260330-1
# Base URL utilisee pour tracking (liens/pixels)
# En prod: mettre un domaine public HTTPS
# BASE_URL=http://localhost:5000
# ============================================
# API Sirene
# ============================================
SIRENE_API_URL=https://recherche-entreprises.api.gouv.fr/search
SIRENE_API_RATE_LIMIT=10
# SIRENE_API_KEY=votre-cle-api-sirene
# ============================================
# APIs OSINT / enrichissement
# ============================================
SHODAN_API_KEY=votre-cle-api-shodan
CENSYS_API_ID=votre-censys-api-id
CENSYS_API_SECRET=votre-censys-api-secret
HUNTER_API_KEY=votre-cle-api-hunter
# Validation email (Abstract) — optionnel, enrichit analyze_email
# ABSTRACT_EMAIL_API_KEY=
# Validation téléphone (Abstract, Numverify/APILayer) — optionnel, enrichit analyze_phones_osint
# ABSTRACT_PHONE_API_KEY=
# NUMVERIFY_API_KEY=
BUILTWITH_API_KEY=votre-cle-api-builtwith
HIBP_API_KEY=votre-cle-api-hibp
# ============================================
# Google Maps
# ============================================
GOOGLE_MAPS_JS_API_KEY=votre-cle-google-maps-js
# ============================================
# Multicanal - X (Twitter)
# ============================================
X_API_KEY=
X_API_SECRET=
X_ACCESS_TOKEN=
X_ACCESS_TOKEN_SECRET=
# ============================================
# Multicanal - Meta Messenger
# ============================================
META_PAGE_ID=
META_PAGE_ACCESS_TOKEN=
META_GRAPH_API_VERSION=v20.0
# ============================================
# Gemini Vision (audit complet + design screenshots)
# ============================================
# Cles hors git uniquement (.env / .env.prod). Voir docs/guides/GEMINI_AUDIT.md
# Rotation : 429 RPM / 503 -> cle suivante ; 401/403 -> cle ignoree jusqu'au restart ;
# 429 RPD reel -> ignoree jusqu'au reset Pacific.
# GEMINI_API_KEY=
# GEMINI_API_KEY_2=
# GEMINI_API_KEY_3=
# GEMINI_API_KEY_4=
# GEMINI_API_KEY_5=
# GEMINI_API_KEY_6=
# GEMINI_API_KEY_7=
# Ou liste CSV : GEMINI_API_KEYS=key1,key2,key3
# GEMINI_DESIGN_MODEL=gemini-3.8-flash
# GEMINI_MODEL=gemini-3.8-flash
# Fallback si 503 sur le modele principal (meme cle, puis cle suivante)
# GEMINI_FALLBACK_MODELS=gemini-flash-latest,gemini-3.5-flash
# GEMINI_QUOTA_RETRY_MS=35000
# GEMINI_QUOTA_RETRY_ROUNDS=3
# Pause courte apres stop precoce 503 (defaut 25s)
# GEMINI_TRANSIENT_RETRY_MS=25000
# Apres N cles 503 d'affilee : stop du tour (defaut 2)
# GEMINI_503_MAX_CONSECUTIVE_KEYS=2
# GEMINI_FULL_REPORT_MAX_CONCURRENT=2
# Vision leger : 1 image compressée
# GEMINI_VISION_MAX_IMAGES=1
# GEMINI_VISION_MAX_WIDTH=1280
# GEMINI_VISION_JPEG_QUALITY=72
# GEMINI_VISION_COMPRESS=1
# GEMINI_JOB_SPACING_SEC=90
# GEMINI_QUEUE_PENDING_TTL_SEC=7200
# GEMINI_SLOT_WAIT_SEC=900
# ============================================
# WSL / outils externes
# ============================================
WSL_DISTRO=kali-linux
WSL_USER=loupix
OSINT_TOOL_TIMEOUT=60
PENTEST_TOOL_TIMEOUT=120
# Tests formulaires (Celery, tasks/pentest_tasks.py + services/pentest_analyzer.py)
# PENTEST_FORM_PARALLEL_WORKERS=8
# PENTEST_FORM_HTTP_TIMEOUT=4
# PENTEST_FORM_SQLMAP_PROBE=0
# PENTEST_SQLMAP_FORM_TIMEOUT=90
# ============================================
# Stockage fichiers (uploads / exports)
# ============================================
# Défaut relatif au projet si non défini. En prod Linux souvent :
# UPLOAD_FOLDER=/opt/prospectlab/uploads
# EXPORT_FOLDER=/opt/prospectlab/exports
#
# NFS : même chemin sur l'app et sur tous les workers Celery (voir docs/configuration/DEPLOIEMENT_PRODUCTION.md).
# Les scripts deploy_production / deploy_cluster lisent NFS_SERVER dans .env.prod / .env.cluster
# et montent automatiquement le client si la variable est renseignée.
# NFS_SERVER=node15.lan
# NFS_EXPORT_ROOT=/srv/nfs/prospectlab
# Migration auto si uploads/exports déjà remplis avant le 1er montage (défaut=true si absent).
# NFS_AUTO_STASH=true
# Sur la machine qui héberge aussi les dossiers /srv/nfs/prospectlab : pas de NFS_SERVER,
# mets UPLOAD_FOLDER=/srv/nfs/prospectlab/uploads (et exports). Ou NFS_SKIP_CLIENT_MOUNT=true
# si tu gardes UPLOAD_FOLDER sous /opt/prospectlab avec montage désactivé côté déploiement.
#
# Sur Windows avec workers Linux : sans NFS accessible en écriture depuis le PC, la copie SSH reste utilisée.
# Si le fichier est déjà visible sur les workers au chemin Linux (partage réseau, etc.) :
# CLUSTER_SKIP_WORKER_SCP=true