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