---
title: Публикация
description: Распространяйте своё приложение Twenty в маркетплейсе или разверните его для внутреннего использования.
---

<Warning>
Приложения сейчас проходят альфа-тестирование. Функциональность работает, но продолжает развиваться.
</Warning>

## Обзор

После того как ваше приложение [собрано и протестировано локально](/l/ru/developers/extend/apps/building), у вас есть два пути для его распространения:

* **Опубликовать в npm** — разместите ваше приложение в маркетплейсе Twenty, чтобы любое рабочее пространство могло его найти и установить.
* **Разверните tar-архив** — загрузите своё приложение напрямую на конкретный сервер Twenty для внутреннего или частного использования.

Оба пути начинаются с одного и того же шага **build**.

## Сборка вашего приложения

Команда `build` компилирует ваши исходники TypeScript, транспилирует функции логики и фронтенд-компоненты и генерирует `manifest.json`, который описывает содержимое вашего приложения:

```bash filename="Terminal"
yarn twenty build
```

Выходные данные записываются в `.twenty/output/`. Этот каталог содержит всё необходимое для распространения: скомпилированный код, ресурсы, манифест и копию вашего `package.json`.

Чтобы также создать tarball `.tgz` (который внутренне используется командой deploy или для ручного распространения):

```bash filename="Terminal"
yarn twenty build --tarball
```

## Публикация в npm

Публикация в npm делает ваше приложение видимым в маркетплейсе Twenty. Любое рабочее пространство Twenty может просматривать, устанавливать и обновлять приложения из маркетплейса непосредственно из интерфейса.

### Требования

* Учётная запись [npm](https://www.npmjs.com)
* Ключевое слово `twenty-app` **обязательно** должно быть указано в массиве `keywords` вашего `package.json`

### Добавление обязательного ключевого слова

Маркетплейс Twenty находит приложения, ища в реестре npm пакеты с ключевым словом `twenty-app`. Добавьте его в ваш `package.json`:

```json filename="package.json"
{
  "name": "twenty-app-postcard-sender",
  "version": "1.0.0",
  "keywords": ["twenty-app"],
  ...
}
```

<Note>
Маркетплейс ищет в реестре npm по `keywords:twenty-app`. Без этого ключевого слова ваш пакет не появится в маркетплейсе, даже если в его имени есть префикс `twenty-app-`.
</Note>

### Шаги

1. **Сборка вашего приложения:**

```bash filename="Terminal"
yarn twenty build
```

2. **Публикация в npm:**

```bash filename="Terminal"
yarn twenty publish
```

Это выполняет `npm publish` из каталога `.twenty/output/`.

Чтобы опубликовать с определённым dist-tag (например, `beta` или `next`):

```bash filename="Terminal"
yarn twenty publish --tag beta
```

### Как работает обнаружение приложений в маркетплейсе

Сервер Twenty синхронизирует каталог маркетплейса из реестра npm **каждый час**:

1. Он ищет все пакеты npm с ключевым словом `keywords:twenty-app`
2. Для каждого пакета он извлекает `manifest.json` с CDN npm
3. Метаданные приложения (name, description, author, logo, screenshots, category) извлекаются из манифеста и отображаются в маркетплейсе

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

```bash filename="Terminal"
yarn twenty catalog-sync
```

Чтобы указать конкретный remote:

```bash filename="Terminal"
yarn twenty catalog-sync -r production
```

Метаданные, отображаемые в маркетплейсе, берутся из вызова `defineApplication()` в исходном коде вашего приложения — из таких полей, как `displayName`, `description`, `author`, `category`, `logoUrl`, `screenshots`, `aboutDescription`, `websiteUrl` и `termsUrl`.

### Публикация через CI

Сгенерированный шаблоном проект включает рабочий процесс GitHub Actions, который выполняет публикацию при каждом релизе:

```yaml filename=".github/workflows/publish.yml"
name: Publish
on:
  release:
    types: [published]

permissions:
  contents: read
  id-token: write

jobs:
  publish:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with:
          node-version: "24"
          registry-url: https://registry.npmjs.org
      - run: yarn install --immutable
      - run: npx twenty build
      - run: npm publish --provenance --access public
        working-directory: .twenty/output
        env:
          NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
```

Для других CI-систем (GitLab CI, CircleCI и др.) применимы те же три команды: `yarn install`, `yarn twenty build`, затем `npm publish` из `.twenty/output`.

<Tip>
**npm provenance** — опционально, но рекомендуется. Публикация с флагом `--provenance` добавляет к вашему пакету в npm значок доверия, позволяя пользователям проверить, что пакет был собран из конкретного коммита в общедоступном конвейере CI. См. инструкции по настройке в [документации по npm provenance](https://docs.npmjs.com/generating-provenance-statements).
</Tip>

## Развертывание на сервер (tarball)

Для приложений, которые вы не хотите делать общедоступными — собственные инструменты, интеграции только для предприятий или экспериментальные сборки — вы можете развернуть tarball напрямую на сервер Twenty.

### Требования

Перед развертыванием вам нужен настроенный remote, указывающий на целевой сервер. Remotes локально хранят URL сервера и учётные данные аутентификации в `~/.twenty/config.json`.

Добавьте remote:

```bash filename="Terminal"
yarn twenty remote add --url https://your-twenty-server.com --as production
```

Для локального сервера разработки:

```bash filename="Terminal"
yarn twenty remote add --local --as local
```

Вы также можете аутентифицироваться с помощью API-ключа в неинтерактивных средах:

```bash filename="Terminal"
yarn twenty remote add --url https://your-twenty-server.com --token <api-key> --as production
```

Управляйте remotes:

```bash filename="Terminal"
yarn twenty remote list       # List all configured remotes
yarn twenty remote switch prod # Set the default remote
yarn twenty remote status     # Show active remote and auth status
yarn twenty remote remove old # Remove a remote
```

### Развертывание

Соберите и загрузите ваше приложение на сервер в одном шаге:

```bash filename="Terminal"
yarn twenty deploy
```

Это собирает приложение с флагом `--tarball`, затем загружает tarball на remote по умолчанию через GraphQL multipart upload.

Чтобы развернуть на конкретный remote:

```bash filename="Terminal"
yarn twenty deploy -r production
```

### Общий доступ к развернутому приложению

Приложения в формате tarball не отображаются в публичном маркетплейсе, поэтому другие рабочие пространства на том же сервере не найдут их при просмотре. Чтобы поделиться развернутым приложением:

1. Перейдите в **Настройки > Приложения > Регистрации** и откройте ваше приложение
2. На вкладке **Распространение** нажмите **Копировать ссылку для общего доступа**
3. Поделитесь этой ссылкой с пользователями в других рабочих пространствах — она ведёт их прямо на страницу установки приложения

Ссылка общего доступа использует базовый URL сервера (без какого-либо поддомена рабочего пространства), поэтому она работает для любого рабочего пространства на сервере.

### Управление версиями

Чтобы выпустить обновление:

1. Обновите значение поля `version` в файле `package.json`
2. Выполните `yarn twenty deploy` (или `yarn twenty deploy -r production`)
3. Рабочие пространства, в которых установлено приложение, увидят доступное обновление в своих настройках

## Установка приложений

После публикации приложения (npm) или его развертывания (tarball) рабочие пространства устанавливают его через интерфейс:

```bash filename="Terminal"
yarn twenty install
```

Или со страницы **Настройки > Приложения** в интерфейсе Twenty, где можно просматривать и устанавливать как приложения из маркетплейса, так и развернутые через tarball.

## Категории распространения приложений

Twenty группирует приложения в три категории в зависимости от способа их распространения:

| Категория                | Как это работает                                                                                                                                    | Отображается в маркетплейсе? |
| ------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------- |
| **Разработка**           | Локальные приложения в режиме разработки, запущенные через `yarn twenty dev`. Используются для сборки и тестирования.                               | Нет                          |
| **Опубликовано (npm)**   | Приложения, опубликованные в npm с ключевым словом `twenty-app`. Отображаются в маркетплейсе, доступные для установки любому рабочему пространству. | Да                           |
| **Внутренние (tarball)** | Приложения, развернутые через tarball на конкретном сервере. Доступны только рабочим пространствам на этом сервере по ссылке общего доступа.        | Нет                          |

<Tip>
Начните в режиме **Разработка** во время создания приложения. Когда будет готово, выберите **Опубликовано** (npm) для широкого распространения или **Внутренний** (tarball) для приватного развертывания.
</Tip>

## Справочник по CLI

| Команда                     | Описание                                                 | Основные флаги                                          |
| --------------------------- | -------------------------------------------------------- | ------------------------------------------------------- |
| `yarn twenty build`         | Скомпилировать приложение и сгенерировать манифест       | `--tarball` — также создать пакет `.tgz`                |
| `yarn twenty publish`       | Собрать и опубликовать в npm                             | `--tag <tag>` — dist-tag npm (например, `beta`, `next`) |
| `yarn twenty deploy`        | Собрать и загрузить tarball на сервер                    | `-r, --remote <name>` — целевой remote                  |
| `yarn twenty catalog-sync`  | Запустить на сервере синхронизацию каталога маркетплейса | `-r, --remote <name>` — целевой remote                  |
| `yarn twenty install`       | Установить развернутое приложение в рабочем пространстве | `-r, --remote <name>` — целевой remote                  |
| `yarn twenty dev`           | Отслеживать и синхронизировать локальные изменения       | Использует remote по умолчанию                          |
| `yarn twenty remote add`    | Добавить подключение к серверу                           | `--url`, `--token`, `--as`, `--local`, `--port`         |
| `yarn twenty remote list`   | Показать настроенные remotes                             | —                                                       |
| `yarn twenty remote switch` | Установить remote по умолчанию                           | —                                                       |
| `yarn twenty remote status` | Показать статус подключения                              | —                                                       |
| `yarn twenty remote remove` | Удалить remote                                           | —                                                       |
