Маленькая поверхность рантайма
Cotton работает как цельное ASP.NET Core приложение, а не как куча несвязанных рантаймов. Postgres хранит метаданные; хранилище чанков может жить на файловой системе или в S3-совместимом хранилище.
Cotton держит форму развёртывания компактной: один образ приложения, PostgreSQL, постоянное хранилище чанков и мастер настройки, который превращает первый запуск в UI, а не шаманство в env-файле.
Cotton работает как цельное ASP.NET Core приложение, а не как куча несвязанных рантаймов. Postgres хранит метаданные; хранилище чанков может жить на файловой системе или в S3-совместимом хранилище.
Базовая Compose-форма намеренно прямолинейная: Postgres, Cotton, bind mount для /app/files, переменные базы данных и никакого ручного Docker network или connection-string ритуала.
Публичный инстанс можно запускать без COTTON_MASTER_KEY в env и разблокировать через браузер. После рестарта украденный сервер без мастер-ключа превращается в тыкву: контейнер есть, диски есть, а открыть нечего. Для доверенного домашнего развёртывания можно раскомментировать мастер-ключ и получить рестарты без участия человека, если этот компромисс подходит.
Настройка при первом запуске закрывает создание администратора, выбор хранилища, режим email, часовой пояс и настройку телеметрии. Базовая настройка живёт в продукте, а не в фольклоре развёртывания.
Cotton умеет Cloud Cotton Mail, собственный SMTP или отключённый email. Домашний сервер и публичный инстанс не обязаны проходить одинаковый mail-обряд.
Хранилище на файловой системе использует атомарные перемещения временных файлов и отчёт о ёмкости. S3-совместимое хранилище может писать через записи с проверкой существования за той же логической моделью чанков.
Тот же маленький старт может вырасти в нормальную эксплуатацию: локальный тест, домашний сервер за reverse proxy, публичный инстанс с проверкой безопасности и 2FA администратора или хранилище на S3, когда локальной файловой системы уже не хватает.
Пользовательские квоты и проверки нагрузки на хранилище помогают публичным и демо-инстансам не расползаться бесконтрольно и не забивать хранилище на файловой системе до нуля.
После развёртывания проверка безопасности для администратора показывает конкретные риски: открытая регистрация аккаунтов, отсутствие 2FA, доступный на запись rootfs, seccomp, ptrace и открытый Docker socket.
История развёртывания держится на одном образе приложения, метаданных в PostgreSQL, хранилище чанков на файловой системе или S3-совместимом, настройке при первом запуске, выборе режима email, политике квот, проверках нагрузки на хранилище и диагностике безопасности для администратора.
Cotton легко запустить, но он не притворяется, что эксплуатации в production не существует. Форма достаточно компактна для домашнего сервера, но показывает ручки, которые важны на публичном инстансе.
Docker и Postgres — только форма приложения. Публичным развёртываниям всё равно нужны TLS, проверенные бэкапы, хранение ключей, обновления, мониторинг хранилища и закалка хоста/контейнера под реальную модель угроз. Docker поднимет контейнер. Думать за вас он не станет.
Cotton не продаётся как чёрный ящик. Это сфокусированное файловое облако на Docker/Postgres, где явно видны хранилище, поведение разблокировки, права, hardening, бэкапы и диагностика.
Web UI, API, конвейер хранения, мастер настройки и фоновые задачи едут в одном рантайме Cotton.
Postgres хранит пользователей, раскладки, манифесты, токены, настройки и состояние БД, которое Cotton проверяет.
/app/files должен переживать рестарты контейнера: там лежат чанки и зашифрованный master-key sentinel.
Для публичного развёртывания ставьте Cotton за обычным TLS edge, а не превращайте контейнер приложения в весь периметр.
Граница развёртывания намеренно скучная: один раз сгенерировать пароль БД, держать Postgres долговечным, держать /data/cotton долговечным, вынести TLS на edge и дать мастеру настройки закрыть первый запуск.
services:
postgres:
image: postgres:18
restart: always
environment:
POSTGRES_DB: cotton
POSTGRES_USER: cotton
POSTGRES_PASSWORD: "замените выводом: openssl rand -base64 32"
cotton:
image: bvdcode/cotton:latest
restart: always
depends_on:
- postgres
ports:
- "8080:8080"
volumes:
- /data/cotton:/app/files
environment:
COTTON_PG_HOST: postgres
COTTON_PG_PORT: "5432"
COTTON_PG_DATABASE: cotton
COTTON_PG_USERNAME: cotton
COTTON_PG_PASSWORD: "то же значение, что POSTGRES_PASSWORD"
COTTON_RESTORE_DATABASE_IF_EMPTY: "true"
# Опционально для рестартов без ручного unlock; иначе разблокируйте в браузере:
# COTTON_MASTER_KEY: "замените выводом: openssl rand -base64 24"
security_opt:
- no-new-privileges:trueCompose, bind mount для каталога файлов, локальный Postgres и разблокировка в браузере после старта.
Держите /data/cotton долговечным, TLS отдайте reverse proxy и решите, подходит ли вашей модели угроз автоматическая разблокировка через env.
Предпочтите разблокировку в браузере, включите 2FA админам, настройте email и после публикации прогоните проверку безопасности.
Берите S3-совместимое хранилище чанков, когда путь файловой системы уже не вытягивает по долговечности или ёмкости.
Новый инстанс может стартовать без COTTON_MASTER_KEY и разблокироваться через /unlock. После рестарта украденный сервер без мастер-ключа превращается в тыкву: контейнер есть, диски есть, а открыть нечего.
Доверенное домашнее развёртывание всё ещё может использовать COTTON_MASTER_KEY для рестартов без ручной разблокировки. После derivation Cotton чистит его из своего процесса.
Официальный образ сначала готовит права на том, а потом запускает процесс Cotton от .NET app user.
Админка показывает конкретные сигналы hardening: diagnostics, dumpability, seccomp, ptrace, rootfs, Docker socket и покрытие 2FA.
Cotton может создавать дампы PostgreSQL, складывать артефакты бэкапа через свой чанковый конвейер и пытаться восстановиться на пустой БД, если это настроено. Это не замена бэкапам вне сервера, а практичный слой восстановления внутри продукта.
Формула простая: Cotton легко поднять, но он не делает вид, что эксплуатация заканчивается на первом запуске контейнера.
Публичному развёртыванию всё равно нужны обычные операторские вещи: TLS, бэкапы, хранение ключей, обновления, мониторинг хранилища и host/container hardening под реальную модель угроз.
Docker, PostgreSQL и постоянное хранилище для чанков Cotton. Стартовый Compose использует bind mount в /app/files и прямые переменные базы данных; TLS для публичного развёртывания обычно живёт на reverse proxy.
Нет. Простой Compose использует обнаружение сервисов для Postgres и отдельные переменные COTTON_PG_*. Для стартового пути не нужны ручная Docker-сеть и церемония со строкой подключения.
Да. Cotton может хранить объекты чанков в S3-совместимом хранилище, сохраняя те же метаданные и конвейер хранения поверх него.
Зависит от развёртывания. Для простого доверенного домашнего сервера ключ в env даёт рестарты без участия человека. Для открытых инстансов разблокировка через браузер держит ключ вне метаданных окружения контейнера, но сам ключ надо хранить безопасно.
Cotton может создавать резервные копии в виде PostgreSQL-дампов через свой конвейер хранения и пытаться восстановиться на пустой БД, если это настроено. Это полезно, но бэкапы вне сервера всё равно нужны.