Getting Started with n8n on a VPS
I've heard a lot of good things about n8n, the open-source workflow automation tool. But I never got around to trying it until a few days ago. I borrowed a VPS from a friend and set it up. It was straightforward, but I ran into a couple of hurdles. In this post, I'll share my steps so you can avoid the same issues.
Of course I used Docker, which makes things smooth like butter. Another thing, you need an HTTPS connection for n8n to set up properly. Without it, you'll hit roadblocks.
Here's my docker-compose.yaml
file if you want to try it. Just tweak it to fit your needs.
services:
n8n:
image: docker.n8n.io/n8nio/n8n:latest
container_name: n8n
restart: unless-stopped
ports:
- "5678:5678"
environment:
- N8N_ENFORCE_SETTINGS_FILE_PERMISSIONS=true
- N8N_HOST=domain.com
- N8N_PROTOCOL=https
- N8N_BLOCK_ENV_ACCESS_IN_NODE=false
- N8N_RUNNERS_ENABLED=true
- GENERIC_TIMEZONE=Asia/Dhaka
volumes:
- n8n_data:/home/node/.n8n
networks:
- n8n-network
volumes:
n8n_data:
networks:
n8n-network:
I used Nginx as a reverse proxy. The biggest problem I faced was a websocket error. I also checked the network tab and there was just websocket errors. I kept getting "connection lost" message every time I tried to execute a workflow, no matter what environment variables I changed. I was stuck for hours. Then a friend suggested it might be an Nginx issue, and he was right. n8n relies on websocket connections, but my Nginx config wasn't set up to allow them.
I fixed it by adding these lines to my Nginx site config at /etc/nginx/sites-available/mydomain.com
:
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
Here's the full Nginx config file I ended up with. Remember to replace domain.com
with your actual domain.
server {
listen 443 ssl;
server_name domain.com;
access_log /var/log/nginx/n8n.access.log;
error_log /var/log/nginx/n8n.error.log;
ssl_certificate /etc/letsencrypt/live/domain.com/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/domain.com/privkey.pem; # managed by Certbot
include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
location / {
proxy_pass http://127.0.0.1:5678;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
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;
}
}
server {
if ($host = domain.com) {
return 301 https://$host$request_uri;
} # managed by Certbot
listen 80;
server_name domain.com;
return 404; # managed by Certbot
}
For SSL, I used Certbot
to get a free certificate. First, set up an A
record for your domain in your DNS settings. Then run this command:
sudo certbot --nginx -d domain.com
After that, visit your domain in a browser and finish the n8n setup. It should work smoothly now.
Overall, setting up n8n this way was worth it for custom automations. If you run into issues, double-check your websocket config in Nginx.
Top comments (0)