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

341 lines
7.2 KiB
Markdown

# 🚀 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:**
```sql
-- 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)
```bash
# 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
```bash
cd apps/mobile
npx supabase functions deploy start-generation --project-ref mjuvnnjxwfwlmxjsgkqu
```
**Expected Output:**
```
✓ Deployed Function start-generation
```
### 2.2 Deploy process-generation
```bash
npx supabase functions deploy process-generation --project-ref mjuvnnjxwfwlmxjsgkqu
```
### 2.3 Deploy process-jobs
```bash
npx supabase functions deploy process-jobs --project-ref mjuvnnjxwfwlmxjsgkqu
```
---
## 🔐 Step 3: Set Environment Secrets
```bash
# 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:**
```sql
-- 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!
```sql
-- 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
```sql
-- 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
```sql
-- 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:
```bash
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:**
```json
{
"success": true,
"generation_id": "uuid-here",
"job_id": "uuid-here",
"status": "queued"
}
```
#### Test process-jobs (manual trigger):
```bash
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
```sql
-- 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:
```sql
-- 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:**
```sql
-- 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:**
```sql
SELECT error_message FROM failed_jobs_recent;
```
**Common Causes:**
- Missing REPLICATE_API_TOKEN
- Invalid model_id
- Replicate API down
---
## 📝 Notes
**Project:**
- ID: mjuvnnjxwfwlmxjsgkqu
- URL: https://mjuvnnjxwfwlmxjsgkqu.supabase.co
- Region: EU Central
**Important URLs:**
- Dashboard: https://supabase.com/dashboard/project/mjuvnnjxwfwlmxjsgkqu
- SQL Editor: https://supabase.com/dashboard/project/mjuvnnjxwfwlmxjsgkqu/sql
- Functions: https://supabase.com/dashboard/project/mjuvnnjxwfwlmxjsgkqu/functions
- Logs: https://supabase.com/dashboard/project/mjuvnnjxwfwlmxjsgkqu/logs/explorer
---
**Last Updated:** 2025-10-09
**Status:** Ready for deployment