forked from stellar-kracken/swipely_backend
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy path.env.example
More file actions
324 lines (240 loc) · 11.6 KB
/
Copy path.env.example
File metadata and controls
324 lines (240 loc) · 11.6 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
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
# =============================================================================
# Swipely Backend — Environment Variable Reference
# =============================================================================
# Copy this file to .env and fill in the values for your environment.
# Lines starting with # are comments. All variables without a "required"
# comment have safe defaults for local development.
#
# ⚠ Never commit a populated .env file to version control.
# =============================================================================
# -----------------------------------------------------------------------------
# Application
# -----------------------------------------------------------------------------
NODE_ENV=development # development | production | test | sandbox
PORT=3001 # HTTP port the API server listens on
WS_PORT=3002 # WebSocket server port
# Comma-separated list of allowed CORS origins (production only).
# Leave unset in development to allow all origins.
# CORS_ALLOWED_ORIGINS=https://app.example.com,https://admin.example.com
# -----------------------------------------------------------------------------
# Security ★ required in production
# -----------------------------------------------------------------------------
# Minimum 32 characters. Used to sign download tokens in the export service.
# JWT_SECRET=change-me-to-a-random-32-char-or-longer-string
# Minimum 32 characters. Used to encrypt sensitive config values at rest.
# CONFIG_ENCRYPTION_KEY=change-me-to-a-random-32-char-or-longer-string
# -----------------------------------------------------------------------------
# PostgreSQL / TimescaleDB
# -----------------------------------------------------------------------------
POSTGRES_HOST=localhost
POSTGRES_PORT=5432
POSTGRES_DB=bridge_watch
POSTGRES_USER=bridge_watch
POSTGRES_PASSWORD=bridge_watch_dev # ★ change in production
# -----------------------------------------------------------------------------
# Redis
# -----------------------------------------------------------------------------
REDIS_HOST=localhost
REDIS_PORT=6379
REDIS_PASSWORD= # leave empty if no auth
# Set to "true" in production to enable Redis Cluster mode
# REDIS_CLUSTER=true
# -----------------------------------------------------------------------------
# Stellar
# -----------------------------------------------------------------------------
STELLAR_NETWORK=testnet # testnet | mainnet
STELLAR_HORIZON_URL=https://horizon-testnet.stellar.org
SOROBAN_RPC_URL=https://soroban-testnet.stellar.org
# SOROBAN_MAINNET_RPC_URL=https://soroban-rpc.mainnet.stellar.org
# CIRCUIT_BREAKER_CONTRACT_ID=CXXXX...
# LIQUIDITY_CONTRACT_ADDRESS=CXXXX...
# -----------------------------------------------------------------------------
# Ethereum / EVM chains
# -----------------------------------------------------------------------------
# ETHEREUM_RPC_URL=https://mainnet.infura.io/v3/YOUR_PROJECT_ID
# ETHEREUM_RPC_WS_URL=wss://mainnet.infura.io/ws/v3/YOUR_PROJECT_ID
# ETHEREUM_RPC_FALLBACK_URL=https://eth-mainnet.alchemyapi.io/v2/YOUR_KEY
RPC_PROVIDER_TYPE=http # http | ws
# USDC_BRIDGE_ADDRESS=0x...
# EURC_BRIDGE_ADDRESS=0x...
# USDC_TOKEN_ADDRESS=0x...
# EURC_TOKEN_ADDRESS=0x...
# POLYGON_RPC_URL=https://polygon-mainnet.infura.io/v3/YOUR_PROJECT_ID
# POLYGON_RPC_FALLBACK_URL=https://polygon-mainnet.alchemyapi.io/v2/YOUR_KEY
# BASE_RPC_URL=https://mainnet.base.org
# BASE_RPC_FALLBACK_URL=https://base-mainnet.g.alchemy.com/v2/YOUR_KEY
# -----------------------------------------------------------------------------
# External price / data APIs
# -----------------------------------------------------------------------------
# CIRCLE_API_KEY=your-circle-api-key
CIRCLE_API_URL=https://api.circle.com
CIRCLE_API_TIMEOUT_MS=5000
CIRCLE_CACHE_TTL_SEC=60
CIRCLE_RATE_LIMIT_MAX=30
CIRCLE_RATE_LIMIT_WINDOW_MS=60000
# COINBASE_API_KEY=your-coinbase-api-key
# COINBASE_API_SECRET=your-coinbase-api-secret
# ONEINCH_API_KEY=your-1inch-api-key
# COINMARKETCAP_API_KEY=your-cmc-api-key
# COINGECKO_API_KEY=your-coingecko-demo-api-key
# Bootstrap token used to seed the first admin API key (optional after first run)
# API_KEY_BOOTSTRAP_TOKEN=a-long-random-bootstrap-secret
# -----------------------------------------------------------------------------
# Logging
# -----------------------------------------------------------------------------
LOG_LEVEL=info # fatal | error | warn | info | debug | trace
# LOG_FILE=/var/log/swipely/app.log # Write logs to a file (production)
LOG_MAX_FILE_SIZE=104857600 # 100 MB
LOG_MAX_FILES=10
LOG_RETENTION_DAYS=30
LOG_REQUEST_BODY=false # Log incoming request bodies (verbose)
LOG_RESPONSE_BODY=false # Log outgoing response bodies (verbose)
LOG_SENSITIVE_DATA=false # Must remain false in production
REQUEST_SLOW_THRESHOLD_MS=1000 # Warn on requests slower than this
# -----------------------------------------------------------------------------
# Rate Limiting
# -----------------------------------------------------------------------------
RATE_LIMIT_MAX=100
RATE_LIMIT_WINDOW_MS=60000
RATE_LIMIT_BURST_MULTIPLIER=0.1
# RATE_LIMIT_WHITELIST_IPS=127.0.0.1,10.0.0.1
# RATE_LIMIT_WHITELIST_KEYS=internal-key-1,internal-key-2
RATE_LIMIT_ENABLE_DYNAMIC=true
RATE_LIMIT_GLOBAL_ALERT_THRESHOLD=0.9
RATE_LIMIT_BURST_ALERT_THRESHOLD=0.8
RATE_LIMIT_SUSTAINED_ALERT_THRESHOLD=0.7
RATE_LIMIT_STATS_RETENTION_HOURS=168
RATE_LIMIT_ENABLE_MONITORING=true
RATE_LIMIT_ADMIN_API_KEY_PREFIX=admin_
# Per-endpoint limits (requests per RATE_LIMIT_WINDOW_MS)
RATE_LIMIT_ENDPOINT_ASSETS=200
RATE_LIMIT_ENDPOINT_BRIDGES=150
RATE_LIMIT_ENDPOINT_ALERTS=50
RATE_LIMIT_ENDPOINT_ANALYTICS=100
RATE_LIMIT_ENDPOINT_CONFIG=30
RATE_LIMIT_ENDPOINT_HEALTH=1000
# -----------------------------------------------------------------------------
# Alert Thresholds
# -----------------------------------------------------------------------------
PRICE_DEVIATION_THRESHOLD=0.02 # 2% — triggers a price deviation alert
BRIDGE_SUPPLY_MISMATCH_THRESHOLD=0.1 # 10% — triggers a supply mismatch alert
# -----------------------------------------------------------------------------
# Verification & Retries
# -----------------------------------------------------------------------------
RETRY_MAX=3
BRIDGE_VERIFICATION_INTERVAL_MS=300000 # 5 minutes
# -----------------------------------------------------------------------------
# Price Aggregation / Cache
# -----------------------------------------------------------------------------
HORIZON_TIMEOUT_MS=500
REDIS_CACHE_TTL_SEC=30
REDIS_PRICE_CACHE_PREFIX=price:aggregated
# TTL (seconds) for per-provider last-known-good price fallback values.
PRICE_PROVIDER_CACHE_TTL_SEC=300
# Per-provider rate limits for price sources (requests per window).
# Each provider keeps an independent Redis counter.
SDEX_RATE_LIMIT_MAX=30
SDEX_RATE_LIMIT_WINDOW_MS=60000
AMM_RATE_LIMIT_MAX=30
AMM_RATE_LIMIT_WINDOW_MS=60000
# -----------------------------------------------------------------------------
# WebSocket
# -----------------------------------------------------------------------------
# Required for private channel authentication. Set to a strong random string.
# WS_AUTH_SECRET=change-me-to-a-random-secret
# -----------------------------------------------------------------------------
# Health Score Weights (must sum to 1.0)
# -----------------------------------------------------------------------------
HEALTH_WEIGHT_LIQUIDITY=0.25
HEALTH_WEIGHT_PRICE=0.25
HEALTH_WEIGHT_BRIDGE=0.20
HEALTH_WEIGHT_RESERVES=0.20
HEALTH_WEIGHT_VOLUME=0.10
# -----------------------------------------------------------------------------
# Export Service
# -----------------------------------------------------------------------------
EXPORT_STORAGE_PATH=./exports
EXPORT_DOWNLOAD_URL_EXPIRY_HOURS=24
EXPORT_COMPRESSION_THRESHOLD_BYTES=1048576 # 1 MB
EXPORT_STREAMING_PAGE_SIZE=1000
EXPORT_QUEUE_CONCURRENCY=3
EXPORT_MAX_DATE_RANGE_DAYS=90
# -----------------------------------------------------------------------------
# Email (SMTP)
# -----------------------------------------------------------------------------
# SMTP_HOST=smtp.example.com
SMTP_PORT=587
SMTP_SECURE=false
# SMTP_USER=alerts@example.com
# SMTP_PASSWORD=your-smtp-password
SMTP_FROM_ADDRESS=noreply@bridgewatch.io
SMTP_FROM_NAME=Bridge Watch
# -----------------------------------------------------------------------------
# Discord Bot
# -----------------------------------------------------------------------------
# DISCORD_BOT_TOKEN=your-discord-bot-token
# DISCORD_CLIENT_ID=your-discord-application-id
# -----------------------------------------------------------------------------
# Telegram Bot
# -----------------------------------------------------------------------------
# TELEGRAM_BOT_TOKEN=your-telegram-bot-token
# TELEGRAM_WEBHOOK_URL=https://yourdomain.com/api/v1/telegram/webhook
# TELEGRAM_WEBHOOK_SECRET=a-strong-random-secret
TELEGRAM_RATE_LIMIT_OUTBOUND_GLOBAL_PER_SEC=30
TELEGRAM_RATE_LIMIT_OUTBOUND_PER_CHAT_PER_SEC=1
TELEGRAM_RATE_LIMIT_INBOUND_COMMANDS_PER_WINDOW=5
TELEGRAM_RATE_LIMIT_INBOUND_WINDOW_SEC=30
# TELEGRAM_ADMIN_CHAT_IDS=123456789,987654321
TELEGRAM_BOT_ENABLED=true
# -----------------------------------------------------------------------------
# Health Check Service
# -----------------------------------------------------------------------------
HEALTH_CHECK_TIMEOUT_MS=5000
HEALTH_CHECK_INTERVAL_MS=30000
HEALTH_CHECK_MEMORY_THRESHOLD=90 # % heap usage before degraded
HEALTH_CHECK_DISK_THRESHOLD=80 # % disk usage before degraded
HEALTH_CHECK_EXTERNAL_APIS=true
MAINTENANCE_MODE=false
MAINTENANCE_MESSAGE=
MAINTENANCE_SEVERITY=info # info | warning | critical
# STATUS_PAGE_URL=https://status.example.com
# -----------------------------------------------------------------------------
# Data Validation
# -----------------------------------------------------------------------------
VALIDATION_STRICT_MODE=false
VALIDATION_ADMIN_BYPASS=true
VALIDATION_BATCH_SIZE=100
VALIDATION_MAX_BATCH_SIZE=1000
VALIDATION_DUPLICATE_CHECK=true
VALIDATION_NORMALIZATION=true
VALIDATION_CONSISTENCY_CHECKS=true
VALIDATION_ERROR_THRESHOLD=0.1 # 10% error rate threshold
VALIDATION_WARNING_THRESHOLD=0.3 # 30% warning threshold
VALIDATION_DATA_QUALITY_THRESHOLD=70
# -----------------------------------------------------------------------------
# Compliance Reports
# -----------------------------------------------------------------------------
REPORT_DIR=./reports
ARCHIVE_DIR=./archives
# REPORT_SIGNING_KEY_PATH=/secrets/report-signing-key.pem
# -----------------------------------------------------------------------------
# Correlation / Anomaly Detection
# -----------------------------------------------------------------------------
CORRELATION_THRESHOLD=0.6 # 0.0–1.0 similarity threshold
# -----------------------------------------------------------------------------
# Background Job Intervals
# -----------------------------------------------------------------------------
RECONCILIATION_INTERVAL_MS=600000 # 10 minutes
SOURCE_DECOMMISSION_CHECK_INTERVAL_MS=3600000 # 1 hour
PROVIDER_BREAKER_PROBE_INTERVAL_MS=30000 # 30 seconds
# -----------------------------------------------------------------------------
# BullMQ Queue Rate Limiting (per priority level)
# -----------------------------------------------------------------------------
QUEUE_RATE_MAX_CRITICAL=1000
QUEUE_RATE_DURATION_MS_CRITICAL=1000
QUEUE_RATE_MAX_HIGH=1000
QUEUE_RATE_DURATION_MS_HIGH=1000
QUEUE_RATE_MAX_NORMAL=1000
QUEUE_RATE_DURATION_MS_NORMAL=1000
QUEUE_RATE_MAX_LOW=1000
QUEUE_RATE_DURATION_MS_LOW=1000