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 to127.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 to127.0.0.1) - Web Console: Port
9001(bound to127.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 to127.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:
- Put a reverse proxy in front (Nginx, Caddy, or Traefin) with TLS termination
- Change all default passwords — the
setup.shscript generates random secrets - Set up database backups — use
pg_dumpon a cron schedule - Set up S3 backup — use
mc mirroror rclone for MinIO data - Set
BETTER_AUTH_URLto your production domain - 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
- Railway Deployment — Deploy to Railway cloud for managed hosting
- Environment Variables — Full reference of all configuration options