Skip to content

VPS Deployment

Deploy on a VPS for full control over your environment.

Providers

ProviderStarting PriceLocationsNotes
DigitalOcean$6/moGlobalSimple, great docs
Linode$5/moGlobalReliable
Vultr$5/moGlobalMany locations
Hetzner€4/moEUGreat value
AWS EC2~$8/moGlobalEnterprise
Use CaseRAMCPUStorage
Small1 GB1 vCPU25 GB
Medium2 GB1 vCPU50 GB
Large4 GB2 vCPU80 GB

Initial Setup

1. Create Server

  1. Choose Ubuntu 22.04 LTS (recommended)
  2. Select your region (close to your users)
  3. Add your SSH key for secure access
  4. Create the server

2. Secure the Server

Terminal window
# Connect via SSH
ssh root@your-server-ip
# Update system
apt update && apt upgrade -y
# Create non-root user
adduser deploy
usermod -aG sudo deploy
# Set up SSH for new user
mkdir -p /home/deploy/.ssh
cp ~/.ssh/authorized_keys /home/deploy/.ssh/
chown -R deploy:deploy /home/deploy/.ssh
chmod 700 /home/deploy/.ssh
chmod 600 /home/deploy/.ssh/authorized_keys
# Disable root login
sed -i 's/PermitRootLogin yes/PermitRootLogin no/' /etc/ssh/sshd_config
systemctl restart sshd

3. Configure Firewall

Terminal window
# Enable UFW
ufw default deny incoming
ufw default allow outgoing
ufw allow ssh
ufw allow http
ufw allow https
ufw enable

Installing Dependencies

Node.js

Terminal window
# Install Node.js 20
curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash -
sudo apt install -y nodejs
# Verify installation
node --version # v20.x.x
npm --version

pnpm

Terminal window
# Install pnpm
npm install -g pnpm
# Or via Corepack
corepack enable pnpm

Git

Terminal window
sudo apt install -y git

Deploying the Application

Clone and Build

Terminal window
# Switch to deploy user
su - deploy
# Clone repository
git clone https://github.com/KevinTrinh1227/discord-forum-api.git
cd discord-forum-api
# Install dependencies
pnpm install
# Build
pnpm build

Configure Environment

Terminal window
# Create environment file
cp .env.example .env
nano .env

Add your configuration:

# Discord
DISCORD_TOKEN=your_bot_token
DISCORD_CLIENT_ID=your_client_id
DISCORD_CLIENT_SECRET=your_client_secret
# Database
DATABASE_TYPE=sqlite
DATABASE_PATH=./data/discord-forum.db
# API
API_PORT=3000
CORS_ORIGIN=https://yourdomain.com
NODE_ENV=production

Initialize Database

Terminal window
pnpm db:push

Process Management with PM2

Install PM2

Terminal window
sudo npm install -g pm2

Create Ecosystem File

Create ecosystem.config.js:

module.exports = {
apps: [
{
name: 'forum-bot',
script: 'packages/bot/dist/index.js',
cwd: '/home/deploy/discord-forum-api',
instances: 1,
autorestart: true,
watch: false,
max_memory_restart: '500M',
env: {
NODE_ENV: 'production',
},
},
{
name: 'forum-api',
script: 'packages/api/dist/index.js',
cwd: '/home/deploy/discord-forum-api',
instances: 'max',
exec_mode: 'cluster',
autorestart: true,
watch: false,
max_memory_restart: '500M',
env: {
NODE_ENV: 'production',
},
},
],
};

Start Services

Terminal window
# Start all services
pm2 start ecosystem.config.js
# Save process list
pm2 save
# Enable startup on boot
pm2 startup
# Follow the instructions it prints

PM2 Commands

Terminal window
pm2 status # View status
pm2 logs # View all logs
pm2 logs forum-bot # View bot logs
pm2 restart all # Restart all
pm2 reload forum-api # Zero-downtime reload
pm2 stop all # Stop all
pm2 monit # Real-time monitoring

Nginx Reverse Proxy

Install Nginx

Terminal window
sudo apt install -y nginx

Configure Site

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;
# Timeout settings
proxy_connect_timeout 60s;
proxy_send_timeout 60s;
proxy_read_timeout 60s;
}
# Health check endpoint
location /health {
proxy_pass http://localhost:3000/health;
access_log off;
}
}

Enable Site

Terminal window
# Create symlink
sudo ln -s /etc/nginx/sites-available/forum-api /etc/nginx/sites-enabled/
# Test configuration
sudo nginx -t
# Reload Nginx
sudo systemctl reload nginx

SSL with Let’s Encrypt

Install Certbot

Terminal window
sudo apt install -y certbot python3-certbot-nginx

Obtain Certificate

Terminal window
sudo certbot --nginx -d api.yourdomain.com

Auto-Renewal

Certbot automatically sets up renewal. Test it:

Terminal window
sudo certbot renew --dry-run

Systemd Services (Alternative to PM2)

Bot Service

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

[Unit]
Description=Discord Forum Bot
After=network.target
[Service]
Type=simple
User=deploy
WorkingDirectory=/home/deploy/discord-forum-api
ExecStart=/usr/bin/node packages/bot/dist/index.js
Restart=on-failure
RestartSec=10
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=forum-bot
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=deploy
WorkingDirectory=/home/deploy/discord-forum-api
ExecStart=/usr/bin/node packages/api/dist/index.js
Restart=on-failure
RestartSec=10
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=forum-api
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
# Check status
sudo systemctl status forum-bot forum-api

Updates and Deployments

Manual Update Script

Create deploy.sh:

#!/bin/bash
set -e
cd /home/deploy/discord-forum-api
# Pull latest changes
git pull origin main
# Install dependencies
pnpm install
# Build
pnpm build
# Run migrations (if any)
pnpm db:migrate
# Restart services
pm2 restart all
echo "Deployment complete!"

Automated Deployment

For GitHub Actions, set up a webhook or use SSH:

.github/workflows/deploy.yml
name: Deploy
on:
push:
branches: [main]
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: Deploy via SSH
uses: appleboy/ssh-action@v1.0.0
with:
host: ${{ secrets.SERVER_HOST }}
username: deploy
key: ${{ secrets.SSH_PRIVATE_KEY }}
script: |
cd /home/deploy/discord-forum-api
./deploy.sh

Monitoring

Log Management

Terminal window
# View PM2 logs
pm2 logs --lines 100
# Or with journalctl (for systemd)
journalctl -u forum-bot -f
journalctl -u forum-api -f

Logrotate

Create /etc/logrotate.d/forum-api:

/home/deploy/.pm2/logs/*.log {
daily
rotate 7
compress
delaycompress
missingok
notifempty
copytruncate
}

Uptime Monitoring

Use external services:

Backup

Database Backup Script

Create backup.sh:

#!/bin/bash
BACKUP_DIR="/home/deploy/backups"
DB_PATH="/home/deploy/discord-forum-api/data/discord-forum.db"
DATE=$(date +%Y%m%d_%H%M%S)
mkdir -p $BACKUP_DIR
# Backup database
cp $DB_PATH "$BACKUP_DIR/discord-forum_$DATE.db"
# Keep only last 7 days
find $BACKUP_DIR -name "*.db" -mtime +7 -delete
echo "Backup complete: discord-forum_$DATE.db"

Cron Job

Terminal window
# Edit crontab
crontab -e
# Add daily backup at 2 AM
0 2 * * * /home/deploy/discord-forum-api/backup.sh

Troubleshooting

Service Won’t Start

Terminal window
# Check logs
pm2 logs forum-bot --lines 50
# or
journalctl -u forum-bot -n 50
# Check if port is in use
sudo lsof -i :3000

High Memory Usage

Terminal window
# Check memory
free -h
pm2 monit
# Restart if needed
pm2 restart forum-api

SSL Certificate Issues

Terminal window
# Check certificate
sudo certbot certificates
# Force renewal
sudo certbot renew --force-renewal