Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/hexarchy/bashapi

bashAPI service, task for PostgreSQL
https://github.com/hexarchy/bashapi

docker go golang postgresql

Last synced: 7 days ago
JSON representation

bashAPI service, task for PostgreSQL

Awesome Lists containing this project

README

        

[![Go CI with Docker](https://github.com/17HIERARCH70/BashAPI/actions/workflows/main.yml/badge.svg?event=push)](https://github.com/17HIERARCH70/BashAPI/actions/workflows/main.yml)

# BashAPI сервис

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

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

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

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

- [Swagger документация](https://localhost:8000/api/swagger/index.html) доступна после запуска
- [Конфиг](https://github.com/17HIERARCH70/BashAPI/config/config-local.yaml)

## Структура конфига
```yaml
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 и запускаем сервис:
```bash
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

```bash
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, что делает сервис более доступным для разработчиков и упрощает интеграцию с другими сервисами.

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

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

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

```bash
go test ./...
```

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

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

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