A production-ready SvelteKit application with authentication using Better Auth, containerized with Docker, served by Nginx, and running with Bun.
Internet → Nginx (Port 80) → Load Balancer → App Instances (x3) → PostgreSQL
# Copy environment file
cp .env.example .env
# Edit .env and set your values
nano .env
# Start all services
docker compose up -d
# View logs
docker compose logs -f
# Stop services
docker compose down
Edit .env file:
# Database
POSTGRES_USER=root
POSTGRES_PASSWORD=mysecretpassword
POSTGRES_DB=local
# Better Auth
BETTER_AUTH_SECRET=your-secret-key-change-in-production
BETTER_AUTH_URL=http://localhost
# External Port
PORT=80
Adjust the number of app replicas in compose.yaml:
app:
deploy:
replicas: 3 # Change this number
.
├── Dockerfile # Multi-stage Docker build
├── compose.yaml # Docker Compose configuration
├── nginx/
│ └── nginx.conf # Nginx configuration
├── src/
│ ├── hooks.server.ts # Auth middleware
│ ├── lib/
│ │ ├── auth.ts # Better Auth server config
│ │ └── auth-client.ts # Better Auth client config
│ └── routes/
│ ├── +page.svelte # Protected home page
│ ├── sign-in/ # Sign in page
│ └── sign-up/ # Sign up page
└── .env.example # Environment variables template
# Start database only
docker compose up db -d
# Install dependencies
bun install
# Run dev server
bun run dev
# Push schema to database
bun run db:push
# Generate migrations
bun run db:generate
# Open Drizzle Studio
bun run db:studio
BETTER_AUTH_SECRETBETTER_AUTH_URL to your domainUpdate nginx/nginx.conf to add SSL:
server {
listen 443 ssl http2;
ssl_certificate /etc/nginx/ssl/cert.pem;
ssl_certificate_key /etc/nginx/ssl/key.pem;
# ... rest of config
}
# Build and start
docker compose up -d --build
# Check status
docker compose ps
# View logs
docker compose logs -f app
# All services
docker compose logs -f
# Specific service
docker compose logs -f app
docker compose logs -f nginx
docker compose logs -f db
# Restart all
docker compose restart
# Restart specific service
docker compose restart app
# Stop and remove everything including volumes
docker compose down -v
# Rebuild and start
docker compose up -d --build
docker compose ps
BETTER_AUTH_SECRET (generate with openssl rand -base64 32)ports from db service)MIT