---
title: "Deploy Multica"
description: "Multica on Railway with automatic URL/daemon setup, OpenCode, and Postgres."
category: "AI/ML"
url: https://railway.com/deploy/multica-railway-template
---

# Deploy Multica

Multica on Railway with automatic URL/daemon setup, OpenCode, and Postgres.

**[Deploy Multica on Railway](https://railway.com/template/multica-railway-template)**

- **Creator:** Agaz Self-Host
- **Category:** AI/ML
- **Total deploys:** 1

## Template content

### Frontend

- **Source:** https://github.com/aalfath/multica-railway
- **Health check:** /
- **Public domain:** Yes

### Backend

- **Source:** https://github.com/aalfath/multica-railway
- **Health check:** /healthz
- **Public domain:** Yes

### PG Vector

- **Image:** pgvector/pgvector:pg17

## Documentation

# Deploy and Host Multica on Railway

Deploys Multica as three Railway services:

- **Backend** — builds the Multica Go server and CLI from the `railway-template` branch of `aalfath/multica-railway`. The runtime image includes OpenCode `1.18.23`, Git, and persistent daemon/workspace state under `/app/data`.
- **Frontend** — builds the Next.js web application from `Dockerfile.web`.
- **PG Vector** — runs `pgvector/pgvector:pg17` with persistent PostgreSQL storage.

The Backend volume is mounted at `/app/data`; the PG Vector volume is mounted at `/var/lib/postgresql`. The Backend automatically writes its Railway API/app URLs into the persistent Multica CLI profile and retries daemon startup after authentication is available. No manual setup command is needed just to point the CLI at this deployment. For unattended CLI authentication, set the optional `MULTICA_DAEMON_TOKEN` Railway secret; OpenCode provider login is still interactive.

## About Hosting

Railway hosts the Multica web application, API, daemon runtime, and PostgreSQL-compatible vector database as managed services. Public domains are provisioned automatically, while service-to-service traffic uses Railway's private network.

## Why Deploy

This template provides a reproducible self-hosted Multica installation with persistent backend state, database storage, healthchecks, and an OpenCode-enabled backend image.

## Common Use Cases

- Run a private Multica workspace for engineering or operations teams.
- Run the Multica agent daemon inside the Railway Backend container.
- Keep uploads, OpenCode credentials, workspaces, and PostgreSQL data across redeployments.

## Dependencies for Multica

### Deployment Dependencies

- A Railway account and a workspace with permission to create services and volumes.
- Generated PostgreSQL, JWT, and VCS secret values during deployment.
- OpenCode provider credentials configured after connecting to the Backend with `railway ssh`.

## Configure the Backend daemon

After deployment, use the Railway CLI to open a shell in the Backend and register the LLM provider used by OpenCode:

```bash
railway ssh --service Backend
opencode auth login
opencode auth list
```

The Railway API/app URLs are configured automatically at boot. To authenticate the
Multica CLI against this self-hosted server and start the daemon immediately, run:

```bash
multica setup self-host \
  --server-url "$MULTICA_SERVER_URL" \
  --app-url "$MULTICA_APP_URL"
multica daemon status
```

With both Railway URL variables present, plain `multica setup` also selects the
self-hosted flow automatically. Use `multica setup cloud` only when you want to
connect this container to Multica Cloud.

If the OAuth callback cannot reach the SSH session directly, follow the tunnel hint printed by `multica setup self-host`, or use `multica login --token=` for an interactive token prompt.

For future restarts, set `MULTICA_DAEMON_TOKEN` as a Railway secret containing a
Multica personal access token. The Backend entrypoint uses it to authenticate
the persisted CLI profile before retrying daemon startup. It never replaces
`opencode auth login`, which must be completed interactively to register an LLM
provider.

## Required environment variables

Railway may ask for values that are intentionally not embedded in the template. Use generated values for passwords and secrets.

```dotenv
# PG Vector
POSTGRES_DB=multica
POSTGRES_USER=multica
POSTGRES_PASSWORD=

# Backend
ALLOW_SIGNUP=true
APP_ENV=production
CORS_ALLOWED_ORIGINS=https://${{Frontend.RAILWAY_PUBLIC_DOMAIN}}
DATABASE_URL=postgres://${{PG Vector.POSTGRES_USER}}:${{PG Vector.POSTGRES_PASSWORD}}@${{PG Vector.RAILWAY_PRIVATE_DOMAIN}}:5432/${{PG Vector.POSTGRES_DB}}?sslmode=disable
FRONTEND_ORIGIN=https://${{Frontend.RAILWAY_PUBLIC_DOMAIN}}
JWT_SECRET=
MULTICA_APP_URL=https://${{Frontend.RAILWAY_PUBLIC_DOMAIN}}
MULTICA_DAEMON_SERVER_URL=https://${{RAILWAY_PUBLIC_DOMAIN}}
MULTICA_DATABASE_CONNECT_TIMEOUT=5s
MULTICA_DATABASE_STARTUP_TIMEOUT=3m
MULTICA_DAEMON_TOKEN=
MULTICA_OPENCODE_PATH=/usr/local/bin/opencode
MULTICA_PUBLIC_URL=https://${{RAILWAY_PUBLIC_DOMAIN}}
MULTICA_SERVER_URL=https://${{RAILWAY_PUBLIC_DOMAIN}}
MULTICA_VCS_INTEGRATION_ENABLED=true
MULTICA_VCS_SECRET_KEY=
PORT=8080

# Frontend
HOSTNAME=0.0.0.0
NODE_ENV=production
PORT=3000
RAILWAY_DOCKERFILE_PATH=Dockerfile.web
REMOTE_API_URL=http://${{Backend.RAILWAY_PRIVATE_DOMAIN}}:8080
```

The template creates public service domains automatically. The Backend healthcheck is `/healthz`, and the Frontend healthcheck is `/`.


## Similar templates

- [Chat Chat](https://railway.com/deploy/-WWW5r) — Chat Chat, your own unified chat and search to AI platform.
- [stella](https://railway.com/deploy/stella) — Self-host stella with web, API, Postgres, Redis, and object storage.
- [Hermes Agent | OpenClaw Alternative with Dashboard](https://railway.com/deploy/hermes-agent-or-openclaw-alternative-wit) — Self-Hosted Hermes AI Agent for Telegram, Discord & Slack

Open this page in a browser: https://railway.com/deploy/multica-railway-template
