DEPLOY GUIDE · RENDER.COM

Watchword на Render за 5 минут

Dockerfile из 4 строк в вашем репозитории, бесплатная Turso-база и три секрета — render собирает образ за вас на free-tier и отдаёт публичный HTTPS MCP-эндпоинт, к которому подключаются Claude.ai, Cursor и ChatGPT.

Что вы получаете

Публичный HTTPS MCP-эндпоинт

Render автоматически выпускает TLS-сертификат. Указываете Claude.ai, Cursor, ChatGPT или любому MCP-клиенту https://watchword-<your>.onrender.com — и готово.

Постоянная Turso база

libSQL/Turso заменяет SQLite в облаке — те же миграции, та же схема, но данные переживают рестарты контейнера и scale-to-zero.

Контейнерный деплой

Render собирает ваш Dockerfile на каждый push. Образ наследуется от ghcr.io/giglabo/watchword:1.6.0 и зашивает ваш config.yaml. Без buildpacks, без аккаунтов в registry, без платного плана.

Production auth из коробки

Статические bearer-токены для простых сетапов; JWT/JWKS-валидация против Auth0, Keycloak или Cloudflare Worker OAuth provider — ровно то, что нужно Claude.ai.

FREE-TIER ХАК

Почему это работает на free-tier (а image-pull — нет)

Free-tier на render не любит подтягивать произвольные готовые образы за вас, но с радостью собирает Dockerfile из любого публичного git-репозитория, на который вы укажете — бесплатно, на каждый push. Поэтому вместо борьбы с платформой даём ей Dockerfile из 4 строк: FROM upstream + COPY вашего конфига. Render собирает результирующий образ в своём билдере и запускает его. Получаете upstream-бинарник watchword, конфиг живёт в вашем репозитории, и весь pipeline — в free-плане.

"c"># Dockerfile (4 lines, lives in YOUR repo)
"k">FROM ghcr.io/giglabo/watchword:1.6.0
"k">COPY config.yaml /etc/watchword/config.yaml
"k">COPY docker-entrypoint.sh /usr/local/bin/docker-entrypoint.sh
"k">ENTRYPOINT ["/usr/local/bin/docker-entrypoint.sh"]
  • 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 для авто-обновлений.

Тот же Dockerfile собирается на Fly.io, Railway и большинстве других Docker-aware PaaS — но в 2026 рядом с render по $0 стоит только Starter-план Koyeb. Fly.io убрал free tier в 2024 (теперь $5 триал), Railway после 30-дневного триала требует Hobby за $5/мес. Трюк всё ещё работает — просто перестаёт быть бесплатным.

Что нужно

  • Аккаунт render.com (free tier подходит для тестов — см. секцию про стоимость ниже)
  • Аккаунт Turso и установленный turso CLI (free tier: ~500 МБ и 1 млрд чтений строк)
  • Любой git-хост, до которого render может достучаться — ваш репозиторий с четырьмя файлами ниже
  • Опционально: Cloudflare Workers, если хотите JWT/OAuth вместо статических токенов

Деплой за пять шагов

  1. 01

    Создайте Turso базу

    Поднимите libSQL базу и заберите connection URL и auth-token. Watchword прогоняет те же миграции против Turso, что и против локального SQLite — изменений в схеме не нужно.

    "c"># установка "k">turso CLI (macOS)
    "k">brew install tursodatabase/tap/turso
    
    "c"># логин и создание базы
    
    "k">turso auth login
    "k">turso db create watchword
    
    "c"># заберите URL и токен
    
    "k">turso db show watchword --url # libsql://watchword-<org>.turso.io
    "k">turso db tokens create watchword # eyJhbGci...
  2. 02

    Соберите свой deploy-репозиторий (4 файла)

    Сделайте маленький репозиторий на любом удобном git-хосте. Положите туда четыре файла — Dockerfile это сердце free-tier хака: он просто кладёт ваш конфиг поверх upstream-образа watchword. Локально ничего собирать не надо; render билдит сам.

    your-watchword-deploy/
    ├── Dockerfile # "k">FROM ghcr.io/giglabo/watchword:1.6.0 + "k">COPY конфиг
    ├── config.yaml # transport, БД-драйвер, JWT issuer, RFC 9728 metadata
    ├── docker-entrypoint.sh # маппит $PORT от "k">render в WORDSTORE*SERVER_HTTP_PORT
    └── render.yaml # 1 сервис, type: web, runtime: docker

    config.yaml несёт transport: http, database.driver: libsql, auth.enabled: true, expiration.ttl_hours: 168. Любое значение можно переопределить через WORDSTORE** env vars в дашборде render.

  3. 03

    Сгенерируйте bearer-токены

    Watchword аутентифицирует каждый MCP-запрос. Самый простой режим — список bearer-токенов через запятую. Сгенерируйте openssl или менеджером паролей — агенты передают их в Authorization: Bearer <token>.

    "c"># два сильных токена
    openssl rand -hex 32
    openssl rand -hex 32
    
    "c"># вставите список через запятую в "v">WORDSTORE_AUTH_TOKENS
    
    "c"># пример: 9f4a...,7b22...
  4. 04

    Нажмите 'New Blueprint' на render.com

    В дашборде render.com выберите New → Blueprint и укажите ваш репозиторий. Render прочитает render.yaml, соберёт ваш Dockerfile и спросит три секрета ниже. Заполнили, нажали Apply — сборка пошла.

    render.yaml объявляет один web service типа docker, запускает ваш Dockerfile и отмечает env-переменные ниже как sync:false (то есть вы задаёте их per-environment).

  5. 05

    Подключите MCP-клиента

    Когда сборка зелёная, скопируйте .onrender.com URL. Добавьте его в Claude Code, Cursor или любой MCP-клиент как remote server c streamable-http транспортом и вашим bearer-токеном.

    "c"># Claude Code
    
    "k">claude mcp add watchword --transport http \
    --header "Authorization: Bearer <your-token>" \
    https://watchword-<your>.onrender.com/mcp
    
    "c"># проверка
    
    "k">claude mcp list

Переменные окружения

Эти три секрета живут в env-настройках render.com (sync:false в Blueprint, чтобы они не попадали в git). Остальное поведение watchword — TTL, transport, JWT issuer — зашито в config.yaml внутри вашего репозитория.

WORDSTORE_AUTH_TOKENStok1,tok2,...

Bearer-токены через запятую. Каждому MCP-клиенту — свой. Ротация — отредактировали список, старые токены перестают работать сразу.

WORDSTORE_DATABASE_LIBSQL_URLlibsql://...turso.io

URL из `turso db show <db> --url`. Watchword общается с ним через pure-Go libsql-client-go — без CGO и нативных зависимостей.

WORDSTORE_DATABASE_LIBSQL_AUTH_TOKENeyJhbGci...

Токен из `turso db tokens create <db>`. Относитесь к нему как к паролю базы. Ротация — через Turso CLI.

WORDSTORE_AUTH_JWT_AUDIENCEwatchword-mcp

Опционально — только если включили JWT. Соответствует claim `aud` от вашего OAuth-провайдера, чтобы один JWKS обслуживал несколько окружений.

Auth: bearer, JWT или оба

Поставляемый конфиг включает bearer и JWT параллельно. Bearer-токены просты и работают везде; JWT/JWKS + RFC 9728 protected resource metadata — это то, что нужно Claude.ai для авто-discovery.

  • 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.

Стоимость

Watchword на render — дешёвый. Free tier покрывает соло-использование; production комфортно идёт на Starter, платный Turso нужен только если упёрлись в free-квоту.

render.com web service$0–$7/месFree instance засыпает после 15 мин простоя. Starter ($7) держит тёплым и даёт кастомный домен.
Turso libSQL$0–$29/месFree: ~500 МБ / 1 млрд чтений строк. Scaler ($29) нужен только под тяжёлый multi-tenant.
Bandwidth и TLS$0render.com включает трафик и автоматически обновляет TLS-сертификат на каждом деплое.
Cloudflare Worker (опционально)$0Workers free tier — 100K запросов/день, более чем достаточно для OAuth metadata + JWKS.

FAQ

Почему это работает на free-tier render?

Free-tier Docker-runtime у render собирает ваш Dockerfile из публичного git-репозитория на каждый push — это бесплатно. Чего он не делает бесплатно — не тянет произвольные готовые приватные образы в рантайме. Dockerfile из 4 строк обходит registry-pull целиком: билдер render тянет образ во время сборки, итоговый image живёт у render, а в рантайме никаких аутентификаций к ghcr.io.

Можно использовать свой домен?

Да. Добавьте custom domain в настройках сервиса render.com, направьте CNAME на <service>.onrender.com и обновите resource_metadata.resource в config.yaml, чтобы Claude.ai discovery возвращал правильный URL. TLS сертификат — render.

Free tier правда работает?

Для соло — да. Free instance render засыпает после 15 мин — при переподключении MCP-клиента cold start ~30 секунд. Для always-on — Starter ($7/мес).

Почему Turso, а не PostgreSQL от render?

Watchword изначально SQLite-based; libSQL/Turso прогоняет ровно те же миграции и схему без изменений. Managed Postgres от render тоже подходит — задайте DATABASE_URL и поменяйте driver в config.yaml — но free tier у Turso щедрее под этот workload, и вы сохраняете free tier render.

Как ротировать токены?

Отредактируйте WORDSTORE_AUTH_TOKENS в env-настройках render.com и триггерните redeploy (или дождитесь следующего git push). Старые токены перестают работать в момент старта нового пода.

Где мониторить?

Встроенные логи и метрики render покрывают объём запросов, ошибки, CPU. Watchword пишет JSON в stdout (level: info), так что можно тейлить live-stream в дашборде или пайпить в сторонний log drain.

Запускайте

Четыре файла в репо, три секрета в render, Turso база — ваша MCP-память онлайн, и каждый агент на ноутбуке читает из неё.

Показать шаги