initial commit

This commit is contained in:
Will Bradley
2025-10-11 17:03:31 -07:00
commit 4767b67460
25 changed files with 5098 additions and 0 deletions
+413
View File
@@ -0,0 +1,413 @@
# Deployment Guide
This guide covers deploying the Meshtastic MQTT Dashboard to production environments.
## Pre-Deployment Checklist
- [ ] Change `SESSION_SECRET` to a strong random string
- [ ] Set `NODE_ENV=production` in `.env`
- [ ] Review and adjust MQTT broker settings
- [ ] Configure data retention policies
- [ ] Set up SSL/TLS certificates
- [ ] Configure firewall rules
- [ ] Plan backup strategy
- [ ] Create initial user accounts
- [ ] Test the application locally
## Deployment Options
### Option 1: Traditional Server (Linux)
#### Requirements
- Ubuntu 20.04+ or similar Linux distribution
- Node.js 16.x or higher
- Nginx (for reverse proxy and SSL)
- 1GB+ RAM
- 10GB+ disk space
#### Steps
1. **Install Node.js**
```bash
curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash -
sudo apt-get install -y nodejs
```
2. **Clone/Upload Application**
```bash
cd /opt
sudo mkdir meshtastic-dashboard
sudo chown $USER:$USER meshtastic-dashboard
cd meshtastic-dashboard
# Upload your files here
```
3. **Install Dependencies**
```bash
npm ci --production
```
4. **Configure Environment**
```bash
cp .env.example .env
nano .env # Edit configuration
```
5. **Create User**
```bash
npm run create-user
```
6. **Set Up Systemd Service**
Create `/etc/systemd/system/meshtastic-dashboard.service`:
```ini
[Unit]
Description=Meshtastic MQTT Dashboard
After=network.target
[Service]
Type=simple
User=www-data
WorkingDirectory=/opt/meshtastic-dashboard
Environment=NODE_ENV=production
ExecStart=/usr/bin/node src/server.js
Restart=on-failure
RestartSec=10
[Install]
WantedBy=multi-user.target
```
Enable and start:
```bash
sudo systemctl daemon-reload
sudo systemctl enable meshtastic-dashboard
sudo systemctl start meshtastic-dashboard
sudo systemctl status meshtastic-dashboard
```
7. **Configure Nginx**
Create `/etc/nginx/sites-available/meshtastic-dashboard`:
```nginx
server {
listen 80;
server_name your-domain.com;
# Redirect to HTTPS
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl http2;
server_name your-domain.com;
ssl_certificate /etc/letsencrypt/live/your-domain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/your-domain.com/privkey.pem;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
location / {
proxy_pass http://localhost:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_cache_bypass $http_upgrade;
}
}
```
Enable site:
```bash
sudo ln -s /etc/nginx/sites-available/meshtastic-dashboard /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx
```
8. **Set Up SSL with Let's Encrypt**
```bash
sudo apt-get install certbot python3-certbot-nginx
sudo certbot --nginx -d your-domain.com
```
### Option 2: Docker Deployment
Create `Dockerfile`:
```dockerfile
FROM node:18-alpine
WORKDIR /app
COPY package*.json ./
RUN npm ci --production
COPY . .
RUN mkdir -p data logs
EXPOSE 3000
CMD ["node", "src/server.js"]
```
Create `docker-compose.yml`:
```yaml
version: '3.8'
services:
meshtastic-dashboard:
build: .
ports:
- "3000:3000"
volumes:
- ./data:/app/data
- ./logs:/app/logs
- ./.env:/app/.env:ro
restart: unless-stopped
environment:
- NODE_ENV=production
```
Deploy:
```bash
docker-compose up -d
```
### Option 3: Cloud Platforms
#### Heroku
1. Create `Procfile`:
```
web: node src/server.js
```
2. Deploy:
```bash
heroku create your-app-name
heroku config:set SESSION_SECRET=your-secret-here
git push heroku main
```
#### DigitalOcean App Platform
1. Connect your repository
2. Set environment variables in the dashboard
3. Deploy with one click
#### AWS EC2
Follow "Traditional Server" steps above on an EC2 instance.
## Security Hardening
### 1. Firewall Configuration
```bash
# UFW (Ubuntu)
sudo ufw allow 22/tcp
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw enable
```
### 2. Environment Variables
Never commit `.env` file. Use secure methods to transfer:
```bash
# On server
touch .env
chmod 600 .env
nano .env # Add your configuration
```
### 3. Database Permissions
```bash
chmod 700 data/
chmod 600 data/meshtastic.db
```
### 4. Regular Updates
```bash
# Update system packages
sudo apt update && sudo apt upgrade -y
# Update Node.js dependencies
npm audit fix
npm update
```
### 5. Monitoring
Install monitoring tools:
```bash
# PM2 for process management
npm install -g pm2
pm2 start src/server.js --name meshtastic-dashboard
pm2 startup
pm2 save
```
## Backup Strategy
### Automated Backup Script
Create `/opt/backup-meshtastic.sh`:
```bash
#!/bin/bash
BACKUP_DIR="/opt/backups/meshtastic"
DATE=$(date +%Y%m%d_%H%M%S)
mkdir -p $BACKUP_DIR
# Backup database
cp /opt/meshtastic-dashboard/data/meshtastic.db $BACKUP_DIR/db_$DATE.db
# Backup configuration
cp /opt/meshtastic-dashboard/.env $BACKUP_DIR/env_$DATE.txt
# Keep only last 7 days
find $BACKUP_DIR -name "db_*.db" -mtime +7 -delete
find $BACKUP_DIR -name "env_*.txt" -mtime +7 -delete
echo "Backup completed: $DATE"
```
Add to crontab:
```bash
chmod +x /opt/backup-meshtastic.sh
crontab -e
# Add: 0 3 * * * /opt/backup-meshtastic.sh
```
## Monitoring and Logs
### View Logs
```bash
# Systemd logs
sudo journalctl -u meshtastic-dashboard -f
# Application logs
tail -f /opt/meshtastic-dashboard/logs/combined.log
tail -f /opt/meshtastic-dashboard/logs/error.log
```
### Log Rotation
Create `/etc/logrotate.d/meshtastic-dashboard`:
```
/opt/meshtastic-dashboard/logs/*.log {
daily
rotate 14
compress
delaycompress
notifempty
missingok
copytruncate
}
```
## Performance Optimization
### 1. Enable Node.js Clustering
For multi-core servers, modify `src/server.js` to use the cluster module.
### 2. Database Optimization
```bash
# Vacuum database periodically
sqlite3 data/meshtastic.db "VACUUM;"
```
### 3. Nginx Caching
Add to nginx configuration:
```nginx
location /css/ {
expires 1y;
add_header Cache-Control "public, immutable";
}
location /js/ {
expires 1y;
add_header Cache-Control "public, immutable";
}
```
## Troubleshooting
### Application Won't Start
1. Check logs: `sudo journalctl -u meshtastic-dashboard -n 50`
2. Verify Node.js version: `node --version`
3. Check port availability: `sudo netstat -tlnp | grep 3000`
4. Verify permissions on data directory
### MQTT Connection Issues
1. Check broker is accessible: `telnet mqtt.meshtastic.org 1883`
2. Verify credentials in `.env`
3. Check firewall rules
### Database Errors
1. Check disk space: `df -h`
2. Verify database permissions: `ls -la data/`
3. Try rebuilding: `rm data/meshtastic.db && npm start`
## Scaling Considerations
For high traffic deployments:
1. **Load Balancing**: Use multiple instances behind nginx
2. **Database**: Consider PostgreSQL for better concurrency
3. **Caching**: Add Redis for session storage
4. **CDN**: Use CloudFlare for static assets
5. **Monitoring**: Add Prometheus + Grafana
## Maintenance
### Weekly Tasks
- Review error logs
- Check disk space
- Verify backups
### Monthly Tasks
- Update dependencies
- Review security advisories
- Optimize database
- Rotate API keys if used
### Quarterly Tasks
- Review access logs
- Update SSL certificates (if not using auto-renewal)
- Performance audit
- Security audit
## Support
For deployment issues:
1. Check logs first
2. Review documentation
3. Check GitHub issues
4. Contact maintainers
---
**Last Updated**: 2025
**Maintainer**: Meshtastic Community