
Workflow automation is no longer a luxury reserved for large engineering teams. Whether you want to sync data between APIs, trigger Slack alerts from a database event, or build complex multi-step pipelines without writing raw code, n8n gives you a self-hosted platform to do all of that on your own infrastructure. This guide walks you through exactly how to install n8n on AlmaLinux 10, covering every step from a fresh server to a secured, browser-accessible n8n instance running behind Nginx with a valid SSL certificate.
n8n (pronounced “nodemation”) is a fair-code licensed, open-source workflow automation tool with over 400 built-in integrations. Unlike Zapier or Make.com, you pay nothing per workflow execution when you self-host it. Your data stays on your server, you control uptime, and you can customize everything.
AlmaLinux 10 is the logical choice for production Linux deployments in 2026. It is a community-maintained, RHEL-compatible distribution that replaced CentOS in most enterprise stacks. It ships with SELinux, dnf, firewalld, and a long-term support lifecycle that makes it rock-solid for hosting services like n8n.
This tutorial is aimed at beginner to intermediate Linux users, developers, and sysadmins who want a clean, repeatable setup using Docker and Nginx. By the end, you will have a fully functional n8n installation on AlmaLinux 10 secured with HTTPS and ready for production use.
Prerequisites
Before you start, make sure you have the following in place:
- A fresh AlmaLinux 10 VPS or bare-metal server (minimum 1 vCPU, 2 GB RAM, 20 GB disk space)
- Root or
sudouser access to the server - A registered domain name with an A record pointing to your server’s public IP address
- Ports 80 (HTTP) and 443 (HTTPS) open or ready to be opened via
firewalld - A valid email address (required for Let’s Encrypt SSL certificate issuance)
- Basic comfort with the Linux terminal and running commands as root
If your DNS A record is freshly created, wait at least 10 to 15 minutes for propagation before running the SSL step. Certbot will fail if it cannot resolve your domain.
Step 1: Update Your AlmaLinux 10 System
The first thing you should always do on a fresh server is apply all available system updates. This patches known security vulnerabilities, updates package metadata, and prevents dependency conflicts during installation.
Run the following commands as root:
dnf update -y
dnf install -y dnf-plugins-core
The dnf update -y command pulls and installs all available package updates without asking for confirmation. The second command installs dnf-plugins-core, which provides the config-manager subcommand that you will need in the next step to add the Docker repository.
If a kernel update gets applied, reboot the server before continuing:
reboot
This makes sure the new kernel loads cleanly and nothing carries stale state into your Docker installation.
Step 2: Install Docker on AlmaLinux 10
Docker will run n8n in an isolated container, which keeps its dependencies completely separate from the rest of your system. AlmaLinux 10 does not ship with Docker CE in its default repositories, so you need to add the official Docker repository manually.
Add the Docker Repository
AlmaLinux 10 is binary-compatible with RHEL 10, and Docker provides a CentOS-compatible repository that works cleanly on it:
dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
This command registers the Docker CE repository on your system. From this point, dnf knows where to pull Docker packages from.
Install Docker Engine and Plugins
Install the Docker engine along with all required components in one command:
dnf install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
Here is what each package does:
docker-ce— the main Docker enginedocker-ce-cli— the command-line client you interact withcontainerd.io— the container runtime that Docker relies ondocker-buildx-plugin— enables multi-platform image buildsdocker-compose-plugin— adds thedocker composev2 subcommand
Enable and Start Docker
systemctl enable --now docker
The --now flag both starts Docker immediately and registers it to launch on every reboot. You do not need to run systemctl start separately.
Verify the Installation
docker version
Expected output (version numbers will vary):
Client: Docker Engine - Community
Version: 28.3.3
API version: 1.51
OS/Arch: linux/amd64
Server: Docker Engine - Community
Engine:
Version: 28.3.3
API version: 1.51 (minimum version 1.24)
OS/Arch: linux/amd64
If you see both Client and Server sections, Docker is running correctly.
Step 3: Install and Configure Nginx as a Reverse Proxy
n8n listens on port 5678 by default. You do not want to expose that port directly to the internet in production. Instead, you place Nginx in front of it as a reverse proxy. Nginx handles incoming requests on ports 80 and 443, then forwards them internally to n8n on port 5678. It also handles SSL termination, which keeps n8n itself simple.
Install Nginx
dnf install -y nginx
systemctl enable --now nginx
systemctl status nginx
The status command lets you confirm Nginx started successfully. Look for Active: active (running) in the output.
Configure the Nginx Reverse Proxy
Create a dedicated configuration file for your n8n domain. Replace your-domain.com with your actual domain name throughout this guide:
nano /etc/nginx/conf.d/your-domain.com.conf
Paste the following server block into the file:
server {
listen 80;
server_name your-domain.com;
location / {
proxy_pass http://localhost:5678/;
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;
}
}
Each proxy_set_header directive passes the original request details to n8n. Without these headers, n8n would see all traffic as coming from localhost instead of the real client IP and protocol.
Save the file with CTRL+O, then exit with CTRL+X.
Test the configuration for syntax errors, then reload Nginx:
nginx -t && systemctl reload nginx
Expected output:
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
Step 4: Open Firewall Ports on AlmaLinux 10
AlmaLinux 10 uses firewalld as its default firewall manager. You need to open ports 80 and 443 so web traffic can reach Nginx, and optionally port 5678 for direct container access during testing.
Run these commands to permanently allow the required services:
firewall-cmd --permanent --add-service=http
firewall-cmd --permanent --add-service=https
firewall-cmd --permanent --add-port=5678/tcp
firewall-cmd --reload
The --permanent flag writes the rule to disk so it survives a reboot. Without it, the rule disappears after the next restart. The --reload flag applies the changes immediately without interrupting existing connections.
You should see success printed after the reload command.
Handle SELinux if Needed
AlmaLinux 10 runs SELinux in enforcing mode by default, which is a good security feature. However, it can block Docker containers from connecting to Nginx. If you run into permission errors after the setup, apply this SELinux boolean instead of disabling enforcement entirely:
setsebool -P httpd_can_network_connect 1
This allows Nginx to proxy to local network ports like 5678 without weakening your overall SELinux policy. The -P flag makes the change persistent across reboots.
Step 5: Install a Free SSL Certificate with Certbot
Running n8n on plain HTTP in production is a security risk. Credentials and workflow data would travel unencrypted over the network. Let’s Encrypt provides free, trusted SSL certificates, and Certbot automates the entire process including renewal.
Install EPEL and Certbot
EPEL (Extra Packages for Enterprise Linux) is required to access the Certbot packages on AlmaLinux 10:
dnf install -y epel-release
dnf install -y certbot python3-certbot-nginx
The python3-certbot-nginx plugin allows Certbot to automatically modify your Nginx configuration and insert the SSL directives without any manual file editing.
Obtain and Install the SSL Certificate
certbot --nginx -d your-domain.com
Certbot will walk you through an interactive setup:
- Enter your email address for renewal and security notices
- Agree to the Let’s Encrypt Terms of Service
- Optionally share your email with the EFF
On success, you will see output similar to this:
Successfully received certificate.
Certificate is saved at: /etc/letsencrypt/live/your-domain.com/fullchain.pem
Key is saved at: /etc/letsencrypt/live/your-domain.com/privkey.pem
This certificate expires on 2026-07-20.
Certbot has set up a scheduled task to automatically renew this certificate in the background.
Congratulations! You have successfully enabled HTTPS on https://your-domain.com
Certbot automatically updates your Nginx config to add HTTPS support and sets up a systemd timer to renew the certificate before expiration. Let’s Encrypt certificates are valid for 90 days and renew automatically.
Reload Nginx one more time to apply everything cleanly:
nginx -t && systemctl reload nginx
Step 6: Deploy n8n with Docker on AlmaLinux 10
With Docker installed, Nginx configured, ports open, and SSL active, you are ready to run n8n. This step is the core of the entire n8n on AlmaLinux 10 setup.
Create a Persistent Docker Volume
Before running the container, create a named Docker volume. This is where n8n stores all its data including workflows, credentials, and settings:
docker volume create n8n_data
Without a persistent volume, every time you stop or restart the container, you lose everything. The volume decouples your data from the container lifecycle.
Run n8n in Production Mode
Use the following command to launch n8n in detached mode with automatic restart enabled:
docker run -d --restart unless-stopped --name n8n \
-p 5678:5678 \
-v n8n_data:/home/node/.n8n \
docker.n8n.io/n8nio/n8n
Here is what each flag does:
-d— runs the container in the background (detached mode)--restart unless-stopped— automatically restarts n8n if it crashes or the server reboots, unless you manually stop it--name n8n— gives the container a friendly name for easy management-p 5678:5678— maps port 5678 inside the container to port 5678 on the host-v n8n_data:/home/node/.n8n— mounts the persistent volume to the n8n data directorydocker.n8n.io/n8nio/n8n— the official n8n image from the n8n Docker registry
Docker will pull the latest n8n image on the first run. You will see layer-by-layer download progress in the terminal.
Verify the Container Is Running
docker ps
You should see your n8n container listed with a status of Up. To watch live logs and confirm n8n started cleanly:
docker logs -f n8n
Press CTRL+C to exit the log stream without stopping the container.
Optional: Use Docker Compose for n8n
If you prefer infrastructure-as-code or plan to add a PostgreSQL database later, Docker Compose is a cleaner option. Create a file called docker-compose.yml:
nano docker-compose.yml
Add the following content:
version: "3"
services:
n8n:
image: docker.n8n.io/n8nio/n8n
restart: unless-stopped
ports:
- "5678:5678"
volumes:
- n8n_data:/home/node/.n8n
volumes:
n8n_data:
Start it with:
docker compose up -d
Stop it cleanly with:
docker compose down
Docker Compose makes it easy to version-control your setup and add services like Redis or PostgreSQL alongside n8n without tangled docker run commands.
Step 7: Access the n8n Web Interface
Open a browser and navigate to your domain:
https://your-domain.com
You should land on the n8n owner account setup screen. Fill in your first name, last name, email address, and a strong password to create the admin account.
After logging in, you will see the n8n workflow canvas, which is the main drag-and-drop interface where you build automation workflows using nodes. The left panel contains the node library with 400+ integrations. The top menu gives you access to the credentials manager, execution history, and settings.
A few things to do right after first login:
- Go to Settings > Personal and confirm your owner account details
- Go to Settings > n8n API and generate an API key if you plan to manage workflows programmatically
- Bookmark the admin URL and store your password in a password manager
Your n8n installation is now live on AlmaLinux 10, running over HTTPS, with persistent storage and automatic container restarts configured.
Troubleshooting Common Issues
Even with a clean setup, things can go wrong. Here are the five most common problems and how to fix them when you configure n8n on AlmaLinux 10.
1. Container fails to start
Run docker logs n8n to read the error. The most common causes are a port conflict on 5678 or incorrect volume permissions. Check if something else is using port 5678 with ss -tlnp | grep 5678.
2. Nginx returns 502 Bad Gateway
This means Nginx can reach port 5678 but nothing is answering. Verify the n8n container is running with docker ps. If it is not listed, start it again with docker start n8n and check logs.
3. Certbot fails with “Connection refused” or “DNS problem”
Two things to check: first, confirm port 80 is open in firewalld with firewall-cmd --list-all. Second, verify your DNS A record has fully propagated by running dig your-domain.com and checking the IP address in the response.
4. SELinux blocks Nginx from proxying to Docker
If you see connect() to 127.0.0.1:5678 failed (13: Permission denied) in the Nginx error log, SELinux is blocking the connection. Fix it permanently with:
setsebool -P httpd_can_network_connect 1
5. n8n login fails after container restart
This usually happens when the N8N_ENCRYPTION_KEY environment variable changes between restarts. If you did not set a fixed key, n8n generates a new one each time, which breaks stored credentials. Set a permanent key by adding -e N8N_ENCRYPTION_KEY=your-long-random-string to your docker run command or as an environment variable in your Compose file.
Congratulations! You have successfully installed n8n. Thanks for using this tutorial for installing n8n workflow automation software and tools on AlmaLinux OS 10 system. For additional help or useful information, we recommend you check the official n8n website.