From 8cdee95679964264aa6632526f508a63b904d27c Mon Sep 17 00:00:00 2001 From: Dorian Date: Mon, 16 Mar 2026 18:59:05 +0000 Subject: [PATCH] feat: add IndeedHub stack to demo compose for Portainer deployment MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Full 8-service IndeedHub stack: app (frontend), api (NestJS), postgres, redis, minio (S3), minio-init, ffmpeg-worker, nostr-relay. All env vars have sensible defaults for demo — override in Portainer env vars for production. IndeedHub builds from ../Indeedhub Prototype source. Frontend on port 7777 with NIP-07 nostr-provider.js for signing via Archipelago's identity system. Co-Authored-By: Claude Opus 4.6 (1M context) --- docker-compose.demo.yml | 183 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 183 insertions(+) diff --git a/docker-compose.demo.yml b/docker-compose.demo.yml index 2aa60689..9d72064a 100644 --- a/docker-compose.demo.yml +++ b/docker-compose.demo.yml @@ -37,3 +37,186 @@ services: depends_on: - neode-backend restart: unless-stopped + + # ══════════════════════════════════════════════════════════════ + # IndeedHub Stack — Decentralized media streaming platform + # ══════════════════════════════════════════════════════════════ + + indeedhub: + build: + context: ../Indeedhub Prototype + dockerfile: Dockerfile + args: + CACHEBUST: "33" + VITE_USE_MOCK_DATA: "false" + VITE_CONTENT_ORIGIN: ${FRONTEND_URL:-http://localhost:7777} + VITE_INDEEHUB_API_URL: /api + VITE_INDEEHUB_CDN_URL: /storage + VITE_NOSTR_RELAYS: "" + container_name: indeedhub + ports: + - "7777:7777" + depends_on: + - indeedhub-relay + - indeedhub-api + networks: + - indeedhub-network + restart: unless-stopped + + indeedhub-api: + build: + context: ../Indeedhub Prototype/backend + dockerfile: Dockerfile + args: + CACHEBUST: "14" + container_name: indeedhub-api + environment: + ENVIRONMENT: production + PORT: 4000 + DOMAIN: ${DOMAIN:-localhost} + FRONTEND_URL: ${FRONTEND_URL:-http://localhost:7777} + DATABASE_HOST: indeedhub-postgres + DATABASE_PORT: 5432 + DATABASE_USER: ${IH_POSTGRES_USER:-indeedhub} + DATABASE_PASSWORD: ${IH_POSTGRES_PASSWORD:-indeedhub} + DATABASE_NAME: ${IH_POSTGRES_DB:-indeedhub} + QUEUE_HOST: indeedhub-redis + QUEUE_PORT: 6379 + S3_ENDPOINT: http://indeedhub-minio:9000 + AWS_REGION: us-east-1 + AWS_ACCESS_KEY: ${IH_MINIO_USER:-minioadmin} + AWS_SECRET_KEY: ${IH_MINIO_PASSWORD:-minioadmin} + S3_PRIVATE_BUCKET_NAME: indeedhub-private + S3_PUBLIC_BUCKET_NAME: indeedhub-public + S3_PUBLIC_BUCKET_URL: ${IH_S3_PUBLIC_URL:-http://localhost:9000/indeedhub-public} + NOSTR_JWT_SECRET: ${IH_JWT_SECRET:-demo-jwt-secret-change-in-production} + NOSTR_JWT_EXPIRES_IN: 7d + AES_MASTER_SECRET: ${IH_AES_SECRET:-demo-aes-secret-change-in-production} + depends_on: + indeedhub-postgres: + condition: service_healthy + indeedhub-redis: + condition: service_started + indeedhub-minio: + condition: service_started + networks: + - indeedhub-network + restart: unless-stopped + healthcheck: + test: ["CMD", "wget", "--no-verbose", "--tries=1", "--spider", "http://localhost:4000/nostr-auth/health"] + interval: 30s + timeout: 10s + retries: 5 + start_period: 60s + + indeedhub-postgres: + image: postgres:16-alpine + container_name: indeedhub-postgres + environment: + POSTGRES_USER: ${IH_POSTGRES_USER:-indeedhub} + POSTGRES_PASSWORD: ${IH_POSTGRES_PASSWORD:-indeedhub} + POSTGRES_DB: ${IH_POSTGRES_DB:-indeedhub} + volumes: + - indeedhub-postgres-data:/var/lib/postgresql/data + networks: + - indeedhub-network + restart: unless-stopped + healthcheck: + test: ["CMD-SHELL", "pg_isready -U indeedhub"] + interval: 10s + timeout: 5s + retries: 5 + start_period: 30s + + indeedhub-redis: + image: redis:7-alpine + container_name: indeedhub-redis + command: redis-server --appendonly yes + volumes: + - indeedhub-redis-data:/data + networks: + - indeedhub-network + restart: unless-stopped + + indeedhub-minio: + image: minio/minio:latest + container_name: indeedhub-minio + command: server /data --console-address ":9001" + environment: + MINIO_ROOT_USER: ${IH_MINIO_USER:-minioadmin} + MINIO_ROOT_PASSWORD: ${IH_MINIO_PASSWORD:-minioadmin} + volumes: + - indeedhub-minio-data:/data + networks: + - indeedhub-network + restart: unless-stopped + + indeedhub-minio-init: + image: minio/mc:latest + container_name: indeedhub-minio-init + depends_on: + - indeedhub-minio + entrypoint: > + /bin/sh -c " + sleep 5; + mc alias set local http://indeedhub-minio:9000 $${IH_MINIO_USER:-minioadmin} $${IH_MINIO_PASSWORD:-minioadmin}; + mc mb local/indeedhub-private --ignore-existing; + mc mb local/indeedhub-public --ignore-existing; + mc anonymous set download local/indeedhub-public; + echo 'MinIO buckets initialized'; + " + networks: + - indeedhub-network + restart: "no" + + indeedhub-ffmpeg-worker: + build: + context: ../Indeedhub Prototype/backend + dockerfile: Dockerfile.ffmpeg + args: + CACHEBUST: "14" + container_name: indeedhub-ffmpeg-worker + environment: + ENVIRONMENT: production + DATABASE_HOST: indeedhub-postgres + DATABASE_PORT: 5432 + DATABASE_USER: ${IH_POSTGRES_USER:-indeedhub} + DATABASE_PASSWORD: ${IH_POSTGRES_PASSWORD:-indeedhub} + DATABASE_NAME: ${IH_POSTGRES_DB:-indeedhub} + QUEUE_HOST: indeedhub-redis + QUEUE_PORT: 6379 + S3_ENDPOINT: http://indeedhub-minio:9000 + AWS_REGION: us-east-1 + AWS_ACCESS_KEY: ${IH_MINIO_USER:-minioadmin} + AWS_SECRET_KEY: ${IH_MINIO_PASSWORD:-minioadmin} + S3_PRIVATE_BUCKET_NAME: indeedhub-private + S3_PUBLIC_BUCKET_NAME: indeedhub-public + S3_PUBLIC_BUCKET_URL: ${IH_S3_PUBLIC_URL:-http://localhost:9000/indeedhub-public} + AES_MASTER_SECRET: ${IH_AES_SECRET:-demo-aes-secret-change-in-production} + depends_on: + indeedhub-postgres: + condition: service_healthy + indeedhub-redis: + condition: service_started + networks: + - indeedhub-network + restart: unless-stopped + + indeedhub-relay: + image: scsibug/nostr-rs-relay:latest + container_name: indeedhub-relay + volumes: + - indeedhub-relay-data:/usr/src/app/db + networks: + - indeedhub-network + restart: unless-stopped + +networks: + indeedhub-network: + driver: bridge + +volumes: + indeedhub-postgres-data: + indeedhub-redis-data: + indeedhub-minio-data: + indeedhub-relay-data: