Cap Docker & Self-Hosted Deployment

GitHub

Open source Loom alternative. Beautiful, shareable screen recordings.

20,689 stars TypeScript TypeScript 1 file ยท ~4,487 tokens #app#cap#coss#loom#mac#nextjs#nextjs15#open-source
RAW Compose
1. Pull Image (GHCR) docker pull ghcr.io/capsoftware/cap-web
2. Docker Run (1-Click Launch) docker run -d --name cap --restart always ghcr.io/capsoftware/cap-web:latest
3. Podman Run podman run -d --name cap --restart always ghcr.io/capsoftware/cap-web:latest
4. Skopeo Inspect (Zero-Pull Manifest) skopeo inspect docker://ghcr.io/capsoftware/cap-web:latest
5. ORAS Pull (OCI Artifact) oras pull ghcr.io/capsoftware/cap-web:latest
6. Compose Deployment docker compose up -d
docker-compose.coolify.yml
Download .yml
name: cap
services:
  cap-web:
    image: 'ghcr.io/capsoftware/cap-web:latest'
    restart: unless-stopped
    depends_on:
      mysql:
        condition: service_healthy
      minio:
        condition: service_healthy
    environment:
      SERVICE_URL_CAP_WEB_3000: ''
      DATABASE_URL: 'mysql://cap:${SERVICE_PASSWORD_MYSQL}@mysql:3306/cap'
      WEB_URL: '${SERVICE_URL_CAP_WEB}'
      NEXTAUTH_URL: '${SERVICE_URL_CAP_WEB}'
      DATABASE_ENCRYPTION_KEY: '${SERVICE_HEX_32_DATABASEENCRYPTIONKEY}'
      NEXTAUTH_SECRET: '${SERVICE_HEX_32_NEXTAUTHSECRET}'
      CAP_AWS_ACCESS_KEY: capadmin
      CAP_AWS_SECRET_KEY: '${SERVICE_PASSWORD_MINIO}'
      CAP_AWS_BUCKET: cap
      CAP_AWS_REGION: us-east-1
      S3_PUBLIC_ENDPOINT: '${SERVICE_URL_MINIO}'
      S3_INTERNAL_ENDPOINT: 'http://minio:9000'
      S3_PATH_STYLE: 'true'
      RESEND_API_KEY: '${RESEND_API_KEY:-}'
      RESEND_FROM_DOMAIN: '${RESEND_FROM_DOMAIN:-}'
      GOOGLE_CLIENT_ID: '${GOOGLE_CLIENT_ID:-}'
      GOOGLE_CLIENT_SECRET: '${GOOGLE_CLIENT_SECRET:-}'
      APPLE_CLIENT_ID: '${APPLE_CLIENT_ID:-}'
      APPLE_CLIENT_SECRET: '${APPLE_CLIENT_SECRET:-}'
      MEDIA_SERVER_URL: 'http://media-server:3456'
      MEDIA_SERVER_WEBHOOK_SECRET: '${SERVICE_HEX_32_MEDIASERVER}'
      MEDIA_SERVER_WEBHOOK_URL: 'http://cap-web:3000'
    healthcheck:
      test:
        - CMD
        - wget
        - '-q'
        - '-O'
        - /dev/null
        - 'http://127.0.0.1:3000/'
      interval: 30s
      timeout: 10s
      retries: 3
      start_period: 60s
  media-server:
    image: 'ghcr.io/capsoftware/cap-media-server:latest'
    restart: unless-stopped
    environment:
      PORT: 3456
      MEDIA_SERVER_WEBHOOK_SECRET: '${SERVICE_HEX_32_MEDIASERVER}'
    healthcheck:
      test:
        - CMD
        - bun
        - '-e'
        - "fetch('http://127.0.0.1:3456/health').then((response) => process.exit(response.ok ? 0 : 1)).catch(() => process.exit(1))"
      interval: 30s
      timeout: 10s
      retries: 3
      start_period: 10s
  mysql:
    image: 'mysql:8.0'
    restart: unless-stopped
    environment:
      MYSQL_DATABASE: cap
      MYSQL_USER: cap
      MYSQL_PASSWORD: '${SERVICE_PASSWORD_MYSQL}'
      MYSQL_ROOT_PASSWORD: '${SERVICE_PASSWORD_64_MYSQL}'
    command:
      - '--max_connections=1000'
      - '--character-set-server=utf8mb4'
      - '--collation-server=utf8mb4_unicode_ci'
    volumes:
      - 'cap-mysql-data:/var/lib/mysql'
    healthcheck:
      test:
        - CMD
        - mysqladmin
        - ping
        - '-h'
        - localhost
        - '-u'
        - cap
        - '-p${SERVICE_PASSWORD_MYSQL}'
      interval: 10s
      timeout: 5s
      retries: 10
      start_period: 30s
  minio:
    image: 'pgsty/minio:RELEASE.2026-08-04T00-00-00Z@sha256:b6bfe7239bfc83fb90d31612d9704d86039dd714f7904b3f1ad68f211e602372'
    restart: unless-stopped
    command: 'server /data --console-address ":9001"'
    environment:
      MINIO_ROOT_USER: capadmin
      MINIO_ROOT_PASSWORD: '${SERVICE_PASSWORD_MINIO}'
      SERVICE_URL_MINIO_9000: ''
    volumes:
      - 'cap-minio-data:/data'
    healthcheck:
      test:
        - CMD
        - mc
        - ready
        - local
      interval: 30s
      timeout: 10s
      retries: 3
      start_period: 10s
  minio-setup:
    container_name: cap-minio-setup
    image: 'pgsty/mc:RELEASE.2026-09-16T00-00-00Z@sha256:cfc83108c3abb371f8fb84d99c1fdc88f8c237e022409b0081fb7c0a3be634dd'
    exclude_from_hc: true
    depends_on:
      minio:
        condition: service_healthy
    entrypoint: "/bin/sh -c \" mc alias set capminio http://minio:9000 capadmin $${SERVICE_PASSWORD_MINIO}; mc mb capminio/cap --ignore-existing; exit 0; \"\n"
    environment:
      MINIO_ROOT_USER: capadmin
      MINIO_ROOT_PASSWORD: '${SERVICE_PASSWORD_MINIO}'
      S3_BUCKET: cap
volumes:
  cap-mysql-data: null
  cap-minio-data: null