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:
@@ -0,0 +1,58 @@
|
||||
#!/usr/bin/env bash
|
||||
# ساخت .env با مقادیر قوی تصادفی — پیش از اولین استقرار تولید یکبار اجرا کنید.
|
||||
#
|
||||
# bash scripts/gen-env.sh # فایل .env میسازد (موجود را بازنویسی نمیکند)
|
||||
# bash scripts/gen-env.sh --force # .env موجود را بازنویسی میکند (احتیاط!)
|
||||
#
|
||||
# توجه: تغییر SECRET_KEY همه ادمینها را از پنل خارج میکند؛ تغییر MINIO_ROOT_PASSWORD
|
||||
# فقط با همگامسازی S3_SECRET_KEY بکاند اعتبار دارد.
|
||||
|
||||
set -euo pipefail
|
||||
cd "$(dirname "$0")/.."
|
||||
|
||||
if [ -f .env ] && [ "${1:-}" != "--force" ]; then
|
||||
echo "خطا: .env از قبل موجود است. برای بازنویسی: bash scripts/gen-env.sh --force" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
rand() { openssl rand -"$1" 2>/dev/null || head -c 64 /dev/urandom | od -An -tx1 | tr -d ' \n'; }
|
||||
|
||||
SECRET_KEY="$(rand hex 48)"
|
||||
POSTGRES_PASSWORD="$(rand hex 16)"
|
||||
MINIO_ROOT_PASSWORD="$(rand hex 16)"
|
||||
ADMIN_PASSWORD="$(rand hex 12)"
|
||||
|
||||
cat > .env <<EOF
|
||||
# تولیدشده با scripts/gen-env.sh — این فایل هرگز به گیت نمیرود.
|
||||
# پیش از انتشار واقعی، ADMIN_PASSWORD را به مقداری که به یاد میسپارید اما قوی است تغییر دهید:
|
||||
# docker compose exec backend python -c "from app.auth import hash_password; print(hash_password('رمز-جدید'))"
|
||||
# سپس در پنل مدیریت از تغییر رمز (change-password) استفاده کنید.
|
||||
SECRET_KEY=${SECRET_KEY}
|
||||
POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
|
||||
MINIO_ROOT_USER=aramesh
|
||||
MINIO_ROOT_PASSWORD=${MINIO_ROOT_PASSWORD}
|
||||
ADMIN_USERNAME=admin
|
||||
ADMIN_PASSWORD=${ADMIN_PASSWORD}
|
||||
TRAEFIK_HTTP_PORT=18081
|
||||
SITE_URL=
|
||||
# --- فقط تولید ---
|
||||
# DOMAIN=example.com
|
||||
# ACME_EMAIL=you@example.com
|
||||
# --- تحلیل رفتار (Umami) ---
|
||||
# VITE_API_URL=
|
||||
# VITE_UMAMI_SRC=
|
||||
# VITE_UMAMI_WEBSITE_ID=
|
||||
# --- چتبات ---
|
||||
# LLM_BASE_URL=
|
||||
# LLM_API_KEY=
|
||||
# LLM_MODEL=openai/gpt-oss-120b
|
||||
# CHAT_REINDEX_TOKEN=
|
||||
# --- مانیتورینگ ---
|
||||
# GRAFANA_ADMIN_PASSWORD=
|
||||
# ALERT_BOT_TOKEN=
|
||||
# ALERT_CHAT_ID=
|
||||
EOF
|
||||
|
||||
echo "✔ .env ساخته شد با مقادیر قوی تصادفی."
|
||||
echo " ADMIN_PASSWORD فعلی: ${ADMIN_PASSWORD}"
|
||||
echo " (آن را امن نگه دارید — پس از ورود به پنل، رمز را عوض کنید.)"
|
||||
Reference in New Issue
Block a user