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 (а 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 вместо статических токенов
Деплой за пять шагов
- 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...
- 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.
- 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...
- 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).
- 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.ioURL из `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.
Если нужно поднять 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.
Открыть Watchword Auth Setup GuideСтоимость
Watchword на render — дешёвый. Free tier покрывает соло-использование; production комфортно идёт на Starter, платный Turso нужен только если упёрлись в free-квоту.
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-память онлайн, и каждый агент на ноутбуке читает из неё.
Показать шаги