Files
MMD ce0735d775 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.
2026-09-19 00:24:57 +03:30

59 lines
2.3 KiB
Bash

#!/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 " (آن را امن نگه دارید — پس از ورود به پنل، رمز را عوض کنید.)"