BashAPI - это асинхронный REST API сервис для выполнения Bash команд. Сервис позволяет параллельно выполнять произвольное количество команд, используя систему очередей для управления процессами.
- Создание команды: Позволяет пользователю отправить команду для выполнения.
- Получение списка команд: Возвращает список всех команд, отправленных на выполнение.
- Управление командами: Возможность остановить выполнение команды или запустить команду вне очереди.
- Логирование: Система логов через slog или классический json output.
- Swagger документация: Автоматически генерируемая документация API.
- Swagger документация доступна после запуска
- Конфиг
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-compose build
docker-compose up
Эти команды соберут образ Docker с приложением и запустят его, вместе с необходимой базой данных PostgreSQL.
Статус: Принято
Решение: Выбор gin в качестве основной библиотеки обусловлен его простотой, производительностью и поддержкой swagger решений.
Статус: Принято
Решение: Для управления параллельным выполнением команд без перегрузки системы ресурсами была введена система очередей. Это позволяет эффективно распределять ресурсы и управлять загрузкой сервера.
Статус: Отклонено
Решение: Реализация гибкой настройки ограничений комманд упералась в кроссплатформенные сложности. Syscall'ы по типу RLIMIT_AS, RLIMIT_NPROC не поддерживаются на всех платформах. Добовление ulimit можно было избежать через инъекции.
Статус: Принято
Решение: Включение Swagger обеспечивает автоматическую генерацию и обновление документации API, что делает сервис более доступным для разработчиков и упрощает интеграцию с другими сервисами.
Чтобы запустить тесты, выполните следующую команду:
go test ./...
Тесты проверяют работосбособность всех handler'ов со 100% покрытием.
В SQL коммандах максимально использовались транзакции для безопасного выполнения команд. Был подняь вопрос о возможных Sql инъкциях, который был косвено решен.