DocsDeploymentDocker Compose

Docker Compose

Deploy Reqcore locally or on a server using Docker Compose with PostgreSQL, MinIO, and the Nuxt application.

Docker Compose Deployment

Reqcore ships with a docker-compose.yml for local development and self-hosted production deployments. This gives you full control over your data — database, file storage, and application all run on your infrastructure.

Architecture

┌─────────────────────────────────────────┐
│  Docker Compose                          │
│                                          │
│  ┌──────────────┐  ┌──────────────────┐ │
│  │  PostgreSQL   │  │  MinIO (S3)      │ │
│  │  Port 5432    │  │  Port 9000/9001  │ │
│  └──────┬───────┘  └───────┬──────────┘ │
│         │                  │             │
│  ┌──────┴──────────────────┴──────────┐ │
│  │  Reqcore (Nuxt 4)                   │ │
│  │  Port 3000                          │ │
│  └─────────────────────────────────────┘ │
│                                          │
│  ┌──────────────┐                       │
│  │  Adminer      │                      │
│  │  Port 8080    │                      │
│  └──────────────┘                       │
└─────────────────────────────────────────┘

Quick Start

# 1. Clone the repository
git clone https://github.com/reqcore-inc/reqcore.git
cd reqcore

# 2. Generate secrets
./setup.sh

# 3. Start everything
docker compose up -d

# 4. Install dependencies and start dev server
npm install
npm run dev

Services

PostgreSQL 16

Persistent relational database for all application data.

  • Port: 5432 (bound to 127.0.0.1)
  • Default user: reqcore
  • Default database: reqcore
  • Data volume: postgres-data (persists across restarts)

MinIO

S3-compatible object storage for resumes, cover letters, and file uploads.

  • S3 API: Port 9000 (bound to 127.0.0.1)
  • Web Console: Port 9001 (bound to 127.0.0.1)
  • Default credentials: Set in .env (MINIO_ROOT_USER / MINIO_ROOT_PASSWORD)
  • Data volume: minio-data (persists across restarts)

On startup, Reqcore automatically creates the S3 bucket and enforces a private bucket policy (deletes any public access rules).

Adminer

Lightweight database management UI for inspecting PostgreSQL data.

  • Port: 8080 (bound to 127.0.0.1)
  • System: PostgreSQL
  • Server: postgres (Docker network hostname)

Security Notes

  • All Docker ports are bound to 127.0.0.1 — they are not accessible from external networks
  • MinIO bucket policy is enforced as private on every application startup
  • Uploaded filenames are sanitized to prevent path traversal and XSS
  • Document access is always server-proxied — no presigned URLs are exposed to clients

Production Considerations

For a production self-hosted deployment:

  1. Put a reverse proxy in front (Nginx, Caddy, or Traefin) with TLS termination
  2. Change all default passwords — the setup.sh script generates random secrets
  3. Set up database backups — use pg_dump on a cron schedule
  4. Set up S3 backup — use mc mirror or rclone for MinIO data
  5. Set BETTER_AUTH_URL to your production domain
  6. Consider using external PostgreSQL and S3 for better availability

Useful Commands

# View logs
docker compose logs -f

# Restart a specific service
docker compose restart postgres

# Reset everything (WARNING: deletes all data)
docker compose down -v

# Run database migrations manually
npm run db:migrate

# Open Drizzle Studio (database GUI)
npm run db:studio

Next Steps