Цей пакет робить 2 речі:
- публічний сайт читає контент із
content/*.json - адмінка редагує цей контент і комітить зміни прямо в GitHub через серверний API
- GitHub Pages може хостити тільки статичну частину: сайт і
admin/ - логін, збереження і upload картинок працюють через Node.js API
- тобто для продакшену потрібні 2 частини:
GitHub Pages→ публічний сайт +admin/Node server→/api/admin/*
- логін і пароль не лежать у фронтенді
- GitHub token не лежить у фронтенді
- пароль зберігається як
scrypthash у.env - адмінка отримує короткоживучий підписаний токен тільки після логіну
- усі записи в GitHub ідуть тільки через сервер
content/site.json— тексти сайтуuk/en/jacontent/categories.json— категорії менюcontent/menu.json— меню, ціни, фото, перекладиadmin/index.html— UI адмінкиadmin/css/admin.cssadmin/js/admin.jsserver/index.js— Node API + локальний серверtools/generate-admin-password-hash.mjs— генератор хешу пароля
npm install
cp .env.example .envПотім заповни .env і запусти:
npm run devЛокально буде:
http://localhost:3000/http://localhost:3000/admin/
PORT=3000
ADMIN_USERNAME=admin
ADMIN_PASSWORD_HASH=scrypt$YOUR_SALT$YOUR_HASH
ADMIN_SESSION_SECRET=long_random_secret_at_least_32_chars
GITHUB_TOKEN=github_pat_xxx
GITHUB_REPO_OWNER=your-github-username-or-org
GITHUB_REPO_NAME=your-repo-name
GITHUB_REPO_BRANCH=main
CONTENT_DIR=content
ADMIN_ALLOWED_ORIGIN=http://localhost:3000,https://lwowsky.github.ioЦе список origin-ів, з яких дозволено відкривати адмінку.
Для GitHub Pages лиши щось типу:
ADMIN_ALLOWED_ORIGIN=https://lwowsky.github.ioЯкщо тестуєш локально і на GitHub Pages одночасно:
ADMIN_ALLOWED_ORIGIN=http://localhost:3000,https://lwowsky.github.ioТи сам придумуєш пароль, наприклад:
ColibriAdmin2026!Потім запускаєш:
node tools/generate-admin-password-hash.mjs "ColibriAdmin2026!"Команда поверне рядок виду:
scrypt$...$...Його вставляєш у .env:
ADMIN_PASSWORD_HASH=scrypt$...$...Ні.
- ти входиш тим самим звичайним паролем, який придумав
- у
.envлежить не пароль, а його хеш - якщо ти заново перегенеруєш хеш для того самого пароля, рядок може бути іншим — це нормально
- але пароль для входу сам по собі не змінюється, поки ти його сам не змінюєш
Зроби fine-grained personal access token тільки для цього repo.
Потрібно:
Contents: Read and writeMetadata: Read
Цього достатньо для:
- читання
content/*.json - комітів у repo
- завантаження картинок у
content/uploads/...
Ти можеш залишити:
- сайт на
https://lwowsky.github.io/Colibri-House/ - адмінку на
https://lwowsky.github.io/Colibri-House/admin/
Node API треба задеплоїти окремо, наприклад на:
- Render
- Railway
- VPS
- будь-який Node hosting
Наприклад API буде жити тут:
https://colibri-admin-api.onrender.comВідкриваєш:
https://lwowsky.github.io/Colibri-House/admin/і в полі API base URL вставляєш:
https://colibri-admin-api.onrender.comПісля цього:
- натискаєш Зберегти API адресу
- натискаєш Перевірити API
- логінишся
- редагуєш контент
Адреса API збережеться в цьому браузері.
- title
uk/en/ja - description
uk/en/ja - tag
uk/en/ja - ціна
- категорія
- sort
- active
- image path
- upload картинки
- додавання нових страв
- видалення страв
- id
- label
uk/en/ja - sort
- будь-який текстовий ключ по сайту
hero_title,reserve_title,access_titleтощо- для
uk/en/ja
При upload:
- файл іде на Node API
- API пушить його в GitHub repo
- шлях автоматично підставляється в поле картинки
За замовчуванням menu images заливаються в:
content/uploads/menu/Тому що GitHub Pages не вміє:
- перевіряти логін/пароль на сервері
- приховувати GitHub token
- комітити зміни в repo без серверного шару
Саме тому:
- UI можна тримати на GitHub Pages
- безпечний API треба тримати окремо
- використовуй тільки HTTPS
- постав довгий
ADMIN_SESSION_SECRET - токен GitHub дай тільки на один repo
- для продакшену краще мати окремий repo під сайт
- не коміть
.env - відкривай адмінку на GitHub Pages тільки як:
https://lwowsky.github.io/Colibri-House/admin/зі слешем у кінці
admin/коректно стилізується на GitHub Pages/adminавтоматично редіректить на/admin/- статичні файли адмінки підтягуються правильними шляхами
- адмінка вміє працювати з окремим API base URL
- Node API підтримує крос-доменний доступ для GitHub Pages
- авторизація може йти через підписаний bearer token, а не тільки same-origin cookie