Files

8.3 KiB

Docker Deployment Guide

Run your own prompts.chat instance with a single command.

Quick Start

docker run -d \
  --name prompts \
  -p 4444:3000 \
  -v prompts-data:/data \
  ghcr.io/f/prompts.chat

First run: The container will clone the repository and build the app (~3-5 minutes).
Subsequent runs: Starts immediately using the cached build.

Open http://localhost:4444 in your browser.

Custom Branding

Customize your instance with environment variables:

docker run -d \
  --name my-prompts \
  -p 4444:3000 \
  -v prompts-data:/data \
  -e PCHAT_NAME="Acme Prompts" \
  -e PCHAT_DESCRIPTION="Our team's AI prompt library" \
  -e PCHAT_COLOR="#ff6600" \
  -e PCHAT_AUTH_PROVIDERS="github,google" \
  -e PCHAT_LOCALES="en,es,fr" \
  ghcr.io/f/prompts.chat

Note: Branding is applied during the first build. To change branding later, delete the volume and re-run:

docker rm -f my-prompts
docker volume rm prompts-data
docker run ... # with new env vars

Configuration Variables

All variables are prefixed with PCHAT_ to avoid conflicts.

Branding (branding.* in prompts.config.ts)

Env Variable Config Path Description Default
PCHAT_NAME branding.name App name shown in UI My Prompt Library
PCHAT_DESCRIPTION branding.description App description Collect, organize...
PCHAT_LOGO branding.logo Logo path (in public/) /logo.svg
PCHAT_LOGO_DARK branding.logoDark Dark mode logo Same as PCHAT_LOGO
PCHAT_FAVICON branding.favicon Favicon path /logo.svg

Theme (theme.* in prompts.config.ts)

Env Variable Config Path Description Default
PCHAT_COLOR theme.colors.primary Primary color (hex) #6366f1
PCHAT_THEME_RADIUS theme.radius Border radius: none|sm|md|lg sm
PCHAT_THEME_VARIANT theme.variant UI style: default|flat|brutal default
PCHAT_THEME_DENSITY theme.density Spacing: compact|default|comfortable default

Authentication (auth.* in prompts.config.ts)

Env Variable Config Path Description Default
PCHAT_AUTH_PROVIDERS auth.providers Providers: github,google,credentials credentials
PCHAT_ALLOW_REGISTRATION auth.allowRegistration Allow public signup true

Internationalization (i18n.* in prompts.config.ts)

Env Variable Config Path Description Default
PCHAT_LOCALES i18n.locales Supported locales (comma-separated) en
PCHAT_DEFAULT_LOCALE i18n.defaultLocale Default locale en

Features (features.* in prompts.config.ts)

Env Variable Config Path Description Default
PCHAT_FEATURE_PRIVATE_PROMPTS features.privatePrompts Enable private prompts true
PCHAT_FEATURE_CHANGE_REQUESTS features.changeRequests Enable versioning true
PCHAT_FEATURE_CATEGORIES features.categories Enable categories true
PCHAT_FEATURE_TAGS features.tags Enable tags true
PCHAT_FEATURE_COMMENTS features.comments Enable comments true
PCHAT_FEATURE_AI_SEARCH features.aiSearch Enable AI search false
PCHAT_FEATURE_AI_GENERATION features.aiGeneration Enable AI generation false
PCHAT_FEATURE_MCP features.mcp Enable MCP features false

System Environment Variables

Variable Description Default
AUTH_SECRET Secret for authentication tokens Auto-generated
PORT Internal container port 3000
DATABASE_URL PostgreSQL connection string Internal DB

Production Setup

For production, set AUTH_SECRET explicitly:

docker run -d \
  --name prompts \
  -p 4444:3000 \
  -v prompts-data:/data \
  -e AUTH_SECRET="$(openssl rand -base64 32)" \
  -e PCHAT_NAME="My Company Prompts" \
  ghcr.io/f/prompts.chat

With OAuth Providers

docker run -d \
  --name prompts \
  -p 4444:3000 \
  -v prompts-data:/data \
  -e AUTH_SECRET="your-secret-key" \
  -e PCHAT_AUTH_PROVIDERS="github,google" \
  -e AUTH_GITHUB_ID="your-github-client-id" \
  -e AUTH_GITHUB_SECRET="your-github-client-secret" \
  -e AUTH_GOOGLE_ID="your-google-client-id" \
  -e AUTH_GOOGLE_SECRET="your-google-client-secret" \
  ghcr.io/f/prompts.chat

With AI Features (OpenAI)

docker run -d \
  --name prompts \
  -p 4444:3000 \
  -v prompts-data:/data \
  -e PCHAT_FEATURE_AI_SEARCH="true" \
  -e OPENAI_API_KEY="sk-..." \
  ghcr.io/f/prompts.chat

Mount your logo file:

docker run -d \
  --name prompts \
  -p 4444:3000 \
  -v prompts-data:/data \
  -v ./my-logo.svg:/data/app/public/logo.svg \
  -e PCHAT_NAME="My App" \
  ghcr.io/f/prompts.chat

Data Persistence

All-in-One Image

Data is stored in /data inside the container:

  • /data/postgres - PostgreSQL database files

Mount a volume to persist data:

docker run -d \
  -v prompts-data:/data \
  ghcr.io/f/prompts.chat

Backup

# Backup database
docker exec prompts pg_dump -U prompts prompts > backup.sql

# Restore database
docker exec -i prompts psql -U prompts prompts < backup.sql

Building Locally

Build and run locally:

docker build -f docker/Dockerfile -t prompts.chat .
docker run -p 4444:3000 -v prompts-data:/data prompts.chat

Health Check

The container includes a health check endpoint:

curl http://localhost:4444/api/health

Response:

{
  "status": "healthy",
  "timestamp": "2024-01-01T00:00:00.000Z",
  "database": "connected"
}

Troubleshooting

View Logs

# All logs
docker logs prompts

# Follow logs
docker logs -f prompts

# PostgreSQL logs (inside container)
docker exec prompts cat /var/log/supervisor/postgresql.log

# Next.js logs (inside container)
docker exec prompts cat /var/log/supervisor/nextjs.log

Database Access

# Connect to PostgreSQL
docker exec -it prompts psql -U prompts -d prompts

# Run SQL query
docker exec prompts psql -U prompts -d prompts -c "SELECT COUNT(*) FROM \"Prompt\""

Container Shell

docker exec -it prompts bash

Common Issues

Container won't start:

  • Check logs: docker logs prompts
  • Ensure port 4444 is available: lsof -i :4444

Database connection errors:

  • Wait for PostgreSQL to initialize (can take 30-60 seconds on first run)
  • Check database logs: docker exec prompts cat /var/log/supervisor/postgresql.log

Authentication issues:

  • Ensure AUTH_SECRET is set for production
  • For OAuth, verify callback URLs are configured correctly

Resource Requirements

Minimum:

  • 1 CPU core
  • 1GB RAM
  • 2GB disk space

Recommended:

  • 2 CPU cores
  • 2GB RAM
  • 10GB disk space

Updating

# Pull latest image
docker pull ghcr.io/f/prompts.chat

# Stop and remove old container
docker stop prompts && docker rm prompts

# Start new container (data persists in volume)
docker run -d \
  --name prompts \
  -p 4444:3000 \
  -v prompts-data:/data \
  -e AUTH_SECRET="your-secret-key" \
  ghcr.io/f/prompts.chat

Security Considerations

  1. Always set AUTH_SECRET in production
  2. Use HTTPS - put a reverse proxy (nginx, Caddy, Traefik) in front
  3. Limit exposed ports - only expose what's needed
  4. Regular updates - pull the latest image regularly
  5. Backup data - regularly backup the /data volume

Example: Running Behind Nginx

server {
    listen 443 ssl http2;
    server_name prompts.example.com;

    ssl_certificate /etc/letsencrypt/live/prompts.example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/prompts.example.com/privkey.pem;

    location / {
        proxy_pass http://localhost:4444;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_cache_bypass $http_upgrade;
    }
}

License

MIT