clean starter (phase 5)
Some checks failed
deploy / deploy (push) Failing after 3s

This commit is contained in:
ops 2026-06-01 23:44:09 +00:00
parent 34568bf338
commit bfe5a0faa4
4 changed files with 232 additions and 2 deletions

140
README.md
View file

@ -1,3 +1,139 @@
# starter
# Deploy (Forgejo Actions)
Fork me: starter for the Forgejo Actions deploy flow
Push в `main` → сайт на твоём домене с SSL. Один файл `.env`, один пуш.
> Это новый флоу на **Forgejo Actions**. Старый GitLab-флоу (`.gitlab-ci.yml`)
> ещё жив до завершения миграции, но новые проекты заводи здесь.
---
## TL;DR
1. **Fork** этого репо (`templates/starter`) в Forgejo.
2. Положи свой код в корень.
3. Создай `.env` (см. `.env.example`), минимум:
```env
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` → статика раздаётся напрямую (без
контейнера). Деплой за секунды, редеплой = только заливка новых файлов.
```env
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`.
```env
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`. Том переживает редеплои.
```env
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-файл:
```bash
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` перечисли, какие из них прокинуть:
```env
RUNTIME_KEYS=DATABASE_URL,JWT_SECRET
```
3. В коде: `process.env.DATABASE_URL`.
Платформа берёт **только** ключи из `RUNTIME_KEYS` — ничего лишнего не утечёт.
(Только для `docker`/`docker-db`; у static-сайта runtime-секретов нет.)
---
## Выключить сайт (kill-switch)
В `.env`:
```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**, потом открывай
(или открой в инкогнито).