Systemd и SQLite
Самый лёгкий вариант: один бинарник, файл базы SQLite и служба systemd. Docker не нужен. Команды ниже выполняются от root.
mkdir -p /opt/gowave/frontend/dist && cd /opt/gowaveARCH=$(uname -m | sed 's/x86_64/amd64/; s/aarch64/arm64/')curl -fL -o gowave-server https://github.com/aaaSaZaN/gowave/releases/latest/download/gowave-linux-$ARCHcurl -fLO https://github.com/aaaSaZaN/gowave/releases/latest/download/gowave-frontend.tar.gzchmod +x gowave-server && tar -xzf gowave-frontend.tar.gz -C frontend/distКонтрольные суммы лежат в SHA256SUMS рядом с файлами релиза.
Настройки
Заголовок раздела «Настройки»cat > .env <<ENVAPP_HOST=127.0.0.1APP_PORT=3000APP_SECRET=$(openssl rand -hex 32)DB_DRIVER=sqliteDATABASE_URL=gowave.dbPANEL_DOMAIN=panel.yourdomain.comSUB_PUBLIC_DOMAIN=panel.yourdomain.com/api/subENVchmod 600 .envВсе переменные - в справочнике.
Панель не запускается от root: служба работает от системного пользователя gowave. Создайте /etc/systemd/system/gowave.service:
[Unit]Description=GoWave PanelAfter=network-online.targetWants=network-online.target
[Service]Type=simpleUser=gowaveGroup=gowaveWorkingDirectory=/opt/gowaveExecStart=/opt/gowave/gowave-serverRestart=alwaysRestartSec=5LimitNOFILE=65535
[Install]WantedBy=multi-user.targetПользователя и ограничения службы создаёт сам бинарник:
/opt/gowave/gowave-server service install /opt/gowaveln -sfn /opt/gowave/gowave-server /usr/local/bin/gowavesystemctl enable --now gowaveКоманда service install:
- создаёт системную группу и пользователя
gowaveбез shell и домашнего каталога, если их ещё нет; - отдаёт
/opt/gowaveэтому пользователю, ставит каталогу права0750, а.env-0600; - пишет
/etc/systemd/system/gowave.service.d/90-unprivileged.confи выполняетsystemctl daemon-reload.
Сам gowave.service команда не трогает, поэтому ваши Environment= и другие настройки в нём сохраняются. Каталог должен быть отдельным: в путях /opt, /usr/local, /home/... и других общих каталогах команда откажется работать. В пути допустимы только латиница, цифры и _ . / -.
Вторая строка создаёт глобальную команду gowave. Установщик делает это сам, а служба от gowave записать в /usr/local/bin не может.
Ограничения службы
Заголовок раздела «Ограничения службы»90-unprivileged.conf переопределяет пользователя и запуск и закрывает службу от остальной системы:
[Service]User=gowaveGroup=gowaveWorkingDirectory=/opt/gowaveExecStart=ExecStart=/opt/gowave/gowave-serverDynamicUser=falseProtectSystem=strictProtectHome=truePrivateDevices=truePrivateTmp=trueNoNewPrivileges=trueMemoryDenyWriteExecute=trueProtectKernelTunables=trueProtectKernelModules=trueProtectControlGroups=trueRestrictSUIDSGID=trueLockPersonality=trueUMask=0077ReadWritePaths=/opt/gowaveRuntimeDirectory=gowaveRuntimeDirectoryMode=0700RuntimeDirectoryPreserve=yesRestart=alwaysCapabilityBoundingSet=CapabilityBoundingSet=CAP_NET_BIND_SERVICEAmbientCapabilities=AmbientCapabilities=CAP_NET_BIND_SERVICEПисать служба может только в /opt/gowave, /run/gowave и свой отдельный /tmp. Остальная файловая система для неё только на чтение, а /home и /root не видны вовсе. Единственная оставшаяся привилегия - CAP_NET_BIND_SERVICE: она позволяет занять порт ниже 1024, если такой указан в APP_PORT.
DynamicUser выключен намеренно: файлы SQLite должны принадлежать постоянному пользователю.
Код панели принадлежит root. gowave-server и frontend/ пользователь службы изменить не может, поэтому взломанная панель не подложит бинарник, который потом запустит root (установщик, gowave rescue через sudo). Каталог /opt/gowave принадлежит root:gowave с sticky-битом: панель создаёт в нём свои файлы базы, но не может заменить или удалить файлы root. .env доступен панели только на чтение.
Обновление из панели выполняет отдельная служба от root. Панель оставляет запрос в /run/gowave, gowave-update.path запускает gowave-update.service, а та скачивает релиз, сверяет его с SHA256SUMS, ставит и перезапускает панель.
Если панели нужно писать куда-то ещё, например в отдельный каталог для бэкапов, добавьте собственное переопределение. Файл 90-unprivileged.conf перезаписывается при каждом service install и обновлении через установщик, поэтому правьте не его:
systemctl edit gowave[Service]ReadWritePaths=/srv/gowave-backupsСам каталог тоже отдайте пользователю службы: chown gowave:gowave /srv/gowave-backups.
Команды CLI
Заголовок раздела «Команды CLI»Запускайте их от gowave из каталога панели. Если запустить от root, SQLite может создать служебные файлы базы (gowave.db-wal, gowave.db-shm), которые служба потом не откроет:
cd /opt/gowave && sudo -u gowave gowave rescueВсе команды - в справочнике CLI.
Старая служба от root
Заголовок раздела «Старая служба от root»Если панель стояла с User=root (так ставили версии до v1.1.11), ничего делать не нужно. Новый бинарник при первом запуске под systemd сам выполнит service install для своего рабочего каталога и завершится, а systemd перезапустит его уже от gowave. Установщик при обновлении тоже заново применяет ограничения.
Дальше настройте reverse proxy.