11 KiB
Backup API - Admin API Dokumentation
Dokumentation der Admin-Endpoints für die Entwicklung eines Web-Interfaces.
Base URL
https://backupapi.itsdave.de/api/v1
Authentifizierung
Alle Admin-Endpoints erfordern den X-Admin-Key Header:
X-Admin-Key: <ADMIN_KEY>
Fehler bei ungültigem Key:
HTTP 401
{"detail": "Invalid admin API key"}
Token-Verwaltung
Alle Tokens auflisten
GET /admin/tokens
Response:
{
"tokens": [
{
"id": 1,
"name": "prod-servers",
"active": 1,
"created_at": "2026-01-01 10:00:00",
"token_hash_preview": "65248fa2...",
"allowed_hosts": ["web*", "db-primary"]
},
{
"id": 2,
"name": "monitoring",
"active": 1,
"created_at": "2026-01-02 10:00:00",
"token_hash_preview": "a1b2c3d4...",
"allowed_hosts": []
}
]
}
| Feld | Typ | Beschreibung |
|---|---|---|
id |
int | Eindeutige Token-ID |
name |
string | Token-Name |
active |
int | 1 = aktiv, 0 = deaktiviert |
created_at |
string | Erstellungszeitpunkt |
token_hash_preview |
string | Erste 8 Zeichen des Hashes |
allowed_hosts |
array | Host-Patterns (leer = alle Hosts erlaubt) |
Token erstellen
POST /admin/tokens
Content-Type: multipart/form-data
| Parameter | Typ | Pflicht | Beschreibung |
|---|---|---|---|
name |
string | Ja | Eindeutiger Name (max 100 Zeichen) |
Request:
curl -X POST "$API/admin/tokens" \
-H "X-Admin-Key: $ADMIN_KEY" \
-F "name=webserver-prod"
Response (201):
{
"status": "success",
"message": "Token created successfully",
"token_id": 5,
"name": "webserver-prod",
"token": "V56pLTCkJTr4weA6Nkmwuw_h4gPO4l6b4hPLvQisxfM",
"warning": "Save this token now! It cannot be retrieved later."
}
Wichtig: Das token Feld wird nur einmal zurückgegeben! Es wird als SHA-256 Hash gespeichert und kann nicht wiederhergestellt werden.
Fehler (409):
{"detail": "Token name already exists"}
Token-Details abrufen
GET /admin/tokens/{token_id}
Response:
{
"id": 1,
"name": "prod-servers",
"active": 1,
"created_at": "2026-01-01 10:00:00",
"token_hash_preview": "65248fa2...",
"allowed_hosts": ["web*"],
"backup_count": 156
}
| Feld | Typ | Beschreibung |
|---|---|---|
backup_count |
int | Anzahl der Backups mit diesem Token |
Fehler (404):
{"detail": "Token not found"}
Token deaktivieren
POST /admin/tokens/{token_id}/revoke
Deaktiviert ein Token. Das Token kann danach nicht mehr zur Authentifizierung verwendet werden.
Response:
{"status": "success", "message": "Token 'prod-servers' revoked"}
Fehler (400):
{"detail": "Token is already revoked"}
Token aktivieren
POST /admin/tokens/{token_id}/activate
Reaktiviert ein zuvor deaktiviertes Token.
Response:
{"status": "success", "message": "Token 'prod-servers' activated"}
Fehler (400):
{"detail": "Token is already active"}
Token löschen
DELETE /admin/tokens/{token_id}
Löscht ein Token unwiderruflich. Host-Bindings werden automatisch mitgelöscht.
Response:
{"status": "success", "message": "Token 'prod-servers' deleted"}
Host-Binding Verwaltung
Tokens können auf bestimmte Hosts beschränkt werden. Ein Token ohne Bindings hat Zugriff auf alle Hosts.
Patterns
| Pattern | Beschreibung |
|---|---|
webserver01 |
Exakter Match |
web* |
Alle Hosts die mit "web" beginnen |
*-prod |
Alle Hosts die mit "-prod" enden |
db-? |
Einzelnes Zeichen Wildcard |
* |
Alle Hosts (explizit) |
Host-Bindings anzeigen
GET /admin/tokens/{token_id}/hosts
Response:
{
"token_id": 1,
"token_name": "prod-servers",
"hosts": [
{"id": 1, "hostname_pattern": "web*", "created_at": "2026-01-07 20:00:00"},
{"id": 2, "hostname_pattern": "db-primary", "created_at": "2026-01-07 20:00:00"}
]
}
Host-Binding hinzufügen
POST /admin/tokens/{token_id}/hosts
Content-Type: multipart/form-data
| Parameter | Typ | Pflicht | Beschreibung |
|---|---|---|---|
hostname_pattern |
string | Ja | Hostname oder Pattern |
Request:
curl -X POST "$API/admin/tokens/1/hosts" \
-H "X-Admin-Key: $ADMIN_KEY" \
-F "hostname_pattern=web*"
Response:
{"status": "success", "message": "Host pattern 'web*' added to token 'prod-servers'"}
Fehler (409):
{"detail": "Host pattern already exists for this token"}
Host-Binding entfernen
DELETE /admin/tokens/{token_id}/hosts/{hostname_pattern}
Request:
curl -X DELETE "$API/admin/tokens/1/hosts/web*" \
-H "X-Admin-Key: $ADMIN_KEY"
Response:
{"status": "success", "message": "Host pattern 'web*' removed from token 'prod-servers'"}
Backup-Verwaltung
Alle Backups auflisten
GET /admin/backups
| Parameter | Typ | Default | Beschreibung |
|---|---|---|---|
hostname |
string | - | Filter nach Hostname |
backup_type |
string | - | Filter nach Typ |
token_name |
string | - | Filter nach Token |
from_date |
string | - | Von Datum (YYYY-MM-DD) |
to_date |
string | - | Bis Datum (YYYY-MM-DD) |
limit |
int | 1000 | Max. Ergebnisse (max 10000) |
offset |
int | 0 | Offset für Pagination |
Response:
{
"backups": [
{
"id": 6,
"hostname": "webserver01",
"backup_type": "full",
"log_type": "json",
"token_name": "prod-servers",
"created_at": "2026-01-07 19:34:45",
"size": 1524
}
],
"count": 1,
"total": 156,
"limit": 1000,
"offset": 0
}
Einzelnes Backup abrufen
GET /admin/backups/{backup_id}
Response:
{
"id": 6,
"hostname": "webserver01",
"backup_type": "full",
"log_content": {"status": "success", "files": 1523, "size_mb": 2300},
"log_type": "json",
"token_name": "prod-servers",
"created_at": "2026-01-07 19:34:45"
}
Bei log_type: "json" wird log_content als JSON-Objekt zurückgegeben, sonst als String.
Backup löschen
DELETE /admin/backups/{backup_id}
Response:
{"status": "success", "message": "Backup 6 deleted"}
Statistiken
Statistik-Übersicht
GET /admin/stats
| Parameter | Typ | Beschreibung |
|---|---|---|
from_date |
string | Von Datum (YYYY-MM-DD) |
to_date |
string | Bis Datum (YYYY-MM-DD) |
Response:
{
"total_backups": 156,
"unique_hosts": 12,
"by_type": [
{"backup_type": "full", "count": 45},
{"backup_type": "incremental", "count": 89},
{"backup_type": null, "count": 22}
],
"by_token": [
{"token_name": "prod-servers", "count": 120},
{"token_name": "dev-servers", "count": 36}
],
"by_day": [
{"date": "2026-01-07", "count": 24},
{"date": "2026-01-06", "count": 22}
]
}
Audit-Logs
Audit-Logs abrufen
GET /admin/audit
| Parameter | Typ | Default | Beschreibung |
|---|---|---|---|
event_type |
string | - | Filter nach Event-Typ |
from_date |
string | - | Von Datum (YYYY-MM-DD) |
to_date |
string | - | Bis Datum (YYYY-MM-DD) |
limit |
int | 100 | Max. Ergebnisse (max 1000) |
Event-Typen:
TOKEN_CREATED- Token erstelltTOKEN_DELETED- Token gelöschtTOKEN_REVOKED- Token deaktiviertTOKEN_ACTIVATED- Token aktiviertTOKEN_HOST_ADDED- Host-Binding hinzugefügtTOKEN_HOST_REMOVED- Host-Binding entferntBACKUP_SUBMITTED- Backup hochgeladenBACKUP_DELETED- Backup gelöschtAUTH_FAILED- Authentifizierung fehlgeschlagenADMIN_AUTH_SUCCESS- Admin-Authentifizierung erfolgreichADMIN_AUTH_FAILED- Admin-Authentifizierung fehlgeschlagenACCESS_DENIED- Zugriff verweigert (Host-Binding)
Response:
{
"audit_logs": [
{
"id": 15,
"event_type": "TOKEN_CREATED",
"details": "name=webserver-prod",
"ip_address": "192.168.1.100",
"created_at": "2026-01-07 20:20:38"
}
]
}
Fehler-Codes
| Code | Beschreibung |
|---|---|
| 400 | Ungültige Anfrage (z.B. Datumsformat, bereits aktiv/inaktiv) |
| 401 | Admin-Key ungültig |
| 404 | Ressource nicht gefunden |
| 409 | Konflikt (z.B. Name existiert bereits) |
| 413 | Datei zu groß |
| 503 | Admin API nicht konfiguriert |
Beispiel: Kompletter Token-Workflow
API="https://backupapi.itsdave.de/api/v1"
ADMIN_KEY="your-admin-key"
# 1. Token erstellen
TOKEN_RESPONSE=$(curl -s -X POST "$API/admin/tokens" \
-H "X-Admin-Key: $ADMIN_KEY" \
-F "name=webserver-prod")
echo "$TOKEN_RESPONSE"
TOKEN_ID=$(echo "$TOKEN_RESPONSE" | jq -r '.token_id')
# 2. Host-Bindings hinzufügen
curl -s -X POST "$API/admin/tokens/$TOKEN_ID/hosts" \
-H "X-Admin-Key: $ADMIN_KEY" \
-F "hostname_pattern=web*"
curl -s -X POST "$API/admin/tokens/$TOKEN_ID/hosts" \
-H "X-Admin-Key: $ADMIN_KEY" \
-F "hostname_pattern=nginx-*"
# 3. Token-Details prüfen
curl -s "$API/admin/tokens/$TOKEN_ID" \
-H "X-Admin-Key: $ADMIN_KEY" | jq
# 4. Token deaktivieren (bei Bedarf)
curl -s -X POST "$API/admin/tokens/$TOKEN_ID/revoke" \
-H "X-Admin-Key: $ADMIN_KEY"
# 5. Token reaktivieren
curl -s -X POST "$API/admin/tokens/$TOKEN_ID/activate" \
-H "X-Admin-Key: $ADMIN_KEY"
# 6. Token löschen
curl -s -X DELETE "$API/admin/tokens/$TOKEN_ID" \
-H "X-Admin-Key: $ADMIN_KEY"
JavaScript/Fetch Beispiele
const API = 'https://backupapi.itsdave.de/api/v1';
const ADMIN_KEY = 'your-admin-key';
const headers = {
'X-Admin-Key': ADMIN_KEY
};
// Alle Tokens laden
async function getTokens() {
const response = await fetch(`${API}/admin/tokens`, { headers });
return response.json();
}
// Token erstellen
async function createToken(name) {
const formData = new FormData();
formData.append('name', name);
const response = await fetch(`${API}/admin/tokens`, {
method: 'POST',
headers,
body: formData
});
return response.json();
}
// Host-Binding hinzufügen
async function addHostBinding(tokenId, pattern) {
const formData = new FormData();
formData.append('hostname_pattern', pattern);
const response = await fetch(`${API}/admin/tokens/${tokenId}/hosts`, {
method: 'POST',
headers,
body: formData
});
return response.json();
}
// Token deaktivieren
async function revokeToken(tokenId) {
const response = await fetch(`${API}/admin/tokens/${tokenId}/revoke`, {
method: 'POST',
headers
});
return response.json();
}
// Statistiken laden
async function getStats(fromDate, toDate) {
const params = new URLSearchParams();
if (fromDate) params.append('from_date', fromDate);
if (toDate) params.append('to_date', toDate);
const response = await fetch(`${API}/admin/stats?${params}`, { headers });
return response.json();
}
// Backups mit Pagination laden
async function getBackups(page = 0, limit = 50, filters = {}) {
const params = new URLSearchParams({
limit: limit.toString(),
offset: (page * limit).toString(),
...filters
});
const response = await fetch(`${API}/admin/backups?${params}`, { headers });
return response.json();
}