Настройка Preview Deployments (Deploy Previews) для 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 день.







