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

139 lines
5.6 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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`), минимум:
```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**, потом открывай
(или открой в инкогнито).