Эта статья для тех, кто пишет серверные Swift приложения
Все приложения на сервере необходимо запускать под управлением какого-либо демона. Возможно, вы уже используете supervisord или systemd.
Эта статья покажет, как упростить вашу жизнь при помощи systemd, интегрировав его напрямую в ваше приложение через SPM-плагин.
Для начала давайте посмотрим, как мы обычно работаем с systemd и что нужно проделать для его работы с нашим приложением.
Чистый systemd
Настройка
Необходимо найти на просторах интернета примеры валидного конфига, поиграться с ним и сохранить в правильное место /etc/systemd/system.
Большинство разработчиков сдаются где-то здесь..
Управление состоянием
После успешного конфигурирования нам нужно не забыть запустить сервис.
Для этого нужно запомнить несколько простых команд:
systemctl start myapp.service
restart myapp.service
stop myapp.serviceТут всё легко, но нужно помнить название конфигурационного файла
Удаление сервиса
systemctl stop myapp.service
systemctl start clean --allНе слишком сложно запомнить, но все же...
Просмотр логов
Здесь большинство разработчиков теряются потому что логи хранятся где-то в недрах /var/logs или где-либо ещё. Тут на помощь приходит journalctl.
Логи в реальном времени
journalctl -u myapp -fПоследние несколько строк
journalctl -u myapp -n 100 --no-pagerПо-моему запомнить всё этого немного сложно, и я часто просто жму "вверх" по истории в консоли в поисках нужной команды
Плагин
Сильно упростить жизнь может плагин SwiftSystemd.
Он предоставляет простой способ управления всеми вышеупомянутыми процессами без головной боли.
Нужно сделать всего два действия: добавить в проект и запустить команду настройки.
Добавление в проект
Откройте файл Package.swift вашего приложения и добавьте всего одну строку:
.package(url: "https://github.com/MihaelIsaev/SwiftSystemd.git", from:"1.0.0")Команда настройки
Перейдите в папку с вашим Swift приложением и выполните:
swift run systemd installНа этом конфигурационный файл будет создан и приложение будет запущено.
Есть возможность обойтись без диалогов в консоли заранее передав параметры:
swift run systemd install -c release -t App -u mike-c,--config | конфигурация сборки: |
-t,--target | имя исполняемого таргета из |
-u,--user | пользователь, под которым будет работать сервис |
Листинг сгенерированного конфигурационного файла:
[Unit]
Description="AppName"
After=network.target
[Service]
User={user}
EnvironmentFile=/path/to/AppName/.env
WorkingDirectory=/path/to/AppName
TimeoutStopSec=2
Restart=always
ExecStart=/path/to/AppName/.build/{config}/{target}
[Install]
WantedBy=multi-user.targetВот и всё! Вы настроили своё приложение правильно, и не пришлось ничего гуглить и вспоминать. Всего два простых шага, и оно уже работает.
Логи
Одна из самых важных задач — просмотр логов.
swift run systemd logsТак вы получите логи вашего приложения в реальном времени из journalctl.
swift run systemd logs --limit 100Так можно вывести последние 100 строк из логов приложения.
Легко запомнить!
Управление состоянием
Проверить активность сервиса:
swift run systemd statusС помощью следующих команд можно управлять состоянием сервиса:
swift run systemd start # запускает приложение
stop # останавливает приложение
restart # перезапускает приложение
disable # временно отключает приложение
enable # включает приложениеТак же можно отправить kill сигнал приложению:
swift run systemd killУдаление сервиса
Если вам больше не нужен сервис, вы можете легко его начисто удалить:
swift run systemd uninstallЗаключение
Теперь можно выбросить все свои заметки по systemctl и journalctl .
Буду рад вашим коммитам в проект.