Практика развертывания Odysseus: собрать полностью самохостинговую AI-рабочую станцию за 30 минут

June 9, 2026

Коротко: Хотите «сбежать» из веба ChatGPT/Claude и установить целую AI-рабочую станцию на своей машине? Эта статья проведёт вас через Odysseus — локально-ориентированную, приватность-первую замену ChatGPT с самохостингом.

Обзор проекта

Odysseus — это самохостинговая AI-рабочая станция (Self-hosted AI Workspace) от пользователя GitHub pewdiepie-archdaemon, open source по лицензии MIT. Его идея в следующем: запускать у себя на компьютере UI-опыт уровня ChatGPT / Claude, но все данные, все диалоги и все вызовы инструментов остаются локально.

По сравнению с традиционными приложениями в духе ChatGPT, отличия здесь предельно ясные:

  • Чат: подключайте любые локальные или удалённые модели (vLLM / llama.cpp / Ollama / OpenRouter / OpenAI / GitHub Copilot)
  • Агент: по-настоящему «умеющий руками» агент, который работает с MCP / Web / файлами / Shell / Skills / памятью (на базе opencode)
  • Cookbook: автоматически сканирует железо, рекомендует модели, которые реально запускаются, и одним кликом делает download + старт сервиса (на базе llmfit, с учётом VRAM)
  • Deep Research: многошаговое исследование — сбор + чтение + синтез, с выводом в виде визуализированного отчёта (переработка Tongyi DeepResearch)
  • Compare: слепое сравнение нескольких моделей и беспристрастный выбор реально удобной
  • Documents: вы пишете текст, а AI помогает рядом — не наоборот
  • Memory / Skills: долговременная память + система навыков — агент с каждым использованием всё лучше понимает вас (ChromaDB + fastembed ONNX)
  • Email: IMAP/SMTP почтовый ящик — AI автоматически сортирует, делает сводки, готовит черновики ответов и отсекает спам
  • Notes & Tasks / Calendar: заметки + задачи + календарь, синхронизация CalDAV с Radicale / Nextcloud / Apple / Fastmail
  • Поддержка PWA: на телефоне ощущается почти как на десктопе, можно поставить на главный экран

Одной фразой: это не просто чат-окно — это целая ваша AI-среда, полностью на вашей машине, без облака.

Сложность / время / что вы получите

  • Сложность: ⭐⭐⭐ (средний уровень, нужны базовые знания Docker / Python)
  • Время: 30–45 минут (через Docker); 1 час (нативная установка + подключение локальной модели)
  • Что вы получите:
    • Запущенный набор функций полноценной самохостинговой AI-рабочей станции
    • Понимание типичной архитектуры локально-ориентированных AI-приложений (FastAPI + ChromaDB + SearXNG + ntfy)
    • Подключение всех API-вариантов Ollama / vLLM / OpenAI в один общий интерфейс
    • Понимание возможностей «с длинным хвостом» в стиле Cookbook: автоподбор модели, GPU-проход, система памяти — и это действительно приятно

Для кого это

  • Хотите перестать платить за ChatGPT Plus / Claude Pro и хранить AI-данные локально
  • Хотите запускать open-source модели на NUC / workstation / сервере с видеопамятью 8G / 16G / 24G и при этом иметь единый интерфейс
  • Full-stack / независимый разработчик: хочется объединить чат / почту / календарь / агентские задачи в одну панель
  • Интересует «самохостинг» у эксплуатационщиков/engineers платформ: хотите увидеть инженерный шаблон для production-уровня FastAPI
  • Уже платили за облачные LLM и ищете способы, которые не настолько больно бьют по кошельку

Если вам нужен только лёгкий чат-интерфейс, Odysseus может не подойти: функций много, старт чуть сложнее, чем у Open WebUI, зато взамен вы получаете целый набор — почта, память, Cookbook, агент.

Ключевые зависимости и среда

Минимальные требования:

ПакетТребование
Python3.11+
Память2 GB (только Web UI) / 8 GB+ (для локальной модели)
Диск5 GB (система + зависимости) / 50 GB+ (если храните несколько GGUF-моделей)
Docker20.10+ (рекомендуется Docker Compose v2)
ОСLinux / macOS / Windows (включая WSL2)

Опционально / с усилением:

ПакетЗачем
OllamaСамейший способ локально поднять модель (дружелюбно к Windows)
vLLM / llama.cppВысокопроизводительный локальный инференс (нужен NVIDIA/AMD GPU)
NVIDIA Container ToolkitЗапуск GPU в Docker
Git for WindowsФоновая закачка/запуск Cookbook в Windows
Tailscale + mkcertБезопасное HTTPS-экспонирование в локалке

TIP

Не хотите возиться с GPU? Используйте Ollama + любой OpenAI-совместимый API — и всё заработает за 5 минут. GPU — это «бонус», а не обязательное условие.

Полное дерево структуры проекта

odysseus/
├── app.py                    # Входная точка FastAPI
├── setup.py                  # Инициализационный скрипт (создание admin / базы данных / директорий)
├── requirements.txt          # Основные зависимости Python
├── requirements-optional.txt # Опциональные зависимости (PDF/Office/voice/STT)
├── docker-compose.yml        # Дефолтная оркестрация (CPU)
├── docker-compose.gpu-nvidia.yml  # Переопределение для NVIDIA GPU
├── docker-compose.gpu-amd.yml     # Переопределение для AMD ROCm
├── Dockerfile
├── core/                     # Слой инфраструктуры
│   ├── auth.py               # Аутентификация / сессии
│   ├── database.py           # Инициализация SQLAlchemy
│   ├── middleware.py
│   ├── constants.py
│   └── atomic_io.py
├── src/                      # Бизнес-логика
│   ├── llm_core.py           # Абстракция большой модели
│   ├── agent_loop.py         # Цикл агента
│   ├── agent_tools.py        # Инструменты агента
│   ├── chat_processor.py     # Обработка чата
│   ├── cookbook_serve_lifecycle.py  # Жизненный цикл сервиса Cookbook-моделей
│   ├── memory_vector.py      # Долгосрочная память ChromaDB
│   ├── deep_research.py      # Глубокое исследование
│   └── ...
├── routes/                   # Роуты FastAPI (40+ модулей)
│   ├── chat_routes.py
│   ├── agent_routes.py
│   ├── cookbook_routes.py    # Рекомендации/скачивание моделей
│   ├── memory_routes.py
│   ├── email_routes.py
│   ├── calendar_routes.py
│   └── ...
├── services/                 # Фоновые сервисы
│   ├── docs/                 # Обработка документов
│   ├── hwfit/                # Сканирование железа (Cookbook)
│   ├── memory/               # Сервис памяти
│   ├── research/             # Сервис исследований
│   ├── search/               # Поиск
│   ├── stt/ tts/             # Преобразование речи в текст / текста в речь
│   └── shell/                # Инструменты Shell
├── static/                   # Фронтенд (index.html + JS/CSS)
├── docs/                     # Сайт документации + скриншоты + demo
├── config/                   # Конфигурация подсемиcервисов вроде SearXNG
├── companion/                # Десктоп-компаньон (macOS)
└── data/                     # Данные пользователя (gitignored, генерируются во время работы)
    ├── app.db                # SQLite
    ├── chroma/               # Векторная база
    ├── uploads/
    ├── personal_docs/
    └── huggingface/          # Кэш моделей

Внутри вам нужно заботиться только о app.py / docker-compose.yml / .env, всё остальное сделает Docker.

Пошаговая инструкция

Шаг 1: Клонируйте репозиторий

git clone https://github.com/pewdiepie-archdaemon/odysseus.git
cd odysseus

WARNING

Ветка dev в репозитории — самая актуальная, но может быть нестабильной. Для продакшена рекомендуется переключиться на main: git checkout main. Дальше пройдём шаги через dev.

Шаг 2: Подготовьте .env (опционально, но рекомендовано)

cp .env.example .env

Минимально рабочий .env выглядит примерно так:

# === LLM точка подключения ===
LLM_HOST=localhost
# Хотите облачный API — доступ в контейнере через host.docker.internal на локальный Ollama
OLLAMA_BASE_URL=http://host.docker.internal:11434/v1

# === Порты и привязка ===
APP_BIND=127.0.0.1
APP_PORT=7000

# === Безопасность (важно!) ===
AUTH_ENABLED=true
LOCALHOST_BYPASS=false
SECURE_COOKIES=false   # Включайте true только при reverse-proxy с HTTPS
ODYSSEUS_ADMIN_USER=admin
# ODYSSEUS_ADMIN_PASSWORD=  # Не укажете — при первом старте сгенерируется случайный и будет выведен в лог

# === Поиск (SearXNG) ===
SEARXNG_INSTANCE=http://searxng:8080

TIP

Доступ к Ollama с другого хоста: при запуске Ollama обязательно слушайте 0.0.0.0, а не loopback:

OLLAMA_HOST=0.0.0.0:11434 ollama serve

Иначе контейнерный host.docker.internal:11434 будет отвергнут Ollama.

Шаг 3: Быстрый старт Docker (рекомендуемый путь)

docker compose up -d --build

Во время сборки будут подтянуты базовые образы и установлены зависимости Python; первый запуск займёт примерно 3–5 минут. Когда увидите, что все четыре контейнера odysseus / chromadb / searxng / ntfy — healthy / running, всё готово:

docker compose ps

Откройте http://localhost:7000 — первая страница это логин. Начальный пароль admin будет в логах терминала:

docker compose logs --tail=200 odysseus | grep -i "temporary\|admin\|password"

Вы должны увидеть что-то вроде:

[odysseus] Created admin user 'admin' with temporary password: aB3x-9pQz-2vRt

WARNING

Этот временный пароль выводится только один раз — при первом старте. Получили — сразу войдите, сразу перейдите в Settings → Account и поставьте свой пароль.

Шаг 4: Проверка, что сервисы действительно здоровы

# 1. Статус контейнеров
docker compose ps

# 2. Логи самого Odysseus (учтите: в первый запуск нужно подтянуть модель — будет задержка)
docker compose logs --tail=120 odysseus

# 3. Действительно ли поднялся ChromaDB (не HTTP-деградация)
docker compose logs odysseus | grep -E "ChromaDB|MemoryVectorStore|DEGRADED"

Если видите DEGRADED, с большой вероятностью chromadb-client конфликтует с chromadb — причины и диагностику смотрите дальше в разделе «Частые вопросы».

Шаг 5: Подключите вашу первую модель

Зайдите в Settings → Models / Providers и выберите путь в зависимости от вашей конфигурации:

Путь A: Ollama уже запущен (самый простой)

Base URL:  http://host.docker.internal:11434/v1
API Key:   (оставьте пустым)
Model:     qwen2.5:7b (или любая другая модель, которая у вас есть локально)

Путь B: Хотите, чтобы Cookbook сам скачал + запустил

Войдите в Cookbook: он просканирует вашу видеопамять, предложит модели, которые реально запускаются, и даст оценку (fit score). Нажимаете «Download» — дальше всё пойдёт через huggingface-cli: модель будет скачана в ./data/huggingface/, затем она будет запущена напрямую через llama.cpp / vLLM.

Путь C: Подключиться к облачному API — вот что обсудим подробнее сегодня

Конфигурация Provider в Odysseus устроена как протоколо-ориентированная: то есть любой сервис, который корректно отвечает на эндпоинты v1/chat/completions или v1/messages, можно просто подставить, указав Base URL — это не только OpenAI/Anthropic официальные, но и собственные gateway’и, и сторонние прокси.

В моём развертывании, «ежедневные» агентские задачи вроде запуска кода/работы с длинными документами я делаю через облачный API по двум причинам:

  1. Локально на 24G GPU квантование 70B уже тяжело, а при включении агента многошаговые вызовы часто приводят к OOM
  2. Модели уровня Claude/GPT на сложное рассуждение всё ещё сильнее, чем Qwen2.5-Coder

Но проблема очевидна — официальный API слишком дорогой. Счёт от Claude Opus за неделю легко переваливает за сотню долларов, а играть «просто так» — это фактически работа на Anyscale.

Моё решение — подключить Defapi с эндпоинтом, совместимым с v1/messages:

# Odysseus Settings → Custom Anthropic Provider
Base URL:  https://api.defapi.org
API Key:   sk-xxxxx                    # берётся в бэкенде defapi.org
Model:     anthropic/claude-sonnet-4.5 # или haiku-4.5 / opus-4.6

Примеры конфигурации: Defapi Claude Sonnet 4.5 (основной инструмент для программирования/длинных документов), Claude Haiku 4.5 (для повседневных агентских вызовов — дешевле).

По факту: при том же объёме диалогов/задач месячный счет по сравнению с подключением к официальному Anthropic снижается более чем наполовину. При этом возможности модели, вызовы инструментов агента, формат prompt’ов и т.п. вообще не меняются — потому что это прокси на уровне протокола; сама модель остаётся той же. Это идеально сочетается с «протокол-драйвен» дизайном Odysseus.

TIP

При использовании Defapi со стороны Odysseus нет правок кода. Вызовы инструментов в agent_tools.py и управление контекстом трогать не нужно: можно даже в Settings настроить «чатику» Sonnet, «Deep Research» — Opus, «агентским задачам» — Haiku, каждый со своим Provider и независимой тарификацией.

Путь D: Подключить GitHub Copilot / OpenRouter и т.п.

Они тоже совместимы с протоколом OpenAI. Base URL задаёте соответственно: https://api.githubcopilot.com / https://openrouter.ai/api/v1 — и всё.

Шаг 6: Первый чат + первая задача для агента

Вернитесь в главное окно, выберите модель и отправьте простой prompt, чтобы проверить связность:

В трёх предложениях представь себя, а затем дай список проверок производительности Linux, который можно использовать сегодня.

Если проходит — значит путь до LLM на вашей стороне открыт.

Дальше проверьте режим Agent: создайте новый диалог, переключитесь на «Agent» и введите:

Посчитай количество строк для всех .py файлов в текущем каталоге, а затем скажи, какой файл больше всего стоит подвергнуть рефакторингу.

Агент сам спланирует:

  1. Вызовет инструмент shell и выполнит find . -name "*.py" | xargs wc -l
  2. Получит результат
  3. Сформирует рекомендации

Это и есть фундаментальное отличие локального Agent от ChatGPT из веба: он реально умеет «делать руками» — у него есть доступ к вашему коду, файлам и терминалу.

Шаг 7 (опционально): Включить GPU

Этот шаг нужен только тогда, когда вы планируете использовать vLLM / SGLang / llama.cpp CUDA — «тяжёлый» локальный инференс. Если используете только Ollama или облачный API, пропускайте.

NVIDIA:

# Быстрая диагностика
scripts/check-docker-gpu.sh

# Установить NVIDIA Container Toolkit (Ubuntu/Debian; нужен sudo)
scripts/check-docker-gpu.sh --install-nvidia-toolkit

# Включить overlay только после успешной проверки проброса GPU
scripts/check-docker-gpu.sh --enable-nvidia-overlay

# Проверка
docker compose exec odysseus nvidia-smi -L

Он добавляет в .env:

COMPOSE_FILE=docker-compose.yml:docker/gpu.nvidia.yml

AMD ROCm:

scripts/check-docker-amd-gpu.sh
# Запишите выведенный RENDER_GID в .env
COMPOSE_FILE=docker-compose.yml:docker/gpu.amd.yml
RENDER_GID=989

WARNING

Проброс GPU ≠ установка CUDA для llama.cpp. nvidia-smi внутри контейнера видит карту — это лишь подтверждает, что устройства проброшены. Но llama.cpp всё ещё нуждается в cudart и CUDA Toolkit runtime — это делается на шаге Cookbook → Dependencies: там нужно «поставить заново», и это не решается на уровне Docker. Сообщение вида Unable to find cudart library как раз означает это.

Шаг 8 (опционально): Включить Playwright MCP (агент через браузер)

В Odysseus уже есть несколько MCP server’ов, но браузерный требует предварительно подтянуть npx:

npx -y @playwright/mcp@latest --version

Перезапустите контейнер Odysseus — и в Agent появится возможность использовать browser MCP (скриншоты, навигация, заполнение форм):

Откройте https://news.ycombinator.com, возьмите первые 10 заголовков и ссылок, и кратко изложите 5 ключевых тем.

Шаг 9 (опционально): Запуск нативно в Windows

git clone https://github.com/pewdiepie-archdaemon/odysseus.git
cd odysseus
powershell -ExecutionPolicy Bypass -File .\launch-windows.ps1

Скрипт автоматически создаст venv → установит зависимости → запустит setup → запустит uvicorn. Откройте http://localhost:7000.

TIP

В Windows локальный vLLM / SGLang не поддерживается. Чтобы запускать модели локально, установите Ollama for Windows, а затем в Settings заполните endpoint как http://localhost:11434/v1. А если хотите Claude/GPT, но без локального инференса — используйте любой облачный API, совместимый с OpenAI.

Шаг 10 (опционально): Дать доступ с телефона

При условии, что Tailscale уже подключён:

ODYSSEUS_HOST=0.0.0.0 docker compose up -d
# или указать в .env
APP_BIND=0.0.0.0

Но голый HTTP наружу в LAN / через Tailscale небезопасен, настоятельно рекомендуется добавить HTTPS через mkcert:

mkcert -install
mkcert -cert-file cert.pem -key-file key.pem 100.x.y.z   # ваш Tailscale IP

python -m uvicorn app:app --host 0.0.0.0 --port 7000 \
  --ssl-certfile=cert.pem --ssl-keyfile=key.pem

На телефоне открывайте https://<tailscale-ip>:7000, установите PWA на главный экран — ощущения почти как у нативного приложения.

Частые проблемы и диагностика

Q1: Порт 7000 занят (часто на macOS)

На macOS AirPlay по умолчанию занимает 7000. Два варианта:

# Вариант 1: поменять порт в .env
APP_PORT=7001
docker compose up -d
# Откройте в браузере http://localhost:7001

# Вариант 2: Apple меню → Настройки системы → Общие → AirPlay Receiver → выключить

Q2: ChromaDB поднялся, но в логах DEGRADED

Чаще всего одновременно установлен chromadb-client и chromadb, и тихо используется HTTP-only режим — векторные возможности «отваливаются». Исправление:

# В запущенном контейнере (или в локальном venv)
./venv/bin/pip uninstall chromadb-client -y
./venv/bin/pip install --force-reinstall chromadb
docker compose restart odysseus

Проверка после фикса: docker compose logs odysseus | grep -E "ChromaDB|MemoryVectorStore" — должно быть успешная инициализация, без DEGRADED.

Q3: Cookbook не видит мой GPU — вижу только iGPU или CPU

По умолчанию Docker пробрасывает все GPU хоста, но если вы монтируете только iGPU или другие карты, почти всегда причина в том, что не установлен NVIDIA Container Toolkit / не настроен runtime: нет nvidia-ctk runtime configure --runtime=docker:

# Диагностика
scripts/check-docker-gpu.sh
# Смотрите вывод — он подскажет, какой шаг не сделан

# Установка + конфиг одним махом (Ubuntu/Debian)
scripts/check-docker-gpu.sh --install-nvidia-toolkit
sudo nvidia-ctk runtime configure --runtime=docker
sudo systemctl restart docker

Q4: Проброс GPU успешен, но в логах llama.cpp пишут Unable to find cudart

С устройствами всё ок, не хватает CUDA runtime. Docker тут не поможет — идите в Cookbook → Dependencies и выполните CUDA-билд для llama-cpp-python заново:

Откройте Cookbook → Dependencies → найдите llama-cpp-python → Reinstall (CUDA build)

Он сам сделает pip install --no-cache-dir llama-cpp-python[cuda], займёт около 2–3 минут.

Q5: Outlook / Office 365 почтовый ящик не подключается

Модуль почты в Odysseus сейчас поддерживает только аутентификацию IMAP + логин/пароль. После 2024 года Microsoft практически везде отключила обычный парольный вход — нужен OAuth. Это пока известное ограничение.

Временное решение: использовать Gmail / Fastmail / собственный почтовый сервис или включить Microsoft App Password (для аккаунта с 2FA), чтобы имитировать вход по паролю.

Q6: Хочу доступ из интернета — как сделать безопасно?

Сразу APP_BIND=0.0.0.0 для публичного выхода = катастрофа. LOCALHOST_BYPASS обходит аутентификацию, а у Agent ещё есть shell-инструменты — такие инстансы быстро появляются в Shodan: за 24 часа сканеры находят кучу «голых» серверов.

Правильная схема:

[Internet] → Cloudflare Access / Tailscale / WireGuard
            → Caddy / Nginx / Traefik (завершение HTTPS)
            → http://127.0.0.1:7000 (Odysseus, оставляем привязку к localhost)

И в .env:

AUTH_ENABLED=true
LOCALHOST_BYPASS=false
SECURE_COOKIES=true

Q7: Как контролировать биллинг облачного API?

Давайте разберём конкретно проблему из пути C на шаге 5.

Когда пробуешь это «для себя», есть три подхода по убыванию стоимости:

  1. Подключить официальный API — самый полный по ощущениям вариант, но самый дорогой. Claude Opus + частые вызовы агента: превысить 100 долларов за неделю — обычное дело
  2. Подключить протоколо-совместимый транзит (я использую Defapi) — те же Claude / GPT / Gemini модели, но ежемесячный счёт ниже на порядок (точно «на сколько» я не считал; но логика простая: с недельных 100 долларов выходит уровень месячного порядка тех же 100 долларов). Главная выгода — полная совместимость на уровне протокола: со стороны Odysseus всё на месте — не нужно менять prompt / код агента
  3. Локальные квантованные модели — скачать в Cookbook GGUF Q4_K_M: с 16G VRAM реально запускать 30B-класс, нулевая стоимость по API, но инференс медленнее облака, а качество на сложных задачах будет чуть хуже

Моя реальная связка: чат + Deep Research через Defapi Claude Sonnet 4.5, Agent — через Claude Haiku 4.5 для tool-calls (дешевле), а простые задачи вроде классификации/сводок — локальный Qwen2.5 в квантованном варианте. Три Provider считаются независимо; они не мешают друг другу. За месяц выходит сумма в «двузначных» рублях.

TIP

Ключевой трюк: не используйте один и тот же модельный «движок» для всего. Settings в Odysseus позволяет назначать разные Provider под разные сценарии — это полезная функция, которую многие упускают.

Дополнительное чтение / направления для углубления

  • Экосистема MCP: встроенные MCP, которые Odysseus регистрирует автоматически, включают playwright (браузер) / filesystem / shell. Можно написать свой MCP server, зарегистрировать в mcp_servers/ — и агент сможет им пользоваться
  • Система Skills: routes/skills_routes.py управляет переиспользуемыми «фрагментами навыков», похоже на Skills в OpenClaw — один раз написал, и он будет доступен в любых сессиях
  • Tailscale + mkcert HTTPS: в предыдущем разделе уже показан базовый процесс, дальше можно добавить автопродление и DNS-01 challenge
  • Комбинация reverse-proxy: Caddy с HTTPS + Cloudflare proxy позволяет получить публичный доступ без лишней операторской работы
  • Синхронизация CalDAV: поднимайте Radicale (лёгкий CalDAV сервис) — и календарь Odysseus будет двунаправленно синхронизироваться с системным календарём телефона
  • AI-автоматическое разбиение писем: после подключения IMAP, со временем оно само классифицирует по «срочно / обычно / спам», черновики ответов будут подготовлены заранее — вам останется только нажать отправить
  • Cookbook удалённые серверы: Cookbook → Settings → Servers: можно указать удалённую GPU-машину, запуск/скачивание моделей пойдёт по SSH — хост маленький, GPU далеко, и всё получается красиво
  • Deep Research многошаговые отчёты: переработка Tongyi DeepResearch от Alibaba — берёт SearXNG для сбора из нескольких источников → резюмирование → синтез, отлично подходит для анализа конкурентов/отраслевых исследований
  • Маршрутизация по Provider: в Odysseus назначайте разные Provider для чата/агента/исследований — локальный Ollama тянет 80% повседневного общения, а сложные вопросы отправляются в облако; и стоимость, и качество сбалансированы

GitHub-репозиторий: pewdiepie-archdaemon/odysseus, документация — в docs/, roadmap — в ROADMAP.md, чтобы участвовать в разработке смотрите CONTRIBUTING.md.

Updated June 9, 2026