NAS
домашнее хранилище, которое само за собой следит
Папки в сети, бакеты с входом S3, медиатека с телефонов и из iCloud, здоровье дисков и третье место для бэкапов наших проектов — на одном ящике дома, рядом с TrueNAS. Две недели от первого выпуска до ежедневной работы.
- движок
- Rust
- сервер
- PythonFastAPI
- данные
- PostgreSQL
- интерфейс
- ReactFlutter
- инфраструктура
- nginxDocker
- ещё
- ZFSTrueNAS
Дома — ящик с шестью дисками и TrueNAS. Он хранит, но ничего не рассказывает: что с дисками, куда ушло место, дошли ли копии. Фото живут в iCloud, старые архивы — по флешкам, бэкапы наших проектов — только у облачных провайдеров. Нужна была одна панель, которая хранит всё это и сама говорит, когда что-то не так.
NAS вырос из ядра нашей платформы: та же панель, роли, пуши, бэкапы, мониторинг. Своё — поверх: пул ZFS, бакеты, медиатека. Ставится рядом с TrueNAS и ничего у него не отнимает — всё своё лежит в одном наборе данных, а сам пул отпирает и монтирует TrueNAS.
Хранилище объектов, совместимое с S3: файл на диске и строка в базе. Совместимость проверяем настоящими клиентами — boto3, aws cli, rclone, подпись сверена с эталонами AWS. Ключи — с правами на бакет и префикс, права меняются без перевыпуска, неизменяемые бакеты не дают переписать выложенное.
Своё приложение на Flutter с ядром на Rust выгружает снимки с iPhone в фоне. Перенос из iCloud забрал 95 203 файла — и не изменил в iCloud ничего: методы записи заглушены, раскладка ключей та же, что у приложения, поэтому дублей нет. Старые фото с камер ложатся импортом: дата из EXIF, дубли — по sha256 во всей медиатеке, RAW и JPEG одного кадра склеиваются в один снимок.
В ленте — лента как на телефоне: Live, правки, удаление в «Недавно удалённые» на 30 дней. Поворот и обрезка с наклоном не трогают оригинал: ящик собирает копию рядом, вернуть исходник — одна кнопка.
Сборщик раз в пять минут снимает пул, SMART и то, что знает TrueNAS. Панель объясняет словами и даёт команду. Ящик помнит историю счётчиков: тревога — не на «36 ошибок за жизнь», а на рост за неделю — растут ошибки кабеля, значит, пора переткнуть кабель. У дисков Seagate сверяет часы SMART с журналом FARM: сброшенный счётчик выдаёт восстановленный диск. Проверка пула — полосой: сколько проверено и когда закончит.
Ящик дома за NAT, и серверы проектов до него не достают. Поэтому туннель открывает сам ящик: на сервере он виден обычным S3-адресом, а ключ ящика там умеет только этот проброс — без входа и команд. Четыре боевых проекта шлют сюда шифрованные копии рядом с облачными. Когда два туннеля вели на один сервер под разными именами, ящик это и показал — до того, как копия понадобилась.
Процессор, ядра, память, сеть, температуры — по сокету раз в 2–3 секунды, режим Live на любом графике. «Ресурсы» раскладывают процессор, диск и сеть по статьям: перенос из iCloud, импорт, проверка пула, система. Обновление — кнопкой: только выпущенная версия и только вперёд, а в панели видно, что придёт и что стоит.
14 дней от первого выпуска до ящика, на котором живут фото семьи и копии проектов. 74 выпуска, у каждого — проверки на стенде настоящими клиентами. Ящик пережил ребут посреди записи: пул цел, задачи продолжились с того же места, а история SMART показала, какой кабель проверить.





