--- description: "Все переменные окружения SnapOtter со значениями по умолчанию. Настройте аутентификацию, хранилище, AI-модели, аналитику и не только." i18n_source_hash: 8e9e9ca2840c i18n_provenance: human i18n_output_hash: 0a35f86cfc5b --- # Конфигурация {#configuration} Вся конфигурация выполняется через переменные окружения. У каждой переменной есть разумное значение по умолчанию, поэтому SnapOtter работает «из коробки» без задания хотя бы одной из них. ## Переменные окружения {#environment-variables} ### Сервер {#server} | Переменная | По умолчанию | Описание | |---|---|---| | `PORT` | `1349` | Порт, который прослушивает сервер. | | `RATE_LIMIT_PER_MIN` | `1000` | Максимум запросов в минуту с одного IP. Установите 0, чтобы отключить ограничение частоты запросов. | | `CORS_ORIGIN` | (пусто) | Разделённый запятыми список разрешённых источников для CORS или пусто только для того же источника. | | `LOG_LEVEL` | `info` | Подробность журнала. Одно из: `fatal`, `error`, `warn`, `info`, `debug`, `trace`. | | `TRUST_PROXY` | `true` | Доверять заголовкам `X-Forwarded-For` от обратного прокси. Установите `false`, если прокси нет. | ### Аутентификация {#authentication} | Переменная | По умолчанию | Описание | |---|---|---| | `AUTH_ENABLED` | `false` | Установите `true`, чтобы требовать вход. Образ Docker по умолчанию использует `true`. | | `DEFAULT_USERNAME` | `admin` | Имя пользователя для начальной учётной записи администратора. Используется только при первом запуске. | | `DEFAULT_PASSWORD` | `admin` | Пароль для начальной учётной записи администратора. Смените его после первого входа. | | `MAX_USERS` | `0` (без ограничений) | Максимальное число зарегистрированных учётных записей пользователей. Установите 0 для отсутствия ограничений. | | `SESSION_DURATION_HOURS` | `168` | Время жизни сессии входа в часах (по умолчанию 7 дней). | | `SKIP_MUST_CHANGE_PASSWORD` | - | Установите любое непустое значение, чтобы обойти принудительный запрос на смену пароля при первом входе | ### Хранилище {#storage} | Переменная | По умолчанию | Описание | |---|---|---| | `STORAGE_MODE` | `local` | `local` или `s3`. S3/MinIO требует лицензию с функцией s3_storage. | | `DATABASE_URL` | `postgres://snapotter:snapotter@postgres:5432/snapotter` | Строка подключения PostgreSQL. | | `REDIS_URL` | `redis://redis:6379` | Строка подключения Redis (используется для очередей задач BullMQ). | | `WORKSPACE_PATH` | `./tmp/workspace` | Каталог для временных файлов во время обработки. Очищается автоматически. | | `FILES_STORAGE_PATH` | `./data/files` | Каталог для постоянных файлов пользователя (загруженные изображения, сохранённые результаты). | ### Встроенный режим {#embedded-mode} Запустите образ без `DATABASE_URL` и без `REDIS_URL`, и он запустит собственные PostgreSQL 17 и Redis внутри контейнера, привязанные к loopback, со всеми данными на томе `/data`. Это восстанавливает опыт запуска одной командой `docker run` для быстрого старта, домашней лаборатории и обновлений с 1.x. Это путь для удобства, а не продакшн-развёртывание: для продакшена запускайте стек из 3 контейнеров Compose с отдельными PostgreSQL и Redis. Встроенный режим требует запуска контейнера от root и несовместим со средами с произвольным UID (OpenShift, Kubernetes `runAsNonRoot`); там используйте Compose. | Переменная | По умолчанию | Описание | |---|---|---| | `EMBEDDED` | `auto` | Включается автоматически, когда и `DATABASE_URL`, и `REDIS_URL` не заданы. Установите `0`, чтобы отключить (тогда приложение сразу падает, если не задана внешняя `DATABASE_URL`/`REDIS_URL`, вместо тихого запуска базы данных внутри контейнера). | | `REDIS_MAXMEMORY` | `512mb` | Ограничение памяти для встроенного Redis (только встроенный режим). Понизьте его на хостах с ограниченной памятью, например на Raspberry Pi. | Обновление с 1.x: положите вашу старую `snapotter.db` по пути `/data/snapotter.db` в томе, и встроенный режим импортирует её во встроенный PostgreSQL при первом запуске. Импорт выполняется один раз; последующие запуски его пропускают. Примечание о телеметрии: встроенный режим наследует значение аналитики по умолчанию из образа, как и любая другая конфигурация. Публикуемый образ поставляется с включённой аналитикой; чтобы отключить её, соберите с `--build-arg SNAPOTTER_ANALYTICS=off` или используйте отказ в интерфейсе администратора. ### Ограничения обработки {#processing-limits} | Переменная | По умолчанию | Описание | |---|---|---| | `MAX_UPLOAD_SIZE_MB` | `100` | Максимальный размер файла на одну загрузку в мегабайтах. Установите 0 для отсутствия ограничений. | | `MAX_BATCH_SIZE` | `100` | Максимальное число файлов в одном пакетном запросе. Установите 0 для отсутствия ограничений. | | `CONCURRENT_JOBS` | `0` (авто) | Число пакетных задач, выполняемых параллельно. Установите 0 для автоопределения по числу доступных ядер CPU. | | `MAX_MEGAPIXELS` | `0` (без ограничений) | Максимальное разрешение изображения в мегапикселях. Установите 0 для отсутствия ограничений. | | `MAX_WORKER_THREADS` | `0` (авто) | Максимальное число потоков-воркеров для обработки изображений. Установите 0 для автоопределения по числу доступных ядер CPU. | | `PROCESSING_TIMEOUT_S` | `0` (без ограничения) | Максимальное время обработки на запрос в секундах. Установите 0 для отсутствия тайм-аута. | | `MAX_PIPELINE_STEPS` | `20` | Максимальное число шагов в конвейере. Установите 0 для отсутствия ограничения. | | `MAX_CANVAS_PIXELS` | `0` (без ограничения) | Максимальный размер холста в пикселях для выходных изображений. Установите 0 для отсутствия ограничения. | | `MAX_SVG_SIZE_MB` | `0` (без ограничений) | Максимальный размер файла SVG в мегабайтах. Установите 0 для отсутствия ограничений. | | `MAX_SPLIT_GRID` | `100` | Максимальная размерность сетки для инструмента разбиения изображения. | | `MAX_PDF_PAGES` | `0` (без ограничений) | Максимальное число страниц PDF для преобразования PDF в изображение. Установите 0 для отсутствия ограничений. | ### Очистка {#cleanup} | Переменная | По умолчанию | Описание | |---|---|---| | `FILE_MAX_AGE_HOURS` | `72` | Как долго хранятся несохранённые результаты обработки (исходные загрузки и выводы инструментов) до автоматического удаления. Файлы, которые вы явно сохранили в библиотеку Files, не затрагиваются и хранятся, пока вы их не удалите. | | `CLEANUP_INTERVAL_MINUTES` | `60` | Как часто выполняется задача очистки. | ### Внешний вид {#appearance} | Переменная | По умолчанию | Описание | |---|---|---| | `DEFAULT_THEME` | `light` | Тема по умолчанию для новых сессий. `light` или `dark`. | | `DEFAULT_LOCALE` | `en` | Язык интерфейса по умолчанию. | | `DEFAULT_TOOL_VIEW` | `sidebar` | Макет инструментов по умолчанию. `sidebar` или `fullscreen`. | ### Права доступа Docker {#docker-permissions} | Переменная | По умолчанию | Описание | |---|---|---| | `PUID` | `999` | Запускать процесс контейнера с этим UID. Установите в соответствии с вашим пользователем хоста для смонтированных каталогов (`id -u`). | | `PGID` | `999` | Запускать процесс контейнера с этим GID. Установите в соответствии с вашей группой хоста для смонтированных каталогов (`id -g`). | ## Пример Docker {#docker-example} ```yaml services: SnapOtter: image: snapotter/snapotter:latest ports: - "1349:1349" volumes: - SnapOtter-data:/data - SnapOtter-workspace:/tmp/workspace environment: - AUTH_ENABLED=true - DEFAULT_USERNAME=admin - DEFAULT_PASSWORD=changeme - DATABASE_URL=postgres://snapotter:snapotter@postgres:5432/snapotter - REDIS_URL=redis://redis:6379 - MAX_UPLOAD_SIZE_MB=200 - CONCURRENT_JOBS=4 - FILE_MAX_AGE_HOURS=12 depends_on: postgres: condition: service_healthy redis: condition: service_healthy restart: unless-stopped postgres: image: postgres:17-alpine environment: POSTGRES_USER: snapotter POSTGRES_PASSWORD: snapotter POSTGRES_DB: snapotter volumes: - SnapOtter-pgdata:/var/lib/postgresql/data restart: unless-stopped healthcheck: test: ["CMD-SHELL", "pg_isready -U snapotter"] interval: 10s timeout: 5s retries: 12 redis: image: redis:8-alpine command: ["redis-server", "--maxmemory-policy", "noeviction", "--appendonly", "yes"] volumes: - SnapOtter-redisdata:/data restart: unless-stopped healthcheck: test: ["CMD", "redis-cli", "ping"] interval: 10s timeout: 5s retries: 12 volumes: SnapOtter-data: SnapOtter-workspace: SnapOtter-pgdata: SnapOtter-redisdata: ``` ## Тома {#volumes} Стек Docker Compose использует четыре тома: - `/data` (app), AI-модели, виртуальное окружение Python и файлы пользователя. Смонтируйте его, чтобы сохранять загруженные файлы и установленные AI-пакеты между перезапусками. - `/tmp/workspace` (app), временное хранилище для обрабатываемых файлов. Оно может быть эфемерным, но монтирование избавляет от заполнения записываемого слоя контейнера. - `SnapOtter-pgdata` (postgres), каталог данных PostgreSQL. В нём хранятся все реляционные данные (пользователи, настройки, конвейеры, задачи, журнал аудита). Создавайте резервную копию через `pg_dump` или снимок тома. - `SnapOtter-redisdata` (redis), файл Redis только для добавления (append-only) для устойчивых очередей задач.