File size: 7,511 Bytes
c91c7db
3493993
 
 
 
 
 
 
 
 
fba6023
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
c91c7db
 
3493993
 
 
 
 
 
 
c91c7db
 
 
 
 
 
 
 
 
 
 
 
 
e1104b3
 
 
 
 
 
 
3493993
 
 
 
 
 
 
 
e1104b3
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3493993
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
e1104b3
 
 
 
 
 
 
 
 
 
3493993
 
 
 
 
e1104b3
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
a44271f
 
 
 
 
 
 
 
 
 
 
 
e1104b3
 
a44271f
 
 
 
 
 
 
 
 
 
 
 
e1104b3
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
APP_NAME=MediaRouter
APP_VERSION=1.0.0
# Docker sets this to production. Local development keeps development so the
# established SQLite workflow remains available.
APP_ENVIRONMENT=development
HOST=0.0.0.0
PORT=7860
# Comma-separated exact origins. Production requires at least one HTTPS origin
# such as the separately hosted Vercel frontend; wildcard origins are rejected.
CORS_ALLOWED_ORIGINS=http://localhost:3000
TEMP_DIR=./temp
OUTPUT_DIR=./outputs
TEMPLATE_DIR=./app/templates/categories
MAX_UPLOAD_SIZE=1073741824
WHISPER_MODEL=small
CLEANUP_MINUTES=60
CLEANUP_INTERVAL_SECONDS=60
MAX_WORKERS=2
LOG_LEVEL=INFO
MAX_DURATION_SECONDS=21600
MAX_RESOLUTION_PIXELS=33177600
DOWNLOAD_TIMEOUT_SECONDS=300
ALLOW_PRIVATE_URLS=false
BASE_URL=
FFMPEG_BINARY=ffmpeg
FFPROBE_BINARY=ffprobe
AUTH_ENABLED=true
DATABASE_URL=sqlite+aiosqlite:///./data/mediarouter.db
# SQLite initializes this schema locally. PostgreSQL must receive the SQL files
# under app/security/migrations/ through your deployment migration process.
SECURITY_AUTO_MIGRATE=false
# PostgreSQL only: backend-only BYPASSRLS role used for authoritative users,
# memberships, API-key principals, and canonical asset records.
SECURITY_DATABASE_ROLE=mediarouter_security_service
SECURITY_ENFORCE_RLS=true
AUTH_ROLE_SCOPES={}
AUTH_BOOTSTRAP_KEY_HASH=
AUTH_BOOTSTRAP_KEY_PREFIX=
AUTH_BOOTSTRAP_KEY_NAME=Bootstrap Administrator
AUTH_BOOTSTRAP_ENVIRONMENT=live
AUTH_LAST_USED_UPDATE_SECONDS=60
AUTH_DEFAULT_REQUESTS_PER_MINUTE=100
AUTH_DEFAULT_CONCURRENT_JOBS=10
AUTH_DEFAULT_UPLOADS_PER_HOUR=20
AUTH_DEFAULT_PROCESSING_BYTES_PER_DAY=107374182400
AUTH_TRUST_PROXY_HEADERS=true
# Required only when running the standalone stdio MCP transport with auth enabled.
MCP_STDIO_API_KEY=

# Social Automation Foundation. Apply all SQL files under app/social/migrations/
# to Supabase/Postgres before enabling social writes in production. The existing
# DATABASE_URL remains a local-development fallback only.
SOCIAL_ENABLED=true
# Example: postgresql+asyncpg://postgres:password@db.example:5432/postgres
SOCIAL_DATABASE_URL=
# Required for PostgreSQL production. This URL must authenticate as a normal
# non-owner/non-BYPASSRLS API role. Do not use a Supabase service-role URL here.
SOCIAL_TENANT_DATABASE_ROLE=mediarouter_tenant
# Trusted backend-only worker connection. It must use the explicitly named
# BYPASSRLS role and must never be exposed through REST, MCP, n8n, SDKs, or UI.
SOCIAL_WORKER_DATABASE_URL=
SOCIAL_WORKER_DATABASE_ROLE=mediarouter_social_worker
SOCIAL_ENFORCE_RLS=true
SOCIAL_AUTO_MIGRATE=false
SOCIAL_WORKER_ENABLED=true
SOCIAL_SCHEDULER_INTERVAL_SECONDS=30
SOCIAL_JOB_STALE_AFTER_SECONDS=900
SOCIAL_PUBLISH_RETRY_LIMIT=5
SOCIAL_OAUTH_REQUESTS_PER_HOUR=30
SOCIAL_PUBLISH_REQUESTS_PER_MINUTE=30
SOCIAL_SCHEDULE_REQUESTS_PER_MINUTE=60
SOCIAL_ANALYTICS_REQUESTS_PER_MINUTE=120
# Required for OAuth state/PKCE and encrypted local token fallback. Generate at
# least 32 random bytes, for example: openssl rand -base64 32
SOCIAL_OAUTH_ENCRYPTION_KEY=
SUPABASE_URL=
SUPABASE_SERVICE_ROLE_KEY=
SUPABASE_VAULT_ENABLED=false
SOCIAL_OAUTH_REDIRECT_BASE_URL=

# Provider-neutral generation runtime. WAN and FLUX are optional; neither is
# enabled merely by the shared timeout/retry settings below.
GENERATION_ENABLED=true
GENERATION_JOB_RETRY_LIMIT=3
# Shared remote AI worker client defaults. No worker is configured by these
# values alone; do not add browser-visible worker URLs or credentials here.
AI_WORKER_CONNECT_TIMEOUT_SECONDS=10
AI_WORKER_REQUEST_TIMEOUT_SECONDS=60
AI_WORKER_READ_TIMEOUT_SECONDS=300
AI_WORKER_MAX_RETRIES=3
AI_WORKER_RETRY_BACKOFF_SECONDS=0.5
# Optional authenticated WAN 2.2 image-to-video worker. Set both values only
# in backend/Hugging Face deployment secrets; never expose them to a browser,
# MCP client, n8n node, SDK output, or logs. WAN stays unavailable if either
# value is omitted or malformed, without blocking application startup.
WAN_SPACE_URL=
WAN_SPACE_TOKEN=
# Optional authenticated FLUX.2 Klein image-generation worker. Set both
# backend-only values in deployment secrets; never expose either value in a
# browser, MCP/n8n request, SDK result, audit record, or log.
FLUX_SPACE_URL=
FLUX_SPACE_TOKEN=
GENERATION_WORKER_ENABLED=true
GENERATION_WORKER_INTERVAL_SECONDS=5
GENERATION_WORKER_POLL_BACKOFF_SECONDS=2
GENERATION_WORKER_BATCH_SIZE=8
GENERATION_JOB_STALE_AFTER_SECONDS=900
# Content Studio persistence/render limits. Editor state and render jobs are
# durable PostgreSQL records; render workers use bounded temporary files only.
EDITOR_STATE_MAX_BYTES=1048576
RENDER_WORKER_ENABLED=true
RENDER_WORKER_INTERVAL_SECONDS=2
RENDER_JOB_STALE_AFTER_SECONDS=900
RENDER_JOB_TIMEOUT_SECONDS=7200
RENDER_JOB_RETRY_LIMIT=2
RENDER_MAX_ACTIVE_JOBS_PER_PROJECT=1
RENDER_MAX_TRACKS=32
RENDER_MAX_CLIPS=500
RENDER_MAX_DURATION_SECONDS=3600
RENDER_MAX_INPUT_BYTES=4294967296
GOOGLE_CLIENT_ID=
GOOGLE_CLIENT_SECRET=
# YouTube Data API v3 worker controls. Keep the client secret backend-only.
# Upload chunks must be a multiple of 262144 bytes (256 KiB).
YOUTUBE_UPLOAD_CHUNK_BYTES=8388608
YOUTUBE_MAX_CONCURRENT_UPLOADS=2
YOUTUBE_REQUEST_TIMEOUT_SECONDS=60
YOUTUBE_PROCESSING_POLL_SECONDS=30
META_CLIENT_ID=
META_CLIENT_SECRET=
# Preferred Meta application names. META_CLIENT_* remains a compatibility
# alias for deployments created before this configuration contract.
META_APP_ID=
META_APP_SECRET=
META_GRAPH_API_VERSION=v25.0
TIKTOK_CLIENT_KEY=
TIKTOK_CLIENT_SECRET=
# Exact backend callback registered under TikTok Login Kit. It must be:
# https://<api-host>/v1/social/accounts/tiktok/callback
TIKTOK_REDIRECT_URI=
# Fail closed. Set true only after Content Posting API Direct Post approval and
# video.publish authorization are confirmed for this TikTok application.
TIKTOK_DIRECT_POST_ENABLED=false
# TikTok FILE_UPLOAD chunks: 5,000,000 through 64,000,000 bytes.
TIKTOK_UPLOAD_CHUNK_BYTES=10000000
TIKTOK_REQUEST_TIMEOUT_SECONDS=60
TIKTOK_PROCESSING_POLL_SECONDS=30
# Test-only opt-in. Normal CI must keep this false; dedicated credentials and
# explicit publish consent are documented in social-tiktok-production-readiness.md.
RUN_TIKTOK_INTEGRATION_TESTS=false
LINKEDIN_CLIENT_ID=
LINKEDIN_CLIENT_SECRET=
# Exact backend callback registered in the LinkedIn Developer Portal:
# https://<api-host>/v1/social/accounts/linkedin/callback
LINKEDIN_REDIRECT_URI=
# Enable only after LinkedIn has approved the required Community Management
# products/scopes for member and/or organization publishing.
LINKEDIN_PUBLISHING_ENABLED=false
LINKEDIN_REQUEST_TIMEOUT_SECONDS=60
LINKEDIN_MEDIA_PROCESSING_POLL_SECONDS=5
LINKEDIN_MEDIA_PROCESSING_TIMEOUT_SECONDS=600
# Test-only opt-in. Normal CI must keep this false; dedicated credentials and
# explicit publish/delete consent are documented in social-linkedin-production-readiness.md.
RUN_LINKEDIN_INTEGRATION_TESTS=false
X_CLIENT_ID=
X_CLIENT_SECRET=
# Exact backend callback registered in the X Developer Console:
# https://<api-host>/v1/social/accounts/x/callback
X_REDIRECT_URI=
# Enable only after confirming current X write/media endpoint entitlement.
X_PUBLISHING_ENABLED=false
X_UPLOAD_CHUNK_BYTES=5242880
X_REQUEST_TIMEOUT_SECONDS=60
X_MEDIA_PROCESSING_POLL_SECONDS=5
X_MEDIA_PROCESSING_TIMEOUT_SECONDS=300
# Test-only opt-in. Normal CI must keep this false; dedicated credentials and
# explicit publish/delete consent are documented in social-x-production-readiness.md.
RUN_X_INTEGRATION_TESTS=false
TELEGRAM_BOT_TOKEN=
WHATSAPP_CLIENT_ID=
WHATSAPP_CLIENT_SECRET=