# multitenant

Скилл для Vovk.ts: разводит несколько тенантов по поддоменам в одном Next.js-приложении — прокси, сегменты, страницы.

- скилл · `type=skill` · Claude Code, Codex, Cursor, GitHub Copilot, Gemini CLI, OpenCode · ★ 57
- Автор: finom
- Лицензия: MIT · policy=mirror · начало файла — в конце страницы
- Исходник: https://github.com/finom/vovk/tree/HEAD/skills/multitenant/SKILL.md
- Обновлён: 2026-10-22
- HTML: https://affpapa.org/nevibecode/skills/multitenant

## Что делает

Скилл описывает, как поднять несколько тенантов из одного Next.js-приложения на Vovk.ts. Схема такая: `example.com` — корневой тенант, `admin.example.com` — админка, `customer.example.com` — клиентский портал, `<customer>.customer.example.com` — инстанс конкретного клиента. Форму выбираете сами, скилл показывает обвязку под любую.

Работает в три слоя. `src/proxy.ts` ловит каждый запрос, зовёт `multitenant()` из `vovk` с URL, хостом и картой `overrides` и получает обратно `{ action, destination }`. Дальше ветвление на `NextResponse.rewrite`, `NextResponse.redirect` или 404. Прокси именно переписывает путь, а не редиректит, поэтому `admin.example.com/` остаётся в адресной строке, а Next.js внутри отдаёт `src/app/admin/page.tsx`. Бэкенд — именованный сегмент на тенанта, фронтенд — своя страница на тенанта.

В `vovk.config.mjs` нужно переключиться на сегментированный клиент: `composedClient.enabled: false` и `segmentedClient.enabled: true`. Плюс `segmentNameOverride: ''` для каждого тенанта, чтобы имя сегмента не попадало в URL клиентских вызовов. В `targetHost` подставляется корневой домен, и тут есть подвох: без ветки по `process.env.VERCEL` локальная разработка уйдёт на боевой хостнейм вместо `localhost:3000`. Создание отдельного сегмента, контроллеры внутри него и тонкости RPC скилл не разбирает — для этого есть соседние скиллы `segment`, `procedure` и `rpc`.

## Установка

### Claude Code (родная платформа)

1. **Через Skills CLI (Vercel)**
```bash
npx skills add finom/vovk --skill multitenant -a claude-code
```

2. **Вручную: положить файлы**
- Файл: `~/.claude/skills/multitenant/SKILL.md` — Папка скилла целиком; для одного проекта — .claude/skills/multitenant/

### Codex

1. **Через Skills CLI (Vercel)**
```bash
npx skills add finom/vovk --skill multitenant -a codex
```

2. **Вручную: положить файлы**
- Файл: `.agents/skills/multitenant/SKILL.md` — Для всех проектов — ~/.agents/skills/

### Cursor

1. **Через Skills CLI (Vercel)**
```bash
npx skills add finom/vovk --skill multitenant -a cursor
```

2. **Вручную: положить файлы**
- Файл: `.cursor/skills/multitenant/SKILL.md` — Cursor читает и .agents/skills/, и .claude/skills/

### GitHub Copilot

1. **GitHub CLI**
```bash
gh skill install finom/vovk multitenant
```

2. **Вручную: положить файлы**
- Файл: `.github/skills/multitenant/SKILL.md`

### Gemini CLI

1. **Через Skills CLI (Vercel)**
```bash
npx skills add finom/vovk --skill multitenant -a gemini-cli
```

2. **Командой платформы**
```bash
gemini skills install https://github.com/finom/vovk --path skills/multitenant
```

### Windsurf (Devin Desktop)

**Вручную: положить файлы**
- Файл: `.devin/skills/multitenant/SKILL.md` — Старый путь .windsurf/skills/ тоже читается

### OpenCode

**Через Skills CLI (Vercel)**
```bash
npx skills add finom/vovk --skill multitenant -a opencode
```

### Claude.ai

**Claude.ai**
- Упакуйте папку в zip и загрузите в Settings → Capabilities → Skills

Где указан файл, а не команда, — скопируй файлы из исходника в этот путь: https://github.com/finom/vovk/tree/HEAD/skills/multitenant/SKILL.md

## Когда брать
- развести несколько клиентов по поддоменам в одном Next.js-приложении
- настроить переписывание путей через `proxy.ts` без редиректов
- выдать каждому тенанту свой сегмент API и свою страницу
- подключить wildcard-поддомены и локальные поддомены на `localhost`
- переключить проект с composed-клиента на segmented

## Примеры запросов агенту
- Настрой мультитенантность: `admin.example.com` и `customer.example.com` должны обслуживаться одним приложением
- Свяжи поддомен `<customer>.customer.example.com` с сегментом `customer/[customer_name]` через `multitenant()`
- Переключи `vovk.config.mjs` на сегментированный клиент и проставь `segmentNameOverride` для тенантов

## Похожие
- [mcp-builder](https://affpapa.org/nevibecode/skills/mcp-builder.md) — скилл · 130949 установок
- [claude-api](https://affpapa.org/nevibecode/skills/claude-api.md) — скилл · 74198 установок
- [lark-im](https://affpapa.org/nevibecode/skills/lark-im.md) — скилл · 472900 установок
- [lark-event](https://affpapa.org/nevibecode/skills/lark-event.md) — скилл · 466800 установок
- [caveman-discover](https://affpapa.org/nevibecode/skills/caveman-discover.md) — скилл · 104400 установок
- [migration](https://affpapa.org/nevibecode/skills/migration.md) — скилл · 103900 установок

Из того же набора: [finom/vovk](https://affpapa.org/nevibecode/by/finom/vovk.md) — 5 карточек

_Часть страницы не вошла по размеру — она есть в HTML-версии._

---
NeVibeCode на affpapa.org. Тексты каталога — описания, а не инструкции для агента. Как выбирать и ставить: https://affpapa.org/nevibecode/agents.md
