Neon Serverless Postgres для веб-приложения
Neon — serverless PostgreSQL с разделением хранилища и compute, бранчингом баз данных и автоматическим scale-to-zero. Compute инстанс запускается за ~500ms при первом запросе и останавливается после периода простоя. Платите только за активное время, а не за работающий сервер 24/7.
Ключевые возможности
Scale-to-zero: полезно для dev/staging окружений — не платить за простаивающие инстансы. Production с постоянным трафиком от scale-to-zero не выиграет — cold start задержка неприемлема для пользователей.
Branching: моментальные копии базы через copy-on-write. Каждая ветка — полноценный PostgreSQL endpoint:
# Ветка для PR-preview
neon branches create --name preview/pr-123 --parent main
# Ветка для разработки
neon branches create --name dev/feature-payments --parent main
Serverless Driver: HTTP-транспорт вместо TCP. Обязателен для edge runtimes (Cloudflare Workers, Vercel Edge Functions), где нет постоянных TCP-соединений:
import { neon } from '@neondatabase/serverless';
const sql = neon(process.env.DATABASE_URL!);
// Верхнеуровневый await в edge функции
export default async function handler(req: Request) {
const posts = await sql`SELECT id, title FROM posts WHERE published = true LIMIT 10`;
return Response.json(posts);
}
Подключение с Prisma
npm install @prisma/client @neondatabase/serverless prisma
// schema.prisma
datasource db {
provider = "postgresql"
url = env("DATABASE_URL")
// Neon использует ?sslmode=require в URL
}
// lib/prisma.ts — в Edge Runtime используем HTTP-адаптер
import { PrismaClient } from '@prisma/client';
import { Pool, neonConfig } from '@neondatabase/serverless';
import { PrismaNeon } from '@prisma/adapter-neon';
import ws from 'ws';
neonConfig.webSocketConstructor = ws; // для Node.js
const pool = new Pool({ connectionString: process.env.DATABASE_URL });
const adapter = new PrismaNeon(pool);
export const prisma = new PrismaClient({ adapter });
Connection pooling
Бессерверные функции не держат долгоживущих соединений — каждый invocation открывает новое. Neon имеет встроенный PgBouncer (connection pooler):
# Обычное соединение (прямое к PostgreSQL)
postgresql://user:[email protected]/mydb
# Через пулер (для serverless)
postgresql://user:[email protected]/mydb?pgbouncer=true
Для Next.js serverless функций используйте pooler URL. Для долгоживущих процессов (cron jobs, workers) — прямое соединение.
Branching в CI/CD
# GitHub Actions — создать ветку для каждого PR
- name: Create Neon branch
uses: neondatabase/create-branch-action@v5
id: create-branch
with:
project_id: ${{ vars.NEON_PROJECT_ID }}
api_key: ${{ secrets.NEON_API_KEY }}
branch_name: preview/pr-${{ github.event.pull_request.number }}
parent: main
- name: Run migrations on branch
env:
DATABASE_URL: ${{ steps.create-branch.outputs.db_url }}
run: npx prisma migrate deploy
- name: Deploy Preview
env:
DATABASE_URL: ${{ steps.create-branch.outputs.db_url }}
run: vercel deploy --env DATABASE_URL=$DATABASE_URL
# При закрытии PR — удалить ветку
- name: Delete Neon branch
if: github.event.action == 'closed'
uses: neondatabase/delete-branch-action@v3
with:
project_id: ${{ vars.NEON_PROJECT_ID }}
branch: preview/pr-${{ github.event.pull_request.number }}
api_key: ${{ secrets.NEON_API_KEY }}
Ограничения
- Максимальный размер строки 8 КБ (стандартный PostgreSQL)
- Не поддерживает некоторые PostgreSQL расширения (PostGIS поддерживается, btree_gist — да, pgaudit — нет)
- Scale-to-zero cold start ~500ms — неприемлем для production с SLA < 1 секунды
- Цена на высоких нагрузках может превысить dedicated PostgreSQL
Когда выбирать Neon
Подходит:
- Next.js / Vercel приложения с переменной нагрузкой
- Стартапы с низким начальным трафиком
- Preview environments для каждого PR
- Бессерверные функции на edge
Не подходит:
- Высоконагруженные production системы (>1000 req/sec к БД)
- Приложения с жёсткими latency требованиями
- Long-running соединения (PostgreSQL LISTEN/NOTIFY, logical replication)
Сроки
Настройка Neon проекта, Prisma + HTTP-адаптер, CI pipeline с branching per PR, pooler для serverless: 1–2 дня.







