---
title: "Deploy Evolution CRM | (Just Updated) Open Source Customer Support Inbox And AI Agent CRM With REST API, Admin Generated"
description: "Evolution CRM open source customer support inbox and AI agent CRM, Postgres"
category: "Other"
url: https://railway.com/deploy/evolution-crm-or-j-2
---

# Deploy Evolution CRM | (Just Updated) Open Source Customer Support Inbox And AI Agent CRM With REST API, Admin Generated

Evolution CRM open source customer support inbox and AI agent CRM, Postgres

**[Deploy Evolution CRM | (Just Updated) Open Source Customer Support Inbox And AI Agent CRM With REST API, Admin Generated on Railway](https://railway.com/template/evolution-crm-or-j-2)**

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

- **Creator:** SuperSlowSloth
- **Category:** Other

## Template content

### bot-runtime

- **Image:** evoapicloud/evo-bot-runtime:latest@sha256:f6888bfe2cae42191c74f88b92dbf61a3ae20d94f5d2d35e26628f7527cc4139
- **Start command:** `/bin/sh -c 'echo ZXhwb3J0IExJU1RFTl9BRERSPTo4MDgwIEFJX0NBTExfVElNRU9VVF9TRUNPTkRTPTkwIEFJX1BST0NFU1NPUl9VUkw9aHR0cDovL3Byb2Nlc3Nvci5yYWlsd2F5LmludGVybmFsOjgwMDAKZXhlYyAuL2V2by1ib3QtcnVudGltZQ== | base64 -d > /tmp/boot.sh; exec sh /tmp/boot.sh'`

### crm

- **Image:** evoapicloud/evo-ai-crm-community:latest@sha256:fd284bba566ae08a4f18bd7fda8c0b16e3d092cf81f23b62d179c1375d640e4f
- **Start command:** `/bin/sh -c 'echo ZXhwb3J0IFJBSUxTX0VOVj1wcm9kdWN0aW9uIFJBSUxTX0xPR19UT19TVERPVVQ9dHJ1ZSBSQUlMU19TRVJWRV9TVEFUSUNfRklMRVM9dHJ1ZQpleHBvcnQgUE9TVEdSRVNfUE9SVD01NDMyIFBPU1RHUkVTX1VTRVJOQU1FPXBvc3RncmVzIFBPU1RHUkVTX0RBVEFCQVNFPWV2b2NybSBQT1NUR1JFU19TU0xNT0RFPWRpc2FibGUKZXhwb3J0IEFDVElWRV9TVE9SQUdFX1NFUlZJQ0U9bG9jYWwgRVZPX0ZMT1dfRU5BQkxFRD1mYWxzZSBESVNBQkxFX1RFTEVNRVRSWT10cnVlCmV4cG9ydCBFVk9fQVVUSF9TRVJWSUNFX1VSTD1odHRwOi8vYXV0aC5yYWlsd2F5LmludGVybmFsOjMwMDEKZXhwb3J0IEVWT19BSV9DT1JFX1NFUlZJQ0VfVVJMPWh0dHA6Ly9jb3JlLnJhaWx3YXkuaW50ZXJuYWw6NTU1NQpleHBvcnQgQk9UX1JVTlRJTUVfVVJMPWh0dHA6Ly9ib3QtcnVudGltZS5yYWlsd2F5LmludGVybmFsOjgwODAKZXhwb3J0IEJPVF9SVU5USU1FX1BPU1RCQUNLX0JBU0VfVVJMPWh0dHA6Ly9jcm0ucmFpbHdheS5pbnRlcm5hbDozMDAwCmV4ZWMgL2FwcC9kb2NrZXIvZW50cnlwb2ludHMvcmFpbHMuc2ggc2ggLWMgJ2J1bmRsZSBleGVjIHNpZGVraXEgLUMgY29uZmlnL3NpZGVraXEueW1sICYgZXhlYyBidW5kbGUgZXhlYyByYWlscyBzZXJ2ZXIgLWIgOjogLXAgMzAwMCc= | base64 -d > /tmp/boot.sh; exec sh /tmp/boot.sh'`

### frontend

- **Image:** evoapicloud/evo-ai-frontend-community:latest@sha256:dc1f5b6dae1640cf2630010ddec04daa2d20bf269536ef82c58852c698b7808c
- **Start command:** `/bin/sh -c 'echo ZXhwb3J0IFZJVEVfQVBQX0VOVj1wcm9kdWN0aW9uCnNlZCAtaSAicy9saXN0ZW4gODA7L2xpc3RlbiAke1BPUlQ6LTgwODB9Oy8iIC9ldGMvbmdpbngvY29uZi5kL2RlZmF1bHQuY29uZgpleGVjIC9kb2NrZXItZW50cnlwb2ludC5zaCBuZ2lueCAtZyAiZGFlbW9uIG9mZjsi | base64 -d > /tmp/boot.sh; exec sh /tmp/boot.sh'`
- **Health check:** /health
- **Public domain:** Yes

### redis

- **Image:** redis:7-alpine@sha256:7f7d30b7fdd09467bac58198a1f166dd69789d348d4fe859cccb20e0cf287fbe
- **Start command:** `/bin/sh -c 'chown -R redis:redis /data && exec docker-entrypoint.sh redis-server --requirepass "$REDIS_PASSWORD" --appendonly yes --dir /data'`

### postgres

- **Image:** pgvector/pgvector:pg16@sha256:484e838076e04939d27d3e176e91c86eea96236126023be8d3059761122e579f
- **Start command:** `/bin/sh -c 'echo ZXhwb3J0IFBPU1RHUkVTX1VTRVI9cG9zdGdyZXMgUE9TVEdSRVNfREI9ZXZvY3JtCmNhdCA+IC9kb2NrZXItZW50cnlwb2ludC1pbml0ZGIuZC8wMC1leHRlbnNpb25zLnNxbCA8PCdTUUwnCkNSRUFURSBFWFRFTlNJT04gSUYgTk9UIEVYSVNUUyAidXVpZC1vc3NwIjsKQ1JFQVRFIEVYVEVOU0lPTiBJRiBOT1QgRVhJU1RTIHBnY3J5cHRvOwpDUkVBVEUgRVhURU5TSU9OIElGIE5PVCBFWElTVFMgcGdfdHJnbTsKQ1JFQVRFIEVYVEVOU0lPTiBJRiBOT1QgRVhJU1RTIHBnX3N0YXRfc3RhdGVtZW50czsKQ1JFQVRFIEVYVEVOU0lPTiBJRiBOT1QgRVhJU1RTIHZlY3RvcjsKU1FMCmV4ZWMgZG9ja2VyLWVudHJ5cG9pbnQuc2ggcG9zdGdyZXM= | base64 -d > /tmp/boot.sh; exec sh /tmp/boot.sh'`

### gateway

- **Image:** evoapicloud/evo-crm-gateway:latest@sha256:4dadaa7b5483453f70215231b0f13d3cae50e6ad5e42a5188e9efda3ba9f8eb9
- **Start command:** `/bin/sh -c 'echo ZXhwb3J0IEFVVEhfVVBTVFJFQU09YXV0aC5yYWlsd2F5LmludGVybmFsOjMwMDEKZXhwb3J0IENSTV9VUFNUUkVBTT1jcm0ucmFpbHdheS5pbnRlcm5hbDozMDAwCmV4cG9ydCBDT1JFX1VQU1RSRUFNPWNvcmUucmFpbHdheS5pbnRlcm5hbDo1NTU1CmV4cG9ydCBQUk9DRVNTT1JfVVBTVFJFQU09cHJvY2Vzc29yLnJhaWx3YXkuaW50ZXJuYWw6ODAwMApleHBvcnQgQk9UX1JVTlRJTUVfVVBTVFJFQU09Ym90LXJ1bnRpbWUucmFpbHdheS5pbnRlcm5hbDo4MDgwCk5TPSQoYXdrICcvXm5hbWVzZXJ2ZXIve3ByaW50ICQyOyBleGl0fScgL2V0Yy9yZXNvbHYuY29uZikKWyAtbiAiJE5TIiBdIHx8IE5TPWZkMTI6OjEwCmNhc2UgIiROUyIgaW4gKjoqKSBOUz0iWyROU10iOzsgZXNhYwpUPS9ldGMvbmdpbngvdGVtcGxhdGVzL2RlZmF1bHQuY29uZi50ZW1wbGF0ZQpzZWQgLWkgInN8bGlzdGVuIDMwMzA7fGxpc3RlbiAke1BPUlQ6LTgwODB9O3w7IHN8cmVzb2x2ZXIgMTI3LjAuMC4xMSB2YWxpZD0xMHMgaXB2Nj1vZmY7fHJlc29sdmVyICROUyB2YWxpZD0xMHM7fCIgIiRUIgojIHRoZSBhZG1pbmlzdHJhdG9yIGlzIGJvb3RzdHJhcHBlZCBmcm9tIGluc2lkZSB0aGUgYXV0aCBzZXJ2aWNlOyBhIHB1YmxpYyBjYWxsZXIgbXVzdCBuZXZlciByZWFjaCBmaXJzdC1ydW4gc2V0dXAKc2VkIC1pICdzfGxvY2F0aW9uIH4gXi9zZXR1cCB7fGxvY2F0aW9uID0gL3NldHVwL2Jvb3RzdHJhcCB7IHJldHVybiA0MDQ7IH1cbiAgICBsb2NhdGlvbiB+IF4vc2V0dXAge3wnICIkVCIKZWNobyAiZ2F0ZXdheTogbGlzdGVuPSR7UE9SVDotODA4MH0gcmVzb2x2ZXI9JE5TIgpleGVjIC9kb2NrZXItZW50cnlwb2ludC5zaCBuZ2lueCAtZyAiZGFlbW9uIG9mZjsi | base64 -d > /tmp/boot.sh; exec sh /tmp/boot.sh'`
- **Public domain:** Yes

### core

- **Image:** evoapicloud/evo-ai-core-service-community:latest@sha256:371d826b8d5117c9c554fe3f487750b633cd68ca491615fd592c6dac6ca260d3
- **Start command:** `/bin/sh -c 'echo ZXhwb3J0IFBPUlQ9NTU1NSBEQl9QT1JUPTU0MzIgREJfVVNFUj1wb3N0Z3JlcyBEQl9OQU1FPWV2b2NybSBEQl9TU0xNT0RFPWRpc2FibGUgSldUX0FMR09SSVRITT1IUzI1NgpleHBvcnQgRVZPTFVUSU9OX0JBU0VfVVJMPWh0dHA6Ly9jcm0ucmFpbHdheS5pbnRlcm5hbDozMDAwCmV4cG9ydCBFVk9fQVVUSF9CQVNFX1VSTD1odHRwOi8vYXV0aC5yYWlsd2F5LmludGVybmFsOjMwMDEKZXhwb3J0IEFJX1BST0NFU1NPUl9VUkw9aHR0cDovL3Byb2Nlc3Nvci5yYWlsd2F5LmludGVybmFsOjgwMDAgQUlfUFJPQ0VTU09SX1ZFUlNJT049djEKZXhlYyAuL2VudHJ5cG9pbnQuc2g= | base64 -d > /tmp/boot.sh; exec sh /tmp/boot.sh'`

### processor

- **Image:** evoapicloud/evo-ai-processor-community:latest@sha256:1a97c7bc033658b7dcaacdd0ef10023521490b3a5c80870f60d9a9e7ed09521c
- **Start command:** `/bin/sh -c 'echo ZXhwb3J0IFJFRElTX1BPUlQ9NjM3OSBSRURJU19TU0w9ZmFsc2UgUkVESVNfREI9MSBSRURJU19LRVlfUFJFRklYPWEyYV8gUkVESVNfVFRMPTM2MDAgREVCVUc9ZmFsc2UKZXhwb3J0IEVWT19BVVRIX0JBU0VfVVJMPWh0dHA6Ly9hdXRoLnJhaWx3YXkuaW50ZXJuYWw6MzAwMQpleHBvcnQgRVZPX0FJX0NSTV9VUkw9aHR0cDovL2NybS5yYWlsd2F5LmludGVybmFsOjMwMDAKZXhwb3J0IENPUkVfU0VSVklDRV9VUkw9aHR0cDovL2NvcmUucmFpbHdheS5pbnRlcm5hbDo1NTU1L2FwaS92MQphbGVtYmljIHVwZ3JhZGUgaGVhZApweXRob24gLW0gc2NyaXB0cy5ydW5fc2VlZGVycwpleGVjIHV2aWNvcm4gc3JjLm1haW46YXBwIC0taG9zdCA6OiAtLXBvcnQgODAwMA== | base64 -d > /tmp/boot.sh; exec sh /tmp/boot.sh'`

### auth

- **Image:** evoapicloud/evo-auth-service-community:latest@sha256:820164b846bea44ac9703b2dc6c9ebc9c6224b42bceff7b28fef49ca80d7fc13
- **Start command:** `/bin/sh -c 'echo ZXhwb3J0IFJBSUxTX0VOVj1wcm9kdWN0aW9uIFJBSUxTX0xPR19UT19TVERPVVQ9dHJ1ZQpleHBvcnQgUE9TVEdSRVNfUE9SVD01NDMyIFBPU1RHUkVTX1VTRVJOQU1FPXBvc3RncmVzIFBPU1RHUkVTX0RBVEFCQVNFPWV2b2NybSBQT1NUR1JFU19TU0xNT0RFPWRpc2FibGUKZXhwb3J0IEFDVElWRV9TVE9SQUdFX1NFUlZJQ0U9bG9jYWwgTUZBX0lTU1VFUj1Fdm9DUk0gRE9PUktFRVBFUl9KV1RfSVNTPWV2by1hdXRoLXNlcnZpY2UgRE9PUktFRVBFUl9KV1RfQUxHT1JJVEhNPWhzMjU2CmVjaG8gImF1dGg6IHVpZD0kKGlkIC11KSBzdG9yYWdlIHdyaXRhYmxlOiAkKG1rZGlyIC1wIC9yYWlscy9zdG9yYWdlICYmIHRlc3QgLXcgL3JhaWxzL3N0b3JhZ2UgJiYgZWNobyB5ZXMgfHwgZWNobyBubykiCigKICBpPTAKICB1bnRpbCBjdXJsIC1zZiBodHRwOi8vWzo6MV06MzAwMS9oZWFsdGggPi9kZXYvbnVsbCAyPiYxOyBkbwogICAgaT0kKChpKzEpKTsgWyAiJGkiIC1ndCAxODAgXSAmJiB7IGVjaG8gImJvb3RzdHJhcDogYXV0aCBuZXZlciBiZWNhbWUgaGVhbHRoeSI7IGV4aXQgMDsgfQogICAgc2xlZXAgNQogIGRvbmUKICBpZiBjdXJsIC1zIGh0dHA6Ly9bOjoxXTozMDAxL3NldHVwL3N0YXR1cyB8IGdyZXAgLXEgJyJhY3RpdmUiJzsgdGhlbgogICAgZWNobyAiYm9vdHN0cmFwOiBhbHJlYWR5IGFjdGl2ZSI7IGV4aXQgMAogIGZpCiAgY3VybCAtcyAtWCBQT1NUIGh0dHA6Ly9bOjoxXTozMDAxL3NldHVwL2Jvb3RzdHJhcCAtSCAiQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9qc29uIiBcCiAgICAtZCAie1wiZmlyc3RfbmFtZVwiOlwiQWRtaW5cIixcImxhc3RfbmFtZVwiOlwiVXNlclwiLFwiZW1haWxcIjpcIiRBRE1JTl9FTUFJTFwiLFwicGFzc3dvcmRcIjpcIiRBRE1JTl9QQVNTV09SRFwiLFwicGFzc3dvcmRfY29uZmlybWF0aW9uXCI6XCIkQURNSU5fUEFTU1dPUkRcIn0iIFwKICAgIHwgY3V0IC1jMS0yMDAKICBlY2hvCiAgZWNobyAiYm9vdHN0cmFwOiBkb25lIgopICYKZXhlYyAvdXNyL2xvY2FsL2Jpbi9ldm8tYXV0aC1lbnRyeXBvaW50IHNoIC1jICdidW5kbGUgZXhlYyBzaWRla2lxIC1DIGNvbmZpZy9zaWRla2lxLnltbCAmIGV4ZWMgYnVuZGxlIGV4ZWMgcmFpbHMgc2VydmVyIC1iIDo6IC1wIDMwMDEn | base64 -d > /tmp/boot.sh; exec sh /tmp/boot.sh'`

## Documentation

# Deploy and Host Evolution CRM on Railway

**Built for an LLM agent to deploy and use.** The deploy form has nothing to fill in: every secret is generated, the administrator account is created at first boot, and the database, cache and uploads survive redeploys. Evolution CRM is the open-source customer support and sales CRM: a shared inbox for conversations, contacts, pipelines, and AI agents that answer and route messages, with a REST API in front of all of it.

## About Hosting Evolution CRM

This template runs nine services from the upstream Evolution CRM community images, each pinned by digest. **gateway** is the public API front door on one domain and routes to the other services. **frontend** is the web interface and points at the gateway. **auth** is the account service (users, tokens, MFA) and creates the administrator at first boot. **crm** holds conversations, contacts and pipelines, with its background worker in the same container. **core** and **processor** run the AI agents. **bot-runtime** runs chatbots. **postgres** (pgvector, one database shared by the services) and **redis** carry the state, each on a volume.

**No default login.** The administrator is `ADMIN_EMAIL` (admin at the gateway domain), created from the generated `ADMIN_PASSWORD`. The public gateway refuses the first-run setup route, so nobody can claim the instance by posting to it; the administrator is created from inside the auth service within seconds of it starting.

**What the template fixes for Railway.** Services reach each other over the private network, so every internal address is the service's `railway.internal` name. The gateway listens on Railway's injected `PORT` and resolves names through Railway's own DNS. The shared secrets (token signing keys, the agent encryption key, the service-to-service token) are generated once and referenced by every service that needs them, so a redeploy keeps every session and every stored credential valid.

**Using it.** Open the frontend domain, sign in with `ADMIN_EMAIL` and `ADMIN_PASSWORD` (read both from the auth service variables), then connect an inbox, add contacts and build a pipeline. The API is on the gateway domain; the same account signs in there.

### Agent contract

- Public URL: `https://RAILWAY_SERVICE_GATEWAY_URL` (the generated domain of the `gateway` service, also the part of `ADMIN_EMAIL` after the at sign); the web interface is on the `frontend` service domain
- Private URL: `http://gateway.railway.internal:8080`
- Credentials: the variable `ADMIN_PASSWORD` on the `auth` service
- Login name: the variable `ADMIN_EMAIL` on the `auth` service (a public identifier, not a secret)
- Auth: `POST /api/v1/auth/login` with JSON `email` and `password` returns a bearer token in `data.token.access_token`; every other `/api/v1` call sends it as `Authorization: Bearer TOKEN`. A request with no token or a wrong one answers `401`.
- Health: `GET /setup/status` returns 200 with `"status":"active"` once the administrator exists

```bash
#!/bin/sh
# needs: ADMIN_EMAIL, ADMIN_PASSWORD (variables of the auth service); also curl. ADMIN_EMAIL is admin@ plus the gateway's public domain.
D="${ADMIN_EMAIL#admin@}"; R="https://$D"; J="Content-Type: application/json"; B=$(mktemp)
n=0; until curl -s "$R/setup/status" | grep -q '"active"'; do n=$((n+1)); [ "$n" -le 90 ] || break; sleep 5; done
n=0; until [ "$(curl -s -o /dev/null -w '%{http_code}' "$R/api/v1/contacts")" = 401 ]; do n=$((n+1)); [ "$n" -le 90 ] || break; sleep 5; done
curl -s "$R/setup/status" | grep -o '"status":"[a-z]*"' | sed 's/^/setup /'
# sign in as the administrator created at first boot; the answer carries a bearer token
curl -s -o "$B" -w "login: %{http_code}\n" -H "$J" -d "{\"email\":\"$ADMIN_EMAIL\",\"password\":\"$ADMIN_PASSWORD\"}" "$R/api/v1/auth/login"
T=$(sed -n 's/.*"access_token":"\([^"]*\)".*/\1/p' "$B"); A="Authorization: Bearer $T"
curl -s -o /dev/null -w "read with token: %{http_code}\n" -H "$A" "$R/api/v1/contacts"
curl -s -o "$B" -w "write with token: %{http_code}\n" -H "$A" -H "$J" -d '{"name":"Railway Check","email":"check@example.com"}' "$R/api/v1/contacts"
C=$(sed -n 's/.*"contact":{"id":"\([^"]*\)".*/\1/p' "$B")
curl -s -H "$A" "$R/api/v1/contacts" | grep -c "$C" | sed 's/^/contact found after write: /'
curl -s -o /dev/null -w "delete with token: %{http_code}\n" -X DELETE -H "$A" "$R/api/v1/contacts/$C"
curl -s -o /dev/null -w "read without token: %{http_code}\n" "$R/api/v1/contacts"
curl -s -o /dev/null -w "write without key: %{http_code}\n" -X POST -H "$J" -d '{"name":"Anonymous"}' "$R/api/v1/contacts"
curl -s -o /dev/null -w "write wrong token: %{http_code}\n" -X POST -H "Authorization: Bearer wrong" -H "$J" -d '{"name":"Anonymous"}' "$R/api/v1/contacts"
curl -s -o /dev/null -w "public bootstrap: %{http_code}\n" -X POST -H "$J" -d '{}' "$R/setup/bootstrap"
```

A fresh deploy prints `setup "status":"active"`, `login: 200`, `read with token: 200`, `write with token: 201`, `contact found after write: 1` and `delete with token: 200`. The refusals print `read without token: 401`, `write without key: 401`, `write wrong token: 401` and `public bootstrap: 404`: a request with no token or a wrong one creates nothing, and first-run setup cannot be reached from outside.

## Why Deploy Evolution CRM 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 Evolution CRM 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.

- **Agent-ready** - generated secrets, a contract block and one script that proves sign-in, an authenticated write, read-back and delete, and the refusal of a read and a write with no token or a wrong one.
- **No setup form and no default login** - the administrator is created at boot from a generated password.
- **Data survives redeploys** - conversations and contacts sit in Postgres on a volume, uploads and the cache on their own volumes.
- **One public API domain** - the gateway fronts auth, CRM and agent services.
- **Pinned** - every upstream image is pinned by digest.

## Common Use Cases

- **Shared customer support inbox** - one place for conversations from every channel, with assignment and history.
- **Sales pipelines and contact management** - track leads through stages and keep one record per customer.
- **AI agents that answer and route messages** - agents read a conversation, reply or hand it to a person.
- **CRM automation for AI agents** - an agent signs in, creates contacts and reads conversations over the REST API.

## Dependencies for Evolution CRM Hosting

- The nine services above, created by the template. Channel connections (WhatsApp, email, chat widgets) and AI provider keys are added inside Evolution CRM afterwards.

### Deployment Dependencies

- [Evolution CRM repository](https://github.com/evolution-foundation/evo-crm-community)
- [Evolution Foundation](https://github.com/evolution-foundation)


## 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/evolution-crm-or-j-2
