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:
# Звичайне з'єднання (прямо до 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 окремення для кожного PR
- Бессерверні функції на edge
Не підходить:
- Високонавантажені production системи (>1000 req/sec до БД)
- Програми з жорсткими latency вимогами
- Довгоживучі з'єднання (PostgreSQL LISTEN/NOTIFY, logical replication)
Графік
Налаштування Neon проекту, Prisma + HTTP-адаптер, CI pipeline з branching per PR, pooler для serverless: 1–2 дні.







