mirror of
https://github.com/johndoe6345789/metabuilder.git
synced 2026-04-24 13:54:57 +00:00
637 lines
16 KiB
Markdown
637 lines
16 KiB
Markdown
# MetaBuilder Deployment Guide
|
|
|
|
Complete guide for deploying MetaBuilder in various environments.
|
|
|
|
## Table of Contents
|
|
|
|
1. [Quick Start](#quick-start)
|
|
2. [Architecture Overview](#architecture-overview)
|
|
3. [Deployment Stacks](#deployment-stacks)
|
|
4. [Bootstrap Process](#bootstrap-process)
|
|
5. [Monitoring & Observability](#monitoring--observability)
|
|
6. [Backup & Recovery](#backup--recovery)
|
|
7. [Scaling & High Availability](#scaling--high-availability)
|
|
8. [Security Hardening](#security-hardening)
|
|
9. [Troubleshooting](#troubleshooting)
|
|
|
|
---
|
|
|
|
## Quick Start
|
|
|
|
### One-Command Deployment (Development)
|
|
|
|
```bash
|
|
# Clone and deploy everything
|
|
git clone <repo>
|
|
cd metabuilder
|
|
|
|
# Start full development stack
|
|
docker-compose \
|
|
-f deployment/docker/docker-compose.development.yml \
|
|
-f deployment/docker/docker-compose.monitoring.yml \
|
|
up -d
|
|
|
|
# Bootstrap the system
|
|
docker-compose -f deployment/docker/docker-compose.development.yml \
|
|
exec metabuilder-tools /app/scripts/bootstrap-system.sh
|
|
|
|
# Access services
|
|
open http://localhost:5173 # App
|
|
open http://localhost:3001 # Grafana
|
|
```
|
|
|
|
### One-Command Deployment (Production)
|
|
|
|
```bash
|
|
# Configure environment
|
|
cp deployment/env/.env.production.example .env
|
|
vim .env # Set passwords and secrets
|
|
|
|
# Deploy production stack
|
|
docker-compose \
|
|
-f deployment/docker/docker-compose.production.yml \
|
|
-f deployment/docker/docker-compose.monitoring.yml \
|
|
up -d
|
|
|
|
# Bootstrap
|
|
docker-compose -f deployment/docker/docker-compose.production.yml \
|
|
exec metabuilder-tools /app/scripts/bootstrap-system.sh --env production
|
|
|
|
# Access
|
|
open https://your-domain.com
|
|
```
|
|
|
|
---
|
|
|
|
## Architecture Overview
|
|
|
|
### Services
|
|
|
|
```
|
|
┌─────────────────────────────────────────────────────────┐
|
|
│ Load Balancer / CDN │
|
|
└────────────────────┬────────────────────────────────────┘
|
|
│
|
|
┌──────────▼──────────┐
|
|
│ Nginx (SSL/TLS) │
|
|
└──────────┬──────────┘
|
|
│
|
|
┌───────────────┼───────────────┐
|
|
│ │ │
|
|
┌────▼─────┐ ┌─────▼──────┐ ┌────▼─────┐
|
|
│ Next.js │ │ DBAL │ │ Media │
|
|
│ App │ │ Daemon │ │ Daemon │
|
|
│ (Node.js)│ │ (C++) │ │ (C++) │
|
|
└────┬─────┘ └─────┬──────┘ └────┬─────┘
|
|
│ │ │
|
|
└──────────────┼───────────────┘
|
|
│
|
|
┌──────────────┼──────────────┐
|
|
│ │ │
|
|
┌────▼──────┐ ┌───▼────┐ ┌────▼────┐
|
|
│ PostgreSQL│ │ Redis │ │ Icecast │
|
|
│ DB │ │ Cache │ │ (Radio) │
|
|
└───────────┘ └────────┘ └─────────┘
|
|
|
|
Monitoring Layer:
|
|
┌──────────────────────────────────────┐
|
|
│ Prometheus → Grafana → Alertmanager │
|
|
│ Loki → Promtail (Logs) │
|
|
└──────────────────────────────────────┘
|
|
```
|
|
|
|
### Ports (Default Configuration)
|
|
|
|
| Service | Development | Production | Description |
|
|
|---------|------------|------------|-------------|
|
|
| Next.js App | 5173 | 3000 | Frontend & API |
|
|
| DBAL Daemon | 8081 | 8080 | Database layer |
|
|
| Media Daemon | 8090 | 8090 | Media processing |
|
|
| PostgreSQL | 5433 | 5432 | Database |
|
|
| Redis | 6380 | 6379 | Cache |
|
|
| Nginx | - | 80/443 | Reverse proxy |
|
|
| Icecast | 8000 | 8000 | Radio streaming |
|
|
| HLS Streaming | 8088 | 8088 | Video streaming |
|
|
| Prometheus | 9090 | 9090 | Metrics |
|
|
| Grafana | 3001 | 3001 | Dashboards |
|
|
| Loki | 3100 | 3100 | Logs |
|
|
|
|
---
|
|
|
|
## Deployment Stacks
|
|
|
|
### 1. Core Application Stack
|
|
|
|
**File**: [`docker/docker-compose.production.yml`](docker/docker-compose.production.yml)
|
|
|
|
**Services**:
|
|
- PostgreSQL (database)
|
|
- DBAL Daemon (C++ database abstraction)
|
|
- MetaBuilder App (Next.js frontend/API)
|
|
- Nginx (reverse proxy with SSL)
|
|
- Redis (caching)
|
|
- Media Daemon (media processing)
|
|
- Icecast (radio streaming)
|
|
- HLS Server (video streaming)
|
|
|
|
**Start**:
|
|
```bash
|
|
docker-compose -f deployment/docker/docker-compose.production.yml up -d
|
|
```
|
|
|
|
### 2. Monitoring Stack
|
|
|
|
**File**: [`docker/docker-compose.monitoring.yml`](docker/docker-compose.monitoring.yml)
|
|
|
|
**Services**:
|
|
- Prometheus (metrics collection)
|
|
- Grafana (visualization)
|
|
- Loki (log aggregation)
|
|
- Promtail (log shipper)
|
|
- Node Exporter (host metrics)
|
|
- Postgres Exporter (DB metrics)
|
|
- Redis Exporter (cache metrics)
|
|
- cAdvisor (container metrics)
|
|
- Alertmanager (alert routing)
|
|
|
|
**Start**:
|
|
```bash
|
|
docker-compose -f deployment/docker/docker-compose.monitoring.yml up -d
|
|
```
|
|
|
|
### 3. Development Stack
|
|
|
|
**File**: [`docker/docker-compose.development.yml`](docker/docker-compose.development.yml)
|
|
|
|
**Additional Services**:
|
|
- Adminer (database UI)
|
|
- Redis Commander (cache UI)
|
|
- Mailhog (email testing)
|
|
|
|
**Features**:
|
|
- Hot reload enabled
|
|
- Debug logging
|
|
- Interactive DBAL mode
|
|
- Development tools pre-installed
|
|
|
|
**Start**:
|
|
```bash
|
|
docker-compose -f deployment/docker/docker-compose.development.yml up
|
|
```
|
|
|
|
### 4. Admin Tools Container
|
|
|
|
**Dockerfile**:
|
|
- [`Dockerfile.tools`](docker/Dockerfile.tools) - Admin toolkit with Node.js, migrations, and scripts
|
|
|
|
**Usage**:
|
|
```bash
|
|
# Build tools container
|
|
docker build -f deployment/docker/Dockerfile.tools -t metabuilder-tools .
|
|
|
|
# Run administrative script (bootstrap, backup, etc.)
|
|
docker run --rm --network metabuilder_metabuilder-network \
|
|
metabuilder-tools /app/scripts/bootstrap-system.sh
|
|
|
|
# Interactive shell
|
|
docker run -it --rm --network metabuilder_metabuilder-network \
|
|
metabuilder-tools /bin/bash
|
|
```
|
|
|
|
---
|
|
|
|
## Bootstrap Process
|
|
|
|
The bootstrap process initializes the MetaBuilder system with core packages and configuration.
|
|
|
|
### What It Does
|
|
|
|
1. **Database Setup**
|
|
- Waits for PostgreSQL to be ready
|
|
- Runs Prisma migrations
|
|
- Generates Prisma client
|
|
|
|
2. **Seed Data**
|
|
- Inserts `InstalledPackage` records
|
|
- Inserts `PackagePermission` records
|
|
- Sets up default configuration
|
|
|
|
3. **Package Installation**
|
|
- Installs core packages in priority order:
|
|
1. package_manager
|
|
2. ui_header, ui_footer, ui_auth, ui_login
|
|
3. dashboard
|
|
4. user_manager, role_editor
|
|
5. admin_dialog, database_manager, schema_editor
|
|
|
|
4. **Verification**
|
|
- Validates database connectivity
|
|
- Verifies package installation
|
|
- Runs health checks
|
|
|
|
### Manual Bootstrap
|
|
|
|
```bash
|
|
# Using tools container
|
|
docker-compose -f deployment/docker/docker-compose.production.yml \
|
|
run --rm metabuilder-tools /app/scripts/bootstrap-system.sh
|
|
|
|
# With options
|
|
docker-compose -f deployment/docker/docker-compose.production.yml \
|
|
run --rm metabuilder-tools \
|
|
/app/scripts/bootstrap-system.sh --env production --force
|
|
```
|
|
|
|
### Bootstrap Script
|
|
|
|
**Location**: [`scripts/bootstrap-system.sh`](scripts/bootstrap-system.sh)
|
|
|
|
**Options**:
|
|
- `--force` - Re-bootstrap even if already initialized
|
|
- `--env [production|development]` - Environment mode
|
|
|
|
**Logs**: `seed/logs/bootstrap-YYYYMMDD_HHMMSS.log`
|
|
|
|
### Automated Bootstrap on First Run
|
|
|
|
Add to `docker-compose.yml`:
|
|
|
|
```yaml
|
|
metabuilder-tools:
|
|
build:
|
|
context: ..
|
|
dockerfile: deployment/docker/Dockerfile.tools
|
|
container_name: metabuilder-tools
|
|
depends_on:
|
|
postgres:
|
|
condition: service_healthy
|
|
dbal-daemon:
|
|
condition: service_healthy
|
|
command: /app/scripts/bootstrap-system.sh --env production
|
|
restart: "no"
|
|
networks:
|
|
- metabuilder-network
|
|
```
|
|
|
|
---
|
|
|
|
## Monitoring & Observability
|
|
|
|
### Grafana Dashboards
|
|
|
|
**Access**: http://localhost:3001
|
|
**Default Credentials**: admin/admin (change immediately)
|
|
|
|
**Pre-configured Dashboards**:
|
|
1. **System Overview** - All services health
|
|
2. **Application Metrics** - Next.js app performance
|
|
3. **Database Performance** - PostgreSQL metrics
|
|
4. **DBAL Performance** - C++ daemon metrics
|
|
5. **Media Processing** - Media daemon stats
|
|
6. **Container Resources** - Docker container usage
|
|
7. **Network Traffic** - Nginx metrics
|
|
|
|
### Metrics Endpoints
|
|
|
|
Configure your services to expose metrics:
|
|
|
|
```typescript
|
|
// Next.js (frontends/nextjs/src/app/api/metrics/route.ts)
|
|
import { register } from 'prom-client';
|
|
|
|
export async function GET() {
|
|
return new Response(await register.metrics(), {
|
|
headers: { 'Content-Type': register.contentType },
|
|
});
|
|
}
|
|
```
|
|
|
|
### Log Aggregation
|
|
|
|
**Loki** collects logs from all services via **Promtail**.
|
|
|
|
**Query logs in Grafana**:
|
|
```logql
|
|
{container_name="metabuilder-app-prod"} |= "ERROR"
|
|
{job="dbal-daemon"} | json | line_format "{{.message}}"
|
|
```
|
|
|
|
### Alerts
|
|
|
|
Configure alerts in [`config/prometheus/alerts.yml`](config/prometheus/alerts.yml):
|
|
|
|
```yaml
|
|
groups:
|
|
- name: metabuilder
|
|
rules:
|
|
- alert: HighErrorRate
|
|
expr: rate(http_requests_total{status=~"5.."}[5m]) > 0.05
|
|
for: 5m
|
|
annotations:
|
|
summary: "High error rate detected"
|
|
|
|
- alert: DatabaseDown
|
|
expr: up{job="postgres"} == 0
|
|
for: 1m
|
|
annotations:
|
|
summary: "PostgreSQL is down"
|
|
```
|
|
|
|
---
|
|
|
|
## Backup & Recovery
|
|
|
|
### Automated Backups
|
|
|
|
**Script**: [`scripts/backup-database.sh`](scripts/backup-database.sh)
|
|
|
|
**Schedule with cron**:
|
|
```bash
|
|
# Daily backup at 2 AM
|
|
0 2 * * * /path/to/backup-database.sh --retention-days 30
|
|
```
|
|
|
|
**Docker-based backup**:
|
|
```bash
|
|
# Add to docker-compose.yml
|
|
backup:
|
|
image: postgres:16-alpine
|
|
container_name: metabuilder-backup
|
|
environment:
|
|
DATABASE_URL: ${DATABASE_URL}
|
|
volumes:
|
|
- ./backups:/backups
|
|
- ./deployment/scripts:/scripts:ro
|
|
command: /scripts/backup-database.sh
|
|
restart: "no"
|
|
```
|
|
|
|
### Manual Backup
|
|
|
|
```bash
|
|
# Production
|
|
docker-compose -f deployment/docker/docker-compose.production.yml exec postgres \
|
|
pg_dump -U metabuilder metabuilder | gzip > backup_$(date +%Y%m%d).sql.gz
|
|
|
|
# Development
|
|
docker-compose -f deployment/docker/docker-compose.development.yml exec postgres \
|
|
pg_dump -U metabuilder metabuilder_dev | gzip > backup_dev_$(date +%Y%m%d).sql.gz
|
|
```
|
|
|
|
### Restore Database
|
|
|
|
```bash
|
|
# Stop application
|
|
docker-compose -f deployment/docker/docker-compose.production.yml stop metabuilder-app
|
|
|
|
# Restore
|
|
gunzip -c backup.sql.gz | docker-compose -f deployment/docker/docker-compose.production.yml \
|
|
exec -T postgres psql -U metabuilder metabuilder
|
|
|
|
# Restart
|
|
docker-compose -f deployment/docker/docker-compose.production.yml start metabuilder-app
|
|
```
|
|
|
|
### Volume Backups
|
|
|
|
```bash
|
|
# Backup all volumes
|
|
docker run --rm \
|
|
-v metabuilder_postgres_data:/data \
|
|
-v $(pwd)/backups:/backup \
|
|
alpine tar czf /backup/postgres_data_$(date +%Y%m%d).tar.gz /data
|
|
|
|
# Restore
|
|
docker run --rm \
|
|
-v metabuilder_postgres_data:/data \
|
|
-v $(pwd)/backups:/backup \
|
|
alpine tar xzf /backup/postgres_data_YYYYMMDD.tar.gz -C /
|
|
```
|
|
|
|
---
|
|
|
|
## Scaling & High Availability
|
|
|
|
### Horizontal Scaling (Docker Swarm)
|
|
|
|
```bash
|
|
# Initialize swarm
|
|
docker swarm init
|
|
|
|
# Deploy stack
|
|
docker stack deploy -c deployment/docker/docker-compose.production.yml metabuilder
|
|
|
|
# Scale app
|
|
docker service scale metabuilder_metabuilder-app=5
|
|
|
|
# Scale DBAL daemon
|
|
docker service scale metabuilder_dbal-daemon=3
|
|
```
|
|
|
|
### Load Balancing
|
|
|
|
Update Nginx configuration for upstream load balancing:
|
|
|
|
```nginx
|
|
upstream metabuilder_app {
|
|
least_conn;
|
|
server metabuilder-app-1:3000;
|
|
server metabuilder-app-2:3000;
|
|
server metabuilder-app-3:3000;
|
|
}
|
|
|
|
upstream dbal_daemon {
|
|
least_conn;
|
|
server dbal-daemon-1:8080;
|
|
server dbal-daemon-2:8080;
|
|
}
|
|
```
|
|
|
|
### Database Replication
|
|
|
|
Use PostgreSQL replication for read replicas:
|
|
|
|
```yaml
|
|
postgres-replica:
|
|
image: postgres:16-alpine
|
|
environment:
|
|
POSTGRES_PRIMARY_HOST: postgres
|
|
POSTGRES_PRIMARY_PORT: 5432
|
|
command: >
|
|
sh -c "until pg_basebackup -h postgres -D /var/lib/postgresql/data -U replicator -Fp -Xs -P -R; do
|
|
sleep 5;
|
|
done && postgres"
|
|
```
|
|
|
|
### Redis Clustering
|
|
|
|
Deploy Redis Sentinel or Cluster for cache high availability.
|
|
|
|
---
|
|
|
|
## Security Hardening
|
|
|
|
### Production Checklist
|
|
|
|
- [ ] Change all default passwords
|
|
- [ ] Use strong secrets (32+ characters)
|
|
- [ ] Configure SSL certificates
|
|
- [ ] Set `NODE_ENV=production`
|
|
- [ ] Enable firewall rules
|
|
- [ ] Configure rate limiting
|
|
- [ ] Restrict CORS origins
|
|
- [ ] Enable HTTPS redirect
|
|
- [ ] Use Docker secrets
|
|
- [ ] Regular security updates
|
|
- [ ] Audit logs enabled
|
|
- [ ] Intrusion detection
|
|
- [ ] Backup encryption
|
|
|
|
### Environment Variables Security
|
|
|
|
Use Docker secrets instead of environment variables:
|
|
|
|
```bash
|
|
# Create secrets
|
|
echo "my_secure_password" | docker secret create db_password -
|
|
|
|
# Reference in compose
|
|
services:
|
|
postgres:
|
|
secrets:
|
|
- db_password
|
|
environment:
|
|
POSTGRES_PASSWORD_FILE: /run/secrets/db_password
|
|
```
|
|
|
|
### Network Isolation
|
|
|
|
```yaml
|
|
networks:
|
|
frontend:
|
|
driver: overlay
|
|
backend:
|
|
driver: overlay
|
|
internal: true # No internet access
|
|
|
|
services:
|
|
nginx:
|
|
networks:
|
|
- frontend
|
|
metabuilder-app:
|
|
networks:
|
|
- frontend
|
|
- backend
|
|
postgres:
|
|
networks:
|
|
- backend # Database isolated
|
|
```
|
|
|
|
---
|
|
|
|
## Troubleshooting
|
|
|
|
### Common Issues
|
|
|
|
**1. Database Connection Failed**
|
|
```bash
|
|
# Check database status
|
|
docker-compose -f deployment/docker/docker-compose.production.yml exec postgres pg_isready
|
|
|
|
# View logs
|
|
docker-compose -f deployment/docker/docker-compose.production.yml logs postgres
|
|
|
|
# Test connection
|
|
docker-compose -f deployment/docker/docker-compose.production.yml exec postgres \
|
|
psql -U metabuilder -d metabuilder -c "SELECT version();"
|
|
```
|
|
|
|
**2. DBAL Daemon Not Responding**
|
|
```bash
|
|
# Check health
|
|
curl http://localhost:8080/health
|
|
|
|
# View logs
|
|
docker-compose -f deployment/docker/docker-compose.production.yml logs dbal-daemon
|
|
|
|
# Restart
|
|
docker-compose -f deployment/docker/docker-compose.production.yml restart dbal-daemon
|
|
```
|
|
|
|
**3. Bootstrap Failed**
|
|
```bash
|
|
# Check logs
|
|
cat seed/logs/bootstrap-*.log
|
|
|
|
# Re-run with force
|
|
docker-compose -f deployment/docker/docker-compose.production.yml \
|
|
run --rm metabuilder-tools \
|
|
/app/scripts/bootstrap-system.sh --force --env production
|
|
```
|
|
|
|
**4. Port Already in Use**
|
|
```bash
|
|
# Find process
|
|
sudo lsof -i :5432
|
|
|
|
# Change port in docker-compose.yml
|
|
ports:
|
|
- "5433:5432"
|
|
```
|
|
|
|
**5. Out of Disk Space**
|
|
```bash
|
|
# Check Docker disk usage
|
|
docker system df
|
|
|
|
# Clean up
|
|
docker system prune -a --volumes
|
|
|
|
# Remove old images
|
|
docker image prune -a
|
|
```
|
|
|
|
### Health Checks
|
|
|
|
```bash
|
|
# All services
|
|
docker-compose -f deployment/docker/docker-compose.production.yml ps
|
|
|
|
# Individual health
|
|
curl http://localhost:3000/ # App
|
|
curl http://localhost:8080/health # DBAL
|
|
curl http://localhost:8090/health # Media
|
|
curl http://localhost:9090/-/healthy # Prometheus
|
|
```
|
|
|
|
### Performance Debugging
|
|
|
|
```bash
|
|
# Container stats
|
|
docker stats
|
|
|
|
# Container top
|
|
docker top metabuilder-app-prod
|
|
|
|
# Logs with timestamps
|
|
docker-compose -f deployment/docker/docker-compose.production.yml logs -t -f
|
|
|
|
# Network inspection
|
|
docker network inspect metabuilder_metabuilder-network
|
|
```
|
|
|
|
---
|
|
|
|
## Additional Resources
|
|
|
|
- [Main README](../README.md) - Project overview
|
|
- [Seed System](../seed/README.md) - Bootstrap and package installation
|
|
- [DBAL Documentation](../dbal/README.md) - Database abstraction layer
|
|
- [Package System](../README.md#package-system) - Package architecture
|
|
|
|
---
|
|
|
|
**Last Updated**: 2026-01-03
|
|
**Version**: 1.0
|
|
**Generated with Claude Code**
|