---
title: "Deploy Huly"
description: "Open-source Linear and Jira alternative with issues, chat and docs"
category: "Other"
url: https://railway.com/deploy/huly-2
---

# Deploy Huly

Open-source Linear and Jira alternative with issues, chat and docs

**[Deploy Huly on Railway](https://railway.com/template/huly-2)**

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

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

## Template content

### redpanda

- **Image:** redpandadata/redpanda:v24.3.18@sha256:5c6bdbaf30c97de1ebc2ad417b7d02e0bdb5bf88e243bd3079d74bfde9c7754f
- **Start command:** `/bin/sh -c 'rm -rf /var/lib/redpanda/data/lost+found; H=${RAILWAY_PRIVATE_DOMAIN:-redpanda}; exec rpk redpanda start --kafka-addr internal://[::]:9092 --advertise-kafka-addr internal://$H:9092 --pandaproxy-addr internal://[::]:8082 --advertise-pandaproxy-addr internal://$H:8082 --schema-registry-addr internal://[::]:8081 --rpc-addr [::]:33145 --advertise-rpc-addr $H:33145 --mode dev-container --smp 1 --memory 1G --reserve-memory 0M --default-log-level=info'`

### fulltext

- **Image:** hardcoreeng/fulltext:v0.7.426@sha256:e8670c41aab79b0e4e15230aad61e2e7e886e57cc83796e92ecb3c4d1f99209a
- **Start command:** `/bin/sh -c 'q() { node -p "encodeURIComponent(process.argv[1])" "$1"; }; export STORAGE_CONFIG="s3|${S3_ENDPOINT}?accessKey=$(q "$S3_ACCESS_KEY")&secretKey=$(q "$S3_SECRET_KEY")&region=$(q "${S3_REGION:-auto}")&rootBucket=$(q "$S3_BUCKET")&allowPresign=false"; export ELASTIC_INDEX_NAME=huly_storage_index; exec node --expose-gc bundle.js'`

### collaborator

- **Image:** hardcoreeng/collaborator:v0.7.426@sha256:2747295c2cf5de05d6ea8ec90173891f28ede3064d45354a8069ebfe769f279f
- **Start command:** `/bin/sh -c 'q() { node -p "encodeURIComponent(process.argv[1])" "$1"; }; export STORAGE_CONFIG="s3|${S3_ENDPOINT}?accessKey=$(q "$S3_ACCESS_KEY")&secretKey=$(q "$S3_SECRET_KEY")&region=$(q "${S3_REGION:-auto}")&rootBucket=$(q "$S3_BUCKET")&allowPresign=false"; export COLLABORATOR_PORT=${PORT:-8080}; exec node bundle.js'`

### stats

- **Image:** hardcoreeng/stats:v0.7.426@sha256:9a08a6ec7f80e13d3d3694247087751727227152bb23fdc88f53f8fae1a07183
- **Start command:** `/bin/sh -c 'export PORT=${PORT:-8080}; exec node bundle.js'`

### rekoni

- **Image:** hardcoreeng/rekoni-service:v0.7.426@sha256:d148cefc5e55372a4d5d513626136618f814ee341eff1be9deffbeb74c8b5fed
- **Start command:** `/bin/sh -c 'export PORT=${PORT:-8080}; exec node ./bundle.js'`

### transactor

- **Image:** hardcoreeng/transactor:v0.7.426@sha256:4bbf156ff7ba06c665930d40bb577f6b549d1f9eeaa7270de5d98ac7fdd7465c
- **Start command:** `/bin/sh -c 'q() { node -p "encodeURIComponent(process.argv[1])" "$1"; }; export STORAGE_CONFIG="s3|${S3_ENDPOINT}?accessKey=$(q "$S3_ACCESS_KEY")&secretKey=$(q "$S3_SECRET_KEY")&region=$(q "${S3_REGION:-auto}")&rootBucket=$(q "$S3_BUCKET")&allowPresign=false"; export SERVER_PORT=${PORT:-8080} LAST_NAME_FIRST=true; exec node ./bundle.js'`
- **Health check:** /api/v1/version

### elastic

- **Image:** elasticsearch:7.14.2@sha256:f05ab7f4d2aa5040813a0ea4eb76fa99bb31459937a4539efe2f2c2dbb2109fb
- **Start command:** `/bin/sh -c './bin/elasticsearch-plugin list | grep -q ingest-attachment || ./bin/elasticsearch-plugin install --batch --silent ingest-attachment; printf "cluster.name: huly\nnetwork.host: \"::\"\ndiscovery.type: single-node\nnode.store.allow_mmap: false\nxpack.security.enabled: false\nxpack.ml.enabled: false\ningest.geoip.downloader.enabled: false\n" > config/elasticsearch.yml; export ES_JAVA_OPTS="-Xms512m -Xmx512m" TAKE_FILE_OWNERSHIP=1; exec /usr/local/bin/docker-entrypoint.sh eswrapper'`

### huly

- **Image:** caddy:2.11.9-alpine@sha256:0bbb055bda6793c999bde78b1b5ce3e89f829fb031af2cf50056ea1246559fee
- **Start command:** `/bin/sh -c 'echo ewoJYWRtaW4gb2ZmCglhdXRvX2h0dHBzIG9mZgp9Cjo4MDgwIHsKCXJlcXVlc3RfYm9keSB7CgkJbWF4X3NpemUgMTAwTUIKCX0KCWhhbmRsZSAvX2hlYWx0aHogewoJCXJlc3BvbmQgIm9rIiAyMDAKCX0KCWhhbmRsZV9wYXRoIC9fYWNjb3VudHMqIHsKCQlyZXZlcnNlX3Byb3h5IHskQUNDT1VOVF9IT1NUfQoJfQoJaGFuZGxlX3BhdGggL190cmFuc2FjdG9yKiB7CgkJcmV2ZXJzZV9wcm94eSB7JFRSQU5TQUNUT1JfSE9TVH0KCX0KCWhhbmRsZV9wYXRoIC9fY29sbGFib3JhdG9yKiB7CgkJcmV2ZXJzZV9wcm94eSB7JENPTExBQk9SQVRPUl9IT1NUfQoJfQoJaGFuZGxlX3BhdGggL19yZWtvbmkqIHsKCQlyZXZlcnNlX3Byb3h5IHskUkVLT05JX0hPU1R9Cgl9CgloYW5kbGVfcGF0aCAvX3N0YXRzKiB7CgkJcmV2ZXJzZV9wcm94eSB7JFNUQVRTX0hPU1R9Cgl9CgloYW5kbGUgL2V5SiogewoJCXJldmVyc2VfcHJveHkgeyRUUkFOU0FDVE9SX0hPU1R9Cgl9CgloYW5kbGUgewoJCXJldmVyc2VfcHJveHkgeyRGUk9OVF9IT1NUfQoJfQp9Cg== | base64 -d > /etc/caddy/Caddyfile && exec caddy run --config /etc/caddy/Caddyfile --adapter caddyfile'`
- **Health check:** /_healthz
- **Public domain:** Yes

### workspace

- **Image:** hardcoreeng/workspace:v0.7.426@sha256:9a95e4fc7616fb427111400191a9cff42e5e8e56c893c61bfa15055b1bfadb53
- **Start command:** `/bin/sh -c 'q() { node -p "encodeURIComponent(process.argv[1])" "$1"; }; export STORAGE_CONFIG="s3|${S3_ENDPOINT}?accessKey=$(q "$S3_ACCESS_KEY")&secretKey=$(q "$S3_SECRET_KEY")&region=$(q "${S3_REGION:-auto}")&rootBucket=$(q "$S3_BUCKET")&allowPresign=false"; export MODEL_ENABLED="*"; exec node bundle.js'`

### account

- **Image:** hardcoreeng/account:v0.7.426@sha256:a77b42617b7c88e886458966c0001952c22f882feb44f78e9f6f8d89d7e73c1c
- **Start command:** `/bin/sh -c 'echo IyEvYmluL3NoCiMgSHVseSBhY2NvdW50IHNlcnZpY2UgZm9yIFJhaWx3YXk6IGNyZWF0ZSB0aGUgb3duZXIgYWNjb3VudCBmcm9tIGRlcGxveQojIHZhcmlhYmxlcywgdGhlbiBzZXJ2ZSB3aXRoIHB1YmxpYyBzaWduLXVwIHN3aXRjaGVkIG9mZi4KcSgpIHsgbm9kZSAtcCAiZW5jb2RlVVJJQ29tcG9uZW50KHByb2Nlc3MuYXJndlsxXSkiICIkMSI7IH0KZXhwb3J0IFNUT1JBR0VfQ09ORklHPSJzM3wke1MzX0VORFBPSU5UfT9hY2Nlc3NLZXk9JChxICIkUzNfQUNDRVNTX0tFWSIpJnNlY3JldEtleT0kKHEgIiRTM19TRUNSRVRfS0VZIikmcmVnaW9uPSQocSAiJHtTM19SRUdJT046LWF1dG99Iikmcm9vdEJ1Y2tldD0kKHEgIiRTM19CVUNLRVQiKSZhbGxvd1ByZXNpZ249ZmFsc2UiCmV4cG9ydCBBQ0NPVU5UX1BPUlQ9IiR7UE9SVDotODA4MH0iIE1PREVMX0VOQUJMRUQ9IioiIEFETUlOX0VNQUlMUz0iJEhVTFlfQURNSU5fRU1BSUwiCmlmIFsgLW4gIiRIVUxZX0FETUlOX0VNQUlMIiBdICYmIFsgLW4gIiRIVUxZX0FETUlOX1BBU1NXT1JEIiBdOyB0aGVuCiAgIyBTaG9ydC1saXZlZCBpbnN0YW5jZSB3aXRoIHNpZ24tdXAgb24sIG9uIGEgcG9ydCB0aGUgZ2F0ZXdheSBuZXZlciByb3V0ZXMgdG8uCiAgQUNDT1VOVF9QT1JUPTM5OTkgRElTQUJMRV9TSUdOVVA9ZmFsc2Ugbm9kZSBidW5kbGUuanMgPiAvdG1wL2Jvb3RzdHJhcC5sb2cgMj4mMSAmCiAgQlA9JCEKICBub2RlIC1lICcKY29uc3QgZSA9IHByb2Nlc3MuZW52CmNvbnN0IGJvZHkgPSBKU09OLnN0cmluZ2lmeSh7IG1ldGhvZDogInNpZ25VcCIsIHBhcmFtczogeyBlbWFpbDogZS5IVUxZX0FETUlOX0VNQUlMLCBwYXNzd29yZDogZS5IVUxZX0FETUlOX1BBU1NXT1JELCBmaXJzdE5hbWU6IGUuSFVMWV9BRE1JTl9GSVJTVF9OQU1FIHx8ICJBZG1pbiIsIGxhc3ROYW1lOiBlLkhVTFlfQURNSU5fTEFTVF9OQU1FIHx8ICJVc2VyIiB9IH0pCmNvbnN0IGVuZCA9IERhdGUubm93KCkgKyAxODAwMDAKOyhhc3luYyAoKSA9PiB7CiAgd2hpbGUgKERhdGUubm93KCkgPCBlbmQpIHsKICAgIHRyeSB7CiAgICAgIGNvbnN0IHIgPSBhd2FpdCBmZXRjaCgiaHR0cDovLzEyNy4wLjAuMTozOTk5LyIsIHsgbWV0aG9kOiAiUE9TVCIsIGhlYWRlcnM6IHsgImNvbnRlbnQtdHlwZSI6ICJhcHBsaWNhdGlvbi9qc29uIiB9LCBib2R5IH0pCiAgICAgIGNvbnN0IHQgPSBhd2FpdCByLnRleHQoKQogICAgICBjb25zdCBqID0gSlNPTi5wYXJzZSh0KQogICAgICBpZiAoai5lcnJvcj8uY29kZSA9PT0gInBsYXRmb3JtOnN0YXR1czpBY2NvdW50QWxyZWFkeUV4aXN0cyIpIHsgY29uc29sZS5sb2coIltib290c3RyYXBdIG93bmVyIGFjY291bnQgYWxyZWFkeSBleGlzdHMiKTsgcHJvY2Vzcy5leGl0KDApIH0KICAgICAgaWYgKGoucmVzdWx0Py5hY2NvdW50KSB7IGNvbnNvbGUubG9nKCJbYm9vdHN0cmFwXSBvd25lciBhY2NvdW50IGNyZWF0ZWQiKTsgcHJvY2Vzcy5leGl0KDApIH0KICAgICAgY29uc29sZS5sb2coIltib290c3RyYXBdIHJldHJ5aW5nOiIsIHQuc2xpY2UoMCwgMjAwKSkKICAgIH0gY2F0Y2ggKGVycikge30KICAgIGF3YWl0IG5ldyBQcm9taXNlKChyKSA9PiBzZXRUaW1lb3V0KHIsIDMwMDApKQogIH0KICBwcm9jZXNzLmV4aXQoMSkKfSkoKScKICBSQz0kPwogIGtpbGwgIiRCUCIgMj4vZGV2L251bGw7IHNsZWVwIDM7IGtpbGwgLTkgIiRCUCIgMj4vZGV2L251bGw7IHdhaXQgIiRCUCIgMj4vZGV2L251bGwKICBpZiBbICIkUkMiIC1uZSAwIF07IHRoZW4gZWNobyAiW2Jvb3RzdHJhcF0gY291bGQgbm90IGNyZWF0ZSB0aGUgb3duZXIgYWNjb3VudCI7IHRhaWwgLTQwIC90bXAvYm9vdHN0cmFwLmxvZzsgZXhpdCAxOyBmaQpmaQpleHBvcnQgRElTQUJMRV9TSUdOVVA9dHJ1ZQpleGVjIG5vZGUgYnVuZGxlLmpzCg== | base64 -d > /tmp/start.sh && exec sh /tmp/start.sh'`

### cockroach

- **Image:** cockroachdb/cockroach:v24.2.10@sha256:885d9b0e3243f262976763717e547dbbe75ca999548f7a4ea95fcd30a9aee66c
- **Start command:** `/bin/sh -c 'echo IyEvYmluL2Jhc2gKIyBDb2Nrcm9hY2hEQiBzaW5nbGUgbm9kZSBmb3IgSHVseSBvbiBSYWlsd2F5LiBDZXJ0cyBsaXZlIG9uIHRoZSB2b2x1bWUsIGFuZCB0aGUKIyBIdWx5IGRhdGFiYXNlIGFuZCB1c2VyIGFyZSBjcmVhdGVkIChwYXNzd29yZCBzeW5jZWQpIG9uIGV2ZXJ5IHN0YXJ0LCBiZWNhdXNlCiMgdGhlIGltYWdlJ3Mgb3duIGluaXQgb25seSBydW5zIG9uIGFuIGVtcHR5IGRhdGEgZGlyIChhIHZvbHVtZSBoYXMgbG9zdCtmb3VuZCkuCkQ9L2NvY2tyb2FjaC9jb2Nrcm9hY2gtZGF0YTsgQz0kRC9jZXJ0cwpta2RpciAtcCAiJEMiCmlmIFsgISAtZiAiJEMvbm9kZS5jcnQiIF07IHRoZW4KICAuL2NvY2tyb2FjaCBjZXJ0IGNyZWF0ZS1jYSAtLWNlcnRzLWRpcj0iJEMiIC0tY2Eta2V5PSIkQy9jYS5rZXkiCiAgLi9jb2Nrcm9hY2ggY2VydCBjcmVhdGUtY2xpZW50IHJvb3QgLS1jZXJ0cy1kaXI9IiRDIiAtLWNhLWtleT0iJEMvY2Eua2V5IgogIC4vY29ja3JvYWNoIGNlcnQgY3JlYXRlLW5vZGUgbG9jYWxob3N0IDEyNy4wLjAuMSAiJChob3N0bmFtZSkiICIke1JBSUxXQVlfUFJJVkFURV9ET01BSU46LWNvY2tyb2FjaH0iIC0tY2VydHMtZGlyPSIkQyIgLS1jYS1rZXk9IiRDL2NhLmtleSIKZmkKLi9jb2Nrcm9hY2ggc3RhcnQtc2luZ2xlLW5vZGUgLS1jZXJ0cy1kaXI9IiRDIiAtLXN0b3JlPSIkRC9zdG9yZSIgLS1saXN0ZW4tYWRkcj06MjYyNTcgLS1odHRwLWFkZHI9bG9jYWxob3N0OjgwODAgXAogIC0tYWNjZXB0LXNxbC13aXRob3V0LXRscyAtLWNhY2hlPTI1Nk1pQiAtLW1heC1zcWwtbWVtb3J5PTI1Nk1pQiAmClA9JCEKdHJhcCAna2lsbCAtVEVSTSAkUCcgVEVSTSBJTlQKZm9yIGkgaW4gJChzZXEgMSA5MCk7IGRvIC4vY29ja3JvYWNoIHNxbCAtLWNlcnRzLWRpcj0iJEMiIC1lICJzZWxlY3QgMSIgPiAvZGV2L251bGwgMj4mMSAmJiBicmVhazsgc2xlZXAgMjsgZG9uZQouL2NvY2tyb2FjaCBzcWwgLS1jZXJ0cy1kaXI9IiRDIiAtZSAiQ1JFQVRFIERBVEFCQVNFIElGIE5PVCBFWElTVFMgaHVseTsgQ1JFQVRFIFVTRVIgSUYgTk9UIEVYSVNUUyBodWx5OyBBTFRFUiBVU0VSIGh1bHkgV0lUSCBQQVNTV09SRCAnJENPQ0tST0FDSF9QQVNTV09SRCc7IEdSQU5UIEFMTCBPTiBEQVRBQkFTRSBodWx5IFRPIGh1bHk7IiBcCiAgJiYgZWNobyAiW2luaXRdIGRhdGFiYXNlIGFuZCB1c2VyIGh1bHkgcmVhZHkiIHx8IGVjaG8gIltpbml0XSBjb3VsZCBub3Qgc2V0IHVwIHRoZSBodWx5IGRhdGFiYXNlIgp3YWl0ICRQCg== | base64 -d > /tmp/start.sh && exec bash /tmp/start.sh'`

### front

- **Image:** hardcoreeng/front:v0.7.426@sha256:96d5270cb1f46cbe2d67a9cee79a83f184bbf5b6daf02ee8e2cbbb2522ce759f
- **Start command:** `/bin/sh -c 'q() { node -p "encodeURIComponent(process.argv[1])" "$1"; }; export STORAGE_CONFIG="s3|${S3_ENDPOINT}?accessKey=$(q "$S3_ACCESS_KEY")&secretKey=$(q "$S3_SECRET_KEY")&region=$(q "${S3_REGION:-auto}")&rootBucket=$(q "$S3_BUCKET")&allowPresign=false"; B=${ACCOUNTS_URL%/_accounts}; export GMAIL_URL=$B/_gmail CALENDAR_URL=$B/_calendar TELEGRAM_URL=$B/_telegram LOVE_ENDPOINT=$B/_love SERVER_PORT=${PORT:-8080} UPLOAD_URL=/files TITLE=Huly DEFAULT_LANGUAGE=en LAST_NAME_FIRST=true DESKTOP_UPDATES_CHANNEL=0.7.426 DISABLED_FEATURES=auto-translate,mailboxes DISABLE_SIGNUP=true; exec node ./bundle.js'`
- **Health check:** /api/v1/version

## Buckets

- **Bucket**

## Documentation

# Deploy and Host Huly on Railway

Huly is an open-source, all-in-one project management platform from Hardcore Engineering. It combines issue tracking in the style of Linear or Jira with team chat, shared documents, a knowledge base, planning and HR tools in one workspace. Teams self-host it to keep their project data on their own infrastructure.

## About Hosting Huly

Huly runs as a set of cooperating services: the web front end, an account service, the transactor that streams live changes over WebSockets, a collaborator for real-time document editing, a workspace service that creates and upgrades workspaces, full-text indexing with rekoni for attachments, and a stats service. They store data in CockroachDB, pass events through Redpanda (Kafka-compatible), index text in Elasticsearch and keep files in S3-compatible storage. This template wires all of that together on Railway's private network, puts the data on volumes and a Railway bucket, and exposes everything through one gateway domain. Expect about 2.5 GB of RAM at idle.

## Common Use Cases

* Issue tracking, sprints and milestones for software teams as a Linear or Jira alternative
* Team chat, direct messages and shared documents in the same workspace as the tasks
* A self-hosted knowledge base and planner for teams that need to keep data in-house

## Dependencies for Huly Hosting

* CockroachDB (single node, on a volume) for accounts and workspace data
* Redpanda for the event queue and Elasticsearch 7 for full-text search
* A Railway bucket (S3-compatible) for files and attachments

### Deployment Dependencies

* Huly platform release v0.7.426: https://github.com/hcengineering/platform/releases/tag/v0.7.426
* Upstream self-host setup: https://github.com/hcengineering/huly-selfhost
* Start scripts used by this template: https://github.com/aalfath/huly-railway-template

### Implementation Details

* **First login:** the account service creates the owner account on first start from `HULY_ADMIN_EMAIL` and `HULY_ADMIN_PASSWORD` (generated; find it in the `account` service variables). Log in at your Railway domain, then create your first workspace.
* **Sign-up is closed:** public sign-up is switched off in the account service itself, not only hidden in the UI. Add people to a workspace with invite links from the workspace settings.
* **Admin:** the owner email is also set as Huly's admin, which opens the admin pages for managing workspaces.
* **Gateway:** the public `huly` service is a Caddy reverse proxy that routes `/_accounts`, `/_transactor`, `/_collaborator`, `/_rekoni` and `/_stats` to the private services, like upstream's nginx config.
* **Not included:** e-mail (password reset by e-mail and e-mail invites), video calls (LiveKit), AI bot and GitHub or Telegram integrations. Upstream documents how to add them.
* **Images:** all images are pinned by version and digest (Huly v0.7.426, CockroachDB v24.2.10, Redpanda v24.3.18, Elasticsearch 7.14.2, Caddy 2.11.9). To upgrade, change the Huly image tags together; the workspace service migrates data on start.

## Why Deploy Huly 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 Huly 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/huly-2
