Skip to content

Выпуск

Ember выглядит тепло, её главная страница переработана, и она говорит на трёх языках. Пора превратить её в настоящую, устанавливаемую тему — и представить её миру. Это финишная черта.

Справочные страницы для глубины: Сборка и упаковка и Публикация и Premium.

Шаг 1 — отполируйте манифест

В корне темы лежит manifest.json — карточка, которая говорит Pano (и всем остальным), что такое Ember. Заполните её как следует перед выпуском:

json
{
  "id": "ember",
  "title": "Ember",
  "description": "A warm, cozy orange theme for survival servers.",
  "version": "1.0.0",
  "author": "YourName",
  "panoVersion": "1.0.0",
  "screenshots": ["screenshots/1.png"],
  "premium": false
}
ПолеПримечания
idУникальный, в нижнем регистре, через дефис идентификатор Ember: ember. Никогда не меняйте его после публикации — новый id это совершенно новая тема. Он никогда не может быть vanilla-theme. Файл пакета назван в его честь: ember-1.0.0.zip.
titleДружелюбное имя, которое видят люди: Ember.
descriptionОдно-два предложения о внешнем виде.
versionАвтоматизация выпуска проставляет это за вас — не повышайте вручную.
authorВаше имя или команда.
panoVersionВерсия Pano, на которую нацелена Ember.
screenshotsПути к изображениям из папки screenshots/ (ниже).
premiumfalse для бесплатной; true для платной (см. необязательный раздел в конце).

Добавьте скриншот

Скриншоты — это то, как люди оценивают тему с первого взгляда, и Marketplace требует хотя бы один. Положите изображения в папку screenshots/ в корне темы и перечислите их в манифесте:

ember/
├─ manifest.json
└─ screenshots/
   └─ 1.png

Хороший первый скриншот — полностраничный снимок главной страницы Ember, вместе с баннером. Сборка автоматически копирует screenshots/ в пакет, поэтому изображения отправляются внутри .zip.

Шаг 2 — проверка, сборка, упаковка

Три команды ведут Ember от исходников к устанавливаемому файлу:

sh
bun run check      # the safety net — Svelte version, plugin slots, settings, translations, manifest
bun run build      # produces the optimized build/ folder
bun run package    # wraps build/ into ember-1.0.0.zip

Если check сообщает о проблеме, исправьте её и запустите снова. Зелёный check означает, что Ember безопасно упаковывать.

Сборки воспроизводимы

Сборка одного и того же кода дважды даёт побайтово идентичный результат. Это очень важно для премиум-тем, где SHA-256-отпечаток пакета является идентификатором лицензии.

Шаг 3 — установите её на свой Pano

Прежде чем делиться, установите Ember на свой Pano, чтобы убедиться, что она работает от начала до конца — тот самый процесс, которому будут следовать ваши пользователи:

  1. Откройте панель Pano и войдите как администратор.
  2. Перейдите в Просмотр → Темы.
  3. Выберите Установить и загрузите только что собранный ember-1.0.0.zip.
  4. Активируйте её и откройте сайт.

Теперь вы должны увидеть Ember, работающую как правильно установленная тема — без участия dev-сервера.

Шаг 4 — опубликуйте на GitHub

На практике вы будете автоматизировать выпуски. Pano поставляет переиспользуемый workflow, который запускает проверки, собирает, упаковывает детерминированный .zip и создаёт выпуск на GitHub за вас. Добавьте крошечный вызывающий workflow в .github/workflows/release.yml:

yaml
name: Release

on:
  push:
    branches: [main, dev]

jobs:
  release:
    uses: PanoMC/sdk/.github/workflows/theme-release.yml@dev
    with:
      theme-id: ember
    secrets:
      TOKEN_GITHUB: ${{ secrets.GITHUB_TOKEN }}

GITHUB_TOKEN предоставляется GitHub Actions автоматически — просто передайте его. Версии приходят из ваших Conventional Commits (feat:, fix:, chore:), так что вы никогда не повышаете version вручную.

Шаг 5 — опубликуйте на Marketplace

Marketplace на panomc.com — это место, где владельцы серверов находят и устанавливают темы прямо из своей панели.

Создайте ресурс:

  1. Зарегистрируйтесь (или войдите) на panomc.com.
  2. Откройте Create Resource, выберите тип Theme, выберите категорию и заполните заголовок и описание.
  3. Загрузите хотя бы один скриншот — обязательно для тем.
  4. Выберите цену: бесплатно или платно.

Когда ресурс создан, он получает resource ID (UUID). Найдите его позже под Profile → Resources.

Два разных ID

id в вашем manifest.json (ember) идентифицирует пакет темы. Resource ID Marketplace (UUID) идентифицирует её страницу в магазине. Это разные вещи, и автоматизации выпуска нужен UUID.

Автоматизируйте загрузки с помощью semantic-release-pano:

  1. На panomc.com создайте API-токен под Profile → Security → API tokens и добавьте его в ваш GitHub-репозиторий как секрет с именем PANO_TOKEN (Settings → Secrets → Actions).
  2. Укажите semantic-release-pano на ваш resource ID в .releaserc.json:
json
["semantic-release-pano", {
  "resourceId": "YOUR-RESOURCE-UUID",
  "file": "ember-${version}.zip",
  "panoVersion": "1.0.0",
  "useGitHubLink": true,
  "repositoryUrl": "https://github.com/YourName/ember.git"
}]

С useGitHubLink бесплатная тема не загружается дважды — Marketplace просто ссылается на .zip, уже прикреплённый к вашему выпуску на GitHub (поэтому выпуск на GitHub должен выполниться первым). Без него плагин загружает файл напрямую, что и нужно для премиум-темы.

Вот и всё — сделайте push с commit feat:, и Ember публикуется на GitHub и Marketplace за один раз.

Необязательно — сделайте Ember премиум

Хотите продавать Ember? Переключите одно поле в manifest.json:

diff
- "premium": false
+ "premium": true

Это единственное изменение в исходниках; защита подключена за вас. Во время сборки вы предоставляете ключ, чтобы сборка могла привязать лицензию к вашему пакету — либо PANO_LICENSE_SERVER (переиспользуемый workflow задаёт это по ветке), либо PANO_LICENSE_PUBLIC_KEY, хранимый как CI-секрет. В bun run dev лицензионный барьер отключён, поэтому вы разрабатываете свободно.

Как это работает, простыми словами: production-сборка вычисляет SHA-256-отпечаток пакета и привязывает к нему лицензию. Чтобы запустить премиум-тему, у сервера в панели должна быть подключена учётная запись panomc.com, купившая Ember — проверяется как при установке, так и во время работы. Подделайте или переупакуйте .zip — и его отпечаток больше не совпадёт, поэтому Pano его отклонит.

Никакая защита не абсолютна — будьте честны с собой

Ни одна система лицензирования не защищает код на 100%. Цель — сделать несанкционированное использование как можно более трудным для подавляющего большинства пользователей, а не сделать его невозможным. Как и любое программное обеспечение, любой код, попадающий к конечному пользователю, по своей природе открыт — достаточно решительный и умелый человек всегда может его разобрать. Это верно для любой DRM когда-либо созданной, не только для Pano. Устанавливайте цену и поддерживайте Ember с учётом этой реальности.

Выпускайте изменения как новые релизы

Премиум-лицензия выдаётся на версию + пакет. Если вы отредактируете уже выпущенный .zip, его отпечаток изменится, и он перестанет быть лицензированным. Всегда отправляйте изменения как новый выпуск через процесс выше — никогда не редактируйте выпущенный .zip вручную.

Вы это сделали

Ember прошла путь от пустой папки до оформленной, переведённой, опубликованной темы — установленной на вашем собственном Pano и живой на Marketplace. Это всё путешествие, от начала до конца.

Куда двигаться дальше:

Приятного оформления. 🔥