---
title: "Деплой Watchword на Render.com — гайд за 5 минут"
description: "Пошаговый деплой Watchword MCP-сервера на render.com через free-tier хак с Docker-сборкой — Turso (libSQL) база, bearer/JWT auth и публичный HTTPS-эндпоинт для Claude.ai, Cursor и ChatGPT."
canonical: https://giglabo.com/ru/heretic/tools/watchword/deploy/render
locale: ru
---

# Деплой Watchword на Render.com — гайд за 5 минут

> Markdown twin of https://giglabo.com/ru/heretic/tools/watchword/deploy/render
> Fetch this instead of the HTML page: same content, a fraction of the bytes.
> Site structure and the full page list for agents: https://giglabo.com/llms.txt

Пошаговый деплой Watchword MCP-сервера на render.com через free-tier хак с Docker-сборкой — Turso (libSQL) база, bearer/JWT auth и публичный HTTPS-эндпоинт для Claude.ai, Cursor и ChatGPT.

.onrender.com — и готово.',
      },
      {
        title: 'Постоянная Turso база',
        body: 'libSQL/Turso заменяет SQLite в облаке — те же миграции, та же схема, но данные переживают рестарты контейнера и scale-to-zero.',
      },
      {
        title: 'Контейнерный деплой',
        body: 'Render собирает ваш Dockerfile на каждый push. Образ наследуется от ghcr.io/giglabo/watchword:1.6.0 и зашивает ваш config.yaml. Без buildpacks, без аккаунтов в registry, без платного плана.',
      },
      {
        title: 'Production auth из коробки',
        body: 'Статические bearer-токены для простых сетапов; JWT/JWKS-валидация против Auth0, Keycloak или Cloudflare Worker OAuth provider — ровно то, что нужно Claude.ai.',
      },
    ],
    hackEyebrow: 'FREE-TIER ХАК',
    hackHeading: 'Почему это работает на free-tier (а image-pull — нет)',
    hackBody:
      'Free-tier на render не любит подтягивать произвольные готовые образы за вас, но с радостью собирает Dockerfile из любого публичного git-репозитория, на который вы укажете — бесплатно, на каждый push. Поэтому вместо борьбы с платформой даём ей Dockerfile из 4 строк: FROM upstream + COPY вашего конфига. Render собирает результирующий образ в своём билдере и запускает его. Получаете upstream-бинарник watchword, конфиг живёт в вашем репозитории, и весь pipeline — в free-плане.',
    hackBullets: [
      'FROM ghcr.io/giglabo/watchword:1.6.0 — render тянет upstream-образ во время сборки, а не в рантайме, поэтому free-tier не должен ходить в registry за вас.',
      'COPY config.yaml — весь ваш конфиг (TTL, JWT issuer, audience, RFC 9728 metadata) лежит в вашем репозитории. Поменяли, push, redeploy. Без env-var-супа и удалённых томов.',
      'docker-entrypoint.sh маппит динамический $PORT от render в WORDSTORE_SERVER_HTTP_PORT — единственный адаптер, нужный watchword под контракт render.',
      'Каждый git push в ваш репозиторий триггерит свежую сборку. Зафиксируйте upstream-тег для стабильности или оставайтесь на :latest для авто-обновлений.',
    ],
    hackFootnote:
      'Тот же Dockerfile собирается на Fly.io, Railway и большинстве других Docker-aware PaaS — но в 2026 рядом с render по $0 стоит только Starter-план Koyeb. Fly.io убрал free tier в 2024 (теперь $5 триал), Railway после 30-дневного триала требует Hobby за $5/мес. Трюк всё ещё работает — просто перестаёт быть бесплатным.',
    prereqsHeading: 'Что нужно',
    prereqs: [
      'Аккаунт render.com (free tier подходит для тестов — см. секцию про стоимость ниже)',
      'Аккаунт Turso и установленный turso CLI (free tier: ~500 МБ и 1 млрд чтений строк)',
      'Любой git-хост, до которого render может достучаться — ваш репозиторий с четырьмя файлами ниже',
      'Опционально: Cloudflare Workers, если хотите JWT/OAuth вместо статических токенов',
    ],
    stepsHeading: 'Деплой за пять шагов',
    steps: [
      {
        title: 'Создайте Turso базу',
        body: 'Поднимите libSQL базу и заберите connection URL и auth-token. Watchword прогоняет те же миграции против Turso, что и против локального SQLite — изменений в схеме не нужно.',
        code: `# установка turso CLI (macOS)
brew install tursodatabase/tap/turso

## логин и создание базы

turso auth login
turso db create watchword

## заберите URL и токен

turso db show watchword --url # libsql://watchword-<org>.turso.io
turso db tokens create watchword # eyJhbGci...`,
      },
      {
        title: 'Соберите свой deploy-репозиторий (4 файла)',
        body: 'Сделайте маленький репозиторий на любом удобном git-хосте. Положите туда четыре файла — Dockerfile это сердце free-tier хака: он просто кладёт ваш конфиг поверх upstream-образа watchword. Локально ничего собирать не надо; render билдит сам.',
        code: `your-watchword-deploy/
├── Dockerfile # FROM ghcr.io/giglabo/watchword:1.6.0 + COPY конфиг
├── config.yaml # transport, БД-драйвер, JWT issuer, RFC 9728 metadata
├── docker-entrypoint.sh # маппит $PORT от render в WORDSTORE*SERVER_HTTP_PORT
└── render.yaml # 1 сервис, type: web, runtime: docker`,
codeNote:
'config.yaml несёт transport: http, database.driver: libsql, auth.enabled: true, expiration.ttl_hours: 168. Любое значение можно переопределить через WORDSTORE*\* env vars в дашборде render.',
},
{
title: 'Сгенерируйте bearer-токены',
body: 'Watchword аутентифицирует каждый MCP-запрос. Самый простой режим — список bearer-токенов через запятую. Сгенерируйте openssl или менеджером паролей — агенты передают их в Authorization: Bearer <token>.',
code: `# два сильных токена
openssl rand -hex 32
openssl rand -hex 32

## вставите список через запятую в WORDSTORE_AUTH_TOKENS

## пример: 9f4a...,7b22...`,

      },
      {
        title: "Нажмите 'New Blueprint' на render.com",
        body: 'В дашборде render.com выберите New → Blueprint и укажите ваш репозиторий. Render прочитает render.yaml, соберёт ваш Dockerfile и спросит три секрета ниже. Заполнили, нажали Apply — сборка пошла.',
        codeNote:
          'render.yaml объявляет один web service типа docker, запускает ваш Dockerfile и отмечает env-переменные ниже как sync:false (то есть вы задаёте их per-environment).',
      },
      {
        title: 'Подключите MCP-клиента',
        body: 'Когда сборка зелёная, скопируйте .onrender.com URL. Добавьте его в Claude Code, Cursor или любой MCP-клиент как remote server c streamable-http транспортом и вашим bearer-токеном.',
        code: `# Claude Code

claude mcp add watchword --transport http \\
--header "Authorization: Bearer <your-token>" \\
https://watchword-<your>.onrender.com/mcp

## проверка

claude mcp list`,
      },
    ],
    envHeading: 'Переменные окружения',
    envIntro:
      'Эти три секрета живут в env-настройках render.com (sync:false в Blueprint, чтобы они не попадали в git). Остальное поведение watchword — TTL, transport, JWT issuer — зашито в config.yaml внутри вашего репозитория.',
    envVars: [
      {
        name: 'WORDSTORE_AUTH_TOKENS',
        value: 'tok1,tok2,...',
        note: 'Bearer-токены через запятую. Каждому MCP-клиенту — свой. Ротация — отредактировали список, старые токены перестают работать сразу.',
      },
      {
        name: 'WORDSTORE_DATABASE_LIBSQL_URL',
        value: 'libsql://...turso.io',
        note: 'URL из `turso db show <db> --url`. Watchword общается с ним через pure-Go libsql-client-go — без CGO и нативных зависимостей.',
      },
      {
        name: 'WORDSTORE_DATABASE_LIBSQL_AUTH_TOKEN',
        value: 'eyJhbGci...',
        note: 'Токен из `turso db tokens create <db>`. Относитесь к нему как к паролю базы. Ротация — через Turso CLI.',
      },
      {
        name: 'WORDSTORE_AUTH_JWT_AUDIENCE',
        value: 'watchword-mcp',
        note: 'Опционально — только если включили JWT. Соответствует claim `aud` от вашего OAuth-провайдера, чтобы один JWKS обслуживал несколько окружений.',
},
],
authHeading: 'Auth: bearer, JWT или оба',
authBody:
'Поставляемый конфиг включает bearer и JWT параллельно. Bearer-токены просты и работают везде; JWT/JWKS + RFC 9728 protected resource metadata — это то, что нужно Claude.ai для авто-discovery.',
authBullets: [
'Static bearer — задайте WORDSTORE_AUTH_TOKENS, направьте клиентов на /mcp с Authorization: Bearer <token>. Готово.',
'JWT/JWKS — направьте watchword на JWKS URL вашего OAuth-провайдера; работает с Auth0, Keycloak, Cognito, Cloudflare Access или self-hosted Cloudflare Worker OAuth provider.',
'RFC 9728 — config.yaml отдаёт /.well-known/oauth-protected-resource, чтобы Claude.ai сам нашёл authorization server.',
'Можно одновременно — оба режима работают параллельно; bearer-токены остаются валидными даже после подключения JWT.',
],
authPaidPitch:
'Если нужно поднять production OAuth — Auth0, Keycloak или Cloudflare Worker proxy, который позволяет Claude.ai сам зарегистрироваться через Dynamic Client Registration — платный setup-гайд даёт copy-paste конфиги под каждый IdP, audit-логируемый mapping identity claim и 27 production-проверенных setup-граблей (включая 7 Auth0 DCR-блокировок, которых нет в официальных доках). Выберите путь под ваш стек и пропустите этап trial-and-error.',
authPaidCtaLabel: 'Открыть Watchword Auth Setup Guide',
authPaidCtaHref: '/ru/tools/watchword#guide',
costHeading: 'Стоимость',
costBody:
'Watchword на render — дешёвый. Free tier покрывает соло-использование; production комфортно идёт на Starter, платный Turso нужен только если упёрлись в free-квоту.',
costRows: [
{
label: 'render.com web service',
value: '$0–$7/мес',
note: 'Free instance засыпает после 15 мин простоя. Starter ($7) держит тёплым и даёт кастомный домен.',
},
{
label: 'Turso libSQL',
value: '$0–$29/мес',
note: 'Free: ~500 МБ / 1 млрд чтений строк. Scaler ($29) нужен только под тяжёлый multi-tenant.',
},
{
label: 'Bandwidth и TLS',
value: '$0',
note: 'render.com включает трафик и автоматически обновляет TLS-сертификат на каждом деплое.',
},
{
label: 'Cloudflare Worker (опционально)',
value: '$0',
note: 'Workers free tier — 100K запросов/день, более чем достаточно для OAuth metadata + JWKS.',
},
],
faqHeading: 'FAQ',
faq: [
{
q: 'Почему это работает на free-tier render?',
a: 'Free-tier Docker-runtime у render собирает ваш Dockerfile из публичного git-репозитория на каждый push — это бесплатно. Чего он не делает бесплатно — не тянет произвольные готовые приватные образы в рантайме. Dockerfile из 4 строк обходит registry-pull целиком: билдер render тянет образ во время сборки, итоговый image живёт у render, а в рантайме никаких аутентификаций к ghcr.io.',
},
{
q: 'Можно использовать свой домен?',
a: 'Да. Добавьте custom domain в настройках сервиса render.com, направьте CNAME на <service>.onrender.com и обновите resource_metadata.resource в config.yaml, чтобы Claude.ai discovery возвращал правильный URL. TLS сертификат — render.',
},
{
q: 'Free tier правда работает?',
a: 'Для соло — да. Free instance render засыпает после 15 мин — при переподключении MCP-клиента cold start ~30 секунд. Для always-on — Starter ($7/мес).',
},
{
q: 'Почему Turso, а не PostgreSQL от render?',
a: 'Watchword изначально SQLite-based; libSQL/Turso прогоняет ровно те же миграции и схему без изменений. Managed Postgres от render тоже подходит — задайте DATABASE_URL и поменяйте driver в config.yaml — но free tier у Turso щедрее под этот workload, и вы сохраняете free tier render.',
},
{
q: 'Как ротировать токены?',
a: 'Отредактируйте WORDSTORE_AUTH_TOKENS в env-настройках render.com и триггерните redeploy (или дождитесь следующего git push). Старые токены перестают работать в момент старта нового пода.',
},
{
q: 'Где мониторить?',
a: 'Встроенные логи и метрики render покрывают объём запросов, ошибки, CPU. Watchword пишет JSON в stdout (level: info), так что можно тейлить live-stream в дашборде или пайпить в сторонний log drain.',
},
],
closingHeading: 'Запускайте',
closingBody:
'Четыре файла в репо, три секрета в render, Turso база — ваша MCP-память онлайн, и каждый агент на ноутбуке читает из неё.',
closingCta: 'Показать шаги',
}}
/>

## Related

- HTML version of this page: https://giglabo.com/ru/heretic/tools/watchword/deploy/render
- Site map for agents: https://giglabo.com/llms.txt
