| .forgejo/workflows | ||
| .env.example | ||
| .gitignore | ||
| README.md | ||
Deploy (Forgejo Actions)
Push в main → сайт на твоём домене с SSL. Один файл .env, один пуш.
Это новый флоу на Forgejo Actions. Старый GitLab-флоу (
.gitlab-ci.yml) ещё жив до завершения миграции, но новые проекты заводи здесь.
TL;DR
- Fork этого репо (
templates/starter) в Forgejo. - Положи свой код в корень.
- Создай
.env(см..env.example), минимум:DOMAIN=mysite.com - Пропиши A-запись домена на IP сервера платформы.
git pushвmain. Через ~30–90 сек сайт открыт на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 — ничего настраивать, дефолт.
- CRA —
BUILD_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 в 10–30× быстрее 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 контейнера не попадает (парсится только при деплое).
Секреты:
- Forgejo → репа → Settings → Actions → Secrets → Add Secret. Имя секрета =
имя переменной окружения, напр.
DATABASE_URL,JWT_SECRET. - В
.envперечисли, какие из них прокинуть:RUNTIME_KEYS=DATABASE_URL,JWT_SECRET - В коде:
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, потом открывай (или открой в инкогнито).