Deployment

Guide for operating the Collab Server in various environments.

System Requirements

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

Environment Variables

Variable Default Description
PORT 4000 Server port
NODE_ENV development Environment
CONTENT_PATH ./content Path to content
LOG_LEVEL info Log level

Development

# With npm
npm run dev

# With custom content
CONTENT_PATH=../my-content npm run dev

Production Build

# Compile TypeScript
npm run build

# Start
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

Commands

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

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

# With 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

With Certbot (Let's Encrypt)

certbot --nginx -d quiet-frames.de

With Caddy (automatic)

Caddy automatically obtains certificates.

PM2 (Process Manager)

# Installation
npm install -g pm2

# Start
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

External Services

  • Uptime Robot – Availability
  • Sentry – Error tracking
  • Grafana – Metrics

Backup

Content Directory

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

Snapshots

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

Logs

Log Paths

Environment Path
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 Already in Use

# Find process
lsof -i :4000

# Terminate
kill -9 <PID>

Socket Timeouts

Increase Nginx timeout:

proxy_read_timeout 86400s;
proxy_send_timeout 86400s;

Memory Leaks

# Node with increased memory limit
NODE_OPTIONS="--max-old-space-size=4096" npm start