managarten/apps/picture/DEPLOYMENT_STEPS.md
Wuesteon d36b321d9d style: auto-format codebase with Prettier
Applied formatting to 1487+ files using pnpm format:write
  - TypeScript/JavaScript files
  - Svelte components
  - Astro pages
  - JSON configs
  - Markdown docs

  13 files still need manual review (Astro JSX comments)
2025-11-27 18:33:16 +01:00

7.2 KiB

🚀 DEPLOYMENT - Job Queue System

Status: In Progress Started: 2025-10-09


Step 1: Database Migration

Option A: Via Supabase Dashboard (EMPFOHLEN für Production)

  1. Öffne Supabase Dashboard:

    https://supabase.com/dashboard/project/mjuvnnjxwfwlmxjsgkqu
    
  2. Navigiere zu: SQL Editor (linkes Menü)

  3. Kopiere die Migration:

    • Datei: apps/mobile/supabase/migrations/20251009_job_queue_system.sql
    • Kompletten Inhalt kopieren
  4. Führe aus:

    • New Query → Paste → Run
    • Warte auf Success Message
  5. Verifiziere:

    -- Check tables
    SELECT tablename FROM pg_tables WHERE schemaname = 'public' AND tablename = 'job_queue';
    
    -- Check functions
    SELECT routine_name FROM information_schema.routines
    WHERE routine_schema = 'public' AND routine_name IN ('enqueue_job', 'claim_next_job', 'complete_job');
    
    -- Check views
    SELECT viewname FROM pg_views WHERE schemaname = 'public'
    AND viewname IN ('queue_health', 'failed_jobs_recent', 'stuck_jobs');
    

Option B: Via CLI (Local → Remote)

# WARNUNG: Funktioniert nur wenn lokale DB version matches
# (haben DB version 17 vs 15 Mismatch)

# Falls du trotzdem CLI nutzen willst:
cd apps/mobile
npx supabase db push

Step 2: Deploy Edge Functions

2.1 Deploy start-generation

cd apps/mobile
npx supabase functions deploy start-generation --project-ref mjuvnnjxwfwlmxjsgkqu

Expected Output:

✓ Deployed Function start-generation

2.2 Deploy process-generation

npx supabase functions deploy process-generation --project-ref mjuvnnjxwfwlmxjsgkqu

2.3 Deploy process-jobs

npx supabase functions deploy process-jobs --project-ref mjuvnnjxwfwlmxjsgkqu

🔐 Step 3: Set Environment Secrets

# Replicate API Token (KRITISCH!)
npx supabase secrets set REPLICATE_API_TOKEN=r8_... --project-ref mjuvnnjxwfwlmxjsgkqu

# Verify secrets
npx supabase secrets list --project-ref mjuvnnjxwfwlmxjsgkqu

Secrets needed:

  • REPLICATE_API_TOKEN - Your Replicate API key
  • SUPABASE_URL - Auto-set
  • SUPABASE_ANON_KEY - Auto-set
  • SUPABASE_SERVICE_ROLE_KEY - Auto-set

Step 4: Setup pg_cron Worker

4.1 Enable pg_cron Extension

Via SQL Editor:

-- Enable extension
CREATE EXTENSION IF NOT EXISTS pg_cron;

-- Grant permissions
GRANT USAGE ON SCHEMA cron TO postgres;
GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA cron TO postgres;

4.2 Get Service Role Key

  1. Gehe zu: Settings → API im Supabase Dashboard
  2. Kopiere: service_role key (secret!)
  3. Speichere sicher (brauchen wir gleich)

4.3 Schedule Worker Job

WICHTIG: Ersetze YOUR_SERVICE_ROLE_KEY mit dem echten Key!

-- Schedule process-jobs to run every minute
SELECT cron.schedule(
  'process-job-queue',
  '* * * * *', -- Every minute
  $$
    SELECT net.http_post(
      url := 'https://mjuvnnjxwfwlmxjsgkqu.supabase.co/functions/v1/process-jobs',
      headers := jsonb_build_object(
        'Content-Type', 'application/json',
        'Authorization', 'Bearer YOUR_SERVICE_ROLE_KEY'
      ),
      body := '{}'::jsonb
    );
  $$
);

4.4 Verify Cron Job

-- Check scheduled jobs
SELECT * FROM cron.job;

-- Check execution history
SELECT * FROM cron.job_run_details
ORDER BY start_time DESC
LIMIT 10;

🧪 Step 5: Test the System

5.1 Test Database Functions

-- Test: Enqueue a test job
SELECT enqueue_job(
  'generate-image',
  '{"test": true, "prompt": "Test deployment"}'::jsonb,
  0
);
-- Should return: UUID of job

-- Check if job was created
SELECT * FROM job_queue ORDER BY created_at DESC LIMIT 1;

-- Test: Claim the job (simulates worker)
SELECT * FROM claim_next_job();

-- Test: Complete the job
-- (Use the job ID from above)
SELECT complete_job('job-id-here', NULL, NULL);

5.2 Test Edge Functions

Test start-generation:

curl -X POST \
  https://mjuvnnjxwfwlmxjsgkqu.supabase.co/functions/v1/start-generation \
  -H 'Authorization: Bearer YOUR_ANON_KEY' \
  -H 'Content-Type: application/json' \
  -d '{
    "prompt": "A beautiful sunset",
    "model_id": "black-forest-labs/flux-schnell"
  }'

Expected Response:

{
	"success": true,
	"generation_id": "uuid-here",
	"job_id": "uuid-here",
	"status": "queued"
}

Test process-jobs (manual trigger):

curl -X POST \
  https://mjuvnnjxwfwlmxjsgkqu.supabase.co/functions/v1/process-jobs \
  -H 'Authorization: Bearer YOUR_SERVICE_ROLE_KEY' \
  -H 'Content-Type: application/json'

5.3 Monitor Queue

-- Queue health
SELECT * FROM queue_health;

-- Pending jobs
SELECT COUNT(*) FROM job_queue WHERE status = 'pending';

-- Failed jobs (last 24h)
SELECT * FROM failed_jobs_recent;

📊 Step 6: Monitoring

Key Metrics to Watch:

-- 1. Queue Depth (should stay low)
SELECT job_type, status, COUNT(*)
FROM job_queue
GROUP BY job_type, status;

-- 2. Average Processing Time
SELECT
  job_type,
  AVG(EXTRACT(EPOCH FROM (completed_at - created_at))) as avg_seconds
FROM job_queue
WHERE status = 'completed'
  AND created_at > NOW() - INTERVAL '1 hour'
GROUP BY job_type;

-- 3. Success Rate
SELECT
  job_type,
  COUNT(CASE WHEN status = 'completed' THEN 1 END) as completed,
  COUNT(CASE WHEN status = 'failed' THEN 1 END) as failed,
  ROUND(100.0 * COUNT(CASE WHEN status = 'completed' THEN 1 END) / COUNT(*), 2) as success_rate
FROM job_queue
WHERE created_at > NOW() - INTERVAL '1 hour'
GROUP BY job_type;

-- 4. Stuck Jobs (processing > 10 min)
SELECT * FROM stuck_jobs;

Deployment Checklist

  • Database migration applied successfully
  • job_queue table created
  • Database functions created (enqueue_job, claim_next_job, complete_job)
  • Monitoring views created (queue_health, failed_jobs_recent, stuck_jobs)
  • start-generation function deployed
  • process-generation function deployed
  • process-jobs function deployed
  • REPLICATE_API_TOKEN secret set
  • pg_cron extension enabled
  • Cron job scheduled (process-job-queue)
  • Test job completed successfully
  • Monitoring queries working

🐛 Troubleshooting

Issue: Jobs stuck in pending

Check:

-- Is cron running?
SELECT * FROM cron.job_run_details ORDER BY start_time DESC LIMIT 5;

-- Is process-jobs working?
SELECT * FROM job_queue WHERE status = 'processing';

Fix:

  • Manually trigger: curl ... /process-jobs
  • Check service role key is correct
  • Check Edge Function logs

Issue: Jobs failing

Check:

SELECT error_message FROM failed_jobs_recent;

Common Causes:

  • Missing REPLICATE_API_TOKEN
  • Invalid model_id
  • Replicate API down

📝 Notes

Project:

Important URLs:


Last Updated: 2025-10-09 Status: Ready for deployment