v0.1.1 - Cleaning things up.
This commit is contained in:
219
docs/README_ADMIN_API.md
Normal file
219
docs/README_ADMIN_API.md
Normal file
@@ -0,0 +1,219 @@
|
||||
# Ginxsom Admin API
|
||||
|
||||
A Nostr-compliant admin interface for the Ginxsom Blossom server that provides programmatic access to server statistics, configuration, and file management operations.
|
||||
|
||||
## Overview
|
||||
|
||||
The admin API allows server administrators to:
|
||||
- View server statistics (file counts, storage usage, user metrics)
|
||||
- Retrieve and update server configuration settings
|
||||
- Browse recent uploaded files with pagination
|
||||
- Monitor server health and disk usage
|
||||
|
||||
All operations require Nostr authentication using admin-authorized public keys.
|
||||
|
||||
## Quick Start
|
||||
|
||||
### 1. Configure Admin Access
|
||||
|
||||
Add your admin pubkey to the server configuration:
|
||||
|
||||
```bash
|
||||
# Generate admin keys (keep private key secure!)
|
||||
ADMIN_PRIVKEY=$(nak key generate)
|
||||
ADMIN_PUBKEY=$(echo "$ADMIN_PRIVKEY" | nak key public)
|
||||
|
||||
# Configure server
|
||||
sqlite3 db/ginxsom.db << EOF
|
||||
INSERT OR REPLACE INTO server_config (key, value, description) VALUES
|
||||
('admin_pubkey', '$ADMIN_PUBKEY', 'Nostr public key authorized for admin operations'),
|
||||
('admin_enabled', 'true', 'Enable admin interface');
|
||||
EOF
|
||||
```
|
||||
|
||||
### 2. Build and Start Server
|
||||
|
||||
```bash
|
||||
make clean && make
|
||||
spawn-fcgi -s /tmp/ginxsom-fcgi.sock -n ./build/ginxsom-fcgi
|
||||
nginx -c $(pwd)/config/local-nginx.conf
|
||||
```
|
||||
|
||||
### 3. Test the API
|
||||
|
||||
```bash
|
||||
# Run the complete test suite
|
||||
./tests/admin_test.sh
|
||||
|
||||
# Or test individual endpoints
|
||||
export ADMIN_PRIVKEY="your_private_key_here"
|
||||
./tests/admin_test.sh
|
||||
```
|
||||
|
||||
## API Endpoints
|
||||
|
||||
### GET /api/health
|
||||
System health check (no authentication required).
|
||||
```bash
|
||||
curl http://localhost:9001/api/health
|
||||
```
|
||||
|
||||
### GET /api/stats
|
||||
Server statistics and metrics.
|
||||
```json
|
||||
{
|
||||
"status": "success",
|
||||
"data": {
|
||||
"total_files": 1234,
|
||||
"total_bytes": 104857600,
|
||||
"total_size_mb": 100.0,
|
||||
"unique_uploaders": 56,
|
||||
"avg_file_size": 85049,
|
||||
"file_types": {
|
||||
"image/png": 45,
|
||||
"image/jpeg": 32
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### GET /api/config
|
||||
Current server configuration.
|
||||
```json
|
||||
{
|
||||
"status": "success",
|
||||
"data": {
|
||||
"max_file_size": "104857600",
|
||||
"require_auth": "false",
|
||||
"server_name": "ginxsom",
|
||||
"nip94_enabled": "true"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### PUT /api/config
|
||||
Update server configuration.
|
||||
```json
|
||||
{
|
||||
"max_file_size": "209715200",
|
||||
"require_auth": "true",
|
||||
"nip94_enabled": "true"
|
||||
}
|
||||
```
|
||||
|
||||
### GET /api/files
|
||||
Recent uploaded files with pagination.
|
||||
```json
|
||||
{
|
||||
"status": "success",
|
||||
"data": {
|
||||
"files": [
|
||||
{
|
||||
"sha256": "abc123...",
|
||||
"size": 184292,
|
||||
"type": "application/pdf",
|
||||
"uploaded_at": 1725105921,
|
||||
"uploader_pubkey": "def456...",
|
||||
"url": "http://localhost:9001/abc123.pdf"
|
||||
}
|
||||
],
|
||||
"total": 1234,
|
||||
"limit": 50,
|
||||
"offset": 0
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## Manual API Usage with nak and curl
|
||||
|
||||
### Generate Admin Authentication Event
|
||||
|
||||
```bash
|
||||
# Create an authenticated event
|
||||
EVENT=$(nak event -k 24242 -c "admin_request" \
|
||||
--tag t="GET" \
|
||||
--tag expiration="$(date -d '+1 hour' +%s)" \
|
||||
--sec "$ADMIN_PRIVKEY")
|
||||
|
||||
# Send authenticated request
|
||||
AUTH_HEADER="Nostr $(echo "$EVENT" | base64 -w 0)"
|
||||
curl -H "Authorization: $AUTH_HEADER" http://localhost:9001/api/stats
|
||||
```
|
||||
|
||||
### Update Configuration
|
||||
|
||||
```bash
|
||||
# Create PUT event (method in tag)
|
||||
EVENT=$(nak event -k 24242 -c "admin_request" \
|
||||
--tag t="PUT" \
|
||||
--tag expiration="$(date -d '+1 hour' +%s)" \
|
||||
--sec "$ADMIN_PRIVKEY")
|
||||
|
||||
AUTH_HEADER="Nostr $(echo "$EVENT" | base64 -w 0)"
|
||||
|
||||
curl -X PUT -H "Authorization: $AUTH_HEADER" \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{"max_file_size": "209715200", "require_auth": "true"}' \
|
||||
http://localhost:9001/api/config
|
||||
```
|
||||
|
||||
## Security Features
|
||||
|
||||
- **Nostr Authentication**: All admin operations require valid Nostr kind 24242 events
|
||||
- **Pubkey Verification**: Only events signed by configured admin pubkeys are accepted
|
||||
- **Event Expiration**: Admin events must include expiration timestamps for security
|
||||
- **Access Control**: Separate enable/disable flag for admin interface
|
||||
|
||||
## Development and Testing
|
||||
|
||||
### Prerequisites
|
||||
- nak (https://github.com/fiatjaf/nak)
|
||||
- curl, jq
|
||||
- sqlite3
|
||||
|
||||
### Run Tests
|
||||
```bash
|
||||
# Make test script executable
|
||||
chmod +x tests/admin_test.sh
|
||||
|
||||
# Run complete test suite
|
||||
./tests/admin_test.sh
|
||||
|
||||
# Run with specific admin key
|
||||
export ADMIN_PRIVKEY="your_private_key"
|
||||
./tests/admin_test.sh
|
||||
```
|
||||
|
||||
### Build System
|
||||
```bash
|
||||
# Clean build
|
||||
make clean
|
||||
|
||||
# Build with debug info
|
||||
make debug
|
||||
|
||||
# Run FastCGI process
|
||||
make run
|
||||
```
|
||||
|
||||
## Files Added/Modified
|
||||
|
||||
- `src/admin_api.h` - Admin API function declarations
|
||||
- `src/admin_api.c` - Complete admin API implementation
|
||||
- `src/main.c` - Updated with admin API routing
|
||||
- `config/local-nginx.conf` - Updated with admin API routes
|
||||
- `tests/admin_test.sh` - Complete test suite
|
||||
- `Makefile` - Updated to compile admin_api.c
|
||||
- `README_ADMIN_API.md` - This documentation
|
||||
|
||||
## Future Enhancements
|
||||
|
||||
- **Nostr Relay Integration**: Automatic relay subscription for remote admin control
|
||||
- **Admin Pubkey Rotation**: Support for multiple admin keys and key rotation
|
||||
- **Audit Logging**: Detailed logging of admin operations
|
||||
- **Rate Limiting**: Prevent abuse of admin endpoints
|
||||
- **Web Dashboard**: Optional HTML/CSS/JavaScript frontend
|
||||
|
||||
---
|
||||
|
||||
The admin API provides a secure, Nostr-compliant interface for server management through command-line tools while maintaining full compatibility with the existing Blossom protocol implementation.
|
||||
Reference in New Issue
Block a user