Сборка NAS-сервера для малого бизнеса: замена Dropbox на своё железо

Зачем бухгалтерии свой NAS

Бухгалтерская фирма «АудитГрупп» (28 сотрудников) пришла к нам с запросом: заменить Dropbox Business на собственное решение. Причины:

  • Стоимость — Dropbox Business Advanced: $24/пользователь/месяц × 28 = $672/мес ($8 064/год). За 3 года — $24 000+.
  • Регуляторика — бухгалтерские документы, сканы паспортов и договоры клиентов не должны храниться на зарубежных серверах (152-ФЗ).
  • Скорость — загрузка годового отчёта (500 МБ архив 1С) в Dropbox по офисному каналу — 15 минут. По локальной сети — секунды.
  • Объём — 8 ТБ данных с ростом ~2 ТБ/год. Dropbox Advanced даёт unlimited, но загрузка/скачивание ограничены скоростью интернета.

Бюджет: до 150 000 рублей на железо + настройку. Окупаемость — менее 2 лет.

Выбор железа: ECC, HBA и тишина

Для бизнес-NAS критичны три вещи: ECC-память (защита от битовых ошибок в RAM), HBA-контроллер в режиме IT (passthrough дисков в ОС для ZFS), и тихая работа (NAS стоит в офисе, не в серверной).

Финальная конфигурация:

КомпонентМодельЦена (руб)
CPU + материнская платаXeon E5-2680 v4 + X99 mATX (комплект Avito)10 000
RAM32 ГБ DDR4 ECC UDIMM (2×16)8 000
Диски данных4× Seagate Exos 4 ТБ (новые)32 000
Системный SSDKingston A400 240 ГБ2 500
HBA-контроллерLSI 9211-8i (IT mode, Avito)3 000
SAS-кабелиMini-SAS to 4×SATA1 000
КорпусJonsbo N4 (mATX, 6 отсеков HDD)8 000
Блок питанияBe Quiet Pure Power 400W5 000
КулерNoctua NH-L9x654 500
Вентиляторы2× Noctua NF-A12x25 (120mm)5 000
ИБПAPC Back-UPS 650VA6 000
Итого85 000

Важные нюансы при выборе:

  • ECC RAM: бывает трёх типов — Unbuffered (UDIMM), Registered (RDIMM) и Load-Reduced (LRDIMM). Для десктопных/mATX плат нужен именно Unbuffered ECC. RDIMM физически не встанет. Мы видели случаи, когда люди покупали дешёвые RDIMM с Avito и не могли их установить.
  • HBA в IT-mode: контроллер LSI 9211-8i прошивается в режим IT (Initiator Target), где он просто пробрасывает диски в ОС без аппаратного RAID. Это обязательно для ZFS — ему нужен прямой доступ к дискам. Контроллеры типа LSI 9261 без прошивки IT-mode не подходят.
  • Тишина: Noctua вентиляторы + Be Quiet БП дают уровень шума ~28 дБ при нагрузке — тише кондиционера. Критично для офисного размещения.

TrueNAS vs Unraid vs OpenMediaVault

Мы протестировали три NAS-ОС перед финальным выбором:

КритерийTrueNAS SCALEUnraidOpenMediaVault
Файловая системаZFS (нативная)XFS + parityext4/Btrfs/ZFS(плагин)
Защита данныхChecksums + scrubParity без checksumsЗависит от FS
DockerДа (Kubernetes)Да (нативный)Да (portainer)
ЛицензияБесплатная$59-$129Бесплатная
Порог входаСреднийНизкийНизкий
МасштабируемостьEnterpriseДомашний/SMBSMB

Мы выбрали TrueNAS SCALE: ZFS из коробки, базируется на Debian (привычный Linux), бесплатная, enterprise-grade. Unraid хорош для дома (гибкое добавление дисков), но не даёт проверки целостности данных.

# Установка TrueNAS SCALE
# 1. Скачиваем ISO: https://www.truenas.com/download-truenas-scale/
# 2. Записываем на USB через Rufus/dd:
dd if=TrueNAS-SCALE-24.10.iso of=/dev/sdb bs=4M status=progress

# 3. Загружаемся с USB, устанавливаем на системный SSD
# 4. После перезагрузки — веб-интерфейс на IP сервера
# 5. Создаём пул через UI: Storage → Pools → Add
#    - 4 диска в RAIDZ1 (аналог RAID-5: 1 диск на parity)
#    - Полезная ёмкость: 3 × 4 ТБ = 12 ТБ

# Или через CLI:
zpool create -o ashift=12 \
  -O compression=lz4 -O atime=off \
  datapool raidz1 \
  /dev/disk/by-id/ata-ST4000NM000A_* \
  /dev/disk/by-id/ata-ST4000NM000A_* \
  /dev/disk/by-id/ata-ST4000NM000A_* \
  /dev/disk/by-id/ata-ST4000NM000A_*

Samba-шары и Nextcloud для мобильного доступа

Для «АудитГрупп» мы настроили два типа доступа: Samba (SMB) для работы из офиса и Nextcloud для доступа из дома и с мобильных.

Структура Samba-шар с разграничением по отделам:

# Создаём датасеты ZFS под каждый отдел
zfs create datapool/shared              # Общая папка
zfs create datapool/accounting          # Бухгалтерия
zfs create datapool/audit               # Аудиторы
zfs create datapool/management          # Руководство
zfs create -o quota=500G datapool/temp  # Временные файлы, квота 500 ГБ

Настройка Samba через TrueNAS UI или конфиг:

# /etc/samba/smb.conf (TrueNAS генерирует автоматически)
[global]
  workgroup = AUDITGROUP
  server string = NAS FileServer
  security = user
  map to guest = Never
  vfs objects = shadow_copy2 zfsacl
  shadow:snapdir = .zfs/snapshot
  shadow:sort = desc
  shadow:format = autosnap_%Y-%m-%d_%H:%M

[Бухгалтерия]
  path = /mnt/datapool/accounting
  valid users = @accounting
  read only = no
  create mask = 0660
  directory mask = 0770
  veto files = /*.exe/*.bat/*.cmd/

[Общая]
  path = /mnt/datapool/shared
  valid users = @all-staff
  read only = no
  create mask = 0664
  directory mask = 0775

Обратите внимание на shadow_copy2 — модуль Samba, который показывает ZFS-снапшоты как «Предыдущие версии» в Windows. Пользователи могут восстановить удалённый файл через правый клик → Свойства → Предыдущие версии, без обращения к администратору.

Nextcloud для удалённого доступа:

# docker-compose.yml для Nextcloud
version: '3.8'
services:
  nextcloud:
    image: nextcloud:28-apache
    ports:
      - "8080:80"
    volumes:
      - /mnt/datapool/nextcloud/data:/var/www/html/data
      - /mnt/datapool/nextcloud/config:/var/www/html/config
      - /mnt/datapool/shared:/external/shared:ro     # монтируем Samba-шары
      - /mnt/datapool/accounting:/external/accounting:ro
    environment:
      - MYSQL_HOST=db
      - MYSQL_DATABASE=nextcloud
      - MYSQL_USER=nextcloud
      - MYSQL_PASSWORD=${NC_DB_PASS}
    depends_on:
      - db

  db:
    image: mariadb:11
    environment:
      - MYSQL_ROOT_PASSWORD=${DB_ROOT_PASS}
      - MYSQL_DATABASE=nextcloud
      - MYSQL_USER=nextcloud
      - MYSQL_PASSWORD=${NC_DB_PASS}
    volumes:
      - /mnt/datapool/nextcloud/db:/var/lib/mysql

Nextcloud смонтирован на те же ZFS-датасеты через External Storage — пользователи видят одни и те же файлы из офиса (Samba) и из дома (Nextcloud). Синхронизация не нужна, потому что данные хранятся в одном месте.

Бэкапы в облако и ИБП

NAS в офисе решает проблему скорости и 152-ФЗ, но не защищает от пожара/кражи. Нужен offsite-бэкап.

Мы настроили restic для инкрементального зашифрованного бэкапа в Yandex Object Storage (S3-совместимый):

# Установка restic
sudo apt install restic

# Инициализация репозитория в S3
export AWS_ACCESS_KEY_ID="your-key"
export AWS_SECRET_ACCESS_KEY="your-secret"
export RESTIC_REPOSITORY="s3:storage.yandexcloud.net/auditgroup-backup"
export RESTIC_PASSWORD="strong-encryption-password"

restic init

# Скрипт бэкапа
#!/bin/bash
# /opt/scripts/backup.sh

export AWS_ACCESS_KEY_ID="your-key"
export AWS_SECRET_ACCESS_KEY="your-secret"
export RESTIC_REPOSITORY="s3:storage.yandexcloud.net/auditgroup-backup"
export RESTIC_PASSWORD_FILE="/root/.restic-pass"

# Бэкап с исключениями
restic backup /mnt/datapool/accounting /mnt/datapool/audit \
  --exclude="*.tmp" --exclude="~*" --exclude="Thumbs.db" \
  --tag daily

# Ротация: 7 ежедневных, 4 еженедельных, 12 ежемесячных
restic forget --keep-daily 7 --keep-weekly 4 --keep-monthly 12 --prune

# Проверка целостности (раз в неделю)
restic check --read-data-subset=10%

echo "Backup completed: $(date)" | \
  curl -s -X POST "https://api.telegram.org/bot${TG_TOKEN}/sendMessage" \
  -d chat_id="${TG_CHAT_ID}" -d text="$(cat -)"
# Cron: ежедневно в 2:00
0 2 * * * root /opt/scripts/backup.sh >> /var/log/backup.log 2>&1

Стоимость S3-бэкапа: хранение 1 ТБ в Yandex Object Storage — ~1 000 руб/мес. Restic делает дедупликацию и шифрование (AES-256) — в облаке данные нечитаемы без пароля.

ИБП (UPS) + NUT: при отключении электричества NAS должен корректно завершить работу, а не потерять данные:

# Установка NUT (Network UPS Tools)
sudo apt install nut

# /etc/nut/ups.conf
[apc650]
  driver = usbhid-ups
  port = auto
  desc = "APC Back-UPS 650"

# /etc/nut/upsmon.conf
MONITOR apc650@localhost 1 admin secret master
SHUTDOWNCMD "/sbin/shutdown -h +0"
POWERDOWNFLAG /etc/killpower
FINALDELAY 5

# /etc/nut/upsd.conf
LISTEN 0.0.0.0 3493

# Запускаем
sudo systemctl enable --now nut-server nut-monitor

# Проверяем статус ИБП
upsc apc650
# battery.charge: 100
# battery.runtime: 1420  (секунд — ~23 минуты)
# ups.status: OL         (Online — питание есть)

NUT автоматически выключит NAS при разряде батареи до 20%, давая ZFS завершить все транзакции. Без ИБП внезапное отключение питания при записи может повредить пул (хотя ZFS устойчив к этому благодаря CoW, лучше не рисковать).

Мониторинг и обслуживание

NAS без мониторинга — бомба замедленного действия. Мы настроили оповещения через Telegram о любых проблемах:

# Скрипт мониторинга здоровья NAS
#!/bin/bash
# /opt/scripts/nas-health.sh

TG_TOKEN="your-bot-token"
TG_CHAT="your-chat-id"
alert() { curl -s -X POST "https://api.telegram.org/bot${TG_TOKEN}/sendMessage" \
  -d chat_id="${TG_CHAT}" -d text="$1" -d parse_mode="HTML"; }

# 1. Проверяем ZFS pool health
POOL_STATUS=$(zpool status -x)
if [ "$POOL_STATUS" != "all pools are healthy" ]; then
  alert "NAS ALERT: ZFS pool degraded!\n$POOL_STATUS"
fi

# 2. Проверяем SMART статус дисков
for disk in /dev/sd{a,b,c,d}; do
  SMART=$(smartctl -H $disk | grep -i "result")
  if echo "$SMART" | grep -qi "FAILED"; then
    alert "NAS ALERT: Disk $disk SMART FAILED!\n$SMART"
  fi
done

# 3. Проверяем заполненность
USAGE=$(zpool list -H -o cap datapool | tr -d '%')
if [ "$USAGE" -gt 80 ]; then
  alert "NAS WARNING: Pool usage ${USAGE}% (threshold 80%)"
fi

# 4. Проверяем температуру дисков
for disk in /dev/sd{a,b,c,d}; do
  TEMP=$(smartctl -A $disk | grep Temperature_Celsius | awk '{print $10}')
  if [ "$TEMP" -gt 50 ]; then
    alert "NAS ALERT: Disk $disk temperature ${TEMP}°C!"
  fi
done

# 5. Проверяем UPS
UPS_STATUS=$(upsc apc650 ups.status 2>/dev/null)
if [ "$UPS_STATUS" = "OB" ]; then
  RUNTIME=$(upsc apc650 battery.runtime 2>/dev/null)
  alert "NAS ALERT: Running on battery! Runtime: ${RUNTIME}s"
fi
# Cron: проверка каждые 15 минут
*/15 * * * * root /opt/scripts/nas-health.sh

# Еженедельный scrub (воскресенье 3:00)
0 3 * * 0 root zpool scrub datapool

# Ежемесячный расширенный SMART-тест
0 4 1 * * root smartctl -t long /dev/sda; smartctl -t long /dev/sdb; \
  smartctl -t long /dev/sdc; smartctl -t long /dev/sdd

TrueNAS SCALE также имеет встроенный дашборд мониторинга с графиками CPU, RAM, дисков, сети и температуры. Но Telegram-алерты — обязательное дополнение, потому что никто не сидит перед дашбордом 24/7.

TCO: окупаемость за 14 месяцев

Полный расчёт стоимости владения для «АудитГрупп»:

Статья расходовNAS (своё железо)Dropbox Business
Начальные затраты85 000 руб (железо)0
Настройка и внедрение40 000 руб (наша работа)0
Ежемесячно: подписка060 000 руб ($672)
Ежемесячно: электричество500 руб (~60 Вт × 24ч)0
Ежемесячно: S3 бэкап2 000 руб (2 ТБ)0
Ежемесячно: итого2 500 руб60 000 руб
За 1 год155 000 руб720 000 руб
За 3 года215 000 руб2 160 000 руб

Точка окупаемости: 2.2 месяца (начальные затраты 125 000 руб / ежемесячная экономия 57 500 руб). За 3 года экономия — почти 2 миллиона рублей.

Потребление электроэнергии измерили ваттметром: 58 Вт в простое, 72 Вт при активной нагрузке. Это уровень ноутбука — не серверной стойки.

Производительность (fio benchmark, RAIDZ1 из 4 дисков):

# Последовательная запись
fio --name=seqwrite --ioengine=libaio --direct=1 --bs=1M \
    --numjobs=1 --size=10G --rw=write --filename=/mnt/datapool/test
# Result: 784 MB/s (ограничено гигабитной сетью: ~110 MB/s по Samba)

# Последовательное чтение
fio --name=seqread --ioengine=libaio --direct=1 --bs=1M \
    --numjobs=1 --size=10G --rw=read --filename=/mnt/datapool/test
# Result: 675 MB/s (по Samba: ~112 MB/s)

# Случайное чтение 4K (типичная офисная нагрузка)
fio --name=randread --ioengine=libaio --direct=1 --bs=4K \
    --numjobs=4 --size=1G --rw=randread --filename=/mnt/datapool/test
# Result: 65 MB/s / ~16K IOPS

Для офисной работы (документы Word/Excel, 1С, сканы) производительности более чем достаточно. Если нужно быстрее — добавьте NVMe как SLOG и L2ARC.

Если ваш бизнес тратит деньги на облачные хранилища, но объём данных превышает 2-3 ТБ — собственный NAS окупится быстрее, чем вы думаете. Обратитесь к нам на itfresh.ru — мы подберём конфигурацию под ваши задачи и бюджет.

Часто задаваемые вопросы

RAIDZ1 (аналог RAID-5) выдерживает отказ 1 диска и подходит для массивов до 4 ТБ на диск. RAIDZ2 (аналог RAID-6) — 2 диска, рекомендуется для дисков 4 ТБ+ из-за длительного rebuild. Для бизнес-данных «АудитГрупп» с 4 ТБ дисками мы выбрали RAIDZ1, потому что при 4 дисках RAIDZ2 оставляет только 2 диска на данные (50% overhead vs 25%).
SCALE (Linux) — для большинства случаев: Docker-контейнеры, привычная экосистема пакетов, лучшая поддержка оборудования. CORE (FreeBSD) — если нужен bhyve (виртуализация FreeBSD) или iocage jails. С 2024 года iXsystems сфокусировалась на SCALE, CORE получает только исправления безопасности.
Для домашнего — желательно, но не обязательно. Для бизнес-данных (бухгалтерия, юридические документы) — обязательно. Ошибка в одном бите RAM может повредить данные на диске при записи. ZFS это обнаружит (checksums), но не исправит, если нет зеркала/parity. ECC предотвращает проблему до записи на диск.
Три варианта по возрастанию сложности: 1) Nextcloud с доступом через HTTPS (reverse proxy + Let's Encrypt). 2) WireGuard VPN — сотрудник подключается к офисной сети и работает с Samba как из офиса. 3) Tailscale — zero-config VPN, установка в один клик. Мы рекомендуем WireGuard для постоянных удалённых сотрудников и Nextcloud для эпизодического доступа с мобильных.
Не паниковать — данные доступны. Шаги: 1) Зайти в TrueNAS → Storage → Pools → Status. Увидите DEGRADED. 2) Заменить физический диск на новый такого же или большего размера. 3) В UI нажать Replace на отказавшем диске. ZFS начнёт resilver (пересборку) автоматически. При 4 ТБ дисках resilver занимает 4-8 часов. Во время resilver NAS продолжает работать.

Нужна помощь с проектом?

Специалисты АйТи Фреш помогут с архитектурой, DevOps, безопасностью и разработкой — 15+ лет опыта

📞 Связаться с нами
#nas#truenas#unraid#openmediavault#zfs#samba#nextcloud#бэкап
Комментарии 0

Оставить комментарий

загрузка...