---
title: "Deploy WeKan"
description: "Open-source Kanban boards with MongoDB, a preset admin and sign-up closed"
category: "Other"
url: https://railway.com/deploy/wekan-1
---

# Deploy WeKan

Open-source Kanban boards with MongoDB, a preset admin and sign-up closed

**[Deploy WeKan on Railway](https://railway.com/template/wekan-1)**

Machine-readable deploy manifest (JSON, validated by TemplateCI): https://railway.com/deploy/wekan-1/manifest.json

- **Creator:** Agaz Self-Host
- **Category:** Other

## Template content

### WeKan https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/wekan.svg

- **Image:** ghcr.io/wekan/wekan:v13.06@sha256:ce944ff0b8a51f2b45e990becc43ddd7b2e9dbb6be29f270f71077be8dbf05ac
- **Start command:** `node -e "const cp=require('child_process');const e=process.env; const app=cp.spawn('bash',['/build/wekan-entrypoint.sh'],{stdio:'inherit',env:Object.assign({METEOR_REACTIVITY_ORDER:'changeStreams,oplog,polling'},e)}); ['SIGTERM','SIGINT'].forEach(s=>process.on(s,()=>app.kill(s))); app.on('exit',c=>process.exit(c==null?1:c)); const L=m=>console.log('[admin-seed] '+m);const W=t=>new Promise(r=>setTimeout(r,t));const S=String.fromCharCode(36)+'set'; (async()=>{ if(!e.WEKAN_ADMIN_PASSWORD){L('WEKAN_ADMIN_PASSWORD not set, skipping');return} const {MongoClient}=require('module').createRequire('/build/programs/server/npm/node_modules/meteor/npm-mongo/node_modules/')('mongodb'); const u='http://127.0.0.1:'+(e.PORT||8080);const n=e.WEKAN_ADMIN_USERNAME||'admin'; for(let i=0;i<450;i++){try{const r=await fetch(u+'/');if(r.ok&&(await r.text()).includes('__meteor_runtime_config__'))break}catch(x){}await W(2000)} const c=await MongoClient.connect(e.MONGO_URL);const db=c.db();const st=db.collection('settings'); try{ if(await db.collection('users').findOne({},{projection:{_id:1}})){L('users exist, nothing to do');return} for(let i=0;i<30&&!(await st.findOne({}));i++)await W(1000); await st.updateMany({},{[S]:{disableRegistration:false}}); try{const r=await fetch(u+'/users/register',{method:'POST',headers:{'content-type':'application/json'},body:JSON.stringify({username:n,email:e.WEKAN_ADMIN_EMAIL||undefined,password:e.WEKAN_ADMIN_PASSWORD})}); L('create admin '+n+': HTTP '+r.status+(r.ok?'':' '+(await r.text())))} finally{await st.updateMany({},{[S]:{disableRegistration:true}});L('public sign-up disabled')} }finally{await c.close()} })().catch(x=>console.error('[admin-seed] error: '+x.message));"`
- **Health check:** /
- **Public domain:** Yes

### MongoDB

- **Image:** mongo:7.0.45@sha256:8bb4442761a63a8dda452744082cdac9644b429807eb977b42324a63cef59ca4
- **Start command:** `/bin/sh -c 'printf "%s" "$MONGO_REPLICA_KEY" > /tmp/rs.key; chmod 400 /tmp/rs.key; chown 999:999 /tmp/rs.key; (until mongosh --quiet -u "$MONGO_INITDB_ROOT_USERNAME" -p "$MONGO_INITDB_ROOT_PASSWORD" --authenticationDatabase admin --eval "try { rs.status().ok } catch (e) { rs.initiate({ _id: \"rs0\", members: [{ _id: 0, host: \"localhost:27017\" }] }).ok }" 2>/dev/null | grep -qx 1; do sleep 3; done; echo "replica set rs0 ready") & exec docker-entrypoint.sh mongod --replSet rs0 --keyFile /tmp/rs.key --ipv6 --bind_ip_all'`

## Documentation

# Deploy and Host WeKan on Railway

WeKan is an open-source, self-hosted Kanban board, a Trello alternative built with Meteor. Teams organise work on boards with swimlanes, lists and cards, and cards carry checklists, labels, due dates, attachments and comments. It has an admin panel, a REST API, webhooks, and LDAP, OAuth2 and CAS sign-in.

## About Hosting WeKan

Hosting WeKan means running the Node.js (Meteor) web app next to a MongoDB database and keeping both the database and the uploaded files on persistent storage. MongoDB runs as a single-node replica set with authentication, so WeKan gets live updates through change streams. `ROOT_URL` has to match the public address, or the links in emails break. A fresh WeKan makes the first person who signs up the administrator, so a public deploy has to claim that account straight away. This template creates the admin account from deploy variables with a generated password on the first boot, then turns off open sign-up.

## Common Use Cases

* Team task boards for software sprints, support queues or content calendars
* A private, self-hosted Trello replacement that keeps your project data under your control
* Personal to-do and project tracking with checklists, due dates and attachments

## Dependencies for WeKan Hosting

* WeKan web app (`ghcr.io/wekan/wekan`, pinned to v13.06 by digest)
* MongoDB 7.0 (`mongo:7.0.45`, pinned by digest), single-node replica set with authentication

### Deployment Dependencies

* WeKan source and documentation: https://github.com/wekan/wekan
* WeKan v13.06 release notes: https://github.com/wekan/wekan/releases/tag/v13.06
* WeKan's upstream MongoDB 7 Docker Compose file: https://github.com/wekan/wekan/blob/v13.06/docker-compose-mongodb-v7.yml
* MongoDB Docker image: https://hub.docker.com/_/mongo

### Implementation Details

**Sign in:** open the public URL and log in as `admin` (or your `WEKAN_ADMIN_USERNAME`). The password is the `WEKAN_ADMIN_PASSWORD` variable on the WeKan service. You can change it after you log in, with Change Password in your member menu.

**Sign-up is closed.** On the first boot only, while the database has no users, the WeKan start command creates the admin account and unticks **Self-Registration** in the Admin Panel (under "Login: Allow"). To add people, use **Invite People** in the same place, or tick Self-Registration again. Later restarts and redeploys leave that setting and your users alone.

**Storage:** MongoDB data is on a volume at `/data/db`. Attachments and avatars are on a volume at `/data` on the WeKan service.

**Email** is not configured. To get invitations, notifications and password resets, add your SMTP server in the Admin Panel email settings, or set the `MAIL_URL` and `MAIL_FROM` variables on the WeKan service.

**Updating:** change the WeKan image tag to a newer release and redeploy. WeKan runs its own schema upgrade at start.


## Why Deploy WeKan on Railway?


Railway is a singular platform to deploy your infrastructure stack. Railway will host your infrastructure so you don't have to deal with configuration, while allowing you to vertically and horizontally scale it.

By deploying WeKan on Railway, you are one step closer to supporting a complete full-stack application with minimal burden. Host your servers, databases, AI agents, and more on Railway.



## Similar templates

- [Rocky Linux](https://railway.com/deploy/rocky-linux) — Hosted Rocky Linux 9 workspace with SSH and persistent storage. 🚀
- [Foundry Virtual Tabletop](https://railway.com/deploy/X5tR6G) — A Self-Hosted & Modern Roleplaying Platform
- [Letta Code Remote](https://railway.com/deploy/letta-code-remote) — Run a Letta Code agent 24/7. No inbound ports, just deploy.

Open this page in a browser: https://railway.com/deploy/wekan-1
