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 - n8n 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 - n8n labels: - "traefik.enable=true" - "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: - ./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 - n8n 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: - ./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' ] networks: - n8n redis: image: redis:latest restart: unless-stopped llm: image: ollama/ollama:latest restart: unless-stopped volumes: - ./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 networks: - n8n # 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: edu_master/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 phpsessid-bot: build: context: edu_master/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