-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathcompose.yaml
More file actions
283 lines (276 loc) · 16.1 KB
/
Copy pathcompose.yaml
File metadata and controls
283 lines (276 loc) · 16.1 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
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
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
name: ${COMPOSE_PROJECT_NAME:-voicelinkvr}
services:
redis:
profiles: ["redis"]
image: ${REDIS_IMAGE:-redis:latest}
container_name: ${REDIS_CONTAINER_NAME:-redis}
restart: unless-stopped
ports:
- "${REDIS_HOST_PORT:-6379}:6379"
volumes:
- ${REDIS_DATA_PATH:-./redisFiles/data}:/data
- ${REDIS_CONFIG_PATH:-./redisFiles/redis.conf}:/usr/local/etc/redis/redis.conf:ro
command: redis-server /usr/local/etc/redis/redis.conf
faster-whisper:
profiles: ["faster-whisper"]
image: ${FASTER_WHISPER_IMAGE:-fedirz/faster-whisper-server:latest-cuda}
container_name: ${FASTER_WHISPER_CONTAINER_NAME:-faster-whisper}
restart: unless-stopped
ports:
- "${FASTER_WHISPER_HOST_PORT:-8000}:8000"
environment:
WHISPER__TTL: ${FASTER_WHISPER_TTL:--1}
WHISPER__NUM_WORKERS: ${FASTER_WHISPER_NUM_WORKERS:-10}
WHISPER__CPU_THREADS: ${FASTER_WHISPER_CPU_THREADS:-40}
gpus: all
whisper-trt:
profiles: ["whisper-trt"]
image: ${WHISPER_TRT_IMAGE:-ghcr.io/your-org/whisperlive-trt-gemma:latest}
container_name: ${WHISPER_TRT_CONTAINER_NAME:-whisper-trt}
restart: unless-stopped
ports:
- "${WHISPER_TRT_WS_HOST_PORT:-9090}:9090"
- "${WHISPER_TRT_REST_HOST_PORT:-18100}:8000"
environment:
ENABLE_REST: ${WHISPER_TRT_ENABLE_REST:-true}
REST_PORT: ${WHISPER_TRT_REST_PORT:-8000}
TRT_MULTILINGUAL: ${WHISPER_TRT_MULTILINGUAL:-true}
TRANSLATE_SERVICE_URL: ${TRANSLATE_SERVICE_URL:-http://gemma-translate:8080}
AUTO_BUILD_TRT_MODEL: ${AUTO_BUILD_TRT_MODEL:-true}
TRT_BUILD_MODEL_NAME: ${TRT_BUILD_MODEL_NAME:-large-v3}
TRT_WEIGHT_ONLY_PRECISION: ${TRT_WEIGHT_ONLY_PRECISION:-float16}
CONTEXT_FMHA_MODE: ${CONTEXT_FMHA_MODE:-auto}
BERT_ATTENTION_PLUGIN_MODE: ${BERT_ATTENTION_PLUGIN_MODE:-auto}
GPT_ATTENTION_PLUGIN_MODE: ${GPT_ATTENTION_PLUGIN_MODE:-auto}
TRT_PY_SESSION: ${TRT_PY_SESSION:-false}
CORS_ORIGINS: ${CORS_ORIGINS:-http://127.0.0.1:18100,http://localhost:18100}
TRT_BUILD_INFERENCE_PRECISION: ${TRT_BUILD_INFERENCE_PRECISION:-float16}
TRT_BUILD_MAX_BATCH_SIZE: ${TRT_BUILD_MAX_BATCH_SIZE:-1}
TRT_BUILD_MAX_BEAM_WIDTH: ${TRT_BUILD_MAX_BEAM_WIDTH:-1}
TRT_BUILD_ENCODER_MAX_INPUT_LEN: ${TRT_BUILD_ENCODER_MAX_INPUT_LEN:-3000}
TRT_BUILD_ENCODER_MAX_SEQ_LEN: ${TRT_BUILD_ENCODER_MAX_SEQ_LEN:-3000}
TRT_BUILD_DECODER_MAX_SEQ_LEN: ${TRT_BUILD_DECODER_MAX_SEQ_LEN:-225}
TRT_BUILD_DECODER_MAX_INPUT_LEN: ${TRT_BUILD_DECODER_MAX_INPUT_LEN:-32}
TRT_BUILD_DECODER_MAX_ENCODER_INPUT_LEN: ${TRT_BUILD_DECODER_MAX_ENCODER_INPUT_LEN:-3000}
TRT_BUILD_DECODER_MAX_NUM_TOKENS: ${TRT_BUILD_DECODER_MAX_NUM_TOKENS:-}
TRT_RUNTIME_MAX_BATCH_SIZE: ${TRT_RUNTIME_MAX_BATCH_SIZE:-1}
TRT_RUNTIME_MAX_INPUT_LEN: ${TRT_RUNTIME_MAX_INPUT_LEN:-3000}
TRT_RUNTIME_MAX_OUTPUT_LEN: ${TRT_RUNTIME_MAX_OUTPUT_LEN:-64}
TRT_RUNTIME_MAX_BEAM_WIDTH: ${TRT_RUNTIME_MAX_BEAM_WIDTH:-1}
TRT_KV_CACHE_FREE_GPU_MEMORY_FRACTION: ${TRT_KV_CACHE_FREE_GPU_MEMORY_FRACTION:-0.55}
TRT_CROSS_KV_CACHE_FRACTION: ${TRT_CROSS_KV_CACHE_FRACTION:-0.30}
volumes:
- ${WL_CACHE_DIR:-./.cache/whisper-trt}/assets:/app/TensorRT-LLM-examples/whisper/assets
- ${WL_CACHE_DIR:-./.cache/whisper-trt}/engine:/app/TensorRT-LLM-examples/whisper/whisper_large-v3_float16
- ${WL_CACHE_DIR:-./.cache/whisper-trt}/weights:/app/TensorRT-LLM-examples/whisper/whisper_large-v3_weights_float16
- ${WL_CACHE_DIR:-./.cache/whisper-trt}/pip:/root/.cache/pip
gpus: all
sensevoice:
profiles: ["sensevoice"]
image: ${SENSEVOICE_IMAGE:-ghcr.io/your-org/sensevoice-oneapi:latest}
container_name: ${SENSEVOICE_CONTAINER_NAME:-sensevoice}
restart: unless-stopped
ports:
- "${SENSEVOICE_HOST_PORT:-8800}:8000"
environment:
DEVICE_TYPE: ${SENSEVOICE_DEVICE_TYPE:-cuda:0}
use_itn: ${SENSEVOICE_USE_ITN:-True}
ncpu: ${SENSEVOICE_NCPU:-8}
VAD_ENABLE: ${SENSEVOICE_VAD_ENABLE:-False}
gpus: all
gemma-translate:
profiles: ["gemma"]
image: ${GEMMA_TRANSLATE_IMAGE:-ghcr.io/your-org/translategemma-llama-server:latest}
container_name: ${GEMMA_TRANSLATE_CONTAINER_NAME:-gemma-translate}
restart: unless-stopped
ports:
- "${GEMMA_TRANSLATE_BIND_IP:-127.0.0.1}:${GEMMA_TRANSLATE_HOST_PORT:-8080}:8080"
volumes:
- ${GEMMA_MODEL_ROOT:-D:/models}:/models
environment:
MODEL_NAME: ${GEMMA_MODEL_NAME:-translategemma-12b-it-MP-GGUF}
LLAMA_N_GPU_LAYERS: ${LLAMA_N_GPU_LAYERS:--1}
LLAMA_N_PARALLEL: ${LLAMA_N_PARALLEL:-2}
LLAMA_N_CTX: ${LLAMA_N_CTX:-3072}
LLAMA_FLASH_ATTN: ${LLAMA_FLASH_ATTN:-on}
LLAMA_PORT: 8080
LLAMA_EXTRA_ARGS: ${LLAMA_EXTRA_ARGS:-}
gpus: all
voicelink:
build:
context: .
dockerfile: Dockerfile
image: ${VOICELINK_IMAGE:-boyqiu0010/voice-link-vr-server:latest}
container_name: ${VOICELINK_CONTAINER_NAME:-voicelink}
restart: unless-stopped
ports:
- "${VOICELINK_HOST_PORT:-8980}:8980"
volumes:
- ${VOICELINK_DATA_VOLUME:-voice-link-vr-server-local}:/usr/src/app/data:rw
extra_hosts:
- "host.docker.internal:host-gateway"
environment:
VOICELINK_RUNTIME_MODE: ${VOICELINK_RUNTIME_MODE:-all}
VOICELINK_RUN_SCHEDULER: ${VOICELINK_RUN_SCHEDULER:-true}
VOICELINK_RUN_SCHEMA_UPGRADE: ${VOICELINK_RUN_SCHEMA_UPGRADE:-true}
UVICORN_WORKERS: ${UVICORN_WORKERS:-4}
JWT_SECRET_KEY: ${JWT_SECRET_KEY:-aaargwgwqewe}
SESSION_SECRET_KEY: ${SESSION_SECRET_KEY:-feefadfagagagwadsee}
SESSION_COOKIE_HTTPS_ONLY: ${SESSION_COOKIE_HTTPS_ONLY:-True}
SESSION_COOKIE_SAME_SITE: ${SESSION_COOKIE_SAME_SITE:-lax}
SESSION_COOKIE_MAX_AGE: ${SESSION_COOKIE_MAX_AGE:-2592000}
WHISPER_HOST: ${WHISPER_HOST:-faster-whisper}
WHISPER_PORT: ${WHISPER_PORT:-8000}
WHISPER_ENDPOINTS: ${WHISPER_ENDPOINTS:-}
WHISPER_BACKEND: ${WHISPER_BACKEND:-faster-whisper}
WHISPER_ASR_TIMEOUT: ${WHISPER_ASR_TIMEOUT:-30}
ASR_BACKEND_STATUS_ENABLED: ${ASR_BACKEND_STATUS_ENABLED:-false}
ASR_BACKEND_STATUS_TTL_SECONDS: ${ASR_BACKEND_STATUS_TTL_SECONDS:-1.5}
ASR_BACKEND_STATUS_TIMEOUT_SECONDS: ${ASR_BACKEND_STATUS_TIMEOUT_SECONDS:-0.6}
ASR_BACKEND_STATUS_OVERLOAD_ACTIVE_REQUESTS: ${ASR_BACKEND_STATUS_OVERLOAD_ACTIVE_REQUESTS:-4}
ASR_BACKEND_STATUS_OVERLOAD_OLDEST_SECONDS: ${ASR_BACKEND_STATUS_OVERLOAD_OLDEST_SECONDS:-30}
ASR_BACKEND_STATUS_OVERLOAD_MIN_SECONDS: ${ASR_BACKEND_STATUS_OVERLOAD_MIN_SECONDS:-12}
ASR_BACKEND_STATUS_RECOVERY_ACTIVE_REQUESTS: ${ASR_BACKEND_STATUS_RECOVERY_ACTIVE_REQUESTS:-2}
ASR_BACKEND_STATUS_RECOVERY_OLDEST_SECONDS: ${ASR_BACKEND_STATUS_RECOVERY_OLDEST_SECONDS:-12}
WHISPER_MODEL: ${WHISPER_MODEL:-Systran/faster-whisper-large-v3}
WHISPER_TRT_HOST: ${WHISPER_TRT_HOST:-whisper-trt}
WHISPER_TRT_PORT: ${WHISPER_TRT_PORT:-8000}
SENSEVOICE_HOST: ${SENSEVOICE_HOST:-sensevoice}
SENSEVOICE_PORT: ${SENSEVOICE_PORT:-8000}
ASR_DEFAULT_ENGINE: ${ASR_DEFAULT_ENGINE:-firered}
FIRERED_ASR_HOST: ${FIRERED_ASR_HOST:-192.168.2.81}
FIRERED_ASR_PORT: ${FIRERED_ASR_PORT:-8008}
FIRERED_ASR_TIMEOUT: ${FIRERED_ASR_TIMEOUT:-120}
FIRERED_LID_ENABLED: ${FIRERED_LID_ENABLED:-True}
FIRERED_LID_HOST: ${FIRERED_LID_HOST:-192.168.2.81}
FIRERED_LID_PORT: ${FIRERED_LID_PORT:-18000}
FIRERED_LID_TIMEOUT: ${FIRERED_LID_TIMEOUT:-4}
FIRERED_LID_MAX_CONCURRENCY: ${FIRERED_LID_MAX_CONCURRENCY:-4}
FIRERED_LID_QUEUE_TIMEOUT: ${FIRERED_LID_QUEUE_TIMEOUT:-2}
FIRERED_LID_GLOBAL_MIN_INTERVAL: ${FIRERED_LID_GLOBAL_MIN_INTERVAL:-0}
ASR_QUEUE_LIMIT_ENABLED: ${ASR_QUEUE_LIMIT_ENABLED:-true}
ASR_QUEUE_MAX_CONCURRENCY: ${ASR_QUEUE_MAX_CONCURRENCY:-4}
ASR_QUEUE_MAX_WAITING: ${ASR_QUEUE_MAX_WAITING:-4}
ASR_QUEUE_TIMEOUT_SECONDS: ${ASR_QUEUE_TIMEOUT_SECONDS:-1.5}
ASR_QUEUE_RETRY_AFTER_SECONDS: ${ASR_QUEUE_RETRY_AFTER_SECONDS:-2}
ASR_QUEUE_SLOW_LOG_SECONDS: ${ASR_QUEUE_SLOW_LOG_SECONDS:-15}
ASR_QUEUE_LATENCY_WINDOW: ${ASR_QUEUE_LATENCY_WINDOW:-64}
ASR_QUEUE_WHISPER_MAX_CONCURRENCY: ${ASR_QUEUE_WHISPER_MAX_CONCURRENCY:-4}
ASR_QUEUE_WHISPER_MAX_WAITING: ${ASR_QUEUE_WHISPER_MAX_WAITING:-4}
ASR_QUEUE_WHISPER_TIMEOUT_SECONDS: ${ASR_QUEUE_WHISPER_TIMEOUT_SECONDS:-1.5}
ASR_QUEUE_WHISPER_RETRY_AFTER_SECONDS: ${ASR_QUEUE_WHISPER_RETRY_AFTER_SECONDS:-2}
ASR_QUEUE_FIRERED_MAX_CONCURRENCY: ${ASR_QUEUE_FIRERED_MAX_CONCURRENCY:-4}
ASR_QUEUE_FIRERED_MAX_WAITING: ${ASR_QUEUE_FIRERED_MAX_WAITING:-4}
ASR_QUEUE_FIRERED_TIMEOUT_SECONDS: ${ASR_QUEUE_FIRERED_TIMEOUT_SECONDS:-1.5}
ASR_QUEUE_FIRERED_RETRY_AFTER_SECONDS: ${ASR_QUEUE_FIRERED_RETRY_AFTER_SECONDS:-2}
ASR_CANCEL_CHECK_INTERVAL_SECONDS: ${ASR_CANCEL_CHECK_INTERVAL_SECONDS:-0.25}
ASR_HARD_TIMEOUT_GRACE_SECONDS: ${ASR_HARD_TIMEOUT_GRACE_SECONDS:-10}
ASR_ENDPOINT_CIRCUIT_BREAKER_ENABLED: ${ASR_ENDPOINT_CIRCUIT_BREAKER_ENABLED:-true}
ASR_ENDPOINT_CIRCUIT_WINDOW_SECONDS: ${ASR_ENDPOINT_CIRCUIT_WINDOW_SECONDS:-60}
ASR_ENDPOINT_CIRCUIT_CONSECUTIVE_TIMEOUTS: ${ASR_ENDPOINT_CIRCUIT_CONSECUTIVE_TIMEOUTS:-2}
ASR_ENDPOINT_CIRCUIT_CONSECUTIVE_FAILURES: ${ASR_ENDPOINT_CIRCUIT_CONSECUTIVE_FAILURES:-3}
ASR_ENDPOINT_CIRCUIT_TIMEOUT_RATE: ${ASR_ENDPOINT_CIRCUIT_TIMEOUT_RATE:-0.2}
ASR_ENDPOINT_CIRCUIT_MIN_SAMPLES: ${ASR_ENDPOINT_CIRCUIT_MIN_SAMPLES:-5}
ASR_ENDPOINT_CIRCUIT_OPEN_SECONDS: ${ASR_ENDPOINT_CIRCUIT_OPEN_SECONDS:-15}
ASR_ENDPOINT_CIRCUIT_RETRY_AFTER_SECONDS: ${ASR_ENDPOINT_CIRCUIT_RETRY_AFTER_SECONDS:-2}
FILTER_WEB_URL: ${FILTER_WEB_URL:-https://gitee.com/voice-link-vr/VoiceLinkServer/raw/main/src/filter.json}
THREADS_NUM: ${THREADS_NUM:-50}
LIMIT_ENABLE: ${LIMIT_ENABLE:-True}
LIMIT_PUBLIC_TEST_USER: ${LIMIT_PUBLIC_TEST_USER:-testuser}
SQLALCHEMY_POOL_SIZE: ${SQLALCHEMY_POOL_SIZE:-0}
TRANSLATOR_SERVICES_LIST: ${TRANSLATOR_SERVICES_LIST:-bing,modernMt,cloudTranslation,caiyun,alibaba,youdao}
LIMITER_REDIS_URL: ${LIMITER_REDIS_URL:-redis://redis:6379/0}
EDGE_TTS_ENABLED: ${EDGE_TTS_ENABLED:-False}
TTS_URL: ${TTS_URL:-}
TTS_TOKEN: ${TTS_TOKEN:-}
EDGE_TTS_TIMEOUT: ${EDGE_TTS_TIMEOUT:-60}
EDGE_TTS_MAX_INPUT_CHARS: ${EDGE_TTS_MAX_INPUT_CHARS:-500}
VOICE_SYNTHESIS_LEGACY_TRANSPORT_COMPAT: ${VOICE_SYNTHESIS_LEGACY_TRANSPORT_COMPAT:-True}
QWEN_TTS_ENABLED: ${QWEN_TTS_ENABLED:-True}
QWEN_TTS_BUILTIN_VOICES_ENABLED: ${QWEN_TTS_BUILTIN_VOICES_ENABLED:-False}
QWEN_TTS_BASE_URL: ${QWEN_TTS_BASE_URL:-http://host.docker.internal:8010}
QWEN_TTS_TOKEN: ${QWEN_TTS_TOKEN:-}
QWEN_TTS_TIMEOUT: ${QWEN_TTS_TIMEOUT:-300}
QWEN_TTS_MAX_INPUT_CHARS: ${QWEN_TTS_MAX_INPUT_CHARS:-500}
QWEN_TTS_CLONE_MAX_CONCURRENCY: ${QWEN_TTS_CLONE_MAX_CONCURRENCY:-1}
QWEN_TTS_CLONE_QUEUE_SIZE: ${QWEN_TTS_CLONE_QUEUE_SIZE:-16}
QWEN_TTS_CLONE_QUEUE_TIMEOUT: ${QWEN_TTS_CLONE_QUEUE_TIMEOUT:-120}
QWEN_TTS_CLONE_RETRY_ATTEMPTS: ${QWEN_TTS_CLONE_RETRY_ATTEMPTS:-2}
QWEN_TTS_CLONE_RETRY_DELAY: ${QWEN_TTS_CLONE_RETRY_DELAY:-0.75}
QWEN_TTS_CLONE_GLOBAL_LOCK_ENABLED: ${QWEN_TTS_CLONE_GLOBAL_LOCK_ENABLED:-True}
QWEN_TTS_CLONE_GLOBAL_LOCK_PATH: ${QWEN_TTS_CLONE_GLOBAL_LOCK_PATH:-/tmp/voicelink_qwen_clone.lock}
MOSS_TTS_ENABLED: ${MOSS_TTS_ENABLED:-False}
MOSS_TTS_BASE_URL: ${MOSS_TTS_BASE_URL:-http://host.docker.internal:8000}
MOSS_TTS_TOKEN: ${MOSS_TTS_TOKEN:-}
MOSS_TTS_TIMEOUT: ${MOSS_TTS_TIMEOUT:-300}
MOSS_TTS_MAX_INPUT_CHARS: ${MOSS_TTS_MAX_INPUT_CHARS:-500}
OMNIVOICE_TTS_ENABLED: ${OMNIVOICE_TTS_ENABLED:-True}
OMNIVOICE_TTS_BASE_URL: ${OMNIVOICE_TTS_BASE_URL:-http://192.168.2.198:8020}
OMNIVOICE_TTS_TOKEN: ${OMNIVOICE_TTS_TOKEN:-}
OMNIVOICE_TTS_TIMEOUT: ${OMNIVOICE_TTS_TIMEOUT:-300}
OMNIVOICE_TTS_MAX_INPUT_CHARS: ${OMNIVOICE_TTS_MAX_INPUT_CHARS:-500}
AFDIAN_CUSTOM_ID_KEY: ${AFDIAN_CUSTOM_ID_KEY:-change-me-to-32-byte-secret-change-me-now}
AFDIAN_RENEW_GRACE_DAYS: ${AFDIAN_RENEW_GRACE_DAYS:-0}
ENABLE_WEB_TRANSLATORS: ${ENABLE_WEB_TRANSLATORS:-True}
GEMMA_TRANSLATE_ENABLED: ${GEMMA_TRANSLATE_ENABLED:-False}
GEMMA_TRANSLATE_URL: ${GEMMA_TRANSLATE_URL:-gemma-translate:8080}
GEMMA_TRANSLATE_API_MODE: ${GEMMA_TRANSLATE_API_MODE:-completion}
GEMMA_TRANSLATE_MODEL: ${GEMMA_TRANSLATE_MODEL:-translategemma-12b-it-MP-GGUF}
GEMMA_TRANSLATE_TIMEOUT: ${GEMMA_TRANSLATE_TIMEOUT:-10.0}
GEMMA_TRANSLATE_MAX_TOKENS: ${GEMMA_TRANSLATE_MAX_TOKENS:-500}
GEMMA_TRANSLATE_FALLBACK: ${GEMMA_TRANSLATE_FALLBACK:-True}
OCR_IMAGE_TRANSLATE_ENABLED: ${OCR_IMAGE_TRANSLATE_ENABLED:-False}
OCR_IMAGE_TRANSLATE_BASE_URL: ${OCR_IMAGE_TRANSLATE_BASE_URL:-http://host.docker.internal:18000}
OCR_IMAGE_TRANSLATE_TIMEOUT: ${OCR_IMAGE_TRANSLATE_TIMEOUT:-180}
OCR_IMAGE_TRANSLATE_INPAINT_METHOD: ${OCR_IMAGE_TRANSLATE_INPAINT_METHOD:-inpaint}
OCR_IMAGE_TRANSLATE_RENDER_STYLE: ${OCR_IMAGE_TRANSLATE_RENDER_STYLE:-localized}
OCR_IMAGE_TRANSLATE_TEXT_FILL: ${OCR_IMAGE_TRANSLATE_TEXT_FILL:-}
OCR_IMAGE_TRANSLATE_INCLUDE_SEGMENTS: ${OCR_IMAGE_TRANSLATE_INCLUDE_SEGMENTS:-True}
OCR_IMAGE_TRANSLATE_FALLBACK_TO_GEMMA: ${OCR_IMAGE_TRANSLATE_FALLBACK_TO_GEMMA:-True}
PORTAL_PUBLIC_BASE_URL: ${PORTAL_PUBLIC_BASE_URL:-}
SMTP_HOST: ${SMTP_HOST:-}
SMTP_PORT: ${SMTP_PORT:-465}
SMTP_USERNAME: ${SMTP_USERNAME:-}
SMTP_PASSWORD: ${SMTP_PASSWORD:-}
SMTP_FROM_EMAIL: ${SMTP_FROM_EMAIL:-}
SMTP_FROM_NAME: ${SMTP_FROM_NAME:-VoiceLinkVR}
SMTP_USE_SSL: ${SMTP_USE_SSL:-True}
EMAIL_CODE_LENGTH: ${EMAIL_CODE_LENGTH:-6}
EMAIL_CODE_TTL_MINUTES: ${EMAIL_CODE_TTL_MINUTES:-10}
LEGACY_MODE: ${LEGACY_MODE:-True}
API_V1_ENABLED: ${API_V1_ENABLED:-True}
API_V1_LEGACY_LOGIN_ENABLED: ${API_V1_LEGACY_LOGIN_ENABLED:-True}
API_V2_ENABLED: ${API_V2_ENABLED:-True}
API_V2_AUTH_ENABLED: ${API_V2_AUTH_ENABLED:-True}
API_V2_PORTAL_ENABLED: ${API_V2_PORTAL_ENABLED:-True}
API_V2_BILLING_ENABLED: ${API_V2_BILLING_ENABLED:-False}
API_V2_SELF_ACTIVATE_ENABLED: ${API_V2_SELF_ACTIVATE_ENABLED:-False}
API_V2_LEGACY_MIGRATION_ENABLED: ${API_V2_LEGACY_MIGRATION_ENABLED:-True}
ADMIN_SURFACE_LAN_ONLY: ${ADMIN_SURFACE_LAN_ONLY:-True}
ADMIN_STATS_CACHE_TTL_SECONDS: ${ADMIN_STATS_CACHE_TTL_SECONDS:-45}
CLIENT_DISCONNECT_CHECK_TIMEOUT_SECONDS: ${CLIENT_DISCONNECT_CHECK_TIMEOUT_SECONDS:-0.05}
API_V1_HOSTS: ${API_V1_HOSTS:-}
API_V2_HOSTS: ${API_V2_HOSTS:-}
DEFAULT_TEST_USER_ENABLED: ${DEFAULT_TEST_USER_ENABLED:-True}
DEFAULT_TEST_USER_UUID: ${DEFAULT_TEST_USER_UUID:-00000000-0000-0000-0000-000000000001}
DEFAULT_TEST_USER_EMAIL: ${DEFAULT_TEST_USER_EMAIL:-test@voicelinkvr.top}
DEFAULT_TEST_USER_ACTIVE: ${DEFAULT_TEST_USER_ACTIVE:-True}
DEFAULT_TEST_USER_IP_DAILY_QUOTA: ${DEFAULT_TEST_USER_IP_DAILY_QUOTA:-800}
DEFAULT_TEST_USER_IP_RATE_LIMIT: ${DEFAULT_TEST_USER_IP_RATE_LIMIT:-8/minute}
DEFAULT_TEST_USER_RESOURCE_QUOTA: ${DEFAULT_TEST_USER_RESOURCE_QUOTA:-0}
DEFAULT_TEST_USER_USERNAME: ${DEFAULT_TEST_USER_USERNAME:-testuser}
DEFAULT_TEST_USER_PASSWORD: ${DEFAULT_TEST_USER_PASSWORD:-abc123!}
LATEST_VERSION: ${LATEST_VERSION:-v0.6.0-fix1}
PACKAGE_BASE_URL: ${PACKAGE_BASE_URL:-https://cloudflarestorage.boyqiu001.top/VRCLS-windows-}
PACKAGE_TYPE: ${PACKAGE_TYPE:-.exe}
UPDATE_APP_RELEASE_MANIFEST_URL: ${UPDATE_APP_RELEASE_MANIFEST_URL:-https://cloudflarestorage.boyqiu001.top/app-releases/upload-manifest.json}
UPDATE_APP_RELEASE_APPCAST_URL: ${UPDATE_APP_RELEASE_APPCAST_URL:-https://cloudflarestorage.boyqiu001.top/app-releases/appcast.xml}
UPDATE_APP_RELEASE_FALLBACK_URL: ${UPDATE_APP_RELEASE_FALLBACK_URL:-}
UPDATE_APP_RELEASE_CACHE_SECONDS: ${UPDATE_APP_RELEASE_CACHE_SECONDS:-300}
UPDATE_APP_RELEASE_FETCH_TIMEOUT: ${UPDATE_APP_RELEASE_FETCH_TIMEOUT:-15}
VOICE_CLONE_PRESET_ROOT: ${VOICE_CLONE_PRESET_ROOT:-/usr/src/app/data/voice_clone_presets}
VOICE_CLONE_PRESET_MAX_UPLOAD_MB: ${VOICE_CLONE_PRESET_MAX_UPLOAD_MB:-512}
SQL_PATH: ${SQL_PATH:-}
volumes:
voice-link-vr-server-local:
name: ${VOICELINK_DATA_VOLUME:-voice-link-vr-server-local}