CottonРазвёртывание
Развёртывание

Серьёзное файловое облако всё ещё должно запускаться просто.

Cotton держит форму развёртывания компактной: один образ приложения, PostgreSQL, постоянное хранилище чанков и мастер настройки, который превращает первый запуск в UI, а не шаманство в env-файле.

Установка Cotton CloudDockerPostgreSQLХранилище на файловой системеХранилище на S3Мастер настройки

Маленькая поверхность рантайма

Cotton работает как цельное ASP.NET Core приложение, а не как куча несвязанных рантаймов. Postgres хранит метаданные; хранилище чанков может жить на файловой системе или в S3-совместимом хранилище.

Compose без церемоний

Базовая Compose-форма намеренно прямолинейная: Postgres, Cotton, bind mount для /app/files, переменные базы данных и никакого ручного Docker network или connection-string ритуала.

Режим ключа — это выбор развёртывания

Публичный инстанс можно запускать без COTTON_MASTER_KEY в env и разблокировать через браузер. После рестарта украденный сервер без мастер-ключа превращается в тыкву: контейнер есть, диски есть, а открыть нечего. Для доверенного домашнего развёртывания можно раскомментировать мастер-ключ и получить рестарты без участия человека, если этот компромисс подходит.

Мастер настройки

Настройка при первом запуске закрывает создание администратора, выбор хранилища, режим email, часовой пояс и настройку телеметрии. Базовая настройка живёт в продукте, а не в фольклоре развёртывания.

Режимы email

Cotton умеет Cloud Cotton Mail, собственный SMTP или отключённый email. Домашний сервер и публичный инстанс не обязаны проходить одинаковый mail-обряд.

Бэкенды хранилища

Хранилище на файловой системе использует атомарные перемещения временных файлов и отчёт о ёмкости. S3-совместимое хранилище может писать через записи с проверкой существования за той же логической моделью чанков.

Пути в production

Тот же маленький старт может вырасти в нормальную эксплуатацию: локальный тест, домашний сервер за reverse proxy, публичный инстанс с проверкой безопасности и 2FA администратора или хранилище на S3, когда локальной файловой системы уже не хватает.

Квоты и защита от перегрузки

Пользовательские квоты и проверки нагрузки на хранилище помогают публичным и демо-инстансам не расползаться бесконтрольно и не забивать хранилище на файловой системе до нуля.

Диагностика безопасности

После развёртывания проверка безопасности для администратора показывает конкретные риски: открытая регистрация аккаунтов, отсутствие 2FA, доступный на запись rootfs, seccomp, ptrace и открытый Docker socket.

Площадь эксплуатационной поверхности

История развёртывания держится на одном образе приложения, метаданных в PostgreSQL, хранилище чанков на файловой системе или S3-совместимом, настройке при первом запуске, выборе режима email, политике квот, проверках нагрузки на хранилище и диагностике безопасности для администратора.

Маленький старт, настоящая эксплуатация

Cotton легко запустить, но он не притворяется, что эксплуатации в production не существует. Форма достаточно компактна для домашнего сервера, но показывает ручки, которые важны на публичном инстансе.

Что Docker не решает

Docker и Postgres — только форма приложения. Публичным развёртываниям всё равно нужны TLS, проверенные бэкапы, хранение ключей, обновления, мониторинг хранилища и закалка хоста/контейнера под реальную модель угроз. Docker поднимет контейнер. Думать за вас он не станет.

Доказательство развёртывания

Маленькая форма установки. Серьёзная поверхность оператора.

Cotton не продаётся как чёрный ящик. Это сфокусированное файловое облако на Docker/Postgres, где явно видны хранилище, поведение разблокировки, права, hardening, бэкапы и диагностика.

Один образ приложения

Web UI, API, конвейер хранения, мастер настройки и фоновые задачи едут в одном рантайме Cotton.

Метаданные в PostgreSQL

Postgres хранит пользователей, раскладки, манифесты, токены, настройки и состояние БД, которое Cotton проверяет.

Постоянный том с чанками

/app/files должен переживать рестарты контейнера: там лежат чанки и зашифрованный master-key sentinel.

Дружит с reverse proxy

Для публичного развёртывания ставьте Cotton за обычным TLS edge, а не превращайте контейнер приложения в весь периметр.

Форма рантайма

Две долговечные вещи: база и хранилище чанков.

Граница развёртывания намеренно скучная: один раз сгенерировать пароль БД, держать Postgres долговечным, держать /data/cotton долговечным, вынести TLS на edge и дать мастеру настройки закрыть первый запуск.

форма docker-compose.yml
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:true

Локально попробовать

Compose, bind mount для каталога файлов, локальный Postgres и разблокировка в браузере после старта.

Домашний сервер

Держите /data/cotton долговечным, TLS отдайте reverse proxy и решите, подходит ли вашей модели угроз автоматическая разблокировка через env.

Публичный инстанс

Предпочтите разблокировку в браузере, включите 2FA админам, настройте email и после публикации прогоните проверку безопасности.

Хранилище на S3

Берите S3-совместимое хранилище чанков, когда путь файловой системы уже не вытягивает по долговечности или ёмкости.

Разблокировка в браузере по умолчанию

Новый инстанс может стартовать без COTTON_MASTER_KEY и разблокироваться через /unlock. После рестарта украденный сервер без мастер-ключа превращается в тыкву: контейнер есть, диски есть, а открыть нечего.

Ключ в env, когда он к месту

Доверенное домашнее развёртывание всё ещё может использовать COTTON_MASTER_KEY для рестартов без ручной разблокировки. После derivation Cotton чистит его из своего процесса.

Запуск не от root

Официальный образ сначала готовит права на том, а потом запускает процесс Cotton от .NET app user.

Проверка безопасности после установки

Админка показывает конкретные сигналы hardening: diagnostics, dumpability, seccomp, ptrace, rootfs, Docker socket и покрытие 2FA.

Бэкап-путь

Восстановление БД должно быть частью операционной модели.

Cotton может создавать дампы PostgreSQL, складывать артефакты бэкапа через свой чанковый конвейер и пытаться восстановиться на пустой БД, если это настроено. Это не замена бэкапам вне сервера, а практичный слой восстановления внутри продукта.

Старт маленький

Формула простая: Cotton легко поднять, но он не делает вид, что эксплуатация заканчивается на первом запуске контейнера.

Граница оператора

Публичному развёртыванию всё равно нужны обычные операторские вещи: TLS, бэкапы, хранение ключей, обновления, мониторинг хранилища и host/container hardening под реальную модель угроз.

Вопросы

Прямые ответы

Что нужно, чтобы запустить Cotton?

Docker, PostgreSQL и постоянное хранилище для чанков Cotton. Стартовый Compose использует bind mount в /app/files и прямые переменные базы данных; TLS для публичного развёртывания обычно живёт на reverse proxy.

Нужна Docker-сеть или строка подключения?

Нет. Простой Compose использует обнаружение сервисов для Postgres и отдельные переменные COTTON_PG_*. Для стартового пути не нужны ручная Docker-сеть и церемония со строкой подключения.

Cotton может использовать объектное хранилище?

Да. Cotton может хранить объекты чанков в S3-совместимом хранилище, сохраняя те же метаданные и конвейер хранения поверх него.

Стоит ли использовать COTTON_MASTER_KEY?

Зависит от развёртывания. Для простого доверенного домашнего сервера ключ в env даёт рестарты без участия человека. Для открытых инстансов разблокировка через браузер держит ключ вне метаданных окружения контейнера, но сам ключ надо хранить безопасно.

Cotton умеет восстановление базы данных?

Cotton может создавать резервные копии в виде PostgreSQL-дампов через свой конвейер хранения и пытаться восстановиться на пустой БД, если это настроено. Это полезно, но бэкапы вне сервера всё равно нужны.