Files
deckerr/DOCKER.md

192 lines
4.4 KiB
Markdown

# Deckerr Docker Deployment
Self-host Deckerr with two deployment options:
## Deployment Options
| Option | Use Case | Complexity |
|--------|----------|------------|
| **External Supabase** | Use hosted Supabase (cloud or paid) | Simple |
| **Self-hosted Supabase** | Run everything locally | Advanced |
---
## Option 1: External Supabase (Recommended)
Use your own Supabase instance (cloud, paid hosted, or separately self-hosted).
### Quick Start
```bash
# 1. Copy environment template
cp .env.example .env
# 2. Edit .env with your Supabase credentials
VITE_SUPABASE_URL=https://your-project.supabase.co
VITE_SUPABASE_ANON_KEY=your-anon-key
PORT=3000
# 3. Run database migrations on your Supabase
# Go to Supabase Dashboard > SQL Editor and run:
# Contents of supabase/migrations/20250131132458_black_frost.sql
# 4. Start Deckerr
docker-compose up -d
# 5. Access at http://localhost:3000
```
### Using Hosted Supabase (Paid Service)
Contact the Deckerr team for access credentials to use the hosted backend.
---
## Option 2: Self-Hosted Supabase (Full Stack)
Run Deckerr with a complete self-hosted Supabase stack.
### Prerequisites
- Docker & Docker Compose
- 2GB+ RAM
- Ports: 3000, 5432, 8000
### Quick Start
```bash
# 1. Copy environment template
cp .env.example .env
# 2. Generate secure keys
# JWT Secret (required)
openssl rand -base64 32
# Generate Supabase API keys
# Option A: Use online generator at https://supabase.com/docs/guides/self-hosting#api-keys
# Option B: Use Supabase CLI
npx @supabase/cli@latest gen key --type anon --jwt-secret "YOUR_JWT_SECRET"
npx @supabase/cli@latest gen key --type service_role --jwt-secret "YOUR_JWT_SECRET"
# 3. Update .env with your generated values
POSTGRES_PASSWORD=<generated-password>
JWT_SECRET=<generated-jwt-secret>
ANON_KEY=<generated-anon-key>
SERVICE_ROLE_KEY=<generated-service-key>
# 4. Start all services
docker-compose -f docker-compose.selfhosted.yml up -d
# 5. Access Deckerr at http://localhost:3000
# API available at http://localhost:8000
```
### Generate Keys Script
```bash
#!/bin/bash
JWT_SECRET=$(openssl rand -base64 32)
echo "JWT_SECRET=$JWT_SECRET"
echo ""
echo "Now generate API keys at:"
echo "https://supabase.com/docs/guides/self-hosting#api-keys"
echo "Use this JWT secret: $JWT_SECRET"
```
### Self-Hosted Services
| Service | Port | Description |
|---------|------|-------------|
| Deckerr | 3000 | Frontend app |
| Kong | 8000 | API Gateway |
| PostgreSQL | 5432 | Database |
| Auth | 9999 | Authentication (internal) |
| REST | 3000 | PostgREST API (internal) |
| Realtime | 4000 | WebSocket (internal) |
---
## Environment Variables
### External Supabase Mode
| Variable | Required | Description |
|----------|----------|-------------|
| `VITE_SUPABASE_URL` | Yes | Supabase project URL |
| `VITE_SUPABASE_ANON_KEY` | Yes | Supabase anonymous key |
| `PORT` | No | App port (default: 3000) |
### Self-Hosted Mode
| Variable | Required | Description |
|----------|----------|-------------|
| `POSTGRES_PASSWORD` | Yes | PostgreSQL password |
| `JWT_SECRET` | Yes | JWT signing secret (32+ chars) |
| `ANON_KEY` | Yes | Supabase anonymous key |
| `SERVICE_ROLE_KEY` | Yes | Supabase service role key |
| `SITE_URL` | No | Your domain (default: localhost) |
| `SMTP_*` | No | Email configuration |
---
## Commands
```bash
# Start (external Supabase)
docker-compose up -d
# Start (self-hosted)
docker-compose -f docker-compose.selfhosted.yml up -d
# Stop
docker-compose down
# View logs
docker-compose logs -f
# Rebuild after code changes
docker-compose build --no-cache
docker-compose up -d
# Reset database (self-hosted only)
docker-compose -f docker-compose.selfhosted.yml down -v
docker-compose -f docker-compose.selfhosted.yml up -d
```
---
## Production Checklist
- [ ] Use strong passwords (generate with `openssl rand -base64 32`)
- [ ] Configure HTTPS with reverse proxy (nginx, Traefik, Caddy)
- [ ] Set up email (SMTP) for password reset
- [ ] Configure firewall rules
- [ ] Set up backups for PostgreSQL volume
- [ ] Consider rate limiting at reverse proxy level
---
## Troubleshooting
### Container won't start
```bash
docker-compose logs <service-name>
```
### Database connection issues
```bash
# Check if database is healthy
docker-compose exec db pg_isready -U postgres
```
### Reset everything
```bash
docker-compose down -v
docker-compose up -d --build
```
### Check service health
```bash
docker-compose ps
```