# Application APP_NAME=MyClub APP_ENV=development #or production PORT=8080 DEBUG=true PREMIUM=false CLUB_DATA_MODE=auto #manual OR auto # Database Migrations & Seeding RUN_MIGRATIONS=true SEED_DATABASE=false # Database DB_HOST=localhost DB_PORT=5432 DB_USER=postgres DB_PASSWORD=postgres DB_NAME=fotbal_club DATABASE_URL=postgres://${DB_USER}:${DB_PASSWORD}@${DB_HOST}:${DB_PORT}/${DB_NAME}?sslmode=disable # JWT JWT_SECRET=your_jwt_secret_key_here JWT_EXPIRATION_HOURS=24 # Email Configuration SMTP_HOST=smtp.example.com SMTP_PORT=587 SMTP_USER=your_email@example.com SMTP_PASSWORD=your_email_password SMTP_FROM=noreply@fotbalclub.com SMTP_FROM_NAME="MyClub" SMTP_ENCRYPTION=tls # tls, ssl, or none SMTP_AUTH=true SMTP_SKIP_VERIFY=false # Set to true for self-signed certificates # Email Templates EMAIL_TEMPLATE_DIR=./templates/emails # Contact Form CONTACT_EMAIL=help@tdvorak.dev ADMIN_EMAIL=help@tdvorak.dev # Optional special SMTP override used ONLY for admin-triggered password reset emails # If set, the backend will use these credentials for POST /api/v1/admin/users/send-reset # while normal emails continue to use SMTP_* above. # Example (Purelymail over SSL on 465): # ADMIN_RESET_SMTP_HOST=smtp.purelymail.com # ADMIN_RESET_SMTP_PORT=465 # ADMIN_RESET_SMTP_USER=system@tdvorak.dev # ADMIN_RESET_SMTP_PASS=REPLACE_WITH_SECURE_PASSWORD # ADMIN_RESET_SMTP_FROM=system@tdvorak.dev # ADMIN_RESET_SMTP_FROM_NAME="Fotbal Club Admin" # Newsletter NEWSLETTER_ENABLED=true # File Uploads UPLOAD_DIR=./uploads MAX_UPLOAD_SIZE=50 ALLOWED_FILE_TYPES=image/jpeg,image/png,image/gif,application/pdf MAX_FILES=5 # Maximum number of files per upload # CORS ALLOWED_ORIGINS=* # Frontend Configuration REACT_APP_NAME=Fotbal Club Manager REACT_APP_API_URL=/api/v1 # FACR API Configuration # MyClub Central Directory Service DIRECTORY_INGEST_URL=https://error.sportcreative.eu/api/v1/directory/register DIRECTORY_INGEST_TOKEN=directory-registration-secure-token-2025 # Error Reporting (existing) ERROR_INGEST_URL=https://error.sportcreative.eu/api/v1/errors ERROR_INGEST_TOKEN=error-ingest-token-secure REACT_APP_FACR_API_BASE_URL=/api/v1/facr REACT_APP_FACR_API_TIMEOUT=5000 REACT_APP_FACR_CACHE_TTL=3600000 # Homepage Layout (sparta or classic) REACT_APP_HOMEPAGE_LAYOUT=classic # Logging LOG_LEVEL=info # debug, info, warn, error LOG_FORMAT=text # text or json LOG_OUTPUT=stdout # stdout, stderr, or file path # Server timeouts (increase for long AI requests) READ_TIMEOUT=15 WRITE_TIMEOUT=120 # Feature Flags REMBG_ENABLED=true # OpenRouter (for AI blog generation) OPENROUTER_ON=FALSE OPENROUTER_API_KEY=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 OPENROUTER_BASE_URL=https://openrouter.ai/api/v1 # Defaults can be overridden per environment OPENROUTER_MODEL=mistralai/mistral-small-3.1-24b-instruct:free OPENROUTER_FALLBACK_MODEL=mistralai/mistral-7b-instruct:free OPENROUTER_FALLBACK_MODEL2=openrouter/auto # Optional headers to identify your site/app to OpenRouter OPENROUTER_SITE_URL=http://localhost:8080 OPENROUTER_APP_NAME=MyClub # DEEPSEEK (for AI blog generation) DEEPSEEK_ON=TRUE DEEPSEEK_API_KEY=sk-c74e363b04ed4eb7afba080c10a1e679 DEEPSEEK_BASE_URL=https://api.deepseek.com DEEPSEEK_MODEL=deepseek-chat DEEPSEEK_THINKING_MODEL=deepseek-reasoner DEEPSEEK_MAX_DAILY_TOKENS=60000 DEEPSEEK_REASONER_MAX_DAILY_TOKENS=10000 # Frontend AI timeout (ms) REACT_APP_AI_TIMEOUT_MS=90000 # Umami AnalyticsMISTRAL_API_KEY=IY9Z5Ot8sBEdIC9F5cnAYMNxDffIU9Ta # optional: # MISTRAL_BASE_URL=https://api.mistral.ai UMAMI_URL=https://umami.tdvorak.dev UMAMI_USERNAME=admin UMAMI_PASSWORD=eevRQ6h3G@!c#y4A1T UMAMI_WEBSITE_ID= PREFETCH_TARGET=http://127.0.0.1:8080/api/v1 ERROR_LOCAL=true ERROR_INGEST_URL= ERROR_INGEST_TOKEN=fcing_e17b6c1a4d2f9073b5c8e1f2a3d4e5f60718293a4b5c6d7e8f90123456789abc REACT_APP_ERROR_INGEST_URL= REACT_APP_ERROR_INGEST_TOKEN=fcing_e17b6c1a4d2f9073b5c8e1f2a3d4e5f60718293a4b5c6d7e8f90123456789abc ERROR_REVIEW_ADMIN_URL= ERROR_REVIEW_ADMIN_TOKEN=fcadm_8c3a0c9f6d3b4e2caf1d7b9a2e5c6f7081a2b3c4d5e6f718192a3b4c5d6e7f80 # Mistral (direct API: text, vision, OCR, voice) MISTRAL_ON=TRUE MISTRAL_API_KEY=IY9Z5Ot8sBEdIC9F5cnAYMNxDffIU9Ta MISTRAL_BASE_URL=https://api.mistral.ai/v1 # Text models (used for blog/about etc.) MISTRAL_TEXT_MODEL_PRIMARY=mistral-small-latest MISTRAL_TEXT_MODEL_SECONDARY=ministral-14b-latest # Vision / OCR MISTRAL_VISION_MODEL_PIXTRAL=pixtral-12b MISTRAL_OCR_MODEL=mistral-ocr-latest # Voice (Voxtral) MISTRAL_VOICE_MODEL_PRIMARY=voxtral-small-latest MISTRAL_VOICE_MODEL_CHEAP=voxtral-mini-latest # Server-side per-model quota (per user per day) AI_DAILY_REQUEST_LIMIT_PER_MODEL=10 # Grok (x.ai) image generation XAI_ON=FALSE XAI_API_KEY=xai-ER2BQMW9HEAMUeEChj13wjQM0d9fGg8qKVGeKzluciSG93T50NLLxyW1mQc8AhO9Fplqw4aNPrl01Eo5 XAI_BASE_URL=https://api.x.ai/v1 XAI_IMAGE_MODEL=grok-2-image-latest XAI_IMAGE_MODEL_INSTAGRAM=grok-2-image-latest XAI_IMAGE_INSTAGRAM_DAILY_LIMIT=5 # Grok GROK_ON=TRUE GROK_API_KEY=xai-ER2BQMW9HEAMUeEChj13wjQM0d9fGg8qKVGeKzluciSG93T50NLLxyW1mQc8AhO9Fplqw4aNPrl01Eo5 GROK_BASE_URL=https://api.x.ai/v1 GROK_TEXT_MODEL_PRIMARY=grok-4-1-fast-non-reasoning GROK_TEXT_MODEL_SECONDARY=grok-4-1-fast-reasoning ESHOP_ENABLED=false ESHOP_SERVICE_SUFFIX= ESHOP_FRONTEND_URL=http://localhost:3100 ESHOP_API_URL=http://localhost:8082/api/v1/eshop ESHOP_FRONTEND_PORT=3100 ESHOP_BACKEND_PORT=8082 PACKETA_API_PASSWORD=c940e91531cf0d50ac12a89415c16dcc PACKETA_WIDGET_API_KEY=c940e91531cf0d50 PACKETA_ESHP_NAME=MyClub PACKETA_ENV=test # Revolut (E-shop payments) # Use test credentials for development, production/live for real payments. REVOLUT_ENABLED=false REVOLUT_ENVIRONMENT=sandbox # sandbox | production REVOLUT_API_KEY=your_revolut_api_key_here # Secret key from Revolut Business REVOLUT_PUBLIC_KEY=your_revolut_public_key_here # Public key for checkout REVOLUT_WEBHOOK_SECRET=your_revolut_webhook_secret_here REVOLUT_RETURN_URL=${ESHOP_FRONTEND_URL}/objednavka/dekujeme REVOLUT_WEBHOOK_URL=${ESHOP_API_URL}/payments/revolut/webhook # Weather API WEATHER_API_KEY=20dfd9a556ec43888dc103523250904 WEATHER_API_BASE_URL=https://api.weatherapi.com/v1