Настройка Preview Deployments для Pull Request
Preview Deployment — це автоматично створюване тимчасове оточення для кожного Pull Request з унікальним URL вигляду https://pr-123.preview.example.com. Ревьюер відкриває живий сайт, кліває по інтерфейсу, перевіряє зміни без необхідності клонувати репозиторій та настроювати локальне оточення.
Платформи з вбудованими Preview Deployments
Vercel — найкращий варіант для Next.js та статичних сайтів. Preview deployments працюють з коробки при підключенні GitHub репозиторію. Кожен PR отримує унікальний URL, посилання додається в коментар PR автоматично.
Netlify — аналогічна функціональність для статичних сайтів та JAMstack. Deploy Previews включені за замовчуванням. Підтримує split testing між preview та production.
Railway / Render — для full-stack додатків з базою даних. Railway створює ізольоване оточення з окремою БД для кожного PR.
Кастомна реалізація на VPS
Для додатків, які не можуть бути деплоєні на Vercel/Netlify (Docker-контейнери, специфічні вимоги):
# .github/workflows/preview.yml
name: Preview Deployment
on:
pull_request:
types: [opened, synchronize, reopened]
jobs:
deploy-preview:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Build Docker image
run: |
docker build -t app:pr-${{ github.event.pull_request.number }} .
- name: Deploy to preview server
uses: appleboy/ssh-action@v1
with:
host: ${{ secrets.PREVIEW_SERVER_HOST }}
username: deploy
key: ${{ secrets.PREVIEW_SSH_KEY }}
script: |
docker pull registry.example.com/app:pr-${{ github.event.pull_request.number }}
docker stop app-pr-${{ github.event.pull_request.number }} || true
docker run -d --name app-pr-${{ github.event.pull_request.number }} \
-p 0:3000 \
--label traefik.enable=true \
--label "traefik.http.routers.pr-${{ github.event.pull_request.number }}.rule=Host(\`pr-${{ github.event.pull_request.number }}.preview.example.com\`)" \
registry.example.com/app:pr-${{ github.event.pull_request.number }}
- name: Comment PR with preview URL
uses: actions/github-script@v7
with:
script: |
github.rest.issues.createComment({
issue_number: context.issue.number,
owner: context.repo.owner,
repo: context.repo.repo,
body: `Preview: https://pr-${context.issue.number}.preview.example.com`
})
Traefik автоматично маршрутизує трафік на потрібний контейнер по subdomain. Wildcard DNS запис *.preview.example.com указує на preview-сервер.
Очистка застарілих оточень
# Видаляємо preview при закритті PR
on:
pull_request:
types: [closed]
jobs:
cleanup:
runs-on: ubuntu-latest
steps:
- name: Remove preview deployment
uses: appleboy/ssh-action@v1
with:
script: |
docker stop app-pr-${{ github.event.pull_request.number }}
docker rm app-pr-${{ github.event.pull_request.number }}
База даних для preview оточень
Варіанти:
- Спільна read-only база даних — швидко, але не можна тестувати запис
- Окрема база на кожен PR — повна ізоляція, але потребує ресурсів. Neon (PostgreSQL) підтримує database branching: створює branch БД миттєво через copy-on-write
- Seeded in-memory база — SQLite або PostgreSQL з фіксованими тестовими даними
Терміни
Preview Deployments на Vercel/Netlify — 0,5 дня. Кастомна реалізація з Docker, Traefik та очисткою оточень — 2–3 дні. Додавання database branching через Neon — 1 день.







