Full codebase including API server (32 modules + routes), dashboard frontend, DashCA certificate distribution, installer script, and deployment skills.
243 lines
4.8 KiB
Markdown
243 lines
4.8 KiB
Markdown
# 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
|
|
|
|
1. **Node.js** (v14 or higher)
|
|
2. **Caddy** with Admin API enabled
|
|
3. **Technitium DNS Server** (optional, for DNS management)
|
|
|
|
## Installation
|
|
|
|
```bash
|
|
cd api
|
|
npm install
|
|
```
|
|
|
|
## Configuration
|
|
|
|
Set the following environment variables (or use defaults):
|
|
|
|
```bash
|
|
# 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)
|
|
```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)
|
|
```cmd
|
|
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
|
|
|
|
```bash
|
|
npm start
|
|
```
|
|
|
|
Or directly:
|
|
```bash
|
|
node caddy-api.js
|
|
```
|
|
|
|
The server will start on port 3001.
|
|
|
|
## API Endpoints
|
|
|
|
### Deploy an App
|
|
```http
|
|
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:**
|
|
```json
|
|
{
|
|
"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
|
|
```http
|
|
POST /api/apps/delete
|
|
Content-Type: application/json
|
|
|
|
{
|
|
"domain": "myapp.sami",
|
|
"ip": "192.168.1.100"
|
|
}
|
|
```
|
|
|
|
### Get Services List
|
|
```http
|
|
GET /api/services
|
|
```
|
|
|
|
### Get Caddy Configuration
|
|
```http
|
|
GET /api/caddy/config
|
|
```
|
|
|
|
### Test API
|
|
```http
|
|
GET /api/caddy/test
|
|
```
|
|
|
|
### Health Check
|
|
```http
|
|
GET /health
|
|
```
|
|
|
|
## Caddy Configuration Requirements
|
|
|
|
Your Caddyfile should have the Admin API enabled:
|
|
|
|
```caddyfile
|
|
{
|
|
admin localhost:2019 {
|
|
origins localhost localhost:2019
|
|
}
|
|
}
|
|
```
|
|
|
|
For the status dashboard to proxy API requests, add this to your Caddyfile:
|
|
|
|
```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
|
|
|
|
1. Open Technitium DNS web interface
|
|
2. Go to Settings → API
|
|
3. Create a new API token or copy existing one
|
|
4. Set it as the `TECHNITIUM_API_TOKEN` environment variable
|
|
|
|
## Deployment Flow
|
|
|
|
When deploying an app:
|
|
|
|
1. **Validate** - Checks required fields (appId, subdomain, ip)
|
|
2. **DNS Record** - Creates A record in DNS (if `createDns: true` and `dnsType: "private"`)
|
|
3. **Caddy Route** - Adds reverse proxy route via Caddy Admin API
|
|
4. **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:
|
|
|
|
1. Set up environment variables persistently
|
|
2. Use a process manager (PM2, systemd, etc.)
|
|
3. Configure proper logging
|
|
4. Set up SSL/TLS for the API if exposed externally
|
|
|
|
### Using PM2
|
|
```bash
|
|
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`:
|
|
|
|
```ini
|
|
[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:
|
|
```bash
|
|
sudo systemctl enable sami-api
|
|
sudo systemctl start sami-api
|
|
```
|
|
|
|
## License
|
|
|
|
MIT
|