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