---
title: "Deploy Growi"
description: "Confluence Alternative. Markdown wiki, real-time editing, full-text search"
category: "CMS"
url: https://railway.com/deploy/growi
---

# Deploy Growi

Confluence Alternative. Markdown wiki, real-time editing, full-text search

**[Deploy Growi on Railway](https://railway.com/template/growi)**

- **Creator:** A3A
- **Category:** CMS
- **Total deploys:** 1

## Template content

### growi https://raw.githubusercontent.com/growilabs/growi/master/apps/app/public/favicon.svg

- **Image:** growilabs/growi:latest
- **Health check:** /login
- **Public domain:** Yes

### Redis https://cdn.sanity.io/images/sy1jschh/production/0ce0bfdcfbdbf69662b1116671f97c2dd788b655-157x157.svg

- **Image:** redis:8.2
- **Start command:** `/bin/sh -c "rm -rf $RAILWAY_VOLUME_MOUNT_PATH/lost+found/ && exec docker-entrypoint.sh redis-server --requirepass $REDIS_PASSWORD --save 60 1 --dir $RAILWAY_VOLUME_MOUNT_PATH"`

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

- **Source:** https://github.com/gridalpha/growi-railway

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

- **Source:** https://github.com/gridalpha/growi-railway
- **Health check:** /

## Documentation

![GROWI logo](https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRV1UX4gbOs2oCMEm-RI1IVdvmUeMbX7GDRtP2dqdL8Q5n2MKuYEiE8rw8&s=10)

# Deploy and Host GROWI on Railway

GROWI is an open source team wiki and knowledge base built around markdown. Pages live in a tree, several people can edit one page at once, and everything is searchable full-text — a natural fit for runbooks, onboarding guides and internal documentation that would otherwise scatter across chat threads. It is MIT licensed, at [github.com/growilabs/growi](https://github.com/growilabs/growi).

Deploy GROWI on Railway and the pieces it needs are already wired together: the application (`growilabs/growi`) alongside a MongoDB replica set, an Elasticsearch node carrying the analysis plugins GROWI's search index requires, and a managed Redis for sessions. Self-host GROWI the usual way and you assemble those four yourself; here the app reaches its databases over private networking, the first administrator is created on the initial boot, and only the wiki gets a public URL.

![GROWI Railway architecture](https://res.cloudinary.com/rroe4rtk/image/upload/v1786823359/9256fb60-9a9d-4af5-a801-3f01aab1a82b.png)

## Getting Started with GROWI on Railway

Open the generated Railway URL and you land on the sign-in screen rather than an installation wizard — the administrator is created automatically from the `AUTO_INSTALL_ADMIN_*` variables. Sign in with your username (`admin` by default) and the password in `AUTO_INSTALL_ADMIN_PASSWORD`, readable any time from the service's variables in the Railway dashboard.

Close public registration first: **Admin → Security → ID/Pass**, and change *Registration Mode* from **Open** to **Closed** or **Restricted**. GROWI ships with open sign-up and no environment variable for it, so this is a manual step on every fresh install. Signed-out visitors cannot read pages either way, but leaving it open lets strangers create accounts.

Then create a page with the pencil icon, give it a path such as `/Runbook/Deploy Process`, write markdown and press **Update**. Searching a word from that page confirms Elasticsearch is indexing; **Admin → Elasticsearch management** should report *CONNECTED*.

![GROWI runbook page showing severity table and page tree](https://res.cloudinary.com/rroe4rtk/image/upload/v1786781558/growi-runbook-page.png)
![GROWI full-text search results with highlighted matching text](https://res.cloudinary.com/rroe4rtk/image/upload/v1786781559/growi-search-results.png)
![GROWI markdown editor beside its live rendered preview](https://res.cloudinary.com/rroe4rtk/image/upload/v1786781560/growi-markdown-editor.png)

## About Hosting GROWI

GROWI is a Node.js application storing pages, revisions, users and permissions in MongoDB. Teams self-host it when documentation must stay on infrastructure they control.

- Hierarchical markdown pages with live side-by-side preview
- Real-time collaborative editing
- Full-text search across bodies and titles, including Japanese
- Per-page and per-group access control, plus guest restrictions
- LDAP, Active Directory, OAuth and SAML single sign-on
- Slack and Mattermost integration, audit log, plugin system

Four services make up the template. **GROWI** serves the web UI and API. **MongoDB** is the system of record, run as a single-node replica set because GROWI v8 reads change streams for its audit log and bulk-export jobs. **Elasticsearch** backs full-text search. **Redis** holds sessions, so a redeploy does not sign everyone out.

## Why Deploy GROWI on Railway

Railway removes the setup work between you and a running wiki:

- No Docker Compose, volume wiring or replica-set initialisation by hand
- MongoDB, Elasticsearch and Redis connected over private networking
- Persistent volumes for pages, search indexes and uploads
- Managed TLS, custom domains, and an admin account created on first boot

## Common Use Cases

- **Engineering runbooks** — hierarchical pages and code blocks, searchable at 3am
- **Onboarding handbooks** — an `/Onboarding` tree with per-group access
- **Meeting notes** — collaborative editing live, revision history after
- **Internal API documentation** — markdown owned by the team that writes it

## GROWI vs Confluence vs Wiki.js

| | GROWI | Confluence | Wiki.js |
|---|---|---|---|
| Open source | Yes (MIT) | No | Yes (AGPL) |
| Self-hostable | Yes | Data Center only | Yes |
| Editing | Markdown, real-time | Rich text | Markdown, single editor |
| Search backend | Elasticsearch | Built-in | Database or Elasticsearch |

GROWI fits teams that write markdown and want simultaneous editing without a per-seat licence. Wiki.js is lighter to run but has no real-time co-editing.

## Dependencies for GROWI

- **GROWI** — `growilabs/growi:latest`, the application
- **MongoDB** — `mongodb/mongodb-community-server:8.0-ubi8`, a single-node replica set
- **Elasticsearch** — `docker.elastic.co/elasticsearch/elasticsearch:9.3.8` with `analysis-kuromoji` and `analysis-icu`
- **Redis** — Railway's managed Redis, the session store

MongoDB and Elasticsearch build from a public source repository, [github.com/gridalpha/growi-railway](https://github.com/gridalpha/growi-railway), because both need setup environment variables cannot express: a replica set initialised with a keyfile on first boot, and analysis plugins baked into the image before the index is created.

### Environment Variables Reference

| Variable | Description | Required |
|----------|-------------|----------|
| `APP_SITE_URL` | Public URL, used in links and callbacks | Yes |
| `MONGO_URI` | MongoDB connection string | Yes |
| `PASSWORD_SEED` | Salts stored password hashes — never change | Yes |
| `SECRET_TOKEN` | Signs session cookies — never change | Yes |
| `ELASTICSEARCH_URI` | Search endpoint plus index name | No |
| `ELASTICSEARCH_VERSION` | Search backend major version, `9` here | No |
| `REDIS_URI` | Session store; falls back to MongoDB if unset | No |
| `FILE_UPLOAD` | Attachment backend, `local` writes to the volume | No |
| `AUTO_INSTALL_ADMIN_USERNAME` | First administrator's username | No |
| `AUTO_INSTALL_ADMIN_PASSWORD` | First administrator's password, min 8 characters | No |
| `AUTO_INSTALL_ADMIN_EMAIL` | First administrator's email, must be a real TLD | No |

Rotating `PASSWORD_SEED` invalidates every stored password; rotating `SECRET_TOKEN` signs everyone out.

### Deployment Dependencies

- Source: [github.com/growilabs/growi](https://github.com/growilabs/growi) · [hub.docker.com/r/growilabs/growi](https://hub.docker.com/r/growilabs/growi) · [docs.growi.org](https://docs.growi.org)
- Runtime: Node.js 24.x, MongoDB 6.x or 8.x, Elasticsearch 7.x–9.x, Redis 3.x+

## Server Requirements to Self-Host GROWI

| Resource | Minimum | Recommended |
|---|---|---|
| CPU | 2 vCPU across all services | 4 vCPU |
| RAM (GROWI) | 1 GB | 2 GB |
| RAM (Elasticsearch) | 1 GB heap | 2 GB heap |
| RAM (MongoDB) | 512 MB | 1 GB+ |
| Storage | 5 GB | 20 GB+, grows with attachments |
| Runtime | Node.js 24.x | Node.js 24.x |

Elasticsearch is the memory-hungry component; set `ES_JAVA_OPTS` to about half its container memory. GROWI sizes its own heap.

## Self-Hosting GROWI

GROWI publishes an official Docker Compose setup. Clone it and start the stack:

```
git clone https://github.com/growilabs/growi-docker-compose.git growi
cd growi
docker compose up -d
```

That serves GROWI on port 3000 with MongoDB and Elasticsearch alongside. To run it against databases you already have:

```
docker run -d --name growi -p 3000:3000 \
  -e MONGO_URI=mongodb://mongo:27017/growi \
  -e ELASTICSEARCH_URI=http://elasticsearch:9200/growi \
  -e ELASTICSEARCH_VERSION=9 \
  -e PASSWORD_SEED=$(openssl rand -hex 32) \
  -v growi_data:/data \
  growilabs/growi:latest
```

Two things catch people out. Elasticsearch must have `analysis-kuromoji` and `analysis-icu` installed or index creation fails, because GROWI's mappings reference them for every index, not only Japanese content. And MongoDB must be a replica set, or the audit log and bulk export cannot open change streams.

## Is GROWI Free?

Self-hosted GROWI is free and open source under the MIT licence — no seat limits, no paid tier. On Railway you pay only for the infrastructure the four services consume. GROWI, Inc. also runs a commercial hosted version, GROWI.cloud, priced by user count per plan.

## FAQ

**What is GROWI?**
An open source, markdown-based team wiki with hierarchical pages, real-time collaborative editing, full-text search and per-page permissions. It is commonly used as a self-hosted Confluence alternative.

**What does this Railway template deploy?**
Four services: the GROWI app with a public URL, a single-node MongoDB replica set, an Elasticsearch node with GROWI's required analysis plugins, and managed Redis for sessions. Each data service keeps its own volume.

**Why does this template run MongoDB as a replica set instead of a standalone server?**
GROWI v8 opens change streams for its audit log and bulk-export jobs, and those exist only on a replica set. A standalone server starts fine and then fails those features, so a single-node replica set is initialised on first boot.

**Why is Elasticsearch included, and can I remove it?**
It powers full-text search. GROWI runs without it — search simply stops working — so you can delete the service and unset `ELASTICSEARCH_URI` if page-tree navigation is enough.

**How do I stop strangers signing up on my self-hosted GROWI?**
Set **Admin → Security → ID/Pass → Registration Mode** to *Closed* or *Restricted*. GROWI defaults to open registration and has no environment variable for it, so this is done in the admin UI after deploying.

**Does self-hosted GROWI support SSO?**
Yes — LDAP, Active Directory, OAuth and SAML are configured from **Admin → Security**, with no licence required.


## Similar templates

- [Libredesk - Complete Setup](https://railway.com/deploy/libredesk-complete-setup) — [Jul'26] Complete self-hosted omnichannel customer support desk.
- [Paperless-ngx](https://railway.com/deploy/paperless-ngx-3) — Document management with OCR on Railway with PostgreSQL and Redis
- [Instatic CMS - Postgres](https://railway.com/deploy/instatic-cms-postgres) — Design, build and manage powerful static sites from state-of-the-art CMS

Open this page in a browser: https://railway.com/deploy/growi
