Wekan is an open-source Kanban board application that provides a self-hosted alternative to Trello. It supports boards, lists, cards, checklists, labels, swimlanes, and a REST API – all running on your own server with full control over your data. The project is actively maintained on GitHub with regular releases.
This guide covers two methods to install Wekan Kanban on Ubuntu 24.04 LTS – via Snap (recommended) and Docker Compose. Both methods include Nginx reverse proxy setup with free Let’s Encrypt SSL certificates for production use.
Prerequisites
- A server running Ubuntu 24.04 LTS with at least 2GB RAM and 2 CPU cores
- A domain name (e.g., wekan.example.com) pointed to your server’s public IP
- Root or sudo access to the server
- Ports 80 (HTTP) and 443 (HTTPS) open in your firewall
Step 1: Update the System
Start by updating your Ubuntu 24.04 packages to the latest versions.
sudo apt update && sudo apt upgrade -y
Step 2: Configure UFW Firewall
Open the required ports for HTTP and HTTPS traffic. If you need a deeper look at UFW firewall commands, check our dedicated guide.
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw allow OpenSSH
sudo ufw enable
Verify the rules are active:
sudo ufw status
You should see ports 80, 443, and 22 listed as ALLOW:
Status: active
To Action From
-- ------ ----
80/tcp ALLOW Anywhere
443/tcp ALLOW Anywhere
OpenSSH ALLOW Anywhere
80/tcp (v6) ALLOW Anywhere (v6)
443/tcp (v6) ALLOW Anywhere (v6)
OpenSSH (v6) ALLOW Anywhere (v6)
Method 1: Install Wekan Kanban Using Snap (Recommended)
Snap is the easiest way to deploy Wekan on Ubuntu 24.04. It bundles Wekan with its own MongoDB instance, so there is nothing extra to install. Note that the Snap stable channel has an older version (v6.09), while the candidate channel carries the latest releases (v8.x). The Wekan developers recommend using the candidate channel until database migrations are finalized for stable.
Install Wekan Snap
Ubuntu 24.04 ships with snapd pre-installed. Install Wekan from the candidate channel to get the latest version:
sudo snap install wekan --channel=candidate
The install output confirms the version and channel:
wekan (candidate) v8.40 from Lauri Ojansivu (xet7) installed
Configure Wekan Root URL and Port
Set the root URL to match your domain. This is critical – Wekan uses this URL for card links, email notifications, and OAuth callbacks. Also set the internal port Wekan listens on (default is 8080, but we use 3001 to avoid conflicts with other services):
sudo snap set wekan root-url='https://wekan.example.com'
sudo snap set wekan port='3001'
Restart the Wekan services to apply the changes:
sudo systemctl restart snap.wekan.wekan
sudo systemctl restart snap.wekan.mongodb
Verify both services are running:
sudo systemctl status snap.wekan.wekan snap.wekan.mongodb
Both services should show active (running) in the output. If Wekan fails to start, check the logs with:
sudo journalctl -u snap.wekan.wekan -f
At this point, Wekan is listening on localhost:3001. Skip ahead to Step 3 to set up Nginx as a reverse proxy with SSL.
Method 2: Install Wekan Using Docker Compose
If you prefer containers, Wekan runs well with Docker Compose using MongoDB 7 as the backend database. First, install Docker and Docker Compose on Ubuntu 24.04 if you have not already.
Create Wekan Directory and Compose File
Create a directory for Wekan and the Docker Compose configuration:
sudo mkdir -p /opt/wekan
sudo vi /opt/wekan/docker-compose.yml
Add the following configuration. Replace https://wekan.example.com with your actual domain:
services:
wekandb:
image: mongo:7
container_name: wekan-db
restart: unless-stopped
command: mongod --logpath /dev/null --oplogSize 128 --quiet
networks:
- wekan-tier
volumes:
- wekan-db:/data/db
- wekan-db-dump:/dump
wekan:
image: ghcr.io/wekan/wekan:latest
container_name: wekan-app
restart: unless-stopped
networks:
- wekan-tier
ports:
- "3001:8080"
environment:
- WRITABLE_PATH=/data
- MONGO_URL=mongodb://wekandb:27017/wekan
- ROOT_URL=https://wekan.example.com
- WITH_API=true
- BROWSER_POLICY_ENABLED=true
depends_on:
- wekandb
volumes:
- wekan-files:/data
volumes:
wekan-db:
wekan-db-dump:
wekan-files:
networks:
wekan-tier:
driver: bridge
Start Wekan Containers
Pull the images and start the containers in detached mode:
cd /opt/wekan
sudo docker compose up -d
Check that both containers are running:
sudo docker compose ps
You should see both wekan-app and wekan-db containers with status “Up”:
NAME IMAGE STATUS PORTS
wekan-app ghcr.io/wekan/wekan:latest Up 30 seconds 0.0.0.0:3001->8080/tcp
wekan-db mongo:7 Up 31 seconds 27017/tcp
Wekan is now accessible on localhost:3001. If you need to view container logs for troubleshooting:
sudo docker compose logs -f wekan
Step 3: Install Nginx Reverse Proxy for Wekan
Both installation methods have Wekan running on port 3001 internally. Nginx serves as the front-facing reverse proxy that handles SSL termination and forwards requests to Wekan.
Install Nginx:
sudo apt install nginx -y
Create a virtual host configuration for Wekan:
sudo vi /etc/nginx/sites-available/wekan.conf
Add the following server block. Replace wekan.example.com with your domain:
server {
listen 80;
server_name wekan.example.com;
location / {
proxy_pass http://127.0.0.1:3001;
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;
}
client_max_body_size 100M;
}
The Upgrade and Connection headers are required because Wekan uses WebSockets for real-time board updates. Without them, cards and lists will not update live.
Enable the site and test the Nginx configuration:
sudo ln -s /etc/nginx/sites-available/wekan.conf /etc/nginx/sites-enabled/
sudo nginx -t
If the syntax test passes, restart Nginx:
sudo systemctl restart nginx
sudo systemctl enable nginx
Step 4: Configure Let’s Encrypt SSL Certificate
Secure your Wekan installation with a free SSL certificate from Let’s Encrypt using Certbot. For more details on certificate management, see our guide on generating Let’s Encrypt SSL certificates on Linux.
Install Certbot and the Nginx plugin:
sudo apt install certbot python3-certbot-nginx -y
Request a certificate for your domain. Certbot automatically modifies the Nginx config to enable HTTPS and set up redirects:
sudo certbot --nginx -d wekan.example.com
Follow the prompts to enter your email and agree to the terms. Certbot will obtain the certificate and update your Nginx configuration automatically. When asked about redirecting HTTP to HTTPS, choose option 2 to redirect all traffic.
Verify the certificate auto-renewal timer is active:
sudo systemctl status certbot.timer
The timer should show as active (waiting), meaning certificates will renew automatically before expiry:
● certbot.timer - Run certbot twice daily
Loaded: loaded (/lib/systemd/system/certbot.timer; enabled)
Active: active (waiting)
Trigger: Sat 2026-03-22 05:23:00 UTC
Test that the renewal process works without actually renewing:
sudo certbot renew --dry-run
Step 5: Access Wekan and Create Admin Account
Open your browser and navigate to https://wekan.example.com. The first user to register becomes the admin account.
Click “Register” and fill in your name, email, and password. After registration, you are logged in and can start creating boards immediately.
To manage users from the admin panel, click your avatar in the top right corner and select “Admin Panel”. From there you can:
- Disable open registration (recommended for private teams)
- Create and manage user accounts
- Configure SMTP settings for email notifications
- Set board defaults and permissions
Step 6: Configure Email Notifications (Optional)
Wekan can send email notifications for card assignments, due dates, and comments. Configure SMTP settings based on your installation method.
For Snap Installation
Set the mail URL and sender address:
sudo snap set wekan mail-url='smtps://user:[email protected]:465'
sudo snap set wekan mail-from='Wekan Notifications <[email protected]>'
sudo systemctl restart snap.wekan.wekan
For Docker Installation
Add the mail environment variables to your docker-compose.yml under the wekan service environment section:
sudo vi /opt/wekan/docker-compose.yml
Add these lines under the environment section of the wekan service:
- MAIL_URL=smtps://user:[email protected]:465
- MAIL_FROM=Wekan Notifications <[email protected]>
Then recreate the container to apply the changes:
cd /opt/wekan
sudo docker compose up -d
Wekan Backup and Maintenance
Regular backups are essential for any self-hosted application. The backup process depends on your installation method.
Snap Backup
The Snap version stores MongoDB data in /var/snap/wekan/common/. Export the database with:
sudo snap run wekan.database-backup
Backup files are saved to /var/snap/wekan/common/db-backups/.
Docker Backup
For Docker, dump the MongoDB database from inside the container:
sudo docker exec wekan-db mongodump --out /dump/wekan-backup-$(date +%F)
Copy the backup from the container volume to the host:
sudo docker cp wekan-db:/dump/ /opt/wekan/backups/
Updating Wekan
For Snap installations, updates happen automatically. To manually update:
sudo snap refresh wekan --channel=candidate
For Docker on Ubuntu 24.04, pull the latest image and recreate the containers:
cd /opt/wekan
sudo docker compose pull
sudo docker compose up -d
Troubleshooting Wekan Installation
Here are common issues and their fixes.
Wekan shows blank page or WebSocket errors – The Nginx reverse proxy config is missing the WebSocket upgrade headers. Make sure proxy_set_header Upgrade and proxy_set_header Connection "upgrade" are present in your Nginx config.
Cards not opening or wrong URLs in emails – The ROOT_URL does not match your actual domain. For Snap, run sudo snap get wekan root-url to verify. For Docker, check the ROOT_URL environment variable in docker-compose.yml.
MongoDB connection errors in Docker – Make sure both containers are on the same Docker network (wekan-tier). Check with sudo docker network inspect wekan_wekan-tier.
File upload fails – Increase the client_max_body_size value in the Nginx config. The default 1M is too small for attachments. Our config sets it to 100M.
If you work with Docker containers regularly, review the Docker Compose documentation for advanced networking and multi-service workflows.
Conclusion
Wekan is now running on Ubuntu 24.04 behind Nginx with Let’s Encrypt SSL. The Snap method is simpler to maintain with automatic updates, while Docker gives you more control over the stack and makes it easier to run alongside other containerized services.
For production environments, disable open user registration from the admin panel, configure SMTP for notifications, and set up automated MongoDB backups on a daily schedule. Monitor disk space on the MongoDB data directory as boards with heavy file attachments grow over time.