Skip to content

HexArchy/BashAPI

Repository files navigation

Go CI with Docker

BashAPI сервис

BashAPI - это асинхронный REST API сервис для выполнения Bash команд. Сервис позволяет параллельно выполнять произвольное количество команд, используя систему очередей для управления процессами.

Основные функции

  • Создание команды: Позволяет пользователю отправить команду для выполнения.
  • Получение списка команд: Возвращает список всех команд, отправленных на выполнение.
  • Управление командами: Возможность остановить выполнение команды или запустить команду вне очереди.
  • Логирование: Система логов через slog или классический json output.
  • Swagger документация: Автоматически генерируемая документация API.

Документация

Структура конфига

env: local # От этого зависит уровень логирования. Для prettySlog - local. 
server:
  host: 0.0.0.0 # IP адрес, на котором будет доступен сервис.
  port: 8000  
  read_timeout: 10 # Таймаут ожидания чтения в секундах.
  write_timeout: 10 # Таймаут ожидания записи в секундах.
postgres:
  host: localhost # IP адрес PostgreSQL.
  port: 5432 
  user: bashapiadmin # Имя пользователя PostgreSQL.
  database: bashapidb # Имя базы данных PostgreSQL.
  password: bashAPIdb # Пароль пользователя PostgreSQL.
  ssl_mode: disable 
commands:
  max_concurrent: 2 # Максимальное количество одновременно выполняемых команд.
  timeout: 11 # Максимальное время ожидания выполнения команды в секундах.

Начало работы

Для запуска сервиса следуйте инструкциям:

Локальная машина

Запускаем PostgreSQL, меняем конфиги в папке config и запускаем сервис:

git clone https://github.com/17HIERARCH70/BashAPI
cd BashAPI
go mod download
migrate -path ./migrations/ -database "postgresql://username:secretkey@localhost:5432/database_name?sslmode=disable" -verbose up
sudo go run app/main.go -config="config/config-local.yaml"

Docker

docker-compose build
docker-compose up

Эти команды соберут образ Docker с приложением и запустят его, вместе с необходимой базой данных PostgreSQL.

ADR (Architectural Decision Records)

ADR 1: Использование gin

Статус: Принято

Решение: Выбор gin в качестве основной библиотеки обусловлен его простотой, производительностью и поддержкой swagger решений.

ADR 2: Система очередей для асинхронной обработки команд

Статус: Принято

Решение: Для управления параллельным выполнением команд без перегрузки системы ресурсами была введена система очередей. Это позволяет эффективно распределять ресурсы и управлять загрузкой сервера.

ADR 3: Ограничение на кол-во используемой памяти и субпроцессов

Статус: Отклонено

Решение: Реализация гибкой настройки ограничений комманд упералась в кроссплатформенные сложности. Syscall'ы по типу RLIMIT_AS, RLIMIT_NPROC не поддерживаются на всех платформах. Добовление ulimit можно было избежать через инъекции.

ADR 3: Добавление Swagger для документирования API

Статус: Принято

Решение: Включение Swagger обеспечивает автоматическую генерацию и обновление документации API, что делает сервис более доступным для разработчиков и упрощает интеграцию с другими сервисами.

Разработка и вклад

Запуск тестов

Чтобы запустить тесты, выполните следующую команду:

go test ./...

Тесты проверяют работосбособность всех handler'ов со 100% покрытием.

Дополнительно

В SQL коммандах максимально использовались транзакции для безопасного выполнения команд. Был подняь вопрос о возможных Sql инъкциях, который был косвено решен.

About

bashAPI service, task for PostgreSQL

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages