diff --git a/apps/api-daemon/Dockerfile b/apps/api-daemon/Dockerfile index 2a4faf3..54008f5 100644 --- a/apps/api-daemon/Dockerfile +++ b/apps/api-daemon/Dockerfile @@ -12,4 +12,4 @@ COPY . . RUN pnpm install RUN pnpm --filter @streamclipper/db exec prisma generate -CMD ["pnpm", "--filter", "@streamclipper/api-daemon", "dev"] +CMD ["sh", "-c", "pnpm --filter @streamclipper/db exec prisma migrate deploy && pnpm --filter @streamclipper/api-daemon dev"] diff --git a/docker-compose.yml b/docker-compose.yml index a579a45..4c670d0 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,6 +1,7 @@ services: sc_redis: image: redis:7-alpine + restart: unless-stopped ports: - "6379:6379" volumes: @@ -8,6 +9,7 @@ services: sc_postgres: image: postgres:16-alpine + restart: unless-stopped environment: POSTGRES_USER: streamclipper POSTGRES_PASSWORD: streamclipper @@ -21,6 +23,7 @@ services: build: context: . dockerfile: apps/api-daemon/Dockerfile + restart: unless-stopped environment: REDIS_URL: redis://sc_redis:6379 DATABASE_URL: postgresql://streamclipper:streamclipper@sc_postgres:5432/streamclipper @@ -43,6 +46,7 @@ services: build: context: . dockerfile: apps/worker/Dockerfile + restart: unless-stopped environment: REDIS_URL: redis://sc_redis:6379 DATABASE_URL: postgresql://streamclipper:streamclipper@sc_postgres:5432/streamclipper @@ -61,6 +65,7 @@ services: build: context: . dockerfile: apps/frontend/Dockerfile + restart: unless-stopped environment: DATABASE_URL: postgresql://streamclipper:streamclipper@sc_postgres:5432/streamclipper ports: diff --git a/packages/db/prisma/migrations/20260830000000_init/migration.sql b/packages/db/prisma/migrations/20260830000000_init/migration.sql new file mode 100644 index 0000000..132ce99 --- /dev/null +++ b/packages/db/prisma/migrations/20260830000000_init/migration.sql @@ -0,0 +1,73 @@ +-- CreateSchema +CREATE SCHEMA IF NOT EXISTS "public"; + +-- CreateEnum +CREATE TYPE "RawSegmentStatus" AS ENUM ('PENDING', 'PROCESSED', 'DISCARDED'); + +-- CreateEnum +CREATE TYPE "CandidateSegmentStatus" AS ENUM ('PENDING_STT', 'TRANSCRIBED', 'FAILED'); + +-- CreateTable +CREATE TABLE "channels" ( + "id" TEXT NOT NULL, + "name" TEXT NOT NULL, + "youtube_handle" TEXT NOT NULL, + "channel_id" TEXT NOT NULL, + "is_active" BOOLEAN NOT NULL DEFAULT true, + "last_checked_at" TIMESTAMP(3), + "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "channels_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "stream_sessions" ( + "id" TEXT NOT NULL, + "channel_id" TEXT NOT NULL, + "live_video_id" TEXT, + "started_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "ended_at" TIMESTAMP(3), + "total_segments" INTEGER NOT NULL DEFAULT 0, + + CONSTRAINT "stream_sessions_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "raw_segments" ( + "id" TEXT NOT NULL, + "session_id" TEXT NOT NULL, + "file_path" TEXT NOT NULL, + "duration" INTEGER NOT NULL, + "started_at" TIMESTAMP(3) NOT NULL, + "status" "RawSegmentStatus" NOT NULL DEFAULT 'PENDING', + "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "raw_segments_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "candidate_segments" ( + "id" TEXT NOT NULL, + "raw_segment_id" TEXT NOT NULL, + "start_sec" INTEGER NOT NULL, + "end_sec" INTEGER NOT NULL, + "audio_peak_score" DOUBLE PRECISION, + "chat_velocity_score" DOUBLE PRECISION, + "transcript_json" JSONB, + "status" "CandidateSegmentStatus" NOT NULL DEFAULT 'PENDING_STT', + "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "candidate_segments_pkey" PRIMARY KEY ("id") +); + +-- CreateIndex +CREATE UNIQUE INDEX "channels_channel_id_key" ON "channels"("channel_id"); + +-- AddForeignKey +ALTER TABLE "stream_sessions" ADD CONSTRAINT "stream_sessions_channel_id_fkey" FOREIGN KEY ("channel_id") REFERENCES "channels"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "raw_segments" ADD CONSTRAINT "raw_segments_session_id_fkey" FOREIGN KEY ("session_id") REFERENCES "stream_sessions"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "candidate_segments" ADD CONSTRAINT "candidate_segments_raw_segment_id_fkey" FOREIGN KEY ("raw_segment_id") REFERENCES "raw_segments"("id") ON DELETE RESTRICT ON UPDATE CASCADE; diff --git a/packages/db/prisma/migrations/migration_lock.toml b/packages/db/prisma/migrations/migration_lock.toml new file mode 100644 index 0000000..044d57c --- /dev/null +++ b/packages/db/prisma/migrations/migration_lock.toml @@ -0,0 +1,3 @@ +# Please do not edit this file manually +# It should be added in your version-control system (e.g., Git) +provider = "postgresql"