Go-микросервис для запуска bash/овых команд. Среда исполнения основывается на обертке поверх стандартной библиотеки (exec) для поддержки сохранения вывода в процессе отработки скрипта. Также поддерживается возможность досрочного прерывания команд.
Используется небольшое количество сторонних зависимостей (и я считаю их относительно опциональными):
- uuid (люблю данный формат для id обьектов, так он неявно препятствует некоторым видам idor/ов) - можно полностью отказаться и без боли.
- yaml (выбрал, чтобы хранить большую часть настроек сервиса, вроде выбора хранилища или интерпретатора команд в файле-конфиге. До этого хотел применить cleanenv, но он за собой тянет очень много зависимостей) - аналогично.
- chi (один из самых легковесных роутеров для go; это был решающий фактор в ходе выбора) - 100% совместим с net/http.
- pgx (драйвер для постгреса, предоставляет pgxpool, что хорошо работает с запросами в конкурентной среде) - самая тяжелая и важная зависимость проекта.
Тесты реализованы с использованием встроеной библиотеки "testing" и mock-хранилища (inmemory).
Для контейниризации выбрал связку docker+docker-compose (см. соответствующие файлы докера)
Оставил возможность выполнять миграционные файлы для БД (отдельный сервис migrate, для подробностей смотреть Taskfile.yml)
В etc/conf.yml лежит конфигурационный файл по умолчанию. Описание полей:
service:
addr: "0.0.0.0:8080" # ip:port - в обьяснении не нуждается :)
database:
kind: "postgres" # Тип БД: local(используется для тестов - простейшая реализация ExecutorStorage), postgres
# Все эти поля используются, если kind=postgres!
# Использовать поле password в конфигурации не стоит. Такие вещи передаем как переменные окружения.
username: "executor_user" # Юзернейм для работы с бд
hostname: "db" # хостнейм. `db` указан у сервиса postgres в docker-compose
port: 5432 # Порт для подключения
db: "executor" # Название бд
executor:
interpreter_path: "/bin/sh" # Интерпретатор, что будет использоваться при выполнении скриптов.
sched_ticks: "5s" # Раз в сколько системе исполнения проверять наличие новых команд в статусе Scheduled
Как было сказано выше, для указания пароля нам нужно задать переменную окружения. К счастью, docker-compose умеет работать в dotenv файлами. Просто обозначим .env файл с следующим содержимым:
DB_PASS=SOMESECUUUREPASS
Данный пароль будет установлен postgres/ом при инициализации и сервисом при запуске с помощью docker compose.
С помощью Taskfile или командой напрямую
task up
docker compose up --build -d
Тесты прогоняются с помощью команды:
go test executor/internal/service/rest
В ./dev можно найти файл executor.postman_collection.json
. Он содержит описание всех эндпоинтов сервиса с примерами аргументов.
Их можно импортировать в Postman для удобного "ручного" тестирования.
Добра!