feat(stack): full overhaul — hardening, ops tooling, monitoring, analytics, chatbot
Security: deep /api/health (DB+MinIO probes, 503 on failure) + /api/live; rate-limited public forms with honeypots; real client IP behind Traefik (--proxy-headers); TipTap URL sanitization on write (nh3); non-root containers + slim .dockerignore; prod MinIO console bound to 127.0.0.1; HSTS/nosniff on TLS routers; JWT 8h; no default credentials in code. Reliability: Alembic migrations (create_all baseline); graceful shutdown (exec uvicorn); hardened backups (checksums, sanity check, freshness gauge, optional rclone off-site) + restore.sh + hourly db-backup sidecar (ops profile); stack.sh ops tooling (deploy/logs/health/backup/restore/monitoring); .gitattributes LF for shell scripts. Orchestration: json-file log rotation, pinned images, per-service memory limits, edge/internal networks, Traefik ping/accesslog/metrics + flood limiter, conditional minio-setup, pgvector db image, one-shot db-init (umami + aramesh_chatbot databases). Chatbot: unified from site-chatbot branch (RAG + pgvector, SSE, ChatWidget). Monitoring: Prometheus/Alertmanager/Loki/Promtail/Grafana + cAdvisor, node/postgres/blackbox exporters, provisioned dashboards and 10 alert rules; alerts delivered to Bale (tapi.bale.ai — Telegram-compatible). Analytics: Umami on shared Postgres, build-time tracker injection, custom events (contact/newsletter/phone/chat/lang) via frontend/src/analytics.ts. Hygiene: CSV export for contact messages and subscribers; upload image optimization (Pillow); CI script + GitHub-compatible workflow; audit.sh; gen-env.sh for strong credentials.
This commit is contained in:
@@ -27,11 +27,23 @@ import uuid
|
||||
from collections import defaultdict
|
||||
from io import BytesIO
|
||||
|
||||
# اگر .env ریشه هست، متغیرهایش (ADMIN_PASSWORD و ...) خوانده میشوند
|
||||
_REPO_ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
|
||||
_ENV_FILE = os.path.join(_REPO_ROOT, ".env")
|
||||
if os.path.exists(_ENV_FILE):
|
||||
with open(_ENV_FILE, encoding="utf-8") as _f:
|
||||
for _line in _f:
|
||||
_line = _line.strip()
|
||||
if _line and not _line.startswith("#") and "=" in _line:
|
||||
_k, _, _v = _line.partition("=")
|
||||
os.environ.setdefault(_k.strip(), _v.strip())
|
||||
|
||||
import requests
|
||||
|
||||
API = os.environ.get("VITE_API_URL", "http://localhost:5173")
|
||||
USER = os.environ.get("ADMIN_USERNAME", "admin")
|
||||
PASS = os.environ.get("ADMIN_PASSWORD", "aramesh123")
|
||||
# رمز پیشفرض ندارد — از .env یا متغیر محیطی خوانده میشود؛ نبودش یعنی توقف با خطا
|
||||
PASS = os.environ["ADMIN_PASSWORD"]
|
||||
FORCE = "--force" in sys.argv
|
||||
|
||||
print(f"API بکاند: {API}")
|
||||
|
||||
Reference in New Issue
Block a user