Skip to content

Self-Hosting

This guide covers self-hosting Discord Forum API on your own servers.

Architecture Overview

Discord Forum API consists of two services:

ServicePurposeRequirements
BotConnects to Discord, syncs contentPersistent connection (WebSocket)
APIServes REST endpointsHTTP server

Both services share the same database.

┌─────────────┐
│ Discord │
└──────┬──────┘
│ WebSocket
┌──────▼──────┐
│ Bot │
└──────┬──────┘
│ Write
┌──────▼──────┐
│ Database │◄──── Read ────┐
│ (SQLite/ │ │
│ Turso) │ ┌──────┴──────┐
└─────────────┘ │ API │
└──────┬──────┘
│ HTTP
┌──────▼──────┐
│ Clients │
└─────────────┘

Requirements

ComponentMinimumRecommended
RAM512MB1GB
Storage1GB5GB+
Node.js20.x20.x LTS
OSLinux (any)Ubuntu 22.04

Quick Deploy

  1. Clone and build

    Terminal window
    git clone https://github.com/KevinTrinh1227/discord-forum-api.git
    cd discord-forum-api
    pnpm install
    pnpm build
  2. Configure environment

    Terminal window
    cp .env.example .env
    nano .env # Edit with your values
  3. Initialize database

    Terminal window
    pnpm db:push
  4. Start services

    Terminal window
    # Start both bot and API
    node packages/bot/dist/index.js &
    node packages/api/dist/index.js &

Production Setup with PM2

PM2 is recommended for production deployments.

  1. Install PM2

    Terminal window
    npm install -g pm2
  2. Create ecosystem file

    Create ecosystem.config.js:

    module.exports = {
    apps: [
    {
    name: 'forum-bot',
    script: 'packages/bot/dist/index.js',
    env: {
    NODE_ENV: 'production',
    },
    instances: 1, // Bot must be single instance
    autorestart: true,
    max_restarts: 10,
    restart_delay: 5000,
    },
    {
    name: 'forum-api',
    script: 'packages/api/dist/index.js',
    env: {
    NODE_ENV: 'production',
    },
    instances: 'max', // API can scale
    exec_mode: 'cluster',
    autorestart: true,
    },
    ],
    };
  3. Start with PM2

    Terminal window
    pm2 start ecosystem.config.js
  4. Enable startup on boot

    Terminal window
    pm2 save
    pm2 startup
  5. Monitor processes

    Terminal window
    pm2 status
    pm2 logs
    pm2 monit

PM2 Commands

CommandDescription
pm2 statusView process status
pm2 logsView logs
pm2 restart allRestart all processes
pm2 reload forum-apiZero-downtime reload
pm2 stop allStop all processes

Reverse Proxy with Nginx

Set up Nginx as a reverse proxy for the API.

  1. Install Nginx

    Terminal window
    sudo apt install nginx
  2. Create configuration

    Create /etc/nginx/sites-available/forum-api:

    server {
    listen 80;
    server_name api.yourdomain.com;
    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;
    }
    }
  3. Enable the site

    Terminal window
    sudo ln -s /etc/nginx/sites-available/forum-api /etc/nginx/sites-enabled/
    sudo nginx -t
    sudo systemctl reload nginx
  4. Add SSL with Certbot

    Terminal window
    sudo apt install certbot python3-certbot-nginx
    sudo certbot --nginx -d api.yourdomain.com

systemd Service (Alternative to PM2)

If you prefer systemd over PM2:

Bot Service

Create /etc/systemd/system/forum-bot.service:

[Unit]
Description=Discord Forum Bot
After=network.target
[Service]
Type=simple
User=www-data
WorkingDirectory=/var/www/discord-forum-api
ExecStart=/usr/bin/node packages/bot/dist/index.js
Restart=on-failure
RestartSec=5
Environment=NODE_ENV=production
[Install]
WantedBy=multi-user.target

API Service

Create /etc/systemd/system/forum-api.service:

[Unit]
Description=Discord Forum API
After=network.target
[Service]
Type=simple
User=www-data
WorkingDirectory=/var/www/discord-forum-api
ExecStart=/usr/bin/node packages/api/dist/index.js
Restart=on-failure
RestartSec=5
Environment=NODE_ENV=production
[Install]
WantedBy=multi-user.target

Enable Services

Terminal window
sudo systemctl daemon-reload
sudo systemctl enable forum-bot forum-api
sudo systemctl start forum-bot forum-api

Environment Variables

Production .env example:

# Discord
DISCORD_TOKEN=your_bot_token
DISCORD_CLIENT_ID=your_client_id
DISCORD_CLIENT_SECRET=your_client_secret
# Database (Turso recommended for production)
DATABASE_TYPE=turso
TURSO_DATABASE_URL=libsql://your-db.turso.io
TURSO_AUTH_TOKEN=your-token
# API
NODE_ENV=production
API_PORT=3000
CORS_ORIGIN=https://yourdomain.com
# Optional
LOG_LEVEL=info
SYNC_BOT_MESSAGES=true

Production Checklist

Security

  • Use HTTPS for all API traffic
  • Set restrictive CORS origins
  • Use a secrets manager for credentials
  • Regular security updates
  • Firewall configured (only expose port 443)
  • Bot token rotated regularly

Performance

  • Enable response caching
  • Use CDN for static assets
  • Monitor memory usage
  • Set up database backups
  • Configure log rotation

Monitoring

  • Application logging configured
  • Error tracking (Sentry, etc.)
  • Uptime monitoring
  • Resource alerts (CPU, memory, disk)

Maintenance

  • Automated backups scheduled
  • Update strategy documented
  • Rollback plan ready
  • On-call rotation (if applicable)

Scaling

Horizontal Scaling

For high availability:

ComponentScaling Strategy
APIMultiple instances behind load balancer
BotSingle instance only (Discord limitation)
DatabaseUse Turso for multi-region reads

Database Considerations

For multi-instance API:

  1. SQLite: Not recommended (file locking issues)
  2. Turso: Recommended (handles concurrent access)
  3. PostgreSQL: Coming soon

Caching

The API includes built-in caching. For additional caching:

  • Use Redis for shared cache across instances
  • Configure CDN caching for public endpoints
  • Adjust cache TTLs based on your needs

Troubleshooting

High memory usage

Terminal window
# Check current memory
pm2 monit
# Increase Node.js heap size
NODE_OPTIONS="--max-old-space-size=1024" pm2 restart forum-api

Bot disconnecting

  • Check network stability
  • Verify token is valid
  • Monitor Discord Status
  • Review rate limiting in logs

API slow responses

  • Enable caching if disabled
  • Check database query performance
  • Profile with NODE_DEBUG=http
  • Add indexes if needed

Next Steps