-
-
Notifications
You must be signed in to change notification settings - Fork 8
change db hosting
This page outlines how to deploy your application in production environments, using Drizzle ORM and drizzle-kit, with one-click compatibility for:
-
✅ Neon (serverless Postgres)
-
✅ Self-hosted Postgres (VPS)
-
✅ Docker-hosted Postgres
-
✅ Cloud Postgres (AWS RDS, Supabase, Railway, etc.)
A strong choice for most hosted scenarios:
DATABASE_URL=postgresql://user:pass@ep-XXXX.neon.tech/dbname?sslmode=require
import { drizzle } from 'drizzle-orm/neon-http';
import { neon } from '@neondatabase/serverless';
import ws from 'ws';
neonConfig.webSocketConstructor = ws; // required for serverless environments
const sql = neon(process.env.DATABASE_URL!);
export const db = drizzle({ client: sql });
pnpm drizzle-kit push
# or
pnpm drizzle-kit generate && pnpm drizzle-kit migrate
This config uses the Neon serverless HTTP driver for low-latency, serverless & edge compatibility (neon.com, reddit.com, orm.drizzle.team).
Perfect for full control or compliance needs.
sudo apt update && sudo apt install -y postgresql
sudo -u postgres psql -c "CREATE USER produser WITH ENCRYPTED PASSWORD 'prodpass'; CREATE DATABASE proddb OWNER produser;"
-
Edit
listen_addresses='*'inpostgresql.conf -
Add
host all all 0.0.0.0/0 md5inpg_hba.conf -
Restart Postgres.
DATABASE_URL=postgresql://produser:prodpass@VPS_IP:5432/proddb
import { drizzle } from "drizzle-orm/node-postgres";
import { Pool } from "pg";
const pool = new Pool({ connectionString: process.env.DATABASE_URL });
export const db = drizzle(pool);
Great for containerized production.
version: '3.8'
services:
db:
image: postgres:15-alpine
restart: unless-stopped
environment:
POSTGRES_DB: proddb
POSTGRES_USER: produser
POSTGRES_PASSWORD: prodpass
volumes:
- pgdata:/var/lib/postgresql/data
networks:
- backend
app:
build: .
env_file: .env.production
depends_on:
- db
networks:
- backend
volumes:
pgdata:
networks:
backend:
docker-compose -f docker-compose.yml -f docker-compose.prod.yml up -d
DATABASE_URL=postgresql://produser:prodpass@db:5432/proddb
Run migrations before container startup (github.com).
Managed Postgres with full uptime guarantees.
-
Provision instance, allow access from your app server.
-
Copy endpoint.
DATABASE_URL=postgresql://produser:prodpass@your-rds-endpoint.amazonaws.com:5432/proddb?sslmode=require
Connect using the same Drizzle setup as VPS/Docker.
Create drizzle.config.ts:
import type { Config } from "drizzle-kit";
import 'dotenv/config';
export default {
schema: "./lib/schema.ts",
out: "./drizzle/migrations",
dialect: "postgresql",
dbCredentials: { url: process.env.DATABASE_URL! },
strict: true,
} satisfies Config;
"scripts": {
"db:push": "drizzle-kit push",
"db:migrate": "drizzle-kit migrate"
}
Run in CI or pre-deploy:
pnpm db:push
# or
pnpm db:migrate
Create scripts/db-check.ts:
#!/usr/bin/env tsx
import { Pool } from "pg";
const pool = new Pool({ connectionString: process.env.DATABASE_URL });
pool.query("SELECT 1")
.then(() => console.log("✅ DB connection OK"))
.catch(err => { console.error("❌ DB connection failed", err); process.exit(1); })
.finally(() => pool.end());
Run this in CI/CD before deployment.
| Symptom | Potential Fix |
|---|---|
| ECONNREFUSED | DB offline or wrong host/port |
| SSL errors | Add ?sslmode=require |
| Auth failed | Verify credentials and roles |
| Docker db down | Check docker-compose ps and logs |
-
✅ Add GitHub Action to run
db:pushon merge tomain -
✅ Create pre-deploy health check step
-
✅ Add support for high availability (PgBouncer, read replicas)
-
✅ Add automated backups
Let me know if you'd like me to provide:
-
A GitHub Actions workflow snippet for auto-migrations
-
A refined
docker-compose.prod.yml -
Or CI/CD integration examples
Happy to help you level up!