Перейти к основному содержимому

Файлы (drive)

Актуально для: SimpleTwo 0.9.x, drive 0.5, агент 0.5.116 · Проверено: 06.10.2026

drive — роль, которая хранит файлы, которые человек держит, в отличие от файлов, которые он отправил в чат или письмом. У каждого человека есть личное пространство home, у каждой группы identity — общее пространство. В клиентах это вкладка «Файлы» на iOS, macOS и Android (как ею пользуются).

Роль не хранит байты у себя. Файлы лежат в объектном хранилище (роль s3 или хранилище организации) в бакете simpletwo-drive, причём ключ объекта — это путь файла: бакет — настоящее дерево каталогов, которое можно обойти без SimpleTwo. В своей базе на postgres роль держит то, чего в файлах нет: журнал изменений, по которому синхронизируются клиенты, индекс имён для поиска, корзину, версии, внешние ссылки и их счётчики, незаконченные загрузки.

1. Что нужно до установки​

ЧтоЗачемБез этого
роль postgres или внешний кластерсвоя база роли; координатор создаёт её самроль не стартует: режима «в памяти» у неё нет
объектное хранилище — роль s3 или Settings → External storesбайты файловроль стартует, но принимает только файлы до 32 КБ (они помещаются в строку каталога); загрузка крупнее отвечает no_object_store, /healthz показывает object_store: none
публичное DNS-имя с записью A на публичный адрес хоста drive и порт 443, открытый из интернетаклиенты ходят на роль по HTTPS; сертификат Let's Encrypt роль получает сама (TLS-ALPN-01 на 443)сертификат не выпустится, drive_url не объявится, вкладки «Файлы» в клиентах не будет (см. §3)
координатор и роль на одном сеансовом ключероль проверяет токены самакоординатор передаёт ключ сам, руками ничего не вводится

Размер хоста — 2 vCPU / 4 ГБ: байтов на хосте нет, рабочий набор — каталог в postgres. Зато каждое скачивание и каждая загрузка идут через роль (клиенту адрес хранилища не выдаётся никогда), поэтому роль ограничена каналом, а не диском. Нагрузочного прогона для неё ещё не было — см. сайзинг.

Место в хранилище считайте отдельно от вложений чата и почты. Оценки в продукте пока предположительные, не измеренные: 15–20 ГБ на человека при переносе существующих файловых шариков и 3–5 ГБ на человека в год сверх этого.

Хранилище организации

При внешнем хранилище бакет диска всегда называется simpletwo-drive — отдельного поля для его имени в консоли нет. Роль при старте создаёт бакет, если его нет; если ключ этого не позволяет, создайте бакет заранее.

2. Установка​

  1. Серверы и развёртывания → Добавить хост, роль drive.
  2. Заполните поля:
    • Публичное DNS-имя — например files.s2.<домен>. Запись A должна указывать на публичный адрес этого хоста. Это имя получат клиенты, на него же указывают внешние ссылки https://<имя>/d/<токен>, и на него роль сама заказывает сертификат.
    • Приватный адрес — нога хоста в сторону postgres и хранилища. На этот /32 сужаются правила доступа к базе и к хранилищу; ничего передеплоивать не нужно, postgres и s3 подхватывают новый адрес примерно за минуту.
    • Адрес прослушивания — по умолчанию :8088. Это открытый HTTP на приватном адресе хоста: через него ходят координатор и другие службы.
  3. Выполните сформированную команду на хосте. Агент ставит службу, открывает 8088 и — если у хоста есть публичное имя — 443. Служба получает сертификат Let's Encrypt на своё имя сама (TLS-ALPN-01 на 443, как календарь); ни фронта, ни порта 80 не нужно. Сертификат хранится в /var/lib/simpletwo/drive-acme. Контактный адрес для удостоверяющего центра берётся общий на установку.
  4. Дождитесь объявления имени клиентам — см. следующий раздел.

Проверка на хосте роли и снаружи:

curl -fsS http://<приватный адрес>:8088/healthz
curl -fsS https://<публичное имя>/healthz
curl -fsS https://s2.<домен>/.well-known/simpletwo.json

В первом и втором ответе должно быть "ok": true и "object_store" — не none. В третьем — поле drive_url с https://<публичное имя> (появляется в течение пары минут после того, как ответил второй запрос).

До drive 0.5 и агента 0.5.116

В более ранних выпусках образ координатора не содержал саму службу drive (хост присоединялся, но ничего не устанавливал), роль не имела своего TLS, а drive_url записывался только при сохранении настроек хоста. Обновите координатор и агент, затем нажмите Redeploy на хосте drive.

3. Публичное имя и drive_url​

Клиенты узнают, где диск, из документа дискавери (/.well-known/simpletwo.json): поле drive_url. Нет поля — нет вкладки «Файлы»: так клиент честно говорит, что в установке диска нет, вместо кнопок, которые не работают.

drive_url объявляет координатор, так же как у почты и identity: раз в минуту он открывает https://<публичное имя>/healthz и публикует https://<публичное имя> только тогда, когда отвечает именно служба диска. Перестала отвечать — через 15 минут поле снимается, и вкладка прячется. Отсюда требования:

  • имя берётся из строки хоста (поле Публичное DNS-имя при добавлении или в Настройках хоста) и должно разрешаться в публичный адрес хоста drive;
  • порт 443 хоста должен быть доступен из интернета — и для Let's Encrypt, и для клиентов;
  • сертификат должен быть действительным: клиенты не открывают адрес без него.

Отдельного выключателя диска в Settings → Product options нет: вкладку прячет только отсутствие drive_url. Клиенты iOS, macOS и Android читают drive_url из того же документа дискавери, что и адреса почты и календаря.

4. Пространства и права​

  • Личное пространство (personal:<логин>) — у каждого, кто вошёл в клиент. Видит его только владелец; администратор содержимое не видит.
  • Пространство группы (group:<группа>) — у каждой группы, которую несёт токен человека. Список групп роль не хранит: исключили человека из группы в identity — со следующим токеном он теряет и её пространство, синхронизировать ничего не нужно.
В этой версии
  • Все участники группы имеют в её пространстве одинаковые права: читать, загружать, переименовывать и удалять. Ролей «только чтение» внутри пространства ещё нет.
  • Назначение функции «Диск» в identity доступ пока не ограничивает. Роль получает адрес identity, но не читает ленту назначений: личное пространство создаётся при первом открытии вкладки, а состояние функции «Диск» в identity не переходит в «готово».
  • Роль принимает только сеансовый токен координатора. Токен платформы identity (platform_token: identity) она не проверяет — установке с диском переходить на него пока рано.
  • Что происходит с личным пространством ушедшего сотрудника, не решено: файлы остаются, политики нет.

5. Квоты​

Место человека задаётся там же, где почта и чаты, — шаблоном квоты: Консоль → Settings → Quotas, часть «Файлы» (место и самый крупный файл). Подробно — квоты.

  • Квота проверяется при начале загрузки, по заявленному размеру, а не после того, как байты прошли по сети. Пространство без места отвечает quota_spent, файл крупнее разрешённого — too_large.
  • Сверх квоты отказывают только записи. Чтение, скачивание и внешние ссылки работают дальше, ничего не удаляется.
  • Общий предел на один файл у роли — 2 ГБ (DRIVE_MAX_UPLOAD_MB), шаблон может только уменьшить его.
  • Квота пространства группы задаётся на вкладке Файлы консоли (ниже) — шаблонов для групп нет. Квоту личного пространства там изменить нельзя: роль отвечает «a person's quota comes from the quota plan», меняйте шаблон человека.

6. Вкладка «Файлы» в консоли​

Консоль → Файлы — две карточки:

  • What the drive holds — сколько файлов и пространств, сколько начислено людям и сколько реально лежит в хранилище, и разница — сколько экономит дедупликация (один и тот же файл у сорока человек хранится один раз). Там же число незаконченных загрузок.
  • Spaces — поиск пространств по человеку или группе, крупнейшие первыми: чьё, сколько занято, квота в ГБ. 0 — действует значение по умолчанию установки. Квота ниже того, что уже лежит, ничего не удаляет: новые файлы не принимаются.

Карточки ходят в роль через координатор и требуют прав: статистика — settings:read, список пространств — users:read, квота — users:write. Состояния синхронизации устройств («кто что скачал») в консоли нет и не будет: служба его не знает.

7. Внешние ссылки​

Человек может выдать на файл ссылку https://<публичное имя>/d/<токен> для того, кто вне организации. Уровень доступа — чтение (скачать), комментарий (оставить замечание о файле) или запись (положить новую версию файла); по умолчанию — чтение. У ссылки бывают срок, пароль и предел скачиваний; отзыв действует со следующего байта, потому что байты по ссылке всегда идут через роль. Роль записывает каждое скачивание: когда, с какого адреса, сколько байт. Токен показывается один раз и хранится только хешем — выдать ту же ссылку повторно нельзя.

Политика ссылок — по умолчанию «разрешено всем», и в консоли её пока нет

Роль умеет выключать ссылки, разрешать их только названным группам, навязывать срок и ограничивать уровень (/v1/control/links/policy), но координатор эту настройку в консоль ещё не вывел. Пока это так, внешние ссылки разрешены всем, без обязательного срока и с любым уровнем. Если организации это не подходит, отложите открытие диска людям до того, как настройка появится в консоли: закрыть /d/, оставив доступ клиентам, нельзя — и то, и другое служба отдаёт на одном имени и одном порту.

Кнопки «поделиться ссылкой» в клиентах ещё нет, как нет и экрана комментариев: ссылки создаются, а комментарии читаются только через API роли (справочник). Ещё ограничения этой версии: ссылка выдаётся только на файл, не на папку; страницы для получателя нет — ссылка без пароля в браузере сразу скачивает файл, а ссылку с паролем браузер сам не откроет (пароль передаётся в теле запроса или заголовке X-S2-Link-Password, никогда в адресе).

8. Корзина, версии и правила синхронизации​

  • Удалённое уходит в корзину пространства и лежит там 30 дней (DRIVE_BIN_DAYS), затем стирается. Байты стираются, только когда на то же содержимое не ссылается ни один другой файл.
  • Прежние версии файла сохраняются при каждой перезаписи и уходят вместе с файлом, когда его стирает корзина.
  • Что не синхронизируется. У установки есть список масок исключений (*.tmp, ~$*, .DS_Store и т. п.), который человек может дополнить у себя, но не сократить. Роль его хранит и отдаёт клиентам, но в консоли поля для него нет: действует список по умолчанию, встроенный в клиент.

9. Резервное копирование и восстановление​

Бакет — запись о том, какие файлы есть; база — производный указатель. Поэтому:

  • Копируйте бакет simpletwo-drive — это главное и самое большое. На роли s3 это датасет ZFS simpletwo/s3 (снапшоты и zfs send); на внешнем хранилище — его средствами.
  • Раз в час роль кладёт в каждое пространство снимок каталога (<пространство>/.catalogue.json): корзину, версии, ссылки, комментарии. Подключив тот же бакет к новой базе, вы теряете только то, что изменилось после последнего снимка; сами файлы не теряются никогда.
  • База роли копируется вместе с остальными базами postgres (pg_dump) — см. обновление и бэкап.
Шифрование при хранении

Роль файлы не шифрует: решено шифровать ниже, средствами ZFS. Агент сегодня создаёт датасет без шифрования, а включить его у существующего датасета нельзя — только создать новый с encryption=on и перелить данные. Общий переключатель шифрования установки диск не покрывает.

10. Чего в этой версии нет​

  • WebDAV (Finder, Проводник), веб-страница диска и S3 API наружу.
  • Папка синхронизации на компьютере («как Dropbox»): решение принято, демона ещё нет.
  • Файлы в клиенте для Windows: раздел «Файлы» в боковой панели есть, но это пустой экран.
  • В клиентах: переименование, перемещение, версии, корзина с восстановлением, поиск и внешние ссылки есть в роли, но кнопок для них в приложениях ещё нет.
  • Предпросмотр на сервере, проверка загрузок антивирусом (ICAP), поиск по содержимому — поиск есть только по имени.
  • Перенос существующих файловых шар.
  • SMB не будет: это решение, а не очередь.

Если что-то не работает​

СимптомВероятная причина
Нет вкладки «Файлы»в /.well-known/simpletwo.json нет drive_url: координатор не достучался до https://<публичное имя>/healthz (§3)
https://<публичное имя>/healthz не отвечаетнет записи A на хост drive, 443 закрыт снаружи, у хоста не задано публичное имя или сертификат ещё не выпущен — смотрите журнал службы на хосте
На хосте drive нет службы simpletwo-driveкоординатор старше выпуска с drive 0.5: в его образе не было бинаря роли; обновите и нажмите Redeploy
Мелкие файлы загружаются, крупные — no_object_storeроли не передано хранилище: нет роли s3 и не задано внешнее; /healthz → object_store: none
quota_spentпространство заполнено: шаблон человека или квота группы на вкладке Файлы
Нет пространства группыгруппы нет в токене человека: проверьте членство в identity; изменение видно после обновления токена
Хост в статусе ошибки, «no dsn in the desired state»нет postgres или внешнего кластера