{% extends "admin/base-admin.html" %} {% block title %}Server Settings{% endblock %} {% block content %}

Server Settings

Configure Flask server parameters — applied live without restart.

{% with messages = get_flashed_messages(with_categories=true) %}{% for cat, msg in messages %}{% endfor %}{% endwith %}

Upload Limits

Global server ceiling — per-plan limits in Subscription Plans are further capped by this value.

Current effective limit: {{ server_max_mb }} MB. If a user's plan allows more, this value still applies as the ceiling.

{% if plans %}

Effective upload limit per plan (after cap):

{% for plan in plans %} {% set plan_mb = plan.max_file_size_mb|int %} {% endfor %}
Plan Plan Limit Effective Limit Capped?
{{ plan.name }} {% if plan_mb <= 0 %}Unlimited{% else %}{{ plan_mb }} MB{% endif %} {{ plan.effective_max_mb }} MB {% if plan_mb > server_max_mb %} Capped {% else %} OK {% endif %}
{% endif %}

nginx also needs to be configured

The setting above only controls Flask's internal limit. If your server runs nginx in front of Flask (typical in production), nginx has its own separate upload size limit — client_max_body_size — which defaults to just 1 MB. Any file larger than that is rejected by nginx before Flask even sees the request, which causes the "File is too large" error regardless of what is set here.

In your nginx site configuration block, set this to match or exceed the value above:

server {
    ...
    client_max_body_size {{ (site.server_max_upload_mb|default('500'))|int + 100 }}m;  # Flask limit + 100 MB headroom
    ...
}

After editing, reload nginx: sudo systemctl reload nginx

Gunicorn must be configured for long-running conversions

Gunicorn's default worker timeout is only 30 seconds. Any file conversion that takes longer will be forcefully killed mid-process, leaving the job stuck in "pending" forever. Use the bundled config file which sets a 1-hour timeout and restarts the background job thread after each worker fork.

Start the production server with:

gunicorn --config gunicorn.conf.py wsgi:application

The gunicorn.conf.py file in the project root sets timeout = 3600, workers = 1, and includes a post_fork hook so the conversion queue keeps running inside each worker process.

Session Lifetime

How many days a logged-in session remains valid (sets PERMANENT_SESSION_LIFETIME).

Response Compression (Gzip/Brotli)

Flask-Compress settings for compressing HTML/CSS/JS responses.

AI Transcription (Whisper)

Controls which OpenAI Whisper model is used when transcribing audio/video to TXT, SRT, or VTT. The WHISPER_MODEL environment variable overrides this setting.

Models: tiny (fastest, ~1 GB RAM) · base · small · medium · large (best accuracy, ~10 GB RAM). The first transcription will download the selected model automatically.

Cancel
{% endblock %} {% block scripts %} {% endblock %}