299 lines
10 KiB
YAML
299 lines
10 KiB
YAML
x-app: &app
|
|
build:
|
|
context: ./edu_master/backend/
|
|
dockerfile: Dockerfile
|
|
args:
|
|
- VERSION=${VERSION:-v0.10.2}
|
|
depends_on:
|
|
db:
|
|
condition: service_healthy
|
|
dns:
|
|
- 8.8.8.8
|
|
- 1.1.1.1
|
|
environment:
|
|
- SECRET_KEY=${SECRET_KEY:-django-insecure-el4wo4a4--=f0+ag#omp@^w4eq^8v4(scda&1a(td_y2@=sh6&}
|
|
- API_ENCRYPTION_KEY=${API_ENCRYPTION_KEY:-8zSd6JIuC7ovfZ4AoxG_XmhubW6CPnQWW7Qe_4TD1TQ=}
|
|
- DEBUG=${DEBUG:-True}
|
|
- ALLOWED_HOSTS=${ALLOWED_HOSTS:-*}
|
|
- LANGUAGE_CODE=${LANGUAGE_CODE:-en-us}
|
|
- TIME_ZONE=${TIME_ZONE:-UTC}
|
|
- USE_I18N=${USE_I18N:-True}
|
|
- USE_TZ=${USE_TZ:-True}
|
|
- STATIC_ROOT=${STATIC_ROOT:-storage/static/}
|
|
- MEDIA_ROOT=${MEDIA_ROOT:-storage/media/}
|
|
- LOG_LEVEL=${LOG_LEVEL:-INFO}
|
|
- REDIS_URL=${REDIS_URL:-redis://redis:6379/1}
|
|
- DATABASE_URL=postgres://${POSTGRES_USER:-postgres}:${POSTGRES_PASSWORD:-postgres}@${POSTGRES_HOST:-db}:${POSTGRES_PORT:-5432}/${POSTGRES_DB:-postgres}
|
|
- CELERY_BROKER_URL=${CELERY_BROKER_URL:-redis://redis:6379/0}
|
|
- CELERY_RESULT_BACKEND=${CELERY_RESULT_BACKEND:-django-db}
|
|
- REDIS_LOCKER_URL=${REDIS_LOCKER_URL:-redis://redis:6379/3}
|
|
- MINIO_ENDPOINT=minio:9000
|
|
- MINIO_EXTERNAL_ENDPOINT=nginx
|
|
- MINIO_REGION=us-east-1
|
|
- MINIO_ACCESS_KEY=minio
|
|
- MINIO_SECRET_KEY=minio123
|
|
- MINIO_USE_HTTPS=False
|
|
- MINIO_EXTERNAL_ENDPOINT_USE_HTTPS=False
|
|
- MINIO_URL_EXPIRY_HOURS=7
|
|
- MINIO_PRIVATE_BUCKET=private
|
|
- MINIO_PUBLIC_BUCKET=public
|
|
- CSRF_TRUSTED_ORIGINS=${CSRF_TRUSTED_ORIGINS:-}
|
|
- CORS_ALLOWED_ORIGINS=${CORS_ALLOWED_ORIGINS:-}
|
|
- CORS_ALLOWED_ORIGIN_REGEXES=${CORS_ALLOWED_ORIGIN_REGEXES:-}
|
|
- CORS_ALLOW_ALL_ORIGINS=${CORS_ALLOW_ALL_ORIGINS:-False}
|
|
- FRONTEND_URL=${FRONTEND_URL:-http://localhost}
|
|
- IS_LOGIN_ACTIVE=${IS_LOGIN_ACTIVE:-True}
|
|
- IS_SIGNUP_ACTIVE=${IS_SIGNUP_ACTIVE:-True}
|
|
- IS_GITHUB_LOGIN_ACTIVE=${IS_GITHUB_LOGIN_ACTIVE:-True}
|
|
- IS_GOOGLE_LOGIN_ACTIVE=${IS_GOOGLE_LOGIN_ACTIVE:-True}
|
|
- GITHUB_CLIENT_ID=${GITHUB_CLIENT_ID:-}
|
|
- GITHUB_CLIENT_SECRET=${GITHUB_CLIENT_SECRET:-}
|
|
- GOOGLE_CLIENT_ID=${GOOGLE_CLIENT_ID:-}
|
|
- GOOGLE_CLIENT_SECRET=${GOOGLE_CLIENT_SECRET:-}
|
|
- ACCESS_TOKEN_LIFETIME_MINUTES=${ACCESS_TOKEN_LIFETIME_MINUTES:-5}
|
|
- REFRESH_TOKEN_LIFETIME_DAYS=${REFRESH_TOKEN_LIFETIME_DAYS:-30}
|
|
- EMAIL_BACKEND=${EMAIL_BACKEND:-django.core.mail.backends.smtp.EmailBackend}
|
|
- EMAIL_HOST=${EMAIL_HOST:-}
|
|
- EMAIL_PORT=${EMAIL_PORT:-587}
|
|
- EMAIL_USE_TLS=${EMAIL_USE_TLS:-True}
|
|
- EMAIL_HOST_USER=${EMAIL_HOST_USER:-}
|
|
- EMAIL_HOST_PASSWORD=${EMAIL_HOST_PASSWORD:-}
|
|
- DEFAULT_FROM_EMAIL=${DEFAULT_FROM_EMAIL:-}
|
|
- SCRAPY_USER_AGENT=${SCRAPY_USER_AGENT:-WaterCrawl/0.1 (+https://github.com/watercrawl/watercrawl)}
|
|
- SCRAPY_ROBOTSTXT_OBEY=${SCRAPY_ROBOTSTXT_OBEY:-True}
|
|
- SCRAPY_CONCURRENT_REQUESTS=${SCRAPY_CONCURRENT_REQUESTS:-16}
|
|
- SCRAPY_DOWNLOAD_DELAY=${SCRAPY_DOWNLOAD_DELAY:-0}
|
|
- SCRAPY_CONCURRENT_REQUESTS_PER_DOMAIN=${SCRAPY_CONCURRENT_REQUESTS_PER_DOMAIN:-4}
|
|
- SCRAPY_CONCURRENT_REQUESTS_PER_IP=${SCRAPY_CONCURRENT_REQUESTS_PER_IP:-4}
|
|
- SCRAPY_COOKIES_ENABLED=${SCRAPY_COOKIES_ENABLED:-False}
|
|
- SCRAPY_HTTPCACHE_ENABLED=${SCRAPY_HTTPCACHE_ENABLED:-True}
|
|
- SCRAPY_HTTPCACHE_EXPIRATION_SECS=${SCRAPY_HTTPCACHE_EXPIRATION_SECS:-3600}
|
|
- SCRAPY_HTTPCACHE_DIR=${SCRAPY_HTTPCACHE_DIR:-httpcache}
|
|
- SCRAPY_LOG_LEVEL=${SCRAPY_LOG_LEVEL:-ERROR}
|
|
- SCRAPY_GOOGLE_API_KEY=${SCRAPY_GOOGLE_API_KEY:-}
|
|
- SCRAPY_GOOGLE_CSE_ID=${SCRAPY_GOOGLE_CSE_ID:-}
|
|
- SCRAPY_MAX_NUMBER_OF_SITEMAP_URLS=${SCRAPY_MAX_NUMBER_OF_SITEMAP_URLS:-20000}
|
|
- SCRAPY_SITEMAP_CRAWL_PAGE_LIMIT=${SCRAPY_SITEMAP_CRAWL_PAGE_LIMIT:-100}
|
|
- PLAYWRIGHT_SERVER=${PLAYWRIGHT_SERVER:-http://playwright:8000}
|
|
- PLAYWRIGHT_API_KEY=${PLAYWRIGHT_API_KEY:-your-secret-api-key}
|
|
- OPENAI_API_KEY=${OPENAI_API_KEY:-}
|
|
- STRIPE_SECRET_KEY=${STRIPE_SECRET_KEY:-}
|
|
- STRIPE_WEBHOOK_SECRET=${STRIPE_WEBHOOK_SECRET:-}
|
|
- GOOGLE_ANALYTICS_ID=${GOOGLE_ANALYTICS_ID:-}
|
|
- IS_ENTERPRISE_MODE_ACTIVE=${IS_ENTERPRISE_MODE_ACTIVE:-False}
|
|
- MAX_CRAWL_DEPTH=${MAX_CRAWL_DEPTH:--1}
|
|
- CAPTURE_USAGE_HISTORY=${CAPTURE_USAGE_HISTORY:-True}
|
|
- MCP_SERVER=${MCP_SERVER:-http://localhost/sse}
|
|
networks:
|
|
- traefik-proxy
|
|
- default
|
|
|
|
x-frontend: &frontend
|
|
image: watercrawl/frontend:${VERSION:-v0.10.2}
|
|
environment:
|
|
- VITE_API_BASE_URL=${API_BASE_URL:-http://localhost/api}
|
|
depends_on:
|
|
- app
|
|
|
|
services:
|
|
nginx:
|
|
image: nginx:alpine
|
|
volumes:
|
|
- ./edu_master/nginx/nginx.conf:/etc/nginx/conf.d/default.conf.template
|
|
- ./edu_master/nginx/entrypoint.sh:/entrypoint.sh
|
|
environment:
|
|
- MINIO_PRIVATE_BUCKET=${MINIO_PRIVATE_BUCKET:-private}
|
|
- MINIO_PUBLIC_BUCKET=${MINIO_PUBLIC_BUCKET:-public}
|
|
command: ["/bin/sh", "/entrypoint.sh"]
|
|
depends_on:
|
|
- app
|
|
- frontend
|
|
- minio
|
|
restart: unless-stopped
|
|
networks:
|
|
- traefik-proxy
|
|
- default
|
|
labels:
|
|
- "traefik.enable=true"
|
|
- "traefik.http.routers.${WATERCRAWL_APPNAME:-watercrawl}.rule=Host(`${WATERCRAWL_SUBDOMEN:-watercrawl}.${HOST:-workstation}`)"
|
|
- "traefik.http.routers.${WATERCRAWL_APPNAME:-watercrawl}.entrypoints=websecure"
|
|
- "traefik.http.routers.${WATERCRAWL_APPNAME:-watercrawl}.tls.certresolver=le"
|
|
- "traefik.http.services.${WATERCRAWL_APPNAME:-watercrawl}.loadbalancer.server.port=80"
|
|
- "traefik.docker.network=traefik-proxy"
|
|
|
|
app:
|
|
<<: *app
|
|
command: [ "gunicorn", "-b", "0.0.0.0:9000", "-w", "2", "watercrawl.wsgi:application", "--access-logfile", "-", "--error-logfile", "-", "--timeout", "60" ]
|
|
|
|
celery:
|
|
<<: *app
|
|
command: [ "celery", "-A", "watercrawl", "worker", "-l", "info", "-S", "django" ]
|
|
dns:
|
|
- 1.1.1.1
|
|
- 8.8.8.8
|
|
|
|
celery-beat:
|
|
<<: *app
|
|
command: [ "celery", "-A", "watercrawl", "beat", "-l", "info", "-S", "django" ]
|
|
|
|
frontend:
|
|
<<: *frontend
|
|
command: [ "npm", "run", "serve" ]
|
|
|
|
minio:
|
|
image: minio/minio:RELEASE.2024-11-07T00-52-20Z
|
|
restart: unless-stopped
|
|
volumes:
|
|
- ./edu_master/volumes/minio-data:/data
|
|
command: server /data --console-address ":9001"
|
|
environment:
|
|
- MINIO_BROWSER_REDIRECT_URL=${MINIO_BROWSER_REDIRECT_URL:-http://localhost/minio-console/}
|
|
- MINIO_SERVER_URL=${MINIO_SERVER_URL:-http://localhost/}
|
|
- MINIO_ROOT_USER=${MINIO_ACCESS_KEY:-minio}
|
|
- MINIO_ROOT_PASSWORD=${MINIO_SECRET_KEY:-minio123}
|
|
|
|
playwright:
|
|
image: watercrawl/playwright:1.1
|
|
restart: unless-stopped
|
|
user: root
|
|
environment:
|
|
- AUTH_API_KEY=${PLAYWRIGHT_API_KEY:-your-secret-api-key}
|
|
- PORT=${PLAYWRIGHT_PORT:-8000}
|
|
- HOST=${PLAYWRIGHT_HOST:-0.0.0.0}
|
|
dns:
|
|
- 8.8.8.8
|
|
- 1.1.1.1
|
|
networks:
|
|
- traefik-proxy
|
|
- default
|
|
|
|
db:
|
|
image: postgres:17.2-alpine3.21
|
|
restart: unless-stopped
|
|
environment:
|
|
- POSTGRES_PASSWORD=${POSTGRES_PASSWORD:-postgres}
|
|
- POSTGRES_USER=${POSTGRES_USER:-postgres}
|
|
- POSTGRES_DB=${POSTGRES_DB:-postgres}
|
|
volumes:
|
|
- ./edu_master/volumes/postgres-db:/var/lib/postgresql/data
|
|
healthcheck:
|
|
test: [ "CMD-SHELL", "pg_isready" ]
|
|
interval: 10s
|
|
timeout: 5s
|
|
retries: 5
|
|
|
|
mcp:
|
|
image: watercrawl/mcp:v1.2.0
|
|
restart: unless-stopped
|
|
command: [ "sse", "--base-url", "http://app:9000", '--port', '3000', '--endpoint', '/sse' ]
|
|
|
|
redis:
|
|
image: redis:latest
|
|
restart: unless-stopped
|
|
|
|
llm:
|
|
image: ollama/ollama:latest
|
|
restart: unless-stopped
|
|
volumes:
|
|
- ./edu_master/volumes/ollama-models:/root/.ollama
|
|
environment:
|
|
- OLLAMA_DISABLE_TELEMETRY=true
|
|
- OLLAMA_KEEP_ALIVE=5m
|
|
- OLLAMA_HOST=0.0.0.0:11434
|
|
- OLLAMA_NUM_PARALLEL=1
|
|
- OLLAMA_MAX_LOADED_MODELS=1
|
|
dns:
|
|
- 1.1.1.1
|
|
- 8.8.8.8
|
|
|
|
n8n:
|
|
image: docker.n8n.io/n8nio/n8n
|
|
restart: unless-stopped
|
|
environment:
|
|
- N8N_ENFORCE_SETTINGS_FILE_PERMISSIONS=true
|
|
- N8N_PORT=5678
|
|
- N8N_RUNNERS_ENABLED=true
|
|
- NODE_ENV=production
|
|
- GENERIC_TIMEZONE=Europe/Bratislava
|
|
- TZ=Europe/Bratislava
|
|
- N8N_SECURE_COOKIE=false
|
|
- N8N_COMMUNITY_PACKAGES_ALLOW_TOOL_USAGE=true
|
|
volumes:
|
|
- n8n_data:/home/node/.n8n
|
|
- ./edu_master/n8n/local-files:/files
|
|
extra_hosts:
|
|
- "enterprise.n8n.io:104.26.13.187"
|
|
- "enterprise.n8n.io:104.26.12.187"
|
|
- "enterprise.n8n.io:172.67.68.102"
|
|
dns:
|
|
- 1.1.1.1
|
|
- 8.8.8.8
|
|
networks:
|
|
- traefik-proxy
|
|
- default
|
|
labels:
|
|
- "traefik.enable=true"
|
|
- "traefik.http.routers.${N8N_APPNAME:-n8n}.rule=Host(`${N8N_SUBDOMEN:-n8n}.${HOST:-workstation}`)"
|
|
- "traefik.http.routers.${N8N_APPNAME:-n8n}..entrypoints=websecure"
|
|
- "traefik.http.services.${WATERCRAWL_APPNAME:-watercrawl}.loadbalancer.server.port=5678"
|
|
- "traefik.docker.network=traefik-proxy"
|
|
- "traefik.http.routers.${WATERCRAWL_APPNAME:-watercrawl}.tls.certresolver=le"
|
|
# docker exec -it edu_master-llm-1 ollama pull neural-chat:7b-q4
|
|
# docker exec -it edu_master-llm-1 ollama pull mistral:7b-q4
|
|
|
|
lessons-bot:
|
|
build:
|
|
context: lessons_bot/
|
|
dockerfile: Dockerfile
|
|
restart: unless-stopped
|
|
environment:
|
|
- LESSONS_BOT_TOKEN=${LESSONS_BOT_TOKEN}
|
|
- N8N_WEBHOOK_URL=${N8N_WEBHOOK_URL:-http://n8n:5678/webhook-test/get-lessons}
|
|
- N8N_SECRET=${N8N_SECRET:-your-secret-token-here}
|
|
- WATERCRAWL_API_URL=${WATERCRAWL_API_URL:-http://app:9000/api}
|
|
- PHPSESSID_BOT_URL=${PHPSESSID_BOT_URL:-http://phpsessid-bot:5000}
|
|
- EDU_HOST=${EDU_HOST:-edu.edu.vn.ua}
|
|
depends_on:
|
|
- n8n
|
|
- app
|
|
- phpsessid-bot
|
|
dns:
|
|
- 1.1.1.1
|
|
- 8.8.8.8
|
|
networks:
|
|
- default
|
|
healthcheck:
|
|
test: ["CMD-SHELL", "pgrep -f 'python.*main.py' || exit 1"]
|
|
interval: 30s
|
|
timeout: 10s
|
|
retries: 3
|
|
start_period: 10s
|
|
|
|
phpsessid-bot:
|
|
build:
|
|
context: phpsessid_bot/
|
|
dockerfile: Dockerfile
|
|
restart: unless-stopped
|
|
environment:
|
|
- EDU_HOST=${EDU_HOST:-edu.edu.vn.ua}
|
|
- EDU_LOGIN=${EDU_LOGIN}
|
|
- EDU_PASSWORD=${EDU_PASSWORD}
|
|
- BOT_PORT=${PHPSESSID_BOT_PORT:-5000}
|
|
- BOT_HOST=${PHPSESSID_BOT_HOST:-0.0.0.0}
|
|
dns:
|
|
- 1.1.1.1
|
|
- 8.8.8.8
|
|
networks:
|
|
- default
|
|
|
|
|
|
volumes:
|
|
n8n_data:
|
|
postgres-db:
|
|
minio-data:
|
|
ollama-models:
|
|
lmstudio_data:
|
|
networks:
|
|
traefik-proxy:
|
|
external: true
|