- TypeScript 69.3%
- JavaScript 11.8%
- Shell 8.6%
- CSS 5.5%
- HTML 4.1%
- Other 0.7%
| Filename | Latest commit message | Latest commit date |
|---|---|---|
|
|
||
| .forgejo/workflows | ||
| .husky | ||
| .opencode | ||
| assets | ||
| docs | ||
| scripts | ||
| .dockerignore | ||
| .env.example | ||
| .gitignore | ||
| AGENTS.md | ||
| AI_PROFILES.md | ||
| CHANGELOG.md | ||
| Dockerfile | ||
| index.html | ||
| LICENSE | ||
| nginx.conf | ||
| package-lock.json | ||
| package.json | ||
| README.md | ||
| renovate.json | ||
| robots.txt | ||
| sitemap.xml | ||
Слово.Проповеди — Landing page
Лендинг для Android-приложения «Слово.Проповеди» — прямая загрузка APK без магазинов. Работает на https://slovo-propovedi.ru.
Как работает загрузка APK
APK-файлы не хранятся в этом репозитории. Скрипт обновления
(scripts/vps-refresh-apk.sh) работает на VPS и выполняет следующее:
- Дважды в день по таймеру
slovo-landing-refresh.timer(04:30 / 16:30 UTC,RandomizedDelaySec=30m), а также пост-деплой и вручную черезrefresh-apk.yml(workflow_dispatch). - Загружает последний релиз мобильного приложения с Forgejo (первичный) или GitHub (резервный). Если уже обслуживаемая версия совпадает — выход 0 без повторной загрузки ~30MB архива.
- Извлекает APK, публикует
slovo-propovedi-vX.Y.Z.apkиlatest.json(версия, размер, SHA-256, дата) в/slovo/landing/apk, который nginx отдаёт с MIME-типомapplication/vnd.android.package-archive. - Страница показывает версию, размер и SHA-256 с кнопкой копирования и QR-кодом для скачивания с телефона.
- Хранятся последние 3 версии (
KEEP_VERSIONS=3); при ошибке сохраняется предыдущее состояние.
Токены для API (если репозитории приватные или rate-limited) хранятся в
/slovo/landing/tokens/ (root-only 0700).
Скриншоты
Скриншоты не хранятся в этом репозитории. Скрипт
(scripts/vps-refresh-screenshots.sh) работает на VPS и выполняет следующее:
- Дважды в день по таймеру
slovo-landing-refresh-shots.timer(04:30 / 16:30 UTC,RandomizedDelaySec=30m), а также пост-деплой. - Получает git-дерево мобильного репозитория (Forgejo — первичный, GitHub —
резервный) и выбирает канонические PNG из
assets/screenshots/. - Проверяет каждый файл: магические байты PNG и git-blob sha1
(
sha1("blob <size>\0" + содержимое)должен совпасть с sha из дерева). - Публикует файлы с именами
<stem>-<sha8>.png(sha в имени → immutable-кеш) иmanifest.json(fingerprint, updatedAt, sourceUrl, sourcePath, images) в/slovo/landing/screenshots, который nginx отдаёт как/screenshots. - Если fingerprint уже совпадает с удалённым деревом — выход 0 без повторной загрузки и перезаписи (устаревшие файлы всё равно удаляются — галерея самовосстанавливается). При ошибке сохраняется предыдущее состояние (keep-last-good).
Страница показывает галерею из manifest.json с обязательной строкой
«Скриншоты: © 2026 Slovo.Propovedi, GPL-3.0-or-later» (лицензия GPL-3.0-or-later
из REUSE.toml мобильного репозитория).
Разработка
Запуск локально
docker build -t slovo-propovedi-landing .
docker run --rm -p 8080:8080 \
-v /path/to/apk+latest.json:/usr/share/nginx/html/apk:ro \
slovo-propovedi-landing
Для локального тестирования положите APK и latest.json в директорию
test-apk/ (gitignored).
npm-команды
npm ci # установка зависимостей (husky)
npm run validate # проверка согласованности файлов (CI parity)
npm run generate-qr # пересоздать assets/img/qr.svg (DOMAIN-PINNED к https://slovo-propovedi.ru)
npm run generate-og # пересоздать assets/img/og.png (нужен rsvg-convert или ImageMagick)
npm run dev # локальный просмотр на http://localhost:8377 (Node, читает .env; остановка Ctrl+C)
Процесс релиза
-
Bump версии:
npm run bump-version <version|patch|minor|major>Скрипт обновляет
package.json,CHANGELOG.md,package-lock.jsonи?v=cache-busting вindex.html(включаяtheme-init.js), коммитит с DCO signoff и создаёт тегvX.Y.Z. -
Пush:
git push --follow-tags origin main -
CI проверяет (
ci.yml):npm run validateна ubuntu-24.04. -
Тег запускает
release.yml:- Проверяет согласованность версий (tag vs package.json).
- Ждёт прохождения CI на закоммиченном коммите.
- Передаёт исходный код на VPS через tar+ssh.
- Запускает
scripts/vps-deploy.sh(buildx-сборка, read-only контейнер за Traefik с apex + www хостами и www→apex редиректом, LE-сертификат). - Прокидывает опциональные токены и запускает обновление APK.
- Создаёт Forgejo Release с секцией из CHANGELOG.md.
Граница ответственности.
vps-deploy.shвладеет только контейнеромslovo-landing, его сетьюslovo-landingи таймерами обновления APK/скриншотов. Общая инфра — Docker, пользовательslovo, buildx-билдерslovo-constrained, Traefik (slovo-traefik.service) и сетьtraefik— принадлежит внешнемуslovo-propovedi-playbookи должна быть развёрнута заранее (just setup-all). Скрипт её только проверяет и падает с ошибкой, если чего-то нет.
Настройка нового VPS
-
Создайте репозиторий в организации Slovo_Propovedi на
git.lightnode.ruи запушьте main. -
Разверните общую инфру на VPS через
slovo-propovedi-playbook(just setup-all) — Docker, пользовательslovo, buildx-билдер, Traefik. -
Добавьте секреты (Settings → Actions → Secrets):
Секрет Описание VPS_SSH_PRIVATE_KEYSSH-ключ (ed25519) для доступа к VPS VPS_HOSTХостнейм или IP VPS VPS_SSH_USERSSH-пользователь на VPS FORGEJO_API_TOKEN(опционально) токен Forgejo API GITHUB_MIRROR_TOKEN(опционально) токен GitHub API -
Раннер:
ubuntu-24.04. -
DNS: A-записи для apex (
slovo-propovedi.ru) иwwwуказывают на VPS. -
Первый релиз — тег
v0.1.0.
Лицензия
Приложение распространяется под лицензией GPL-3.0-or-later — см. репозиторий мобильного приложения.
Атрибуция
- Иконка приложения (
assets/img/icon.png, логотип в шапке) — это иконка приложения «Слово.Проповеди», скопированная без изменений из мобильного репозитория. Распространяется под GPL-3.0-or-later (та же лицензия, что и у ассетов приложения). - Иконки интерфейса — Ionicons v5 (https://ionicons.com), © Ionic — MIT (https://github.com/ionic-team/ionicons/blob/main/LICENSE).