Skip to content

Microservice for scheduling small and large commands with continuous output delivery

Notifications You must be signed in to change notification settings

neopoleones/executor

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

13 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Executor

О сервисе

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 или командой напрямую

  1. task up
  2. docker compose up --build -d

Тесты прогоняются с помощью команды:

go test executor/internal/service/rest

Прочее

В ./dev можно найти файл executor.postman_collection.json. Он содержит описание всех эндпоинтов сервиса с примерами аргументов. Их можно импортировать в Postman для удобного "ручного" тестирования.


Добра!

About

Microservice for scheduling small and large commands with continuous output delivery

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published