-
Notifications
You must be signed in to change notification settings - Fork 4
Expand file tree
/
Copy path.env.example
More file actions
153 lines (135 loc) · 7.17 KB
/
Copy path.env.example
File metadata and controls
153 lines (135 loc) · 7.17 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
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
# * Environment file for Mewbo
# * Repository: https://github.com/bearlike/Assistant
#
# Copy to .env and fill in your own values:
# cp .env.example .env
#
# THE one environment file. Every variable a deployment needs lives here, each
# under its own name; nothing reads a second env file.
#
# A deployment does not have to keep it in the working tree. Set MEWBO_ENV_FILE
# to a path rendered somewhere else — from a secrets manager into a private
# temp directory, say — and compose reads that instead. Two legs are needed and
# they are not the same: pass `--env-file <path>` so compose INTERPOLATES from
# it, and export MEWBO_ENV_FILE so each service's `env_file:` resolves to it.
# Supply only one and half the configuration goes missing without an error.
#
# It serves both roles Docker Compose distinguishes between, which is why
# there is only one: compose auto-loads it to interpolate `${VAR}` inside the
# compose files themselves, AND every service names it as its `env_file:` so
# the same values reach the processes in the containers. The two are NOT
# interchangeable — `${VAR:-}` interpolation resolves from this file and the
# shell but NEVER from an `env_file:`. That asymmetry is why an `environment:`
# entry restating a variable set here once replaced it with an empty string:
# an `environment:` entry wins over `env_file`, and the interpolation it was
# written with could not see this file's value.
#
# One consequence worth knowing: a root `.env` is auto-loaded by python-dotenv
# as well as by compose, and litellm calls it at import time. These values are
# therefore also present in any host process started from the repo root, so a
# local `uv run` picks up this storage driver and these credentials rather
# than the built-in defaults.
#
# Runtime, LLM, Langfuse, Home Assistant and API settings live in
# configs/app.json, not here. A value there can read from this file instead of
# embedding a literal, by naming the variable — "master_token":
# "${MEWBO_MASTER_API_TOKEN}" — which is how a secret stays out of app.json. A named
# variable that is not set is refused at startup rather than read as empty.
# API authentication token — generate a strong random string.
MEWBO_MASTER_API_TOKEN=CHANGE_ME
# Published image source. Set a private registry as git.example.com/bearlike.
MEWBO_REGISTRY=ghcr.io/bearlike
MEWBO_TAG=latest
# Exposed ports (host networking)
MEWBO_API_PORT=5125
# Host user identity — the container user inherits these, so files created
# inside a container are owned by your host user. Run `id` to find yours.
MEWBO_HOST_UID=1000
MEWBO_HOST_GID=1000
# CORS origin — your frontend's public URL. Defaults to * when unset.
# MEWBO_CORS_ORIGIN=https://mewbo.example.com
# Frontend runtime config. Leave the base URL commented when using the nginx
# proxy, which proxies /api/ for you. The key should match the master token.
# MEWBO_VITE_API_BASE_URL=https://mewbo-api.example.com
MEWBO_VITE_API_KEY=CHANGE_ME
MEWBO_VITE_API_MODE=live
# MongoDB session storage. The URI carries the credentials; the INITDB pair is
# what the official mongo image reads to initialise the database, which is why
# those two alone keep their unprefixed names — renaming them means the
# database is never initialised.
MEWBO_MONGO_PORT=27018
MEWBO_STORAGE_DRIVER=mongodb
MEWBO_MONGODB_URI=mongodb://mewbo:CHANGE_ME@localhost:27018/?authSource=admin
MEWBO_MONGODB_DATABASE=mewbo
MONGO_INITDB_ROOT_USERNAME=mewbo
MONGO_INITDB_ROOT_PASSWORD=CHANGE_ME
# ── Referenced from configs/app.json ──
# Each of these exists because app.json names it as `${VARIABLE}` rather than
# embedding the value. That is what keeps a key, a token or an internal
# hostname out of a file that gets copied around. A name that is set here but
# not consumed by app.json is dead weight; a name app.json references and that
# is NOT set here is refused at startup rather than read as empty.
# LLM gateway (OpenAI-compatible; a LiteLLM proxy is the usual choice).
MEWBO_LLM_API_BASE=https://llm.example.com/v1
MEWBO_LLM_API_KEY=CHANGE_ME
# Langfuse LLM observability.
MEWBO_LANGFUSE_HOST=https://langfuse.example.com
MEWBO_LANGFUSE_PUBLIC_KEY=pk-CHANGE_ME
MEWBO_LANGFUSE_SECRET_KEY=sk-CHANGE_ME
# Home Assistant.
MEWBO_HA_URL=https://homeassistant.example.com/api
MEWBO_HA_TOKEN=CHANGE_ME
# Nextcloud Talk channel.
MEWBO_NEXTCLOUD_URL=https://nextcloud.example.com
MEWBO_NEXTCLOUD_HOST_HEADER=nextcloud.example.com
MEWBO_NEXTCLOUD_BOT_SECRET=CHANGE_ME
# Email channel. The allowlists are one variable per address, because a config
# list resolves each element independently.
MEWBO_EMAIL_IMAP_HOST=imap.example.com
MEWBO_EMAIL_SMTP_HOST=smtp.example.com
MEWBO_EMAIL_USERNAME=mewbo@example.com
MEWBO_EMAIL_PASSWORD=CHANGE_ME
MEWBO_EMAIL_FROM_ADDRESS=Mewbo <mewbo@example.com>
MEWBO_EMAIL_ALLOWED_SENDER_1=you@example.com
MEWBO_EMAIL_ALLOWED_SENDER_2=someone-else@example.com
MEWBO_EMAIL_ALLOWED_RECIPIENT_1=mewbo@example.com
# Plugin marketplace served from your own forge, and the token used to clone
# and comment on repositories there.
MEWBO_PLUGIN_MARKETPLACE=https://git.example.com/you/claude-code-plugin
MEWBO_VCS_TOKEN=CHANGE_ME
# Project-specific MCP variables — define whatever names your .mcp.json files
# reference, under exactly those names. They belong to the MCP servers, not to
# Mewbo, so they are not listed individually here.
# MY_MCP_BEARER_TOKEN=CHANGE_ME
# Personal access token for forge operations (clone, pull-request comments).
# Read by the git/gh tooling under that exact name, so it is not prefixed.
# GITHUB_TOKEN=CHANGE_ME
# ── Web IDE broker (only needed when agent.web_ide.enabled is true) ──
# The mewbo-ide service is the only container mounting the docker socket, so
# it is the only one that can start a code-server container. Both settings are
# REQUIRED for it to start at all.
#
# Shared secret the api uses to call the broker. Make it DIFFERENT from the
# master token — the whole point of the split is that holding the API's
# credential must not confer daemon access.
# MEWBO_IDE_BROKER_TOKEN=CHANGE_ME
#
# Colon-separated absolute paths the broker will open an IDE against. It
# refuses to start when empty rather than defaulting to "anywhere", because a
# bind-mount source that falls open is whole-host read/write. Mount each one
# read-only into the mewbo-ide service at the SAME path
# (docker-compose.override.yml) — the broker resolves symlinks in its own
# mount namespace, so a path it cannot see is refused even when allowlisted.
# MEWBO_IDE_ALLOWED_ROOTS=/home/you/Projects/my-project:/home/you/Projects/another-repo
#
# GID of the host's docker group, for the broker only:
# stat -c '%g' /var/run/docker.sock
# MEWBO_DOCKER_GID=999
# ── Live-source overrides (local development) ──
# Bind-mount a worktree's console build and Python source over the baked image,
# so `npm run build` and `docker compose restart api` go live without an image
# rebuild. These are the only entries compose INTERPOLATES rather than passes
# into a container; unset each to fall back to the main repo's own path.
# MEWBO_CONSOLE_DIST=/home/you/Projects/Assistant/apps/mewbo_console/dist
# MEWBO_API_SRC=/home/you/Projects/Assistant/apps/mewbo_api/src/mewbo_api
# MEWBO_CORE_SRC=/home/you/Projects/Assistant/packages/mewbo_core/src/mewbo_core