Став счастливым обладателем NAS от Synology, я обнаружил, что Docker из коробки поддерживается только в дорогих версиях на Intel, а у меня дешевая на ARM. Но так как на нем стоит DSM на базе Linux, то все можно сделать вручную. Разбираемся как установить Docker и поднять на нем сервер, в моем случае на Swift и Vapor.

Вводные

Изначально я приобрел Mikrotik hAP ac3, чтобы можно было подключить к нему внешний HDD и поднять Time Machine. SMB протокол-то поддерживается в RouterOS, но time machine поверх него нет. Покурив форумы, из вариантов было перепрошить роутер на OpenWRT или купить NAS. Выбор пал на второй вариант с расчётом на то, что на нем еще и сервак можно будет свой дома поднять для пет-проектов. Раз все равно он всегда подключен к интернету и включен в розетку, зачем еще платить за отдельный хостинг?

Установка Docker на Synology

В итоге купил я Synology DS220j на базе ARM процессора. Можно было бы сразу взять на Intel, где уже есть готовый пакет для docker, но стоят они в 2 раза дороже. А так как на дешевых NAS стоит там тот же linux, то можно установить docker вручную, правда с небольшими ограничениями (об этом позже).

Docker из пакета на Intel'овском Synology
Docker из пакета на Intel'овском Synology

Для ручной установки сначала открываем SSH доступ к NAS в настройках DSM. Подключаемся по SSH, логинемся как root через sudo -i, и запускаем скрипт:

curl https://gist.githubusercontent.com/ta264/2b7fb6e6466b109b9bf9b0a1d91ebedc/raw/b76a28d25d0abd0d27a0c9afaefa0d499eb87d3d/get-docker.sh | sh
Настройки SSH в DSM
Настройки SSH в DSM

Скрипт устанавливает докер, прописывает конфиги, меняет рабочую директорию на подключенный HDD вместо системной памяти, создает группу пользователей и добавляет докер в автозапуск. Полную инструкцию можно найти на этой вики.

Из недостатков докера на арме - все контейнеры должны быть с параметром network_mode: host вместо нормального порт маппинга. Но похоже это можно решить скриптом на самом NAS. Тред с обсуждением проблемы.

Запуск докера

Vapor уже создает готовый шаблон для docker и docker-compose с поднятием бд. Соотвественно нужно просто перенести проект на NAS и сбилдить его. Для копирования проекта можно:

  1. Установить git сервер из готовых пакетов на NAS. И скачать напрямую с удаленного репозитория (например, на github).

  2. Использовать классические консольные утилиты вроде scp и rsync

  3. Для Time Machine на NAS уже поднят SMB сервер, поэтому можно подключится к нему напрямую через finder на mac и скопировать проект.

Рекомендую копировать проект именно на подключенный к NAS HDD, а не на внутреннюю память, так как ее очень мало. И даже только после установки Docker'а DSM теперь ругается, что не хватает места для обновления системы.

DSM Update после установки Docker
DSM Update после установки Docker

Проект скопирован, можно собирать через docker-compose build или docker build . Процесс идет, но вот прошел уже час, а еще даже первый swift package из зависимостей не собрался.

Хотя и оперативка, и процессор загружены не полностью судя по мониторингу в DSM, но сборка идет ооочень медленно. Перезапуск также не помог. Причем 1 раз он подвис настолько, что пришлось из розетки дергать. Возможно все-таки дело в слабом железе, да и Synology рекомендуют не использовать их NAS как платформу для разработки. В целом это собирать прямо на устройстве и не обязательно, можно только запустить готовый image, а собрать и на Mac можно.

Графики загруженности при сборке докером
Графики загруженности при сборке докером

Собираем docker-compose build и сохраняем на маке через:

docker save -o <path for generated tar file> <image name>

Копируем уже известными способами на NAS. И загружаем его в докер:

docker load -i <path to image tar file>

Запускаем docker-compose up и вуаля!

Открываем порты на роутере

Сервер на локалке поднялcя, а теперь нужно открыть к нему доступ извне. Mikrotik похоже умеет в собственный ddns, так как до этого я поднимал vpn-server через quick config в mikrotik и он уже создал домен для меня. Соотвественно теперь нужно только пробросить порты.

Сейчас я живу в Сербии, и у местного провайдера интернет по DOCSIS, поэтому у меня сложная система из 2 роутеров: коаксильный кабель втыкается в провайдерский роутер, а микротик по патч-корду подключается уже к нему, поэтому порты пришлось пробрасывать 2 раза (на каждом роутере).

Проброс портов на микротике
Проброс портов на микротике

Проверяем в Postman:

Комментарии (3)


  1. SjoGi
    28.11.2022 14:37

    И это вся статья? Просто как запустить Docker? Думал будет больше информации.


    1. Flatout73 Автор
      28.11.2022 14:37
      +2

      Ну это уже оказалось отдельным челленджом) А что еще было бы интересно узнать?


  1. omaxx
    28.11.2022 23:46

    TLDR: зайдите на nas по ssh и под рутом запустите скрипт, скачанный по какой-то мутной ссылке