# Docker Build Guide for XTablo API

## Overview

This Dockerfile is configured for a **pnpm monorepo** setup. It must be built from the repository root, not from the `apps/api` directory.

## Build Commands

### Production Build (default)

```bash
cd /path/to/xtablo-source
docker build -f apps/api/Dockerfile -t xtablo-api:production .
```

### Staging Build

```bash
cd /path/to/xtablo-source
docker build -f apps/api/Dockerfile --target staging -t xtablo-api:staging .
```

### Build Specific Stages (for testing)

```bash
# Test dependencies stage
docker build -f apps/api/Dockerfile --target deps -t xtablo-api:deps .

# Test build stage
docker build -f apps/api/Dockerfile --target build -t xtablo-api:build .

# Test production dependencies
docker build -f apps/api/Dockerfile --target prod-deps -t xtablo-api:prod-deps .
```

## Running the Container

### Basic Run

```bash
docker run -p 8080:8080 \
  -e SUPABASE_URL=your_url \
  -e SUPABASE_SERVICE_ROLE_KEY=your_key \
  -e STREAM_API_KEY=your_key \
  -e STREAM_SECRET=your_secret \
  xtablo-api:production
```

### With Environment File

```bash
docker run -p 8080:8080 --env-file .env.production xtablo-api:production
```

## Docker Compose Example

```yaml
version: "3.8"

services:
  api:
    build:
      context: .
      dockerfile: apps/api/Dockerfile
      target: production
    ports:
      - "8080:8080"
    environment:
      - NODE_ENV=production
      - SUPABASE_URL=${SUPABASE_URL}
      - SUPABASE_SERVICE_ROLE_KEY=${SUPABASE_SERVICE_ROLE_KEY}
      - STREAM_API_KEY=${STREAM_API_KEY}
      - STREAM_SECRET=${STREAM_SECRET}
    restart: unless-stopped
```

## Image Structure

- **Base Image**: `node:18-alpine`
- **Package Manager**: pnpm (via corepack)
- **Working Directory**: `/app/apps/api`
- **User**: `nodejs` (non-root, UID 1001)
- **Port**: 8080

## Multi-Stage Build Details

1. **base**: Sets up Node.js, pnpm, copies workspace files
2. **deps**: Installs all dependencies (including dev dependencies)
3. **build**: Compiles TypeScript to JavaScript
4. **prod-deps**: Installs only production dependencies
5. **staging**: Creates staging image with production dependencies
6. **production**: Creates production image (default target)

## Important Notes

- ⚠️ **Always build from the monorepo root**, not from `apps/api`
- Environment variables should be injected at runtime, not baked into the image
- The image uses pnpm's workspace features with proper symlink structure
- pnpm version: 10.19.0 (via corepack)
- Node version: 18.20.8
- The `.dockerignore` file excludes local `dist` and `node_modules` to ensure clean builds

## Verification Commands

### Check image size

```bash
docker images xtablo-api:production
```

### Inspect image

```bash
docker run --rm --entrypoint sh xtablo-api:production -c "ls -la /app/apps/api"
```

### Test pnpm installation

```bash
docker run --rm --entrypoint sh xtablo-api:production -c "pnpm --version"
```

### Check built files

```bash
docker run --rm --entrypoint sh xtablo-api:production -c "ls -la /app/apps/api/dist"
```

## Troubleshooting

### "pnpm-lock.yaml: not found"

- Make sure you're building from the repository root
- Use `-f apps/api/Dockerfile` to specify the Dockerfile location

### "Permission denied"

- The container runs as a non-root user (`nodejs`)
- Ensure file permissions are set correctly (handled by the Dockerfile)

### Dependencies not found

- The monorepo structure requires the entire workspace for dependency resolution
- Make sure `pnpm-workspace.yaml` is present in the root

## CI/CD Integration

For Cloud Build or similar CI/CD systems, update your build configuration:

```yaml
steps:
  - name: "gcr.io/cloud-builders/docker"
    args:
      - "build"
      - "-f"
      - "apps/api/Dockerfile"
      - "-t"
      - "gcr.io/$PROJECT_ID/xtablo-api:$COMMIT_SHA"
      - "-t"
      - "gcr.io/$PROJECT_ID/xtablo-api:latest"
      - "."
    dir: "." # Build from root, not apps/api
```
