Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
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
- Host: GitHub
- URL: https://github.com/hexarchy/bashapi
- Owner: HexArchy
- Created: 2024-04-04T16:15:40.000Z (9 months ago)
- Default Branch: master
- Last Pushed: 2024-04-17T14:12:39.000Z (9 months ago)
- Last Synced: 2024-06-03T23:47:59.821Z (7 months ago)
- Topics: docker, go, golang, postgresql
- Language: Go
- Homepage:
- Size: 102 KB
- Stars: 0
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: ReadMe.md
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 инъкциях, который был косвено решен.