feat: multi-database backup, HTTP API endpoints, admin panel UI

- backup CLI: add --all-databases, --database, --data-root flags
- backup format: tar.gz with databases/<name>/ + backup.json metadata
- HTTP API: new endpoints /databases, /backup, /backups, /restore
- HTTP API: database switching via X-Database header
- Admin panel: database selector dropdown, Databases tab, Backups tab
- Admin panel: backup/restore UI with fetch() to new endpoints
- Update deps: hunos 1.3.0, jwt-nim-baraba 2.1.0
- Docker: backup cron uses --all-databases --data-root=/data/databases
- Docs: update api-http.md, protocol.md with correct endpoints
- OpenAPI spec updated to v1.1.6

Known limitation: DELETE /databases disabled due to ORC SIGSEGV
in LSMTree.close(). Use SQL DROP DATABASE instead.
This commit is contained in:
2026-05-25 18:46:07 +03:00
parent a9ea80a1f8
commit eb62b381a1
8 changed files with 697 additions and 112 deletions
+87 -60
View File
@@ -5,7 +5,7 @@ JSON-базиран REST API за уеб приложения.
## Базов URL
```
http://localhost:9470
http://localhost:9912
```
## Endpoints
@@ -15,53 +15,7 @@ http://localhost:9470
Health проверка:
```bash
curl http://localhost:9470/health
```
### GET /ready
Readiness проверка:
```bash
curl http://localhost:9470/ready
```
### POST /query
Изпълнение на BaraQL заявка:
```bash
curl -X POST http://localhost:9470/api/query \
-H "Content-Type: application/json" \
-d '{"query": "SELECT * FROM users WHERE age > 18"}'
```
Отговор:
```json
{
"columns": ["name", "age"],
"rows": [["Alice", 30], ["Bob", 25]],
"row_count": 2,
"duration_ms": 12
}
```
### POST /batch
Групови заявки:
```bash
curl -X POST http://localhost:9470/api/batch \
-H "Content-Type: application/json" \
-d '{"queries": ["INSERT users { name := \"Alice\" }", "INSERT users { name := \"Bob\" }"]}'
```
### GET /schema
Преглед на схемата:
```bash
curl http://localhost:9470/api/schema
curl http://localhost:9912/health
```
### GET /metrics
@@ -69,37 +23,110 @@ curl http://localhost:9470/api/schema
Prometheus метрики:
```bash
curl http://localhost:9470/metrics
curl http://localhost:9912/metrics
```
### POST /explain
### POST /auth
Обяснение на план за изпълнение:
JWT автентикация:
```bash
curl -X POST http://localhost:9470/api/explain \
curl -X POST http://localhost:9912/auth \
-H "Content-Type: application/json" \
-d '{"username": "admin", "password": "secret"}'
```
### POST /query
Изпълнение на SQL заявка:
```bash
curl -X POST http://localhost:9912/query \
-H "Content-Type: application/json" \
-H "X-Database: default" \
-d '{"query": "SELECT * FROM users WHERE age > 18"}'
```
Отговор:
```json
{
"columns": ["name", "age"],
"rows": [{"name": "Alice", "age": 30}],
"affectedRows": 0
}
```
> **Забележка:** Header `X-Database` избира към коя база данни да се изпълни заявката. Ако липсва, се използва `default`.
### GET /tables
Списък с таблици в избраната база данни:
```bash
curl http://localhost:9912/tables -H "X-Database: default"
```
### GET /databases
Списък с налични бази данни:
```bash
curl http://localhost:9912/databases
```
### POST /databases
Създаване на нова база данни (изисква admin права):
```bash
curl -X POST http://localhost:9912/databases \
-H "Content-Type: application/json" \
-H "Authorization: Bearer <token>" \
-d '{"name": "mydb"}'
```
### POST /backup
Създаване на backup:
Създаване на backup (изисква admin права):
```bash
curl -X POST http://localhost:9470/api/backup \
# Backup на всички бази данни
curl -X POST http://localhost:9912/backup \
-H "Content-Type: application/json" \
-d '{"destination": "/backup/snapshot.db"}'
-H "Authorization: Bearer <token>" \
-d '{"all": true}'
# Backup на единична база
curl -X POST http://localhost:9912/backup \
-H "Content-Type: application/json" \
-H "Authorization: Bearer <token>" \
-d '{"database": "default"}'
```
### GET /backups
Списък с налични архиви:
```bash
curl http://localhost:9912/backups -H "Authorization: Bearer <token>"
```
### POST /restore
Възстановяване от архив (изисква admin права):
```bash
curl -X POST http://localhost:9912/restore \
-H "Content-Type: application/json" \
-H "Authorization: Bearer <token>" \
-d '{"input": "backup_1234567890.tar.gz", "all": true}'
```
## Грешки
```json
{
"error": {
"code": "INVALID_QUERY",
"message": "Грешка в синтаксиса"
}
"error": "Unauthorized"
}
```
@@ -107,5 +134,5 @@ curl -X POST http://localhost:9470/api/backup \
```bash
curl -H "Authorization: Bearer <token>" \
http://localhost:9470/api/users
http://localhost:9912/metrics
```
+11 -1
View File
@@ -240,9 +240,19 @@ Content-Type: application/json
```http
POST /backup
Content-Type: application/json
Authorization: Bearer <token>
{
"destination": "/backup/snapshot.db"
"all": true
}
```
Отговор:
```json
{
"success": true,
"output": "backup_1234567890.tar.gz",
"message": "Backup created"
}
```