Full codebase including API server (32 modules + routes), dashboard frontend, DashCA certificate distribution, installer script, and deployment skills.
4.8 KiB
4.8 KiB
SAMI-CLOUD Status Dashboard API
Cross-platform Node.js API server for managing Caddy reverse proxy and DNS records via REST APIs.
Features
- Cross-Platform: Works on Windows, Linux, and macOS
- API-Based: Uses Caddy Admin API and Technitium DNS API (no PowerShell required)
- App Deployment: Deploy apps by creating DNS records and Caddy reverse proxy routes
- App Deletion: Clean removal of DNS records and Caddy routes
- Automatic Rollback: If deployment fails, automatically rolls back changes
Prerequisites
- Node.js (v14 or higher)
- Caddy with Admin API enabled
- Technitium DNS Server (optional, for DNS management)
Installation
cd api
npm install
Configuration
Set the following environment variables (or use defaults):
# Caddy Admin API endpoint (default: http://localhost:2019)
export CADDY_ADMIN_API=http://localhost:2019
# Technitium DNS Server API endpoint (default: http://192.168.254.204:5380)
export DNS_SERVER_API=http://192.168.254.204:5380
# Technitium DNS API token (required for DNS operations)
export TECHNITIUM_API_TOKEN=your_api_token_here
Windows (PowerShell)
$env:CADDY_ADMIN_API="http://localhost:2019"
$env:DNS_SERVER_API="http://192.168.254.204:5380"
$env:TECHNITIUM_API_TOKEN="your_api_token_here"
Windows (Command Prompt)
set CADDY_ADMIN_API=http://localhost:2019
set DNS_SERVER_API=http://192.168.254.204:5380
set TECHNITIUM_API_TOKEN=your_api_token_here
Running the Server
npm start
Or directly:
node caddy-api.js
The server will start on port 3001.
API Endpoints
Deploy an App
POST /api/apps/deploy
Content-Type: application/json
{
"appId": "myapp",
"config": {
"subdomain": "myapp",
"ip": "192.168.1.100",
"port": "8080",
"createDns": true,
"dnsType": "private",
"sslType": "internal"
}
}
Response:
{
"success": true,
"message": "App myapp deployed successfully",
"url": "https://myapp.sami",
"domain": "myapp.sami",
"ip": "192.168.1.100",
"port": "8080",
"dnsCreated": true,
"caddyConfigured": true
}
Delete an App
POST /api/apps/delete
Content-Type: application/json
{
"domain": "myapp.sami",
"ip": "192.168.1.100"
}
Get Services List
GET /api/services
Get Caddy Configuration
GET /api/caddy/config
Test API
GET /api/caddy/test
Health Check
GET /health
Caddy Configuration Requirements
Your Caddyfile should have the Admin API enabled:
{
admin localhost:2019 {
origins localhost localhost:2019
}
}
For the status dashboard to proxy API requests, add this to your Caddyfile:
status.sami {
tls internal
# API proxy to Node.js server
handle /api/* {
reverse_proxy localhost:3001
}
# Static site
root * /path/to/sites/status
file_server
}
Getting Technitium DNS API Token
- Open Technitium DNS web interface
- Go to Settings → API
- Create a new API token or copy existing one
- Set it as the
TECHNITIUM_API_TOKENenvironment variable
Deployment Flow
When deploying an app:
- Validate - Checks required fields (appId, subdomain, ip)
- DNS Record - Creates A record in DNS (if
createDns: trueanddnsType: "private") - Caddy Route - Adds reverse proxy route via Caddy Admin API
- Rollback - If Caddy configuration fails, removes DNS record
Troubleshooting
Caddy Admin API not accessible
- Verify Caddy is running
- Check that admin API is enabled in your Caddyfile
- Confirm the CADDY_ADMIN_API URL is correct
DNS operations failing
- Verify TECHNITIUM_API_TOKEN is set correctly
- Check DNS_SERVER_API URL is accessible
- Ensure the API token has permissions to manage zones
Routes not appearing in Caddy
- Check Caddy logs:
caddy logs - Verify the route was added:
curl http://localhost:2019/config/ - Ensure the domain resolves correctly in DNS
Production Deployment
For production use:
- Set up environment variables persistently
- Use a process manager (PM2, systemd, etc.)
- Configure proper logging
- Set up SSL/TLS for the API if exposed externally
Using PM2
npm install -g pm2
pm2 start caddy-api.js --name sami-api
pm2 save
pm2 startup
Using systemd (Linux)
Create /etc/systemd/system/sami-api.service:
[Unit]
Description=SAMI-CLOUD API Server
After=network.target
[Service]
Type=simple
User=caddy
WorkingDirectory=/path/to/sites/status/api
Environment="CADDY_ADMIN_API=http://localhost:2019"
Environment="DNS_SERVER_API=http://192.168.254.204:5380"
Environment="TECHNITIUM_API_TOKEN=your_token"
ExecStart=/usr/bin/node caddy-api.js
Restart=on-failure
[Install]
WantedBy=multi-user.target
Then:
sudo systemctl enable sami-api
sudo systemctl start sami-api
License
MIT