n8n is an open-source workflow automation platform — a self-hosted alternative to Zapier and Make (formerly Integromat) that connects over 400 applications and services. Deployed on a Hong Kong VPS, n8n keeps your workflow data and API credentials within Asia-Pacific jurisdiction, eliminates per-task pricing, and runs automations with low-latency access to Chinese market tools like WeChat, Alibaba Cloud, and Baidu services.
This guide deploys n8n on a Hong Kong VPS using Docker Compose with PostgreSQL persistence, Nginx SSL termination, and automated backups.
Why Self-Host n8n on a Hong Kong VPS?
- No per-execution pricing — Zapier charges per task; n8n self-hosted is unlimited executions for the cost of your VPS
- Data sovereignty — credentials and workflow data stay on your infrastructure in Hong Kong, not on US cloud servers
- Asian API connectivity — low-latency access to WeChat Work API, Alibaba Cloud, DingTalk, and other China-adjacent services
- Custom nodes — write your own n8n nodes in JavaScript for proprietary internal APIs
- No workflow limits — run thousands of workflows without hitting plan restrictions
Prerequisites
- Hong Kong VPS: minimum 2 vCPU, 2 GB RAM (4 GB recommended for production)
- Ubuntu 22.04 LTS
- A domain name pointed at your VPS IP
Step 1: Install Docker and Docker Compose
apt update && apt upgrade -y
apt install -y ca-certificates curl gnupg
# Add Docker's GPG key
install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | gpg --dearmor -o /etc/apt/keyrings/docker.gpg
# Add Docker repository
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] \
https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" \
| tee /etc/apt/sources.list.d/docker.list
apt update
apt install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
systemctl enable --now dockerStep 2: Create the n8n Docker Compose Stack
mkdir -p /opt/n8n && cd /opt/n8nCreate /opt/n8n/docker-compose.yml:
version: '3.8'
services:
postgres:
image: postgres:15-alpine
restart: always
environment:
POSTGRES_DB: n8n
POSTGRES_USER: n8n
POSTGRES_PASSWORD: CHANGE_THIS_STRONG_PASSWORD
volumes:
- postgres_data:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U n8n"]
interval: 10s
timeout: 5s
retries: 5
n8n:
image: docker.n8n.io/n8nio/n8n:latest
restart: always
ports:
- "127.0.0.1:5678:5678"
environment:
- DB_TYPE=postgresdb
- DB_POSTGRESDB_HOST=postgres
- DB_POSTGRESDB_DATABASE=n8n
- DB_POSTGRESDB_USER=n8n
- DB_POSTGRESDB_PASSWORD=CHANGE_THIS_STRONG_PASSWORD
- N8N_HOST=n8n.yourdomain.com
- N8N_PORT=5678
- N8N_PROTOCOL=https
- WEBHOOK_URL=https://n8n.yourdomain.com/
- GENERIC_TIMEZONE=Asia/Hong_Kong
- N8N_ENCRYPTION_KEY=GENERATE_RANDOM_32_CHAR_STRING
- EXECUTIONS_DATA_PRUNE=true
- EXECUTIONS_DATA_MAX_AGE=336
volumes:
- n8n_data:/home/node/.n8n
depends_on:
postgres:
condition: service_healthy
volumes:
postgres_data:
n8n_data:Generate a secure encryption key:
openssl rand -hex 16Replace GENERATE_RANDOM_32_CHAR_STRING and CHANGE_THIS_STRONG_PASSWORD with your generated values.
docker compose up -dStep 3: Configure Nginx Reverse Proxy with SSL
apt install nginx certbot python3-certbot-nginx -yCreate /etc/nginx/sites-available/n8n:
server {
listen 80;
server_name n8n.yourdomain.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
server_name n8n.yourdomain.com;
ssl_certificate /etc/letsencrypt/live/n8n.yourdomain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/n8n.yourdomain.com/privkey.pem;
client_max_body_size 50m;
location / {
proxy_pass http://127.0.0.1:5678;
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_read_timeout 300s;
proxy_buffering off;
}
}ln -s /etc/nginx/sites-available/n8n /etc/nginx/sites-enabled/
certbot --nginx -d n8n.yourdomain.com
nginx -t && systemctl reload nginxStep 4: First Login and Setup
Open https://n8n.yourdomain.com in your browser. n8n will prompt you to create an owner account — this is your admin account for the instance. Use a strong password and store it in your password manager.
After login, you will see the n8n canvas. You are ready to build workflows.
Common Automations for Asia-Pacific Businesses
WeChat Work (企业微信) Notifications
n8n includes a WeChat Work node. Connect it with your corporate WeChat Work webhook to send automated alerts for order completions, server monitoring events, or customer inquiries directly to team channels.
Alibaba Cloud SMS
Use the HTTP Request node with Alibaba Cloud SMS API to send transactional SMS messages to mainland Chinese phone numbers — for OTP codes, order confirmations, or shipping updates.
Cross-Border E-Commerce Order Sync
Typical workflow: WooCommerce new order → n8n → create record in Alibaba CRM → send WeChat Work notification to fulfilment team → update inventory in Shopify → send customer confirmation email. This replaces a Zapier workflow that would cost $20–100/month at scale.
Database Monitoring Alerts
Schedule a workflow every 5 minutes to query your MySQL database for anomalies → if query result exceeds threshold → send Telegram alert → create Jira ticket. Pure self-hosted monitoring with zero external SaaS dependency.
Step 5: Automated Backups
cat > /opt/n8n/backup.sh << 'EOF' #!/bin/bash BACKUP_DIR="/opt/n8n/backups" DATE=$(date +%Y%m%d_%H%M%S) mkdir -p $BACKUP_DIR # Backup PostgreSQL docker compose -f /opt/n8n/docker-compose.yml exec -T postgres \ pg_dump -U n8n n8n | gzip > $BACKUP_DIR/n8n_db_$DATE.sql.gz
# Backup n8n data volume
docker run --rm \
-v n8n_n8n_data:/data \
-v $BACKUP_DIR:/backup \
alpine tar czf /backup/n8n_data_$DATE.tar.gz /data
# Keep only last 7 days of backups
find $BACKUP_DIR -name "*.gz" -mtime +7 -delete
echo "Backup completed: $DATE"
EOF
chmod +x /opt/n8n/backup.sh
# Schedule daily backup at 3am HKT
crontab -l | { cat; echo "0 3 * * * /opt/n8n/backup.sh >> /var/log/n8n-backup.log 2>&1"; } | crontab -Updating n8n
cd /opt/n8n
docker compose pull
docker compose up -d
docker image prune -fn8n releases updates frequently. Check the n8n GitHub releases for breaking changes before major version upgrades.
Conclusion
Self-hosting n8n on a Hong Kong VPS eliminates Zapier’s per-task pricing, keeps your automation data and credentials within Asia-Pacific jurisdiction, and provides low-latency access to Chinese market APIs. The Docker Compose deployment with PostgreSQL is production-ready — it persists workflow data through container restarts and provides a clean upgrade path as n8n releases new versions.
For teams currently spending $100+/month on Zapier or Make for high-volume automations, a Hong Kong VPS running self-hosted n8n typically recovers its cost within the first month.
Get started: Browse Server.HK Hong Kong VPS plans — a 2 GB plan handles n8n comfortably for most teams; upgrade to 4 GB for high-concurrency workflow execution.