starter/README.md
ops bfe5a0faa4
Some checks failed
deploy / deploy (push) Failing after 3s
clean starter (phase 5)
2026-06-01 23:44:09 +00:00

5.6 KiB
Raw Permalink Blame History

Deploy (Forgejo Actions)

Push в main → сайт на твоём домене с SSL. Один файл .env, один пуш.

Это новый флоу на Forgejo Actions. Старый GitLab-флоу (.gitlab-ci.yml) ещё жив до завершения миграции, но новые проекты заводи здесь.


TL;DR

  1. Fork этого репо (templates/starter) в Forgejo.
  2. Положи свой код в корень.
  3. Создай .env (см. .env.example), минимум:
    DOMAIN=mysite.com
    
  4. Пропиши A-запись домена на IP сервера платформы.
  5. git push в main. Через ~3090 сек сайт открыт на https://mysite.com.

Дальше любой push = редеплой. Файл .forgejo/workflows/deploy.yml трогать не нужно.


Три типа проектов

Тип определяется по .env (DEPLOY=...) или авто-детектом.

1. static — фронт (90% проектов)

Vite / CRA / Next static export. bun build → статика раздаётся напрямую (без контейнера). Деплой за секунды, редеплой = только заливка новых файлов.

DOMAIN=mysite.com
# DEPLOY=static        # дефолт, если нет Dockerfile
# BUILD_DIR=dist       # Vite=dist (дефолт), CRA=build, Next export=out
  • Vite + React — ничего настраивать, дефолт.
  • CRABUILD_DIR=build.
  • Next.js static export — в next.config: output: 'export', images: { unoptimized: true }, trailingSlash: true; .env: BUILD_DIR=out. SSR / API routes / Server Actions не работают (только статика).

2. docker — фронт + бэкенд в контейнере

Положи Dockerfile в корень. Платформа собирает образ и поднимает контейнер, проксирует домен на него. Контейнер должен слушать порт из APP_PORT.

DOMAIN=mysite.com
DEPLOY=docker          # или просто наличие Dockerfile
APP_PORT=3000          # порт, который слушает контейнер (default 80)

3. docker-db — + персистентная база (SQLite)

Как docker, плюс платформа монтирует named-volume в /data и прокидывает DATABASE_URL=file:/data/app.db. Том переживает редеплои.

DOMAIN=mysite.com
DEPLOY=docker-db
APP_PORT=3000

В коде читаешь process.env.DATABASE_URL. Миграции (drizzle/prisma) запускай в своём entrypoint — платформа их не делает. Не указывай DATABASE_URL в RUNTIME_KEYS — она ставится автоматически.


Скорость билда — bun

Платформа собирает фронт через bun (install в 1030× быстрее npm). Закоммить lock-файл:

bun install        # создаст bun.lock
git add bun.lock && git commit -m "chore: bun lock" && git push

package.json и твои npm run build скрипты bun понимает as-is. Не коммить node_modules / dist (они в .gitignore).


Секреты (DATABASE_URL, API-ключи)

.env в runtime контейнера не попадает (парсится только при деплое). Секреты:

  1. Forgejo → репа → Settings → Actions → Secrets → Add Secret. Имя секрета = имя переменной окружения, напр. DATABASE_URL, JWT_SECRET.
  2. В .env перечисли, какие из них прокинуть:
    RUNTIME_KEYS=DATABASE_URL,JWT_SECRET
    
  3. В коде: process.env.DATABASE_URL.

Платформа берёт только ключи из RUNTIME_KEYS — ничего лишнего не утечёт. (Только для docker/docker-db; у static-сайта runtime-секретов нет.)


Выключить сайт (kill-switch)

В .env:

ENABLED=false

Push → контейнер/файлы удаляются, домен отдаёт 404. Убери строку (или true) + push → поднимается обратно. Том и секреты сохраняются.

(Админ может выключить проект и без коммита в репу — переменной ENABLED=false в Settings → Actions → Variables.)


Переменные .env

Key Default Зачем
DOMAIN Обязательно (кроме ENABLED=false)
DEPLOY auto static / docker / docker-db
BUILD_DIR dist static: папка сборки
APP_PORT 80 docker: порт контейнера
WWW auto false — не подключать www
ENABLED true false — выключить сайт
RUNTIME_KEYS docker: список секретов в контейнер

Не открывай сайт в браузере, пока workflow не зелёный

Пока деплой идёт, по домену ещё может не быть валидного серта. Браузер может закешировать "сломанный SSL". Дождись зелёного run в Actions, потом открывай (или открой в инкогнито).