REST-сервис для отслеживания криптовалют, получения цен, истории, статистики и управления расписанием обновлений. Поддерживает внутреннюю авторизацию (JWT) и два типа хранилища: RAM и PostgreSQL.
- Регистрация и логин пользователей с выдачей JWT
- Добавление/удаление криптовалют в трекинг
- Получение списка, карточки, истории и статистики цены
- Ручное обновление цены и массовое обновление всех монет
- Расписание автоподкачки цен (включение/выключение, интервал)
- Go 1.24
- HTTP API на Gin
- PostgreSQL (опционально)
- Coingecko API для получения цен
- Установите Go 1.24+
- Проверьте конфигурацию в config/config.yaml
- Запустите сервис:
go run cryptoserver.go -configPath config/config.yamlСервер по умолчанию слушает адрес из http-config.address.
Файл: config/config.yaml
coingeckoKey: "<ваш_ключ>"
authorizer_type: "internal"
http-config:
jwt_key: "<секрет>"
address: "localhost:8090"
postgres-storage:
host: "localhost"
port: "5432"
user: "postgres"
password: "<пароль>"
dbname: "crypto_service"Параметры:
coingeckoKey— ключ Coingecko APIauthorizer_type— тип авторизации, сейчас используетсяinternalhttp-config.jwt_key— ключ подписи JWThttp-config.address— адрес HTTP сервераstorage_type(в YAML —storage_type) —ramилиpostgres(по умолчаниюram)postgres-storage.*— параметры подключения к PostgreSQL
- Создайте базу
crypto_service. - Укажите параметры подключения в
config/config.yaml. - Установите
storage_type: "postgres". - Запустите сервис. Таблицы создаются автоматически при старте.
Все эндпоинты, кроме /auth/*, требуют заголовок:
Authorization: Bearer <token>
-
POST /auth/register- Body:
{ "username": "user", "password": "pass" } - Ответ:
{ "token": "..." }
- Body:
-
POST /auth/login- Body:
{ "username": "user", "password": "pass" } - Ответ:
{ "token": "..." }
- Body:
GET /crypto— список трекаемых монетGET /crypto/:symbol— информация по монетеGET /crypto/:symbol/history— история ценыGET /crypto/:symbol/stats— статистика (min/max/avg/count)POST /crypto— добавить монету- Body:
{ "symbol": "BTC" }
- Body:
PUT /crypto/:symbol/refresh— обновить цену вручнуюDELETE /crypto/:symbol— удалить монету из трекинга
GET /schedule— текущие настройкиPUT /schedule— изменить настройки- Body:
{ "enabled": true, "interval_seconds": 60 }
- Body:
POST /schedule/trigger— принудительное обновление всех цен
curl -X POST http://localhost:8090/auth/register \
-H "Content-Type: application/json" \
-d '{"username":"demo","password":"secret"}'
curl -X POST http://localhost:8090/crypto \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-d '{"symbol":"BTC"}'
curl -X GET http://localhost:8090/crypto/BTC \
-H "Authorization: Bearer <token>"В проекте есть интеграционные тесты на Python.
make install
make testДополнительные тесты расписания:
make test SCHEDULE=1- Для корректной работы нужны доступ к интернету и валидный
coingeckoKey. - При использовании
ramданные не сохраняются между перезапусками. - В
postgresрежиме данные сохраняются и используются при старте.