Deployment

Anleitung zum Betrieb des Collab Servers in verschiedenen Umgebungen.

Systemanforderungen

Komponente Minimum Empfohlen
Node.js 20.x 22.x LTS
RAM 512 MB 2 GB
Storage 1 GB 10 GB
CPU 1 Core 2+ Cores

Umgebungsvariablen

Variable Default Beschreibung
PORT 4000 Server-Port
NODE_ENV development Umgebung
CONTENT_PATH ./content Pfad zum Content
LOG_LEVEL info Log-Level

Development

# Mit npm
npm run dev

# Mit Custom Content
CONTENT_PATH=../my-content npm run dev

Production Build

# TypeScript kompilieren
npm run build

# Starten
NODE_ENV=production npm start

Docker

Dockerfile

FROM node:22-alpine

WORKDIR /app

COPY package*.json ./
RUN npm ci --only=production

COPY dist/ ./dist/
COPY content/ ./content/

EXPOSE 4000

ENV NODE_ENV=production
ENV PORT=4000

CMD ["node", "dist/server.js"]

Docker Compose

version: '3.8'

services:
  collab-server:
    build: .
    ports:
      - "4000:4000"
    volumes:
      - ./content:/app/content
    environment:
      - NODE_ENV=production
      - PORT=4000
    restart: unless-stopped

Befehle

# Build
docker build -t quiet-frames-collab-server .

# Run
docker run -d -p 4000:4000 \
  -v $(pwd)/content:/app/content \
  quiet-frames-collab-server

# Mit Docker Compose
docker-compose up -d

Reverse Proxy

Nginx

server {
    listen 80;
    server_name quiet-frames.de;

    location / {
        proxy_pass http://localhost:4000;
        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;
    }
}

Caddy

quiet-frames.de {
    reverse_proxy localhost:4000
}

SSL/TLS

Mit Certbot (Let's Encrypt)

certbot --nginx -d quiet-frames.de

Mit Caddy (automatisch)

Caddy holt automatisch Zertifikate.

PM2 (Process Manager)

# Installation
npm install -g pm2

# Starten
pm2 start dist/server.js --name collab-server

# Cluster Mode (Multi-Core)
pm2 start dist/server.js -i max --name collab-server

# Autostart
pm2 startup
pm2 save

ecosystem.config.js

module.exports = {
  apps: [{
    name: 'collab-server',
    script: 'dist/server.js',
    instances: 'max',
    exec_mode: 'cluster',
    env_production: {
      NODE_ENV: 'production',
      PORT: 4000
    }
  }]
};

Monitoring

Health Check

curl http://localhost:4000/health

PM2 Monitoring

pm2 monit
pm2 logs collab-server

Externe Services

  • Uptime Robot – Verfügbarkeit
  • Sentry – Error Tracking
  • Grafana – Metriken

Backup

Content-Verzeichnis

# Täglich um 2:00
0 2 * * * tar -czf /backups/content-$(date +\%Y\%m\%d).tar.gz /app/content

Snapshots

# Wöchentlich
0 3 * * 0 tar -czf /backups/snapshots-$(date +\%Y\%m\%d).tar.gz /app/data/snapshots

Logs

Log-Pfade

Umgebung Pfad
Development Console
Production /var/log/collab-server/
Docker docker logs

Log-Rotation

/var/log/collab-server/*.log {
    daily
    rotate 14
    compress
    missingok
    notifempty
}

Troubleshooting

Port bereits belegt

# Prozess finden
lsof -i :4000

# Beenden
kill -9 <PID>

Sockets Timeouts

Nginx Timeout erhöhen:

proxy_read_timeout 86400s;
proxy_send_timeout 86400s;

Memory Leaks

# Node mit erhöhtem Memory-Limit
NODE_OPTIONS="--max-old-space-size=4096" npm start