lynkr 3.3.1 → 4.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +276 -2177
- package/README.md.backup +2996 -0
- package/docs/GSD_LEARNINGS.md +1116 -0
- package/docs/LOCAL_EMBEDDINGS_PLAN.md +1024 -0
- package/documentation/README.md +98 -0
- package/documentation/api.md +806 -0
- package/documentation/claude-code-cli.md +672 -0
- package/documentation/contributing.md +571 -0
- package/documentation/cursor-integration.md +731 -0
- package/documentation/docker.md +867 -0
- package/documentation/embeddings.md +760 -0
- package/documentation/faq.md +659 -0
- package/documentation/features.md +396 -0
- package/documentation/installation.md +706 -0
- package/documentation/memory-system.md +476 -0
- package/documentation/production.md +601 -0
- package/documentation/providers.md +735 -0
- package/documentation/testing.md +629 -0
- package/documentation/token-optimization.md +323 -0
- package/documentation/tools.md +697 -0
- package/documentation/troubleshooting.md +864 -0
- package/package.json +2 -2
- package/src/api/openai-router.js +919 -0
- package/src/api/router.js +4 -0
- package/src/clients/openai-format.js +427 -0
- package/src/config/index.js +8 -0
- package/test/cursor-integration.test.js +484 -0
|
@@ -0,0 +1,867 @@
|
|
|
1
|
+
# Docker Deployment Guide
|
|
2
|
+
|
|
3
|
+
Complete guide to deploying Lynkr with Docker and docker-compose, including GPU support and Kubernetes deployment.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Quick Start
|
|
8
|
+
|
|
9
|
+
### docker-compose (Recommended)
|
|
10
|
+
|
|
11
|
+
**1. Clone repository:**
|
|
12
|
+
```bash
|
|
13
|
+
git clone https://github.com/vishalveerareddy123/Lynkr.git
|
|
14
|
+
cd Lynkr
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
**2. Configure environment:**
|
|
18
|
+
```bash
|
|
19
|
+
cp .env.example .env
|
|
20
|
+
# Edit .env with your provider credentials
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
**3. Start services:**
|
|
24
|
+
```bash
|
|
25
|
+
docker-compose up -d
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
**4. Verify:**
|
|
29
|
+
```bash
|
|
30
|
+
curl http://localhost:8081/health/live
|
|
31
|
+
# Expected: {"status":"ok"}
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
---
|
|
35
|
+
|
|
36
|
+
## Docker Compose Configuration
|
|
37
|
+
|
|
38
|
+
### Standard Setup (docker-compose.yml)
|
|
39
|
+
|
|
40
|
+
```yaml
|
|
41
|
+
version: '3.8'
|
|
42
|
+
|
|
43
|
+
services:
|
|
44
|
+
lynkr:
|
|
45
|
+
build: .
|
|
46
|
+
container_name: lynkr
|
|
47
|
+
ports:
|
|
48
|
+
- "8081:8081" # Lynkr proxy
|
|
49
|
+
env_file:
|
|
50
|
+
- .env
|
|
51
|
+
volumes:
|
|
52
|
+
- ./data:/app/data # Persistent data (memories, sessions)
|
|
53
|
+
- ./workspace:/app/workspace # Workspace for file operations
|
|
54
|
+
restart: unless-stopped
|
|
55
|
+
healthcheck:
|
|
56
|
+
test: ["CMD", "curl", "-f", "http://localhost:8081/health/live"]
|
|
57
|
+
interval: 30s
|
|
58
|
+
timeout: 10s
|
|
59
|
+
retries: 3
|
|
60
|
+
start_period: 40s
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
### With Ollama (Local LLM)
|
|
64
|
+
|
|
65
|
+
```yaml
|
|
66
|
+
version: '3.8'
|
|
67
|
+
|
|
68
|
+
services:
|
|
69
|
+
# Lynkr proxy
|
|
70
|
+
lynkr:
|
|
71
|
+
build: .
|
|
72
|
+
container_name: lynkr
|
|
73
|
+
ports:
|
|
74
|
+
- "8081:8081"
|
|
75
|
+
environment:
|
|
76
|
+
# Hybrid routing: Ollama first, fallback to cloud
|
|
77
|
+
- MODEL_PROVIDER=ollama
|
|
78
|
+
- OLLAMA_API_BASE=http://ollama:11434
|
|
79
|
+
- PREFER_OLLAMA=true
|
|
80
|
+
- FALLBACK_ENABLED=true
|
|
81
|
+
- FALLBACK_PROVIDER=databricks
|
|
82
|
+
- DATABRICKS_API_BASE=${DATABRICKS_API_BASE}
|
|
83
|
+
- DATABRICKS_API_KEY=${DATABRICKS_API_KEY}
|
|
84
|
+
volumes:
|
|
85
|
+
- ./data:/app/data
|
|
86
|
+
- ./workspace:/app/workspace
|
|
87
|
+
depends_on:
|
|
88
|
+
- ollama
|
|
89
|
+
restart: unless-stopped
|
|
90
|
+
|
|
91
|
+
# Ollama local LLM server
|
|
92
|
+
ollama:
|
|
93
|
+
image: ollama/ollama:latest
|
|
94
|
+
container_name: ollama
|
|
95
|
+
ports:
|
|
96
|
+
- "11434:11434"
|
|
97
|
+
volumes:
|
|
98
|
+
- ollama_data:/root/.ollama
|
|
99
|
+
restart: unless-stopped
|
|
100
|
+
healthcheck:
|
|
101
|
+
test: ["CMD", "curl", "-f", "http://localhost:11434/api/tags"]
|
|
102
|
+
interval: 30s
|
|
103
|
+
timeout: 10s
|
|
104
|
+
retries: 3
|
|
105
|
+
|
|
106
|
+
volumes:
|
|
107
|
+
ollama_data:
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
**Pull models:**
|
|
111
|
+
```bash
|
|
112
|
+
# Enter Ollama container
|
|
113
|
+
docker exec -it ollama ollama pull qwen2.5-coder:7b
|
|
114
|
+
|
|
115
|
+
# Or from host (if Ollama CLI installed)
|
|
116
|
+
ollama pull qwen2.5-coder:7b
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
### With GPU Support (NVIDIA)
|
|
120
|
+
|
|
121
|
+
```yaml
|
|
122
|
+
version: '3.8'
|
|
123
|
+
|
|
124
|
+
services:
|
|
125
|
+
lynkr:
|
|
126
|
+
build: .
|
|
127
|
+
container_name: lynkr
|
|
128
|
+
ports:
|
|
129
|
+
- "8081:8081"
|
|
130
|
+
environment:
|
|
131
|
+
- MODEL_PROVIDER=ollama
|
|
132
|
+
- OLLAMA_API_BASE=http://ollama:11434
|
|
133
|
+
volumes:
|
|
134
|
+
- ./data:/app/data
|
|
135
|
+
- ./workspace:/app/workspace
|
|
136
|
+
depends_on:
|
|
137
|
+
- ollama
|
|
138
|
+
restart: unless-stopped
|
|
139
|
+
|
|
140
|
+
ollama:
|
|
141
|
+
image: ollama/ollama:latest
|
|
142
|
+
container_name: ollama
|
|
143
|
+
ports:
|
|
144
|
+
- "11434:11434"
|
|
145
|
+
volumes:
|
|
146
|
+
- ollama_data:/root/.ollama
|
|
147
|
+
deploy:
|
|
148
|
+
resources:
|
|
149
|
+
reservations:
|
|
150
|
+
devices:
|
|
151
|
+
- driver: nvidia
|
|
152
|
+
count: all
|
|
153
|
+
capabilities: [gpu]
|
|
154
|
+
restart: unless-stopped
|
|
155
|
+
|
|
156
|
+
volumes:
|
|
157
|
+
ollama_data:
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
**Prerequisites:**
|
|
161
|
+
1. Install NVIDIA drivers
|
|
162
|
+
2. Install NVIDIA Container Toolkit:
|
|
163
|
+
```bash
|
|
164
|
+
# Ubuntu/Debian
|
|
165
|
+
distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
|
|
166
|
+
curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add -
|
|
167
|
+
curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | \
|
|
168
|
+
sudo tee /etc/apt/sources.list.d/nvidia-docker.list
|
|
169
|
+
|
|
170
|
+
sudo apt-get update
|
|
171
|
+
sudo apt-get install -y nvidia-container-toolkit
|
|
172
|
+
sudo systemctl restart docker
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
**Verify GPU access:**
|
|
176
|
+
```bash
|
|
177
|
+
docker exec -it ollama nvidia-smi
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
### With Embeddings (for Cursor @Codebase)
|
|
181
|
+
|
|
182
|
+
```yaml
|
|
183
|
+
version: '3.8'
|
|
184
|
+
|
|
185
|
+
services:
|
|
186
|
+
lynkr:
|
|
187
|
+
build: .
|
|
188
|
+
container_name: lynkr
|
|
189
|
+
ports:
|
|
190
|
+
- "8081:8081"
|
|
191
|
+
environment:
|
|
192
|
+
- MODEL_PROVIDER=databricks
|
|
193
|
+
- DATABRICKS_API_BASE=${DATABRICKS_API_BASE}
|
|
194
|
+
- DATABRICKS_API_KEY=${DATABRICKS_API_KEY}
|
|
195
|
+
|
|
196
|
+
# Embeddings via Ollama
|
|
197
|
+
- EMBEDDINGS_PROVIDER=ollama
|
|
198
|
+
- OLLAMA_API_BASE=http://ollama:11434
|
|
199
|
+
- OLLAMA_EMBEDDINGS_MODEL=nomic-embed-text
|
|
200
|
+
|
|
201
|
+
# Index workspace for @Codebase
|
|
202
|
+
- WORKSPACE_ROOT=/app/workspace
|
|
203
|
+
- WORKSPACE_INDEX_ENABLED=true
|
|
204
|
+
volumes:
|
|
205
|
+
- ./data:/app/data
|
|
206
|
+
- ./workspace:/app/workspace
|
|
207
|
+
depends_on:
|
|
208
|
+
- ollama
|
|
209
|
+
restart: unless-stopped
|
|
210
|
+
|
|
211
|
+
ollama:
|
|
212
|
+
image: ollama/ollama:latest
|
|
213
|
+
container_name: ollama
|
|
214
|
+
ports:
|
|
215
|
+
- "11434:11434"
|
|
216
|
+
volumes:
|
|
217
|
+
- ollama_data:/root/.ollama
|
|
218
|
+
restart: unless-stopped
|
|
219
|
+
|
|
220
|
+
volumes:
|
|
221
|
+
ollama_data:
|
|
222
|
+
```
|
|
223
|
+
|
|
224
|
+
**Pull embedding model:**
|
|
225
|
+
```bash
|
|
226
|
+
docker exec -it ollama ollama pull nomic-embed-text
|
|
227
|
+
```
|
|
228
|
+
|
|
229
|
+
---
|
|
230
|
+
|
|
231
|
+
## Standalone Docker
|
|
232
|
+
|
|
233
|
+
### Build Image
|
|
234
|
+
|
|
235
|
+
```bash
|
|
236
|
+
# Build from Dockerfile
|
|
237
|
+
docker build -t lynkr:latest .
|
|
238
|
+
|
|
239
|
+
# Or pull from registry (when available)
|
|
240
|
+
docker pull ghcr.io/vishalveerareddy123/lynkr:latest
|
|
241
|
+
```
|
|
242
|
+
|
|
243
|
+
### Run Container
|
|
244
|
+
|
|
245
|
+
**With Databricks:**
|
|
246
|
+
```bash
|
|
247
|
+
docker run -d \
|
|
248
|
+
--name lynkr \
|
|
249
|
+
-p 8081:8081 \
|
|
250
|
+
-e MODEL_PROVIDER=databricks \
|
|
251
|
+
-e DATABRICKS_API_BASE=https://your-workspace.databricks.com \
|
|
252
|
+
-e DATABRICKS_API_KEY=your-key \
|
|
253
|
+
-v $(pwd)/data:/app/data \
|
|
254
|
+
-v $(pwd)/workspace:/app/workspace \
|
|
255
|
+
--restart unless-stopped \
|
|
256
|
+
lynkr:latest
|
|
257
|
+
```
|
|
258
|
+
|
|
259
|
+
**With Ollama:**
|
|
260
|
+
```bash
|
|
261
|
+
# Start Ollama first
|
|
262
|
+
docker run -d \
|
|
263
|
+
--name ollama \
|
|
264
|
+
-p 11434:11434 \
|
|
265
|
+
-v ollama_data:/root/.ollama \
|
|
266
|
+
ollama/ollama:latest
|
|
267
|
+
|
|
268
|
+
# Start Lynkr
|
|
269
|
+
docker run -d \
|
|
270
|
+
--name lynkr \
|
|
271
|
+
-p 8081:8081 \
|
|
272
|
+
-e MODEL_PROVIDER=ollama \
|
|
273
|
+
-e OLLAMA_API_BASE=http://ollama:11434 \
|
|
274
|
+
-v $(pwd)/data:/app/data \
|
|
275
|
+
-v $(pwd)/workspace:/app/workspace \
|
|
276
|
+
--link ollama \
|
|
277
|
+
--restart unless-stopped \
|
|
278
|
+
lynkr:latest
|
|
279
|
+
```
|
|
280
|
+
|
|
281
|
+
**With AWS Bedrock:**
|
|
282
|
+
```bash
|
|
283
|
+
docker run -d \
|
|
284
|
+
--name lynkr \
|
|
285
|
+
-p 8081:8081 \
|
|
286
|
+
-e MODEL_PROVIDER=bedrock \
|
|
287
|
+
-e AWS_ACCESS_KEY_ID=AKIA... \
|
|
288
|
+
-e AWS_SECRET_ACCESS_KEY=... \
|
|
289
|
+
-e AWS_BEDROCK_REGION=us-east-1 \
|
|
290
|
+
-v $(pwd)/data:/app/data \
|
|
291
|
+
-v $(pwd)/workspace:/app/workspace \
|
|
292
|
+
--restart unless-stopped \
|
|
293
|
+
lynkr:latest
|
|
294
|
+
```
|
|
295
|
+
|
|
296
|
+
---
|
|
297
|
+
|
|
298
|
+
## Dockerfile
|
|
299
|
+
|
|
300
|
+
### Standard Dockerfile
|
|
301
|
+
|
|
302
|
+
```dockerfile
|
|
303
|
+
# Use Node.js 18 Alpine for smaller image
|
|
304
|
+
FROM node:18-alpine
|
|
305
|
+
|
|
306
|
+
# Set working directory
|
|
307
|
+
WORKDIR /app
|
|
308
|
+
|
|
309
|
+
# Install dependencies
|
|
310
|
+
COPY package*.json ./
|
|
311
|
+
RUN npm ci --production
|
|
312
|
+
|
|
313
|
+
# Copy application code
|
|
314
|
+
COPY . .
|
|
315
|
+
|
|
316
|
+
# Create data directories
|
|
317
|
+
RUN mkdir -p /app/data /app/workspace
|
|
318
|
+
|
|
319
|
+
# Expose port
|
|
320
|
+
EXPOSE 8081
|
|
321
|
+
|
|
322
|
+
# Health check
|
|
323
|
+
HEALTHCHECK --interval=30s --timeout=10s --start-period=40s --retries=3 \
|
|
324
|
+
CMD node -e "require('http').get('http://localhost:8081/health/live', (r) => { process.exit(r.statusCode === 200 ? 0 : 1); })"
|
|
325
|
+
|
|
326
|
+
# Run as non-root user
|
|
327
|
+
USER node
|
|
328
|
+
|
|
329
|
+
# Start application
|
|
330
|
+
CMD ["node", "index.js"]
|
|
331
|
+
```
|
|
332
|
+
|
|
333
|
+
### Multi-stage Dockerfile (Smaller Image)
|
|
334
|
+
|
|
335
|
+
```dockerfile
|
|
336
|
+
# Build stage
|
|
337
|
+
FROM node:18-alpine AS builder
|
|
338
|
+
|
|
339
|
+
WORKDIR /app
|
|
340
|
+
COPY package*.json ./
|
|
341
|
+
RUN npm ci --production
|
|
342
|
+
|
|
343
|
+
# Runtime stage
|
|
344
|
+
FROM node:18-alpine
|
|
345
|
+
|
|
346
|
+
WORKDIR /app
|
|
347
|
+
|
|
348
|
+
# Copy dependencies
|
|
349
|
+
COPY --from=builder /app/node_modules ./node_modules
|
|
350
|
+
|
|
351
|
+
# Copy application
|
|
352
|
+
COPY . .
|
|
353
|
+
|
|
354
|
+
# Create directories
|
|
355
|
+
RUN mkdir -p /app/data /app/workspace && \
|
|
356
|
+
chown -R node:node /app
|
|
357
|
+
|
|
358
|
+
# Expose port
|
|
359
|
+
EXPOSE 8081
|
|
360
|
+
|
|
361
|
+
# Health check
|
|
362
|
+
HEALTHCHECK --interval=30s --timeout=10s --start-period=40s --retries=3 \
|
|
363
|
+
CMD node -e "require('http').get('http://localhost:8081/health/live', (r) => { process.exit(r.statusCode === 200 ? 0 : 1); })"
|
|
364
|
+
|
|
365
|
+
# Run as non-root user
|
|
366
|
+
USER node
|
|
367
|
+
|
|
368
|
+
CMD ["node", "index.js"]
|
|
369
|
+
```
|
|
370
|
+
|
|
371
|
+
---
|
|
372
|
+
|
|
373
|
+
## Volume Management
|
|
374
|
+
|
|
375
|
+
### Persistent Data
|
|
376
|
+
|
|
377
|
+
**Required volumes:**
|
|
378
|
+
```yaml
|
|
379
|
+
volumes:
|
|
380
|
+
- ./data:/app/data # SQLite databases (memories, sessions)
|
|
381
|
+
- ./workspace:/app/workspace # File operations workspace
|
|
382
|
+
```
|
|
383
|
+
|
|
384
|
+
**Data directory structure:**
|
|
385
|
+
```
|
|
386
|
+
data/
|
|
387
|
+
├── memories.db # Long-term memory database
|
|
388
|
+
├── sessions.db # Conversation history
|
|
389
|
+
└── workspace-index.db # Workspace metadata
|
|
390
|
+
```
|
|
391
|
+
|
|
392
|
+
### Backup Data
|
|
393
|
+
|
|
394
|
+
**Backup script:**
|
|
395
|
+
```bash
|
|
396
|
+
#!/bin/bash
|
|
397
|
+
# backup-lynkr.sh
|
|
398
|
+
|
|
399
|
+
BACKUP_DIR="./backups/$(date +%Y%m%d_%H%M%S)"
|
|
400
|
+
mkdir -p $BACKUP_DIR
|
|
401
|
+
|
|
402
|
+
# Stop container
|
|
403
|
+
docker-compose stop lynkr
|
|
404
|
+
|
|
405
|
+
# Backup data
|
|
406
|
+
cp -r ./data $BACKUP_DIR/
|
|
407
|
+
cp -r ./workspace $BACKUP_DIR/
|
|
408
|
+
|
|
409
|
+
# Restart container
|
|
410
|
+
docker-compose start lynkr
|
|
411
|
+
|
|
412
|
+
echo "Backup saved to: $BACKUP_DIR"
|
|
413
|
+
```
|
|
414
|
+
|
|
415
|
+
### Restore Data
|
|
416
|
+
|
|
417
|
+
```bash
|
|
418
|
+
#!/bin/bash
|
|
419
|
+
# restore-lynkr.sh
|
|
420
|
+
|
|
421
|
+
BACKUP_DIR=$1
|
|
422
|
+
|
|
423
|
+
if [ -z "$BACKUP_DIR" ]; then
|
|
424
|
+
echo "Usage: ./restore-lynkr.sh <backup_directory>"
|
|
425
|
+
exit 1
|
|
426
|
+
fi
|
|
427
|
+
|
|
428
|
+
# Stop container
|
|
429
|
+
docker-compose stop lynkr
|
|
430
|
+
|
|
431
|
+
# Restore data
|
|
432
|
+
rm -rf ./data ./workspace
|
|
433
|
+
cp -r $BACKUP_DIR/data ./
|
|
434
|
+
cp -r $BACKUP_DIR/workspace ./
|
|
435
|
+
|
|
436
|
+
# Restart container
|
|
437
|
+
docker-compose start lynkr
|
|
438
|
+
|
|
439
|
+
echo "Restored from: $BACKUP_DIR"
|
|
440
|
+
```
|
|
441
|
+
|
|
442
|
+
---
|
|
443
|
+
|
|
444
|
+
## Environment Variables
|
|
445
|
+
|
|
446
|
+
### Core Configuration
|
|
447
|
+
|
|
448
|
+
```yaml
|
|
449
|
+
environment:
|
|
450
|
+
# Provider
|
|
451
|
+
- MODEL_PROVIDER=databricks
|
|
452
|
+
- DATABRICKS_API_BASE=https://your-workspace.databricks.com
|
|
453
|
+
- DATABRICKS_API_KEY=${DATABRICKS_API_KEY}
|
|
454
|
+
|
|
455
|
+
# Hybrid routing
|
|
456
|
+
- PREFER_OLLAMA=true
|
|
457
|
+
- FALLBACK_ENABLED=true
|
|
458
|
+
- FALLBACK_PROVIDER=databricks
|
|
459
|
+
|
|
460
|
+
# Port
|
|
461
|
+
- PORT=8081
|
|
462
|
+
|
|
463
|
+
# Logging
|
|
464
|
+
- LOG_LEVEL=info
|
|
465
|
+
|
|
466
|
+
# Memory
|
|
467
|
+
- MEMORY_ENABLED=true
|
|
468
|
+
- MEMORY_RETRIEVAL_LIMIT=5
|
|
469
|
+
|
|
470
|
+
# Caching
|
|
471
|
+
- PROMPT_CACHE_ENABLED=true
|
|
472
|
+
- PROMPT_CACHE_TTL_MS=300000
|
|
473
|
+
```
|
|
474
|
+
|
|
475
|
+
### Security Configuration
|
|
476
|
+
|
|
477
|
+
```yaml
|
|
478
|
+
environment:
|
|
479
|
+
# Git policies
|
|
480
|
+
- POLICY_GIT_ALLOW_PUSH=false
|
|
481
|
+
- POLICY_GIT_REQUIRE_TESTS=true
|
|
482
|
+
- POLICY_GIT_TEST_COMMAND=npm test
|
|
483
|
+
|
|
484
|
+
# Web fetch policies
|
|
485
|
+
- WEB_SEARCH_ALLOWED_HOSTS=github.com,stackoverflow.com
|
|
486
|
+
|
|
487
|
+
# Workspace policies
|
|
488
|
+
- WORKSPACE_ROOT=/app/workspace
|
|
489
|
+
- POLICY_MAX_STEPS=8
|
|
490
|
+
|
|
491
|
+
# MCP sandbox
|
|
492
|
+
- MCP_SANDBOX_ENABLED=true
|
|
493
|
+
- MCP_SANDBOX_IMAGE=ubuntu:22.04
|
|
494
|
+
```
|
|
495
|
+
|
|
496
|
+
---
|
|
497
|
+
|
|
498
|
+
## Docker Commands
|
|
499
|
+
|
|
500
|
+
### Container Management
|
|
501
|
+
|
|
502
|
+
```bash
|
|
503
|
+
# Start services
|
|
504
|
+
docker-compose up -d
|
|
505
|
+
|
|
506
|
+
# Stop services
|
|
507
|
+
docker-compose stop
|
|
508
|
+
|
|
509
|
+
# Restart services
|
|
510
|
+
docker-compose restart
|
|
511
|
+
|
|
512
|
+
# View logs
|
|
513
|
+
docker-compose logs -f lynkr
|
|
514
|
+
|
|
515
|
+
# View logs (last 100 lines)
|
|
516
|
+
docker-compose logs --tail=100 lynkr
|
|
517
|
+
|
|
518
|
+
# Execute command in container
|
|
519
|
+
docker-compose exec lynkr sh
|
|
520
|
+
|
|
521
|
+
# Remove containers
|
|
522
|
+
docker-compose down
|
|
523
|
+
|
|
524
|
+
# Remove containers and volumes
|
|
525
|
+
docker-compose down -v
|
|
526
|
+
```
|
|
527
|
+
|
|
528
|
+
### Debugging
|
|
529
|
+
|
|
530
|
+
```bash
|
|
531
|
+
# Check container status
|
|
532
|
+
docker-compose ps
|
|
533
|
+
|
|
534
|
+
# Inspect container
|
|
535
|
+
docker inspect lynkr
|
|
536
|
+
|
|
537
|
+
# Check resource usage
|
|
538
|
+
docker stats lynkr
|
|
539
|
+
|
|
540
|
+
# View container logs
|
|
541
|
+
docker logs -f lynkr
|
|
542
|
+
|
|
543
|
+
# Enter container shell
|
|
544
|
+
docker exec -it lynkr sh
|
|
545
|
+
|
|
546
|
+
# Check environment variables
|
|
547
|
+
docker exec lynkr env
|
|
548
|
+
|
|
549
|
+
# Test health endpoint
|
|
550
|
+
docker exec lynkr curl http://localhost:8081/health/live
|
|
551
|
+
```
|
|
552
|
+
|
|
553
|
+
---
|
|
554
|
+
|
|
555
|
+
## Kubernetes Deployment
|
|
556
|
+
|
|
557
|
+
### Basic Deployment
|
|
558
|
+
|
|
559
|
+
**deployment.yaml:**
|
|
560
|
+
```yaml
|
|
561
|
+
apiVersion: apps/v1
|
|
562
|
+
kind: Deployment
|
|
563
|
+
metadata:
|
|
564
|
+
name: lynkr
|
|
565
|
+
labels:
|
|
566
|
+
app: lynkr
|
|
567
|
+
spec:
|
|
568
|
+
replicas: 3
|
|
569
|
+
selector:
|
|
570
|
+
matchLabels:
|
|
571
|
+
app: lynkr
|
|
572
|
+
template:
|
|
573
|
+
metadata:
|
|
574
|
+
labels:
|
|
575
|
+
app: lynkr
|
|
576
|
+
spec:
|
|
577
|
+
containers:
|
|
578
|
+
- name: lynkr
|
|
579
|
+
image: ghcr.io/vishalveerareddy123/lynkr:latest
|
|
580
|
+
ports:
|
|
581
|
+
- containerPort: 8081
|
|
582
|
+
name: http
|
|
583
|
+
env:
|
|
584
|
+
- name: MODEL_PROVIDER
|
|
585
|
+
value: "databricks"
|
|
586
|
+
- name: DATABRICKS_API_BASE
|
|
587
|
+
valueFrom:
|
|
588
|
+
secretKeyRef:
|
|
589
|
+
name: lynkr-secrets
|
|
590
|
+
key: databricks-api-base
|
|
591
|
+
- name: DATABRICKS_API_KEY
|
|
592
|
+
valueFrom:
|
|
593
|
+
secretKeyRef:
|
|
594
|
+
name: lynkr-secrets
|
|
595
|
+
key: databricks-api-key
|
|
596
|
+
resources:
|
|
597
|
+
requests:
|
|
598
|
+
cpu: "500m"
|
|
599
|
+
memory: "512Mi"
|
|
600
|
+
limits:
|
|
601
|
+
cpu: "2"
|
|
602
|
+
memory: "2Gi"
|
|
603
|
+
volumeMounts:
|
|
604
|
+
- name: data
|
|
605
|
+
mountPath: /app/data
|
|
606
|
+
- name: workspace
|
|
607
|
+
mountPath: /app/workspace
|
|
608
|
+
livenessProbe:
|
|
609
|
+
httpGet:
|
|
610
|
+
path: /health/live
|
|
611
|
+
port: 8081
|
|
612
|
+
initialDelaySeconds: 10
|
|
613
|
+
periodSeconds: 10
|
|
614
|
+
timeoutSeconds: 5
|
|
615
|
+
failureThreshold: 3
|
|
616
|
+
readinessProbe:
|
|
617
|
+
httpGet:
|
|
618
|
+
path: /health/ready
|
|
619
|
+
port: 8081
|
|
620
|
+
initialDelaySeconds: 5
|
|
621
|
+
periodSeconds: 5
|
|
622
|
+
timeoutSeconds: 3
|
|
623
|
+
failureThreshold: 3
|
|
624
|
+
volumes:
|
|
625
|
+
- name: data
|
|
626
|
+
persistentVolumeClaim:
|
|
627
|
+
claimName: lynkr-data-pvc
|
|
628
|
+
- name: workspace
|
|
629
|
+
persistentVolumeClaim:
|
|
630
|
+
claimName: lynkr-workspace-pvc
|
|
631
|
+
---
|
|
632
|
+
apiVersion: v1
|
|
633
|
+
kind: Service
|
|
634
|
+
metadata:
|
|
635
|
+
name: lynkr
|
|
636
|
+
labels:
|
|
637
|
+
app: lynkr
|
|
638
|
+
spec:
|
|
639
|
+
selector:
|
|
640
|
+
app: lynkr
|
|
641
|
+
ports:
|
|
642
|
+
- port: 80
|
|
643
|
+
targetPort: 8081
|
|
644
|
+
protocol: TCP
|
|
645
|
+
name: http
|
|
646
|
+
type: LoadBalancer
|
|
647
|
+
```
|
|
648
|
+
|
|
649
|
+
**secrets.yaml:**
|
|
650
|
+
```yaml
|
|
651
|
+
apiVersion: v1
|
|
652
|
+
kind: Secret
|
|
653
|
+
metadata:
|
|
654
|
+
name: lynkr-secrets
|
|
655
|
+
type: Opaque
|
|
656
|
+
stringData:
|
|
657
|
+
databricks-api-base: "https://your-workspace.databricks.com"
|
|
658
|
+
databricks-api-key: "your-api-key"
|
|
659
|
+
```
|
|
660
|
+
|
|
661
|
+
**persistent-volumes.yaml:**
|
|
662
|
+
```yaml
|
|
663
|
+
apiVersion: v1
|
|
664
|
+
kind: PersistentVolumeClaim
|
|
665
|
+
metadata:
|
|
666
|
+
name: lynkr-data-pvc
|
|
667
|
+
spec:
|
|
668
|
+
accessModes:
|
|
669
|
+
- ReadWriteOnce
|
|
670
|
+
resources:
|
|
671
|
+
requests:
|
|
672
|
+
storage: 10Gi
|
|
673
|
+
---
|
|
674
|
+
apiVersion: v1
|
|
675
|
+
kind: PersistentVolumeClaim
|
|
676
|
+
metadata:
|
|
677
|
+
name: lynkr-workspace-pvc
|
|
678
|
+
spec:
|
|
679
|
+
accessModes:
|
|
680
|
+
- ReadWriteOnce
|
|
681
|
+
resources:
|
|
682
|
+
requests:
|
|
683
|
+
storage: 50Gi
|
|
684
|
+
```
|
|
685
|
+
|
|
686
|
+
**Deploy:**
|
|
687
|
+
```bash
|
|
688
|
+
# Create secrets
|
|
689
|
+
kubectl apply -f secrets.yaml
|
|
690
|
+
|
|
691
|
+
# Create PVCs
|
|
692
|
+
kubectl apply -f persistent-volumes.yaml
|
|
693
|
+
|
|
694
|
+
# Deploy application
|
|
695
|
+
kubectl apply -f deployment.yaml
|
|
696
|
+
|
|
697
|
+
# Check status
|
|
698
|
+
kubectl get pods -l app=lynkr
|
|
699
|
+
kubectl get svc lynkr
|
|
700
|
+
|
|
701
|
+
# View logs
|
|
702
|
+
kubectl logs -f deployment/lynkr
|
|
703
|
+
|
|
704
|
+
# Scale replicas
|
|
705
|
+
kubectl scale deployment/lynkr --replicas=5
|
|
706
|
+
```
|
|
707
|
+
|
|
708
|
+
---
|
|
709
|
+
|
|
710
|
+
## Production Best Practices
|
|
711
|
+
|
|
712
|
+
### Security
|
|
713
|
+
|
|
714
|
+
1. **Run as non-root user:**
|
|
715
|
+
```dockerfile
|
|
716
|
+
USER node
|
|
717
|
+
```
|
|
718
|
+
|
|
719
|
+
2. **Read-only root filesystem:**
|
|
720
|
+
```yaml
|
|
721
|
+
security_opt:
|
|
722
|
+
- no-new-privileges:true
|
|
723
|
+
read_only: true
|
|
724
|
+
tmpfs:
|
|
725
|
+
- /tmp
|
|
726
|
+
```
|
|
727
|
+
|
|
728
|
+
3. **Resource limits:**
|
|
729
|
+
```yaml
|
|
730
|
+
deploy:
|
|
731
|
+
resources:
|
|
732
|
+
limits:
|
|
733
|
+
cpus: '2'
|
|
734
|
+
memory: 2G
|
|
735
|
+
reservations:
|
|
736
|
+
cpus: '0.5'
|
|
737
|
+
memory: 512M
|
|
738
|
+
```
|
|
739
|
+
|
|
740
|
+
### Monitoring
|
|
741
|
+
|
|
742
|
+
1. **Prometheus metrics:**
|
|
743
|
+
```yaml
|
|
744
|
+
# Expose metrics port
|
|
745
|
+
ports:
|
|
746
|
+
- "8081:8081" # Main port (includes /metrics)
|
|
747
|
+
```
|
|
748
|
+
|
|
749
|
+
2. **Health checks:**
|
|
750
|
+
```yaml
|
|
751
|
+
healthcheck:
|
|
752
|
+
test: ["CMD", "curl", "-f", "http://localhost:8081/health/live"]
|
|
753
|
+
interval: 30s
|
|
754
|
+
timeout: 10s
|
|
755
|
+
retries: 3
|
|
756
|
+
start_period: 40s
|
|
757
|
+
```
|
|
758
|
+
|
|
759
|
+
3. **Logging:**
|
|
760
|
+
```yaml
|
|
761
|
+
logging:
|
|
762
|
+
driver: "json-file"
|
|
763
|
+
options:
|
|
764
|
+
max-size: "10m"
|
|
765
|
+
max-file: "3"
|
|
766
|
+
```
|
|
767
|
+
|
|
768
|
+
### High Availability
|
|
769
|
+
|
|
770
|
+
1. **Multiple replicas:**
|
|
771
|
+
```yaml
|
|
772
|
+
spec:
|
|
773
|
+
replicas: 3
|
|
774
|
+
```
|
|
775
|
+
|
|
776
|
+
2. **Load balancer:**
|
|
777
|
+
```yaml
|
|
778
|
+
services:
|
|
779
|
+
nginx:
|
|
780
|
+
image: nginx:alpine
|
|
781
|
+
ports:
|
|
782
|
+
- "80:80"
|
|
783
|
+
volumes:
|
|
784
|
+
- ./nginx.conf:/etc/nginx/nginx.conf:ro
|
|
785
|
+
depends_on:
|
|
786
|
+
- lynkr
|
|
787
|
+
```
|
|
788
|
+
|
|
789
|
+
3. **Shared database:**
|
|
790
|
+
```yaml
|
|
791
|
+
volumes:
|
|
792
|
+
- lynkr_data:/app/data # Shared volume
|
|
793
|
+
|
|
794
|
+
volumes:
|
|
795
|
+
lynkr_data:
|
|
796
|
+
driver: local
|
|
797
|
+
```
|
|
798
|
+
|
|
799
|
+
---
|
|
800
|
+
|
|
801
|
+
## Troubleshooting
|
|
802
|
+
|
|
803
|
+
### Container Won't Start
|
|
804
|
+
|
|
805
|
+
```bash
|
|
806
|
+
# Check logs
|
|
807
|
+
docker-compose logs lynkr
|
|
808
|
+
|
|
809
|
+
# Common issues:
|
|
810
|
+
# 1. Missing environment variables
|
|
811
|
+
# 2. Invalid API credentials
|
|
812
|
+
# 3. Port already in use
|
|
813
|
+
```
|
|
814
|
+
|
|
815
|
+
### Connection Refused
|
|
816
|
+
|
|
817
|
+
```bash
|
|
818
|
+
# Check container is running
|
|
819
|
+
docker-compose ps
|
|
820
|
+
|
|
821
|
+
# Check port binding
|
|
822
|
+
docker port lynkr
|
|
823
|
+
|
|
824
|
+
# Test from inside container
|
|
825
|
+
docker exec lynkr curl http://localhost:8081/health/live
|
|
826
|
+
```
|
|
827
|
+
|
|
828
|
+
### Out of Memory
|
|
829
|
+
|
|
830
|
+
```bash
|
|
831
|
+
# Increase memory limit
|
|
832
|
+
docker-compose.yml:
|
|
833
|
+
deploy:
|
|
834
|
+
resources:
|
|
835
|
+
limits:
|
|
836
|
+
memory: 4G # Increase from 2G
|
|
837
|
+
```
|
|
838
|
+
|
|
839
|
+
### Slow Performance
|
|
840
|
+
|
|
841
|
+
```bash
|
|
842
|
+
# Check resource usage
|
|
843
|
+
docker stats lynkr
|
|
844
|
+
|
|
845
|
+
# Increase CPU limit
|
|
846
|
+
docker-compose.yml:
|
|
847
|
+
deploy:
|
|
848
|
+
resources:
|
|
849
|
+
limits:
|
|
850
|
+
cpus: '4' # Increase from 2
|
|
851
|
+
```
|
|
852
|
+
|
|
853
|
+
---
|
|
854
|
+
|
|
855
|
+
## Next Steps
|
|
856
|
+
|
|
857
|
+
- **[Production Guide](production.md)** - Production deployment best practices
|
|
858
|
+
- **[Monitoring Guide](production.md#monitoring)** - Prometheus + Grafana setup
|
|
859
|
+
- **[API Reference](api.md)** - API endpoints
|
|
860
|
+
- **[Troubleshooting](troubleshooting.md)** - Common issues
|
|
861
|
+
|
|
862
|
+
---
|
|
863
|
+
|
|
864
|
+
## Getting Help
|
|
865
|
+
|
|
866
|
+
- **[GitHub Discussions](https://github.com/vishalveerareddy123/Lynkr/discussions)** - Ask questions
|
|
867
|
+
- **[GitHub Issues](https://github.com/vishalveerareddy123/Lynkr/issues)** - Report issues
|