forked from odysseus-dev/odysseus
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathrender.yaml
More file actions
135 lines (131 loc) · 6.27 KB
/
Copy pathrender.yaml
File metadata and controls
135 lines (131 loc) · 6.27 KB
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
# Render Blueprint for Odysseus — deploy the self-hosted AI workspace in one click.
# https://render.com/docs/blueprint-spec
#
# Three services, grouped under an "odysseus" project: the Odysseus web app, a
# bundled SearXNG (web search) and a bundled ChromaDB (vector store). The web app
# talks to the two private services over Render's internal network. Fill the
# provider API keys in the deploy form (stored as Render secrets, never committed).
previews:
generation: "off"
projects:
- name: odysseus
environments:
- name: production
services:
# ---- Odysseus web app ------------------------------------------
- type: web
name: odysseus
runtime: docker
dockerfilePath: ./Dockerfile.render
plan: standard # 2 GB — in-process fastembed embeddings need headroom
region: oregon
healthCheckPath: /api/health
disk:
name: odysseus-data # SQLite DB, encrypted key store, uploads, embed cache
mountPath: /app/data
sizeGB: 10
envVars:
# Auth / security — locked down for a public host by default.
- key: AUTH_ENABLED
value: "true"
- key: LOCALHOST_BYPASS
value: "false"
- key: SECURE_COOKIES
value: "true" # Render serves HTTPS
# Trusted proxy hops in front of the app — used by every IP-keyed
# rate limiter (auth login/signup/setup AND the demo caps). Render
# runs one edge proxy that appends the real client IP to the RIGHT
# of X-Forwarded-For, so we read 1 hop from the right (the leftmost
# entry is client-spoofable). Bump only if you front this service
# with additional trusted proxies. On first traffic the app logs a
# one-time "[trusted-ip] X-Forwarded-For sample" line — check it to
# confirm this value resolves your true client IP.
- key: TRUSTED_PROXY_HOPS
value: "1"
- key: ODYSSEUS_ADMIN_USER
value: admin
- key: ODYSSEUS_ADMIN_PASSWORD
generateValue: true # strong first-login password; view it in the dashboard
# Storage.
- key: DATABASE_URL
value: sqlite:///./data/app.db
- key: FASTEMBED_CACHE_PATH
value: /app/data/fastembed # persist the local embedding model on the disk
# Bundled services (internal network).
- key: SEARXNG_INSTANCE
value: http://odysseus-searxng:8080
- key: CHROMADB_HOST
fromService:
type: pserv
name: odysseus-chromadb
property: host
- key: CHROMADB_PORT
value: "8000"
# ---- Provider credentials — set these in the one-click deploy form. ----
# All optional per feature: OpenAI powers chat/agents; a search key
# (Brave/Tavily/Serper/Google) enriches research beyond the bundled SearXNG;
# HF_TOKEN is only for gated Hugging Face models.
- key: OPENAI_API_KEY
sync: false
- key: OPENAI_DEFAULT_MODEL
value: gpt-5.6-sol # seeds the default chat model on first boot; change here or in the app
- key: DATA_BRAVE_API_KEY
sync: false
- key: TAVILY_API_KEY
sync: false
- key: SERPER_API_KEY
sync: false
- key: GOOGLE_API_KEY
sync: false
- key: GOOGLE_PSE_CX
sync: false
- key: HF_TOKEN
sync: false
# ---- Demo mode — opt-in public showcase (default OFF) -------
# DEMO=false keeps the full authenticated app (forks get this).
# DEMO=true opens a public, no-signup, locked-down chat demo that
# spends this deploy's OPENAI_API_KEY. See README "Demo mode".
# NOTE: the rate limit and per-IP daily ceiling below are keyed on
# the trusted client IP (Render's proxy-attested XFF), so cookie
# clearing / owner churn can't reset them. They bound burn RATE;
# they don't replace a hard dollar cap. Set a monthly usage limit on
# your OpenAI project for the true ceiling before enabling this.
- key: DEMO
value: "false" # opt-in; not a secret. "true"/"1"/"yes" turns it on.
- key: DEMO_MODEL
value: gpt-5.6-luna # cheap current OpenAI tier for the demo path (env OPENAI_API_KEY)
- key: DEMO_RATE_LIMIT_PER_MINUTE
value: "10" # chat requests/min per client IP; 0 disables this dimension
- key: DEMO_MAX_MESSAGES_PER_SESSION
value: "30" # total messages per visitor cookie session (UX friction); 0 disables
- key: DEMO_MAX_MESSAGES_PER_IP_PER_DAY
value: "200" # hard per-IP daily message ceiling (the real backstop); 0 disables
- key: DEMO_MAX_OUTPUT_TOKENS
value: "512" # cost cap on output tokens per demo LLM call
# ---- SearXNG (web search) — private ----------------------------
- type: pserv
name: odysseus-searxng
runtime: docker
dockerfilePath: ./searxng.Dockerfile
plan: starter
region: oregon
envVars:
- key: SEARXNG_SECRET
generateValue: true
- key: SEARXNG_BASE_URL
value: http://odysseus-searxng:8080/
# ---- ChromaDB (vector store) — private -------------------------
- type: pserv
name: odysseus-chromadb
runtime: image
image:
url: docker.io/chromadb/chroma:1.0.20
plan: starter
region: oregon
envVars:
- key: ANONYMIZED_TELEMETRY
value: "FALSE"
disk:
name: chromadb-data
mountPath: /chroma/chroma
sizeGB: 5