---
title: "Deploy Odysseus"
description: "odysseus from pewdiepie. Self-hosted AI workspace. odyseus"
category: "AI/ML"
url: https://railway.com/deploy/odysseus
---

# Deploy Odysseus

odysseus from pewdiepie. Self-hosted AI workspace. odyseus

**[Deploy Odysseus on Railway](https://railway.com/template/odysseus)**

- **Creator:** Xav's Projects
- **Category:** AI/ML
- **Total deploys:** 13

## Template content

### chroma https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/webp/chroma.webp

- **Image:** chromadb/chroma:latest

### ntfy https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/png/ntfy.png

- **Image:** binwiederhier/ntfy
- **Start command:** `ntfy serve`
- **Public domain:** Yes

### searxng https://docs.searxng.org/_static/searxng-wordmark.svg

- **Source:** https://github.com/XavTo/odysseus

### odysseus https://bc.xavto.fr/xavto/odysseus-logo2.svg

- **Source:** https://github.com/XavTo/odysseus
- **Public domain:** Yes

## Documentation

# Deploy and Host Odysseus on Railway

Odysseus is a self-hosted AI workspace for chat, agents, tools, documents, memory, research, email, and model integrations. This Railway template deploys Odysseus with supporting services so you can run the web UI online while connecting it to external LLM APIs or a remote OpenAI-compatible endpoint.

## About Hosting Odysseus

This template deploys a multi-service Odysseus stack on Railway: the main Odysseus app, ChromaDB for vector storage, SearXNG for web search, and ntfy for notifications. The services communicate over Railway private networking, while only the Odysseus web app is exposed publicly by default. Persistent volumes are used so application data, uploads, vectors, and service state survive redeploys. This template is intended for cloud-hosted Odysseus usage with external model providers such as OpenAI, OpenRouter, Anthropic-compatible gateways, or a remote Ollama/OpenAI-compatible server. It is not meant to run heavy local LLM inference inside Railway.

## Common Use Cases

- Host a private AI workspace with chat, memory, tools, and document search.
- Use Odysseus with external LLM APIs instead of running local models.
- Run web research workflows through the bundled private SearXNG service.
- Upload documents and query them through Chroma-backed RAG.
- Test agent workflows, reminders, notifications, email tools, and MCP-style integrations.

## Dependencies for Odysseus Hosting

- Odysseus web app
- ChromaDB vector database
- SearXNG metasearch engine
- ntfy notification service
- Railway persistent volumes
- External LLM API key or remote OpenAI-compatible/Ollama endpoint

### Deployment Dependencies

Relevant links:

- Odysseus project: https://github.com/pewdiepie-archdaemon/odysseus
- Odysseus website: https://pewdiepie-archdaemon.github.io/odysseus/
- Chroma Docker deployment: https://cookbook.chromadb.dev/running/running-chroma/
- SearXNG settings: https://docs.searxng.org/admin/settings/index.html
- ntfy configuration: https://docs.ntfy.sh/config/

### Implementation Details

This template creates four Railway services:

```text
odysseus  -> public web app, persistent volume mounted at /app/data
chroma    -> private ChromaDB service, persistent volume mounted at /data
searxng   -> private SearXNG service with JSON search enabled
ntfy      -> private notification service, persistent volume mounted at /var/cache/ntfy
```

Only the `odysseus` service should have a public domain by default. The `chroma`, `searxng`, and `ntfy` services should remain private and communicate with Odysseus through Railway private networking.

#### First Login: Where to Find the Username and Password

After deploying the template, open your Railway project and select the **odysseus** service.

Go to:

```text
odysseus service -> Variables
```

Find these variables:

```env
ODYSSEUS_ADMIN_USER="admin"
ODYSSEUS_ADMIN_PASSWORD="${{secret(32)}}"
```

Railway generates the real password from `${{secret(32)}}` when the template is deployed. In the Railway UI, the generated value is available in the **Variables** tab for the `odysseus` service. Use:

```text
Username: value of ODYSSEUS_ADMIN_USER
Password: value of ODYSSEUS_ADMIN_PASSWORD
```

Then open the public Odysseus URL and log in with those credentials.

If you change `ODYSSEUS_ADMIN_PASSWORD` after the first successful setup, it may not reset an already-created admin account because Odysseus stores auth data in the persistent `/app/data` volume. For a fresh template deployment, the generated variables are the credentials to use for the first login.

#### Recommended Default Model

After first login, go to the Odysseus model/provider settings and configure an external LLM provider.

For the best first experience with tools and memory, set **Claude Sonnet 4.6** as the default model if it is available through your provider. Sonnet is generally a better default than Haiku for tool-heavy workflows such as Memory MCP, RAG, agents, and multi-step tasks.

Haiku can be faster and cheaper, but it may answer directly instead of calling tools in some setups. If you are testing Memory MCP, prefer Sonnet 4.6 first, then switch to Haiku later only after confirming your tools work.

Recommended first model setup:

```text
Default model: Claude Sonnet 4.6
Use for: chat, agents, Memory MCP, RAG, tool use
Avoid for first Memory MCP test: Haiku
```

#### Memory MCP Test

After setting a capable default model such as Claude Sonnet 4.6, test Memory MCP from the Odysseus chat.

Send:

```text
Call the tool mcp__memory__manage_memory with action "add", category "fact", and text "My Railway Odysseus template is working."
```

Then send:

```text
Call the tool mcp__memory__manage_memory with action "search" and text "Railway Odysseus template".
```

Expected result: Odysseus should add the memory, then retrieve it from memory search.

If the model replies that it has no memory access, check that tools/agent mode are enabled in the UI and use Sonnet 4.6 instead of Haiku for the test.

#### Recommended Odysseus Variables

```env
AUTH_ENABLED="true" # enable authentication
LOCALHOST_BYPASS="false" # disable localhost auth bypass for public deployments
ODYSSEUS_ADMIN_USER="admin" # initial admin username
ODYSSEUS_ADMIN_PASSWORD="${{secret(32)}}" # generated admin password shown in Railway Variables

DATABASE_URL="sqlite:///./data/app.db" # SQLite database stored under /app/data

CHROMADB_HOST="${{chroma.RAILWAY_PRIVATE_DOMAIN}}" # private Chroma hostname
CHROMADB_PORT="8000" # internal Chroma port

SEARXNG_INSTANCE="http://${{searxng.RAILWAY_PRIVATE_DOMAIN}}:8080" # private SearXNG URL
NTFY_BASE_URL="http://${{ntfy.RAILWAY_PRIVATE_DOMAIN}}:80" # private ntfy URL

ALLOWED_ORIGINS="https://${{odysseus.RAILWAY_PUBLIC_DOMAIN}}" # public Odysseus origin
SECURE_COOKIES="true" # secure cookies over Railway HTTPS

LLM_HOST="localhost" # compatibility default; not used for local inference on Railway

FASTEMBED_MODEL="sentence-transformers/all-MiniLM-L6-v2" # default embedding model
FASTEMBED_CACHE_PATH="/app/data/fastembed" # persistent FastEmbed cache

CLEANUP_INTERVAL_HOURS="24" # background cleanup interval
ODYSSEUS_INPROCESS_POLLERS="1" # enable internal pollers
ODYSSEUS_INPROCESS_TASKS="1" # enable internal task scheduler
ODYSSEUS_SCRIPT_HOST="localhost" # internal script host

PUID="1000" # non-root runtime user ID
PGID="1000" # non-root runtime group ID

PLAYWRIGHT_BROWSERS_PATH="/ms-playwright" # Playwright browser path inside the image
NODE_OPTIONS="--max-old-space-size=4096" # Node.js memory limit for MCP/Playwright
```

Optional provider variables can be added when needed:

```env
OPENAI_API_KEY="" # optional OpenAI API key
OLLAMA_BASE_URL="" # optional remote Ollama URL
RESEARCH_LLM_ENDPOINT="" # optional Deep Research LLM endpoint
TAVILY_API_KEY="" # optional Tavily Search API key
SERPER_API_KEY="" # optional Serper Search API key
DATA_BRAVE_API_KEY="" # optional Brave Search API key
GOOGLE_API_KEY="" # optional Google API key
GOOGLE_PSE_CX="" # optional Google Programmable Search Engine ID
HF_TOKEN="" # optional Hugging Face token
HUGGING_FACE_HUB_TOKEN="" # optional Hugging Face Hub token
EMBEDDING_URL="" # optional OpenAI-compatible embeddings endpoint
EMBEDDING_MODEL="" # optional embedding model for EMBEDDING_URL
LLM_HOSTS="" # optional additional LLM hosts
```

#### After Deployment

1. Open the public Odysseus URL.
2. Log in using the credentials from the `odysseus` service Variables tab.
3. Add your preferred external model provider in the Odysseus UI.
4. Set Claude Sonnet 4.6 as the default model if available.
5. Test a simple prompt, for example: `Reply only: OK_RAILWAY`.
6. Test Memory MCP with Sonnet 4.6 before trying Haiku.
7. Test web search through SearXNG.
8. Upload a small document and test RAG.
9. Redeploy Odysseus and confirm that your data persists.

For mobile ntfy notifications, expose the `ntfy` service publicly and update the ntfy base URL to the public Railway domain. The default template keeps ntfy private, which is enough for internal Odysseus notification delivery.

## Why Deploy Odysseus 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 Odysseus 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

- [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/odysseus
