403 lines
10 KiB
Markdown
403 lines
10 KiB
Markdown
# SAMI-CLOUD Status Dashboard - Deployment Guide
|
|
|
|
Complete guide for deploying and using the SAMI-CLOUD Status Dashboard with app deployment capabilities.
|
|
|
|
## Overview
|
|
|
|
The SAMI-CLOUD Status Dashboard is a web application that:
|
|
- Monitors service status in real-time
|
|
- Provides weather information
|
|
- Allows deploying new apps via a user-friendly interface
|
|
- Automatically creates DNS records and Caddy reverse proxy configurations
|
|
- Works cross-platform (Windows, Linux, macOS)
|
|
|
|
## Architecture
|
|
|
|
```
|
|
┌─────────────────────────────────────────────────────────┐
|
|
│ User Browser │
|
|
│ (https://status.sami) │
|
|
└────────────────────┬────────────────────────────────────┘
|
|
│
|
|
▼
|
|
┌─────────────────────────────────────────────────────────┐
|
|
│ Caddy Server │
|
|
│ - Serves static files (index.html, assets) │
|
|
│ - Proxies /api/* to Node.js API server │
|
|
│ - Provides TLS with internal CA │
|
|
└────────────────────┬────────────────────────────────────┘
|
|
│
|
|
▼
|
|
┌─────────────────────────────────────────────────────────┐
|
|
│ Node.js API Server (port 3001) │
|
|
│ - Handles app deployment requests │
|
|
│ - Creates DNS records via Technitium API │
|
|
│ - Configures Caddy routes via Admin API │
|
|
└───────┬─────────────────────────────┬───────────────────┘
|
|
│ │
|
|
▼ ▼
|
|
┌──────────────────┐ ┌──────────────────┐
|
|
│ Caddy Admin API │ │ Technitium DNS │
|
|
│ (port 2019) │ │ API (port 5380) │
|
|
└──────────────────┘ └──────────────────┘
|
|
```
|
|
|
|
## Prerequisites
|
|
|
|
1. **Caddy Server** with Admin API enabled
|
|
2. **Node.js** v14 or higher
|
|
3. **Technitium DNS Server** (optional, for DNS management)
|
|
4. **npm** (comes with Node.js)
|
|
|
|
## Step 1: Configure Caddy
|
|
|
|
### 1.1 Enable Caddy Admin API
|
|
|
|
Add to your Caddyfile (global options):
|
|
|
|
```caddyfile
|
|
{
|
|
admin localhost:2019 {
|
|
origins localhost localhost:2019
|
|
}
|
|
}
|
|
```
|
|
|
|
### 1.2 Configure Status Dashboard Site
|
|
|
|
Add this block to your Caddyfile:
|
|
|
|
```caddyfile
|
|
status.sami {
|
|
tls internal
|
|
|
|
# API proxy to Node.js server
|
|
handle /api/* {
|
|
reverse_proxy localhost:3001
|
|
}
|
|
|
|
# Probe endpoints for service status checks
|
|
handle_path /probe/* {
|
|
header Content-Type application/json
|
|
respond `{"ok":true}` 200
|
|
}
|
|
|
|
# Static site
|
|
root * C:/caddy/sites/status
|
|
file_server
|
|
}
|
|
```
|
|
|
|
### 1.3 Reload Caddy
|
|
|
|
```bash
|
|
caddy reload --config /path/to/Caddyfile
|
|
```
|
|
|
|
## Step 2: Deploy Dashboard Files
|
|
|
|
### 2.1 Copy Files to Production
|
|
|
|
Copy the status dashboard files to your Caddy web root:
|
|
|
|
```bash
|
|
# On Windows
|
|
xcopy /E /I e:\CaddyCerts\sites\status C:\caddy\sites\status
|
|
|
|
# On Linux/macOS
|
|
cp -r /path/to/development/sites/status /var/www/status
|
|
```
|
|
|
|
### 2.2 Verify File Structure
|
|
|
|
```
|
|
C:/caddy/sites/status/
|
|
├── index.html
|
|
├── apps.json
|
|
├── sw.js
|
|
├── assets/
|
|
│ ├── fonts/
|
|
│ ├── weather/
|
|
│ ├── *.png (app logos)
|
|
│ └── ...
|
|
└── api/
|
|
├── caddy-api.js
|
|
├── package.json
|
|
├── README.md
|
|
└── node_modules/
|
|
```
|
|
|
|
## Step 3: Set Up API Server
|
|
|
|
### 3.1 Install Dependencies
|
|
|
|
```bash
|
|
cd C:/caddy/sites/status/api # or your path
|
|
npm install
|
|
```
|
|
|
|
### 3.2 Configure Environment Variables
|
|
|
|
#### Windows (PowerShell - Persistent)
|
|
```powershell
|
|
# Set system environment variables
|
|
[System.Environment]::SetEnvironmentVariable('CADDY_ADMIN_API', 'http://localhost:2019', 'User')
|
|
[System.Environment]::SetEnvironmentVariable('DNS_SERVER_API', 'http://192.168.254.204:5380', 'User')
|
|
[System.Environment]::SetEnvironmentVariable('TECHNITIUM_API_TOKEN', 'your_token_here', 'User')
|
|
```
|
|
|
|
#### Linux/macOS (Persistent)
|
|
Add to `~/.bashrc` or `~/.zshrc`:
|
|
|
|
```bash
|
|
export CADDY_ADMIN_API=http://localhost:2019
|
|
export DNS_SERVER_API=http://192.168.254.204:5380
|
|
export TECHNITIUM_API_TOKEN=your_token_here
|
|
```
|
|
|
|
Then reload:
|
|
```bash
|
|
source ~/.bashrc # or source ~/.zshrc
|
|
```
|
|
|
|
### 3.3 Get Technitium API Token
|
|
|
|
1. Open Technitium DNS web interface (e.g., `http://dns1.sami:5380`)
|
|
2. Log in with admin credentials
|
|
3. Go to **Settings → API**
|
|
4. Generate a new token or copy existing one
|
|
5. Set as `TECHNITIUM_API_TOKEN` environment variable
|
|
|
|
### 3.4 Test the API Server
|
|
|
|
```bash
|
|
node test-api.js
|
|
```
|
|
|
|
Expected output:
|
|
```
|
|
Testing SAMI-CLOUD API...
|
|
|
|
1. Testing health endpoint...
|
|
✓ Health check passed
|
|
|
|
2. Testing API test endpoint...
|
|
✓ API test passed
|
|
Platform: win32
|
|
Caddy Admin API: http://localhost:2019
|
|
DNS Server API: http://192.168.254.204:5380
|
|
DNS Token: Configured
|
|
|
|
3. Testing services endpoint...
|
|
✓ Services endpoint passed
|
|
Found 8 services
|
|
|
|
Tests complete!
|
|
```
|
|
|
|
## Step 4: Run the API Server
|
|
|
|
### Option A: Run Directly (for testing)
|
|
|
|
```bash
|
|
node caddy-api.js
|
|
```
|
|
|
|
### Option B: Use PM2 (recommended for production)
|
|
|
|
```bash
|
|
# Install PM2 globally
|
|
npm install -g pm2
|
|
|
|
# Start the API server
|
|
pm2 start caddy-api.js --name sami-api
|
|
|
|
# Save the process list
|
|
pm2 save
|
|
|
|
# Set up PM2 to start on boot
|
|
pm2 startup
|
|
```
|
|
|
|
Manage with PM2:
|
|
```bash
|
|
pm2 status # Check status
|
|
pm2 logs sami-api # View logs
|
|
pm2 restart sami-api
|
|
pm2 stop sami-api
|
|
```
|
|
|
|
### Option C: Windows Service (using PM2)
|
|
|
|
```bash
|
|
npm install -g pm2-windows-service
|
|
pm2-service-install -n SAMI-API
|
|
```
|
|
|
|
### Option D: 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=/var/www/status/api
|
|
Environment="NODE_ENV=production"
|
|
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
|
|
RestartSec=10
|
|
|
|
[Install]
|
|
WantedBy=multi-user.target
|
|
```
|
|
|
|
Enable and start:
|
|
```bash
|
|
sudo systemctl daemon-reload
|
|
sudo systemctl enable sami-api
|
|
sudo systemctl start sami-api
|
|
sudo systemctl status sami-api
|
|
```
|
|
|
|
## Step 5: Verify Everything Works
|
|
|
|
### 5.1 Access the Dashboard
|
|
|
|
Open your browser and navigate to:
|
|
```
|
|
https://status.sami
|
|
```
|
|
|
|
You should see:
|
|
- Service status cards
|
|
- Weather widget
|
|
- Theme toggle
|
|
- "📱 App Selector" button
|
|
|
|
### 5.2 Test App Deployment
|
|
|
|
1. Click **"📱 App Selector"** button
|
|
2. Choose an app template (or use the generic one)
|
|
3. Fill in the deployment form:
|
|
- **Subdomain**: e.g., `test-app`
|
|
- **IP Address**: e.g., `192.168.1.100`
|
|
- **Port**: e.g., `8080`
|
|
- **DNS Type**: Choose "Private DNS" or "Public DNS"
|
|
- **SSL Type**: Choose "Internal CA" or "Public (Let's Encrypt)"
|
|
4. Click **"Deploy App"**
|
|
|
|
If successful, you should see:
|
|
- Success message
|
|
- New card appears in the grid
|
|
- App is accessible at `https://test-app.sami`
|
|
|
|
## Troubleshooting
|
|
|
|
### Dashboard not accessible
|
|
- Check Caddy is running: `caddy version`
|
|
- Check Caddyfile syntax: `caddy validate --config /path/to/Caddyfile`
|
|
- View Caddy logs for errors
|
|
|
|
### API requests failing
|
|
- Verify API server is running: `pm2 status` or check process
|
|
- Check API logs: `pm2 logs sami-api`
|
|
- Test API directly: `curl http://localhost:3001/health`
|
|
|
|
### DNS records not created
|
|
- Verify `TECHNITIUM_API_TOKEN` is set correctly
|
|
- Test DNS API manually:
|
|
```bash
|
|
curl "http://192.168.254.204:5380/api/zones/records/get?token=YOUR_TOKEN&domain=sami"
|
|
```
|
|
- Check Technitium DNS server is running
|
|
|
|
### Caddy routes not working
|
|
- Verify Caddy Admin API is accessible:
|
|
```bash
|
|
curl http://localhost:2019/config/
|
|
```
|
|
- Check Caddy admin API origins in Caddyfile
|
|
- View Caddy configuration: `curl http://localhost:2019/config/ | jq .`
|
|
|
|
### App deployment fails
|
|
1. Check API server logs
|
|
2. Verify all environment variables are set
|
|
3. Test each component individually:
|
|
- DNS API connection
|
|
- Caddy Admin API connection
|
|
4. Check for existing configurations with same subdomain
|
|
|
|
## Advanced Configuration
|
|
|
|
### Custom App Templates
|
|
|
|
Edit the dashboard's JavaScript to add custom app templates with pre-configured settings.
|
|
|
|
### Multiple DNS Servers
|
|
|
|
Modify the API to support multiple DNS servers for redundancy.
|
|
|
|
### Docker Integration
|
|
|
|
Extend the API to deploy Docker containers automatically before configuring DNS and Caddy.
|
|
|
|
### Authentication
|
|
|
|
Add authentication middleware to the API server to protect deployment endpoints.
|
|
|
|
## Maintenance
|
|
|
|
### Backup Important Files
|
|
|
|
Regularly backup:
|
|
- `C:/caddy/Caddyfile` (or equivalent)
|
|
- `C:/caddy/sites/status/apps.json`
|
|
- Custom app data in localStorage (export from browser)
|
|
|
|
### Update the Dashboard
|
|
|
|
1. Pull latest changes from development
|
|
2. Copy updated files to production
|
|
3. Restart API server if needed
|
|
4. Clear browser cache or bump cache version in `sw.js`
|
|
|
|
### Monitor Logs
|
|
|
|
```bash
|
|
# API logs
|
|
pm2 logs sami-api
|
|
|
|
# Caddy logs
|
|
caddy logs
|
|
|
|
# System logs (Linux)
|
|
journalctl -u sami-api -f
|
|
```
|
|
|
|
## Security Considerations
|
|
|
|
1. **API Access**: The API server should only be accessible from localhost or trusted networks
|
|
2. **DNS Token**: Keep your Technitium API token secure
|
|
3. **Caddy Admin API**: Restrict access to localhost only
|
|
4. **CORS**: The API has CORS enabled - restrict origins in production
|
|
5. **Input Validation**: The API validates inputs but consider additional security layers
|
|
|
|
## Support
|
|
|
|
For issues or questions:
|
|
- Check the API README: `api/README.md`
|
|
- Review Caddy documentation: https://caddyserver.com/docs/
|
|
- Check Technitium DNS docs: https://technitium.com/dns/
|
|
|
|
## License
|
|
|
|
MIT
|