throttling, abuse-protection & logging/monitoring pass
This commit is contained in:
107
docker-compose.yml
Normal file
107
docker-compose.yml
Normal file
@@ -0,0 +1,107 @@
|
||||
# ---------------------------------------------------------------------
|
||||
# Docker Compose برای اجرای محلیِ Django بههمراه استکِ لاگِ متمرکز
|
||||
# (Grafana Alloy → Loki → Grafana). فقط برای dev/local — تنظیمِ پروداکشن نیست.
|
||||
#
|
||||
# جریانِ لاگ:
|
||||
# Django app --(همون JSON log خطبهخطِ موجود، هم روی stdout هم در
|
||||
# فایلِ /var/log/django/app.log — بدونِ تغییرِ پیامها)-->
|
||||
# Alloy --(این فایل رو از طریقِ ولومِ مشترکِ django_logs میخونه)-->
|
||||
# Loki --(ذخیرهسازیِ لاگ روی فایلسیستمِ محلی)-->
|
||||
# Grafana --(دیتاسورسِ Loki از قبل provision شده؛ داشبوردِ آماده)
|
||||
#
|
||||
# ⚠️ قبلاً این نقش با Promtail انجام میشد؛ چون Promtail مارچ ۲۰۲۶ به
|
||||
# EOL رسید، با Grafana Alloy (جانشینِ رسمیِ خودِ Grafana Labs) جایگزین
|
||||
# شد. جریانِ لاگ (Django → فایلِ مشترک → Loki → Grafana) و لیبلهای
|
||||
# level/logger دقیقاً همون قبلیان.
|
||||
#
|
||||
# اجرا: docker compose up --build
|
||||
# - اپ: http://localhost:8000
|
||||
# - Grafana: http://localhost:3000 (بدونِ لاگین، anonymous admin فعاله)
|
||||
# ---------------------------------------------------------------------
|
||||
|
||||
services:
|
||||
django:
|
||||
build: .
|
||||
container_name: tadrisino_django
|
||||
# migrate هر بار قبل از اجرا صدا زده میشه؛ روی SQLite بیخطر و
|
||||
# idempotent است (مطابقِ همون workflow ای که در README برای اجرای
|
||||
# محلی/غیرِ Docker هم توصیه شده).
|
||||
command: sh -c "python manage.py migrate --noinput && python manage.py runserver 0.0.0.0:8000"
|
||||
ports:
|
||||
- "8000:8000"
|
||||
environment:
|
||||
# این مقادیر فقط برای اجرای محلیِ Docker/دِمو هستن؛ برای پروداکشن
|
||||
# واقعی جایگزین بشن (به .env.example نگاه کنید).
|
||||
- DJANGO_DEBUG=${DJANGO_DEBUG:-1}
|
||||
- DJANGO_SECRET_KEY=${DJANGO_SECRET_KEY:-}
|
||||
- DJANGO_ALLOWED_HOSTS=${DJANGO_ALLOWED_HOSTS:-localhost,127.0.0.1}
|
||||
- CACHE_URL=${CACHE_URL:-}
|
||||
- KAVENEGAR_API_KEY=${KAVENEGAR_API_KEY:-}
|
||||
# مسیرِ اضافهای که Django (علاوه بر stdout) همون خطوطِ JSON رو توش
|
||||
# هم مینویسه؛ فقط وقتی این env ست باشه فعال میشه (config/settings.py)
|
||||
# — یعنی اجرای عادیِ خارج از Docker دقیقاً مثلِ قبل میمونه.
|
||||
- LOG_DIR=/var/log/django
|
||||
volumes:
|
||||
- .:/app # کد برای دیباگ/توسعهی زنده mount میشه
|
||||
- django_logs:/var/log/django # ولومِ مشترک با alloy
|
||||
# ⚠️ عمداً depends_on نداره: Django برای بالا اومدن یا جوابدادن به
|
||||
# درخواستها هیچ نیازی به Loki نداره (فقط توی فایل مینویسه؛ Promtail
|
||||
# و Loki مستقل از این میخونن/push میکنن). وابستگیِ استارتآپیِ اضافه
|
||||
# فقط باعثِ کندشدنِ بیدلیلِ `docker compose up` میشد.
|
||||
|
||||
loki:
|
||||
image: grafana/loki:2.9.6
|
||||
container_name: tadrisino_loki
|
||||
ports:
|
||||
- "3100:3100"
|
||||
command: -config.file=/etc/loki/loki-config.yml
|
||||
volumes:
|
||||
- ./docker/loki/loki-config.yml:/etc/loki/loki-config.yml:ro
|
||||
- loki_data:/loki
|
||||
|
||||
alloy:
|
||||
image: grafana/alloy:v1.18.1
|
||||
container_name: tadrisino_alloy
|
||||
# همون کاری که promtail قبلاً میکرد: config.alloy رو اجرا میکنه که
|
||||
# فایلِ لاگِ Django رو میخونه و به Loki push میکنه. پرچمِ
|
||||
# server.http.listen-addr فقط برای UI دیباگِ خودِ Alloy روی 12345 است.
|
||||
command:
|
||||
- run
|
||||
- --server.http.listen-addr=0.0.0.0:12345
|
||||
- --storage.path=/var/lib/alloy/data
|
||||
- /etc/alloy/config.alloy
|
||||
ports:
|
||||
- "12345:12345" # اختیاری: UI دیباگِ Alloy (وضعیتِ کامپوننتها)
|
||||
volumes:
|
||||
- ./docker/alloy/config.alloy:/etc/alloy/config.alloy:ro
|
||||
- django_logs:/var/log/django:ro # همون لاگهای Django رو میخونه (read-only)
|
||||
- alloy_data:/var/lib/alloy/data # ذخیرهسازیِ داخلیِ Alloy (شاملِ positions)
|
||||
# ⚠️ عمداً فقط به loki وابستهست، نه django: Alloy صرفاً فایلِ
|
||||
# لاگِ رویِ ولومِ مشترک رو میخونه (چه Django بالا باشه چه نه) و به
|
||||
# Loki push میکنه؛ نیازی نداره منتظرِ استارتشدنِ Django بمونه.
|
||||
depends_on:
|
||||
- loki
|
||||
|
||||
grafana:
|
||||
image: grafana/grafana:10.4.3
|
||||
container_name: tadrisino_grafana
|
||||
ports:
|
||||
- "3000:3000"
|
||||
environment:
|
||||
# فقط برای دسترسیِ محلی/دِمو ساده شده (بدونِ لاگین)؛ برای هر چیزِ
|
||||
# عمومی/پروداکشن حتماً anonymous access رو خاموش و پسورد ست کنید.
|
||||
- GF_AUTH_ANONYMOUS_ENABLED=true
|
||||
- GF_AUTH_ANONYMOUS_ORG_ROLE=Admin
|
||||
- GF_SECURITY_ADMIN_PASSWORD=${GRAFANA_ADMIN_PASSWORD:-admin}
|
||||
volumes:
|
||||
- ./docker/grafana/provisioning:/etc/grafana/provisioning:ro
|
||||
- ./docker/grafana/dashboards:/var/lib/grafana/dashboards:ro
|
||||
- grafana_data:/var/lib/grafana
|
||||
depends_on:
|
||||
- loki
|
||||
|
||||
volumes:
|
||||
django_logs:
|
||||
loki_data:
|
||||
alloy_data:
|
||||
grafana_data:
|
||||
Reference in New Issue
Block a user