@cybermem/mcp 0.1.0 → 0.5.1
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 +2 -46
- package/dist/commands/deploy.js +230 -0
- package/dist/commands/init.js +65 -0
- package/dist/index.js +198 -90
- package/dist/templates/ansible/inventory/hosts.ini +3 -0
- package/dist/templates/ansible/playbooks/deploy-cybermem.yml +71 -0
- package/dist/templates/ansible/playbooks/stop-cybermem.yml +17 -0
- package/dist/templates/charts/cybermem/Chart.yaml +6 -0
- package/dist/templates/charts/cybermem/templates/dashboard-deployment.yaml +29 -0
- package/dist/templates/charts/cybermem/templates/dashboard-service.yaml +20 -0
- package/dist/templates/charts/cybermem/templates/openmemory-deployment.yaml +40 -0
- package/dist/templates/charts/cybermem/templates/openmemory-pvc.yaml +10 -0
- package/dist/templates/charts/cybermem/templates/openmemory-service.yaml +13 -0
- package/dist/templates/charts/cybermem/values-vps.yaml +18 -0
- package/dist/templates/charts/cybermem/values.yaml +42 -0
- package/dist/templates/docker-compose.yml +219 -0
- package/dist/templates/envs/local.example +27 -0
- package/dist/templates/envs/rpi.example +27 -0
- package/dist/templates/envs/vps.example +25 -0
- package/dist/templates/monitoring/db_exporter/Dockerfile +19 -0
- package/dist/templates/monitoring/db_exporter/exporter.py +313 -0
- package/dist/templates/monitoring/db_exporter/requirements.txt +2 -0
- package/dist/templates/monitoring/grafana/dashboards/cybermem.json +1088 -0
- package/dist/templates/monitoring/grafana/provisioning/dashboards/default.yml +12 -0
- package/dist/templates/monitoring/grafana/provisioning/datasources/prometheus.yml +9 -0
- package/dist/templates/monitoring/log_exporter/Dockerfile +13 -0
- package/dist/templates/monitoring/log_exporter/exporter.py +274 -0
- package/dist/templates/monitoring/log_exporter/requirements.txt +1 -0
- package/dist/templates/monitoring/postgres_exporter/queries.yml +22 -0
- package/dist/templates/monitoring/prometheus/prometheus.yml +22 -0
- package/dist/templates/monitoring/traefik/traefik.yml +32 -0
- package/dist/templates/monitoring/vector/vector.toml/vector.yaml +77 -0
- package/dist/templates/monitoring/vector/vector.yaml +106 -0
- package/package.json +33 -10
- package/templates/ansible/inventory/hosts.ini +3 -0
- package/templates/ansible/playbooks/deploy-cybermem.yml +71 -0
- package/templates/ansible/playbooks/stop-cybermem.yml +17 -0
- package/templates/charts/cybermem/Chart.yaml +6 -0
- package/templates/charts/cybermem/templates/dashboard-deployment.yaml +29 -0
- package/templates/charts/cybermem/templates/dashboard-service.yaml +20 -0
- package/templates/charts/cybermem/templates/openmemory-deployment.yaml +40 -0
- package/templates/charts/cybermem/templates/openmemory-pvc.yaml +10 -0
- package/templates/charts/cybermem/templates/openmemory-service.yaml +13 -0
- package/templates/charts/cybermem/values-vps.yaml +18 -0
- package/templates/charts/cybermem/values.yaml +42 -0
- package/templates/docker-compose.yml +219 -0
- package/templates/envs/local.example +27 -0
- package/templates/envs/rpi.example +27 -0
- package/templates/envs/vps.example +25 -0
- package/templates/monitoring/db_exporter/Dockerfile +19 -0
- package/templates/monitoring/db_exporter/exporter.py +313 -0
- package/templates/monitoring/db_exporter/requirements.txt +2 -0
- package/templates/monitoring/grafana/dashboards/cybermem.json +1088 -0
- package/templates/monitoring/grafana/provisioning/dashboards/default.yml +12 -0
- package/templates/monitoring/grafana/provisioning/datasources/prometheus.yml +9 -0
- package/templates/monitoring/log_exporter/Dockerfile +13 -0
- package/templates/monitoring/log_exporter/exporter.py +274 -0
- package/templates/monitoring/log_exporter/requirements.txt +1 -0
- package/templates/monitoring/postgres_exporter/queries.yml +22 -0
- package/templates/monitoring/prometheus/prometheus.yml +22 -0
- package/templates/monitoring/traefik/traefik.yml +32 -0
- package/templates/monitoring/vector/vector.toml/vector.yaml +77 -0
- package/templates/monitoring/vector/vector.yaml +106 -0
- package/requirements.txt +0 -2
- package/server.py +0 -347
- package/src/index.ts +0 -114
- package/test_mcp.py +0 -111
- package/tsconfig.json +0 -14
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
---
|
|
2
|
+
- name: Deploy CyberMem to Raspberry Pi
|
|
3
|
+
hosts: rpi
|
|
4
|
+
become: yes
|
|
5
|
+
vars:
|
|
6
|
+
project_dir: /home/{{ ansible_user }}/cybermem
|
|
7
|
+
env_file: .env.rpi
|
|
8
|
+
|
|
9
|
+
tasks:
|
|
10
|
+
- name: Update apt cache
|
|
11
|
+
apt:
|
|
12
|
+
update_cache: yes
|
|
13
|
+
cache_valid_time: 3600
|
|
14
|
+
|
|
15
|
+
- name: Install dependencies
|
|
16
|
+
apt:
|
|
17
|
+
name:
|
|
18
|
+
- git
|
|
19
|
+
- rsync
|
|
20
|
+
state: present
|
|
21
|
+
|
|
22
|
+
- name: Ensure Docker service is running
|
|
23
|
+
service:
|
|
24
|
+
name: docker
|
|
25
|
+
state: started
|
|
26
|
+
enabled: yes
|
|
27
|
+
|
|
28
|
+
- name: Add user to docker group
|
|
29
|
+
user:
|
|
30
|
+
name: "{{ ansible_user }}"
|
|
31
|
+
groups: docker
|
|
32
|
+
append: yes
|
|
33
|
+
|
|
34
|
+
- name: Create project directory
|
|
35
|
+
file:
|
|
36
|
+
path: "{{ project_dir }}"
|
|
37
|
+
state: directory
|
|
38
|
+
owner: "{{ ansible_user }}"
|
|
39
|
+
group: "{{ ansible_user }}"
|
|
40
|
+
mode: "0755"
|
|
41
|
+
|
|
42
|
+
- name: Synchronize project files
|
|
43
|
+
synchronize:
|
|
44
|
+
src: "{{ playbook_dir }}/../../"
|
|
45
|
+
dest: "{{ project_dir }}"
|
|
46
|
+
rsync_opts:
|
|
47
|
+
- "--exclude=.git"
|
|
48
|
+
- "--exclude=node_modules"
|
|
49
|
+
- "--exclude=.next"
|
|
50
|
+
- "--exclude=dashboard/.next"
|
|
51
|
+
- "--exclude=*.log"
|
|
52
|
+
- "--exclude=tmp"
|
|
53
|
+
- "--exclude=__pycache__"
|
|
54
|
+
|
|
55
|
+
- name: Copy environment file
|
|
56
|
+
copy:
|
|
57
|
+
src: "../../{{ env_file }}"
|
|
58
|
+
dest: "{{ project_dir }}/.env"
|
|
59
|
+
owner: "{{ ansible_user }}"
|
|
60
|
+
group: "{{ ansible_user }}"
|
|
61
|
+
mode: "0600"
|
|
62
|
+
|
|
63
|
+
- name: Pull and start services
|
|
64
|
+
command: docker-compose -f docker-compose.prod.yml --profile ollama up -d --pull always
|
|
65
|
+
args:
|
|
66
|
+
chdir: "{{ project_dir }}"
|
|
67
|
+
register: compose_output
|
|
68
|
+
|
|
69
|
+
- name: Show deployment status
|
|
70
|
+
debug:
|
|
71
|
+
var: compose_output.stdout_lines
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
---
|
|
2
|
+
- name: Stop CyberMem on Raspberry Pi
|
|
3
|
+
hosts: rpi
|
|
4
|
+
become: yes
|
|
5
|
+
vars:
|
|
6
|
+
project_dir: /home/{{ ansible_user }}/cybermem
|
|
7
|
+
|
|
8
|
+
tasks:
|
|
9
|
+
- name: Stop services
|
|
10
|
+
command: docker-compose down
|
|
11
|
+
args:
|
|
12
|
+
chdir: "{{ project_dir }}"
|
|
13
|
+
register: down_output
|
|
14
|
+
|
|
15
|
+
- name: Show stop status
|
|
16
|
+
debug:
|
|
17
|
+
var: down_output.stdout_lines
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
apiVersion: apps/v1
|
|
2
|
+
kind: Deployment
|
|
3
|
+
metadata:
|
|
4
|
+
name: {{ .Chart.Name }}-dashboard
|
|
5
|
+
labels:
|
|
6
|
+
app.kubernetes.io/name: dashboard
|
|
7
|
+
spec:
|
|
8
|
+
replicas: {{ .Values.dashboard.replicaCount }}
|
|
9
|
+
selector:
|
|
10
|
+
matchLabels:
|
|
11
|
+
app.kubernetes.io/name: dashboard
|
|
12
|
+
template:
|
|
13
|
+
metadata:
|
|
14
|
+
labels:
|
|
15
|
+
app.kubernetes.io/name: dashboard
|
|
16
|
+
spec:
|
|
17
|
+
containers:
|
|
18
|
+
- name: dashboard
|
|
19
|
+
image: "{{ .Values.dashboard.image.repository }}:{{ .Values.dashboard.image.tag }}"
|
|
20
|
+
imagePullPolicy: {{ .Values.dashboard.image.pullPolicy }}
|
|
21
|
+
ports:
|
|
22
|
+
- name: http
|
|
23
|
+
containerPort: 3000
|
|
24
|
+
protocol: TCP
|
|
25
|
+
env:
|
|
26
|
+
- name: NEXT_PUBLIC_API_URL
|
|
27
|
+
value: "http://{{ .Chart.Name }}-openmemory:8080"
|
|
28
|
+
resources:
|
|
29
|
+
{{- toYaml .Values.dashboard.resources | nindent 12 }}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
apiVersion: v1
|
|
2
|
+
kind: Service
|
|
3
|
+
metadata:
|
|
4
|
+
name: {{ .Chart.Name }}-dashboard
|
|
5
|
+
spec:
|
|
6
|
+
type: {{ .Values.dashboard.service.type }}
|
|
7
|
+
ports:
|
|
8
|
+
- port: {{ .Values.dashboard.service.port }}
|
|
9
|
+
targetPort: http
|
|
10
|
+
protocol: TCP
|
|
11
|
+
name: http
|
|
12
|
+
{{- if eq .Values.dashboard.service.type "NodePort" }}
|
|
13
|
+
- port: {{ .Values.dashboard.service.port }}
|
|
14
|
+
targetPort: http
|
|
15
|
+
nodePort: {{ .Values.dashboard.service.nodePort }}
|
|
16
|
+
protocol: TCP
|
|
17
|
+
name: http-node
|
|
18
|
+
{{- end }}
|
|
19
|
+
selector:
|
|
20
|
+
app.kubernetes.io/name: dashboard
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
apiVersion: apps/v1
|
|
2
|
+
kind: Deployment
|
|
3
|
+
metadata:
|
|
4
|
+
name: {{ .Chart.Name }}-openmemory
|
|
5
|
+
labels:
|
|
6
|
+
app.kubernetes.io/name: openmemory
|
|
7
|
+
spec:
|
|
8
|
+
replicas: {{ .Values.openmemory.replicaCount }}
|
|
9
|
+
selector:
|
|
10
|
+
matchLabels:
|
|
11
|
+
app.kubernetes.io/name: openmemory
|
|
12
|
+
template:
|
|
13
|
+
metadata:
|
|
14
|
+
labels:
|
|
15
|
+
app.kubernetes.io/name: openmemory
|
|
16
|
+
spec:
|
|
17
|
+
containers:
|
|
18
|
+
- name: openmemory
|
|
19
|
+
image: "{{ .Values.openmemory.image.repository }}:{{ .Values.openmemory.image.tag }}"
|
|
20
|
+
imagePullPolicy: {{ .Values.openmemory.image.pullPolicy }}
|
|
21
|
+
ports:
|
|
22
|
+
- name: http
|
|
23
|
+
containerPort: 8080
|
|
24
|
+
protocol: TCP
|
|
25
|
+
env:
|
|
26
|
+
- name: OPENMEMORY_API_KEY
|
|
27
|
+
value: {{ .Values.env.OPENMEMORY_API_KEY | quote }}
|
|
28
|
+
- name: OPENAI_API_KEY
|
|
29
|
+
value: {{ .Values.env.OPENAI_API_KEY | quote }}
|
|
30
|
+
- name: DB_PATH
|
|
31
|
+
value: "/data/openmemory.sqlite"
|
|
32
|
+
volumeMounts:
|
|
33
|
+
- name: data
|
|
34
|
+
mountPath: /data
|
|
35
|
+
resources:
|
|
36
|
+
{{- toYaml .Values.openmemory.resources | nindent 12 }}
|
|
37
|
+
volumes:
|
|
38
|
+
- name: data
|
|
39
|
+
persistentVolumeClaim:
|
|
40
|
+
claimName: {{ .Chart.Name }}-openmemory-pvc
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
apiVersion: v1
|
|
2
|
+
kind: Service
|
|
3
|
+
metadata:
|
|
4
|
+
name: {{ .Chart.Name }}-openmemory
|
|
5
|
+
spec:
|
|
6
|
+
type: {{ .Values.openmemory.service.type }}
|
|
7
|
+
ports:
|
|
8
|
+
- port: {{ .Values.openmemory.service.port }}
|
|
9
|
+
targetPort: http
|
|
10
|
+
protocol: TCP
|
|
11
|
+
name: http
|
|
12
|
+
selector:
|
|
13
|
+
app.kubernetes.io/name: openmemory
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
# VPS Overrides
|
|
2
|
+
|
|
3
|
+
openmemory:
|
|
4
|
+
image:
|
|
5
|
+
repository: ghcr.io/mikhailkogan17/cybermem-openmemory
|
|
6
|
+
pullPolicy: Always
|
|
7
|
+
service:
|
|
8
|
+
type: ClusterIP
|
|
9
|
+
|
|
10
|
+
dashboard:
|
|
11
|
+
image:
|
|
12
|
+
repository: ghcr.io/mikhailkogan17/cybermem-dashboard
|
|
13
|
+
pullPolicy: Always
|
|
14
|
+
|
|
15
|
+
env:
|
|
16
|
+
OPENMEMORY_API_KEY: "prod-secret-key-CHANGE-ME"
|
|
17
|
+
# Add your OpenAI Key here for production
|
|
18
|
+
OPENAI_API_KEY: "sk-..."
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
# Default values for cybermem.
|
|
2
|
+
|
|
3
|
+
openmemory:
|
|
4
|
+
image:
|
|
5
|
+
repository: cybermem-openmemory
|
|
6
|
+
pullPolicy: IfNotPresent
|
|
7
|
+
tag: "latest"
|
|
8
|
+
replicaCount: 1
|
|
9
|
+
service:
|
|
10
|
+
type: ClusterIP
|
|
11
|
+
port: 8080
|
|
12
|
+
persistence:
|
|
13
|
+
enabled: true
|
|
14
|
+
size: 10Gi
|
|
15
|
+
accessMode: ReadWriteOnce
|
|
16
|
+
resources:
|
|
17
|
+
limits:
|
|
18
|
+
cpu: 1000m
|
|
19
|
+
memory: 1Gi
|
|
20
|
+
requests:
|
|
21
|
+
cpu: 100m
|
|
22
|
+
memory: 256Mi
|
|
23
|
+
env:
|
|
24
|
+
# Passed to the container
|
|
25
|
+
OM_PORT: "8080"
|
|
26
|
+
|
|
27
|
+
dashboard:
|
|
28
|
+
image:
|
|
29
|
+
repository: cybermem-dashboard
|
|
30
|
+
pullPolicy: IfNotPresent
|
|
31
|
+
tag: "latest"
|
|
32
|
+
replicaCount: 1
|
|
33
|
+
service:
|
|
34
|
+
type: ClusterIP
|
|
35
|
+
port: 3000
|
|
36
|
+
nodePort: 30000 # For k3d/local access if needed
|
|
37
|
+
resources: {}
|
|
38
|
+
|
|
39
|
+
env:
|
|
40
|
+
# Shared secrets
|
|
41
|
+
OPENMEMORY_API_KEY: "dev-secret-key"
|
|
42
|
+
OPENAI_API_KEY: ""
|
|
@@ -0,0 +1,219 @@
|
|
|
1
|
+
# CyberMem - OpenMemory + DevOps monitoring stack
|
|
2
|
+
# For local development only
|
|
3
|
+
# Production deployment: use Helm chart (charts/cybermem/)
|
|
4
|
+
|
|
5
|
+
services:
|
|
6
|
+
traefik:
|
|
7
|
+
image: traefik:v3.0
|
|
8
|
+
container_name: cybermem-traefik
|
|
9
|
+
command:
|
|
10
|
+
- --api.dashboard=true
|
|
11
|
+
- --api.insecure=true
|
|
12
|
+
- --providers.docker=true
|
|
13
|
+
- --providers.docker.exposedbydefault=false
|
|
14
|
+
- --entrypoints.web.address=:8626
|
|
15
|
+
- --accesslog=true
|
|
16
|
+
- --accesslog.filepath=/var/log/traefik/access.log
|
|
17
|
+
- --accesslog.format=json
|
|
18
|
+
ports:
|
|
19
|
+
- "8626:8626"
|
|
20
|
+
volumes:
|
|
21
|
+
- /var/run/docker.sock:/var/run/docker.sock:ro
|
|
22
|
+
- ./monitoring/traefik/traefik.yml:/etc/traefik/traefik.yml:ro
|
|
23
|
+
- traefik-logs:/var/log/traefik
|
|
24
|
+
labels:
|
|
25
|
+
- traefik.enable=true
|
|
26
|
+
restart: unless-stopped
|
|
27
|
+
|
|
28
|
+
openmemory:
|
|
29
|
+
image: ghcr.io/mikhailkogan17/cybermem-openmemory:latest
|
|
30
|
+
container_name: cybermem-openmemory
|
|
31
|
+
ports: [] # Access via Traefik on 8626
|
|
32
|
+
volumes:
|
|
33
|
+
- openmemory-data:/data
|
|
34
|
+
- ${CYBERMEM_ENV_PATH}:/.env
|
|
35
|
+
environment:
|
|
36
|
+
# Core settings
|
|
37
|
+
OM_PORT: "8080"
|
|
38
|
+
OM_TIER: "deep"
|
|
39
|
+
# API Key is loaded from /.env file
|
|
40
|
+
|
|
41
|
+
# Embeddings (local dev uses Ollama)
|
|
42
|
+
OM_EMBEDDINGS: ${EMBEDDINGS_PROVIDER:-ollama}
|
|
43
|
+
OLLAMA_URL: ${OLLAMA_URL:-http://ollama:11434}
|
|
44
|
+
OPENAI_API_KEY: ${OPENAI_API_KEY:-}
|
|
45
|
+
|
|
46
|
+
# Database (local dev uses SQLite)
|
|
47
|
+
OM_METADATA_BACKEND: ${DB_BACKEND:-sqlite}
|
|
48
|
+
OM_DB_PATH: ${DB_PATH:-/data/openmemory.sqlite}
|
|
49
|
+
OM_VECTOR_BACKEND: ${VECTOR_BACKEND:-sqlite}
|
|
50
|
+
|
|
51
|
+
# PostgreSQL (for production/testing)
|
|
52
|
+
OM_PG_HOST: ${PG_HOST:-postgres}
|
|
53
|
+
OM_PG_PORT: ${PG_PORT:-5432}
|
|
54
|
+
OM_PG_DB: ${PG_DB:-openmemory}
|
|
55
|
+
OM_PG_USER: ${PG_USER:-openmemory}
|
|
56
|
+
OM_PG_PASSWORD: ${PG_PASSWORD:-}
|
|
57
|
+
|
|
58
|
+
# Performance
|
|
59
|
+
OM_RATE_LIMIT_ENABLED: "true"
|
|
60
|
+
OM_RATE_LIMIT_MAX_REQUESTS: "1000"
|
|
61
|
+
|
|
62
|
+
labels:
|
|
63
|
+
- traefik.enable=true
|
|
64
|
+
- traefik.http.routers.openmemory.entrypoints=web
|
|
65
|
+
- traefik.http.routers.openmemory.rule=PathPrefix(`/memory`) || PathPrefix(`/health`) || PathPrefix(`/v1`) || PathPrefix(`/api`) || PathPrefix(`/all`) || PathPrefix(`/add`) || PathPrefix(`/mcp`) || PathPrefix(`/sse`)
|
|
66
|
+
- traefik.http.services.openmemory.loadbalancer.server.port=8080
|
|
67
|
+
healthcheck:
|
|
68
|
+
test:
|
|
69
|
+
[
|
|
70
|
+
"CMD",
|
|
71
|
+
"wget",
|
|
72
|
+
"--quiet",
|
|
73
|
+
"--tries=1",
|
|
74
|
+
"--spider",
|
|
75
|
+
"http://localhost:8080/health",
|
|
76
|
+
]
|
|
77
|
+
interval: 30s
|
|
78
|
+
timeout: 10s
|
|
79
|
+
retries: 3
|
|
80
|
+
start_period: 40s
|
|
81
|
+
restart: unless-stopped
|
|
82
|
+
depends_on:
|
|
83
|
+
- traefik
|
|
84
|
+
|
|
85
|
+
db-exporter:
|
|
86
|
+
image: ghcr.io/mikhailkogan17/cybermem-db_exporter:latest
|
|
87
|
+
container_name: cybermem-db-exporter
|
|
88
|
+
environment:
|
|
89
|
+
DB_PATH: /data/openmemory.sqlite
|
|
90
|
+
SCRAPE_INTERVAL: "15"
|
|
91
|
+
EXPORTER_PORT: "8000"
|
|
92
|
+
ports:
|
|
93
|
+
- "8000:8000"
|
|
94
|
+
volumes:
|
|
95
|
+
- openmemory-data:/data:ro
|
|
96
|
+
restart: unless-stopped
|
|
97
|
+
depends_on:
|
|
98
|
+
- openmemory
|
|
99
|
+
|
|
100
|
+
log-exporter:
|
|
101
|
+
image: ghcr.io/mikhailkogan17/cybermem-log_exporter:latest
|
|
102
|
+
container_name: cybermem-log-exporter
|
|
103
|
+
environment:
|
|
104
|
+
LOG_FILE: /var/log/traefik/access.log
|
|
105
|
+
SCRAPE_INTERVAL: "5"
|
|
106
|
+
EXPORTER_PORT: "8001"
|
|
107
|
+
DB_PATH: /data/openmemory.sqlite
|
|
108
|
+
volumes:
|
|
109
|
+
- traefik-logs:/var/log/traefik:ro
|
|
110
|
+
- openmemory-data:/data
|
|
111
|
+
- ./monitoring/log_exporter/exporter.py:/app/exporter.py:ro
|
|
112
|
+
restart: unless-stopped
|
|
113
|
+
depends_on:
|
|
114
|
+
- traefik
|
|
115
|
+
- openmemory
|
|
116
|
+
|
|
117
|
+
postgres:
|
|
118
|
+
image: postgres:15-alpine
|
|
119
|
+
container_name: cybermem-postgres
|
|
120
|
+
environment:
|
|
121
|
+
POSTGRES_DB: ${PG_DB:-openmemory}
|
|
122
|
+
POSTGRES_USER: ${PG_USER:-openmemory}
|
|
123
|
+
POSTGRES_PASSWORD: ${PG_PASSWORD:-postgres}
|
|
124
|
+
ports:
|
|
125
|
+
- "5432:5432"
|
|
126
|
+
volumes:
|
|
127
|
+
- postgres-data:/var/lib/postgresql/data
|
|
128
|
+
healthcheck:
|
|
129
|
+
test: ["CMD-SHELL", "pg_isready -U ${PG_USER:-openmemory}"]
|
|
130
|
+
interval: 10s
|
|
131
|
+
timeout: 5s
|
|
132
|
+
retries: 5
|
|
133
|
+
restart: unless-stopped
|
|
134
|
+
profiles:
|
|
135
|
+
- postgres
|
|
136
|
+
|
|
137
|
+
postgres-exporter:
|
|
138
|
+
image: prometheuscommunity/postgres-exporter:v0.15.0
|
|
139
|
+
container_name: cybermem-postgres-exporter
|
|
140
|
+
environment:
|
|
141
|
+
DATA_SOURCE_NAME: postgresql://${PG_USER:-openmemory}:${PG_PASSWORD:-postgres}@postgres:5432/${PG_DB:-openmemory}?sslmode=disable
|
|
142
|
+
PG_EXPORTER_EXTEND_QUERY_PATH: /queries.yml
|
|
143
|
+
ports:
|
|
144
|
+
- "9187:9187"
|
|
145
|
+
volumes:
|
|
146
|
+
- ./monitoring/postgres_exporter/queries.yml:/queries.yml:ro
|
|
147
|
+
restart: unless-stopped
|
|
148
|
+
depends_on:
|
|
149
|
+
- postgres
|
|
150
|
+
profiles:
|
|
151
|
+
- postgres
|
|
152
|
+
|
|
153
|
+
ollama:
|
|
154
|
+
image: ollama/ollama:latest
|
|
155
|
+
container_name: cybermem-ollama
|
|
156
|
+
ports:
|
|
157
|
+
- "11434:11434"
|
|
158
|
+
volumes:
|
|
159
|
+
- ollama-models:/root/.ollama
|
|
160
|
+
restart: unless-stopped
|
|
161
|
+
profiles:
|
|
162
|
+
- ollama
|
|
163
|
+
|
|
164
|
+
prometheus:
|
|
165
|
+
image: prom/prometheus:v2.48.0
|
|
166
|
+
container_name: cybermem-prometheus
|
|
167
|
+
command:
|
|
168
|
+
- --config.file=/etc/prometheus/prometheus.yml
|
|
169
|
+
- --storage.tsdb.path=/prometheus
|
|
170
|
+
- --storage.tsdb.retention.time=${PROM_RETENTION:-7d}
|
|
171
|
+
- --web.console.libraries=/usr/share/prometheus/console_libraries
|
|
172
|
+
- --web.console.templates=/usr/share/prometheus/consoles
|
|
173
|
+
ports:
|
|
174
|
+
- "9092:9090"
|
|
175
|
+
volumes:
|
|
176
|
+
- ./monitoring/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml:ro
|
|
177
|
+
- prometheus-data:/prometheus
|
|
178
|
+
restart: unless-stopped
|
|
179
|
+
depends_on:
|
|
180
|
+
- db-exporter
|
|
181
|
+
|
|
182
|
+
dashboard:
|
|
183
|
+
image: ghcr.io/mikhailkogan17/cybermem-dashboard:latest
|
|
184
|
+
container_name: cybermem-dashboard
|
|
185
|
+
environment:
|
|
186
|
+
NEXT_PUBLIC_PROMETHEUS_URL: http://prometheus:9090
|
|
187
|
+
PROMETHEUS_URL: http://prometheus:9090
|
|
188
|
+
OM_API_KEY: ${OM_API_KEY:-dev-secret-key}
|
|
189
|
+
# WATCHPACK_POLLING: "true" # Enable if hot reload blocks (high CPU usage)
|
|
190
|
+
ports:
|
|
191
|
+
- "3000:3000"
|
|
192
|
+
volumes:
|
|
193
|
+
- openmemory-data:/data
|
|
194
|
+
- /var/run/docker.sock:/var/run/docker.sock
|
|
195
|
+
- ${CYBERMEM_ENV_PATH}:/app/shared.env
|
|
196
|
+
restart: unless-stopped
|
|
197
|
+
depends_on:
|
|
198
|
+
- prometheus
|
|
199
|
+
|
|
200
|
+
volumes:
|
|
201
|
+
openmemory-data:
|
|
202
|
+
name: cybermem-openmemory-data
|
|
203
|
+
driver: local
|
|
204
|
+
postgres-data:
|
|
205
|
+
name: cybermem-postgres-data
|
|
206
|
+
driver: local
|
|
207
|
+
ollama-models:
|
|
208
|
+
name: cybermem-ollama-models
|
|
209
|
+
driver: local
|
|
210
|
+
prometheus-data:
|
|
211
|
+
name: cybermem-prometheus-data
|
|
212
|
+
driver: local
|
|
213
|
+
traefik-logs:
|
|
214
|
+
name: cybermem-traefik-logs
|
|
215
|
+
driver: local
|
|
216
|
+
|
|
217
|
+
networks:
|
|
218
|
+
default:
|
|
219
|
+
name: cybermem-network
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# Example environment configuration
|
|
2
|
+
# Copy to .env and customize
|
|
3
|
+
|
|
4
|
+
# Embeddings provider: ollama (local) or openai (cloud)
|
|
5
|
+
EMBEDDINGS_PROVIDER=ollama
|
|
6
|
+
OLLAMA_URL=http://ollama:11434
|
|
7
|
+
OPENAI_API_KEY=
|
|
8
|
+
|
|
9
|
+
# Database backend: sqlite (local/rpi) or postgres (vps)
|
|
10
|
+
DB_BACKEND=sqlite
|
|
11
|
+
DB_PATH=/data/openmemory.sqlite
|
|
12
|
+
VECTOR_BACKEND=sqlite
|
|
13
|
+
|
|
14
|
+
# PostgreSQL settings (only for DB_BACKEND=postgres)
|
|
15
|
+
PG_HOST=postgres
|
|
16
|
+
PG_PORT=5432
|
|
17
|
+
PG_DB=openmemory
|
|
18
|
+
PG_USER=openmemory
|
|
19
|
+
PG_PASSWORD=change-me
|
|
20
|
+
|
|
21
|
+
# OpenMemory API key (Optional for local mode)
|
|
22
|
+
# CYBERMEM_API_KEY=
|
|
23
|
+
|
|
24
|
+
# Monitoring
|
|
25
|
+
PROM_RETENTION=7d
|
|
26
|
+
GRAFANA_USER=admin
|
|
27
|
+
GRAFANA_PASSWORD=admin
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# Raspberry Pi environment
|
|
2
|
+
# Optimized for low memory (1GB total)
|
|
3
|
+
DOCKER_PLATFORM=linux/arm64
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
# Embeddings (use Ollama with small models)
|
|
7
|
+
EMBEDDINGS_PROVIDER=ollama
|
|
8
|
+
OLLAMA_URL=http://ollama:11434
|
|
9
|
+
OPENAI_API_KEY=
|
|
10
|
+
|
|
11
|
+
# Database (SQLite for RPi - low memory footprint)
|
|
12
|
+
DB_BACKEND=sqlite
|
|
13
|
+
DB_PATH=/data/openmemory.sqlite
|
|
14
|
+
|
|
15
|
+
# PostgreSQL (not used)
|
|
16
|
+
PG_HOST=postgres
|
|
17
|
+
PG_DB=openmemory
|
|
18
|
+
PG_USER=openmemory
|
|
19
|
+
PG_PASSWORD=not-used
|
|
20
|
+
|
|
21
|
+
# OpenMemory
|
|
22
|
+
CYBERMEM_API_KEY=key-change-me
|
|
23
|
+
|
|
24
|
+
# Monitoring (short retention for disk space)
|
|
25
|
+
PROM_RETENTION=3d
|
|
26
|
+
GRAFANA_USER=admin
|
|
27
|
+
GRAFANA_PASSWORD=admin
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# VPS production environment
|
|
2
|
+
# For Hetzner CX22 or similar (2 vCPU, 4GB RAM)
|
|
3
|
+
|
|
4
|
+
# Embeddings (use OpenAI for production)
|
|
5
|
+
EMBEDDINGS_PROVIDER=openai
|
|
6
|
+
OPENAI_API_KEY=sk-change-me-in-production
|
|
7
|
+
OLLAMA_URL=
|
|
8
|
+
|
|
9
|
+
# Database (PostgreSQL for production)
|
|
10
|
+
DB_BACKEND=postgres
|
|
11
|
+
VECTOR_BACKEND=postgres
|
|
12
|
+
|
|
13
|
+
# PostgreSQL
|
|
14
|
+
PG_HOST=postgres
|
|
15
|
+
PG_DB=openmemory
|
|
16
|
+
PG_USER=openmemory
|
|
17
|
+
PG_PASSWORD=change-me-in-production-use-secrets
|
|
18
|
+
|
|
19
|
+
# OpenMemory
|
|
20
|
+
CYBERMEM_API_KEY=change-me-in-production-use-secrets
|
|
21
|
+
|
|
22
|
+
# Monitoring
|
|
23
|
+
PROM_RETENTION=30d
|
|
24
|
+
GRAFANA_USER=admin
|
|
25
|
+
GRAFANA_PASSWORD=change-me-in-production-use-secrets
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
FROM python:3.11-alpine
|
|
2
|
+
|
|
3
|
+
WORKDIR /app
|
|
4
|
+
|
|
5
|
+
# Install dependencies
|
|
6
|
+
COPY requirements.txt .
|
|
7
|
+
RUN pip install --no-cache-dir -r requirements.txt
|
|
8
|
+
|
|
9
|
+
# Copy exporter script
|
|
10
|
+
COPY exporter.py .
|
|
11
|
+
|
|
12
|
+
# Make script executable
|
|
13
|
+
RUN chmod +x exporter.py
|
|
14
|
+
|
|
15
|
+
# Expose Prometheus metrics port
|
|
16
|
+
EXPOSE 8000
|
|
17
|
+
|
|
18
|
+
# Run exporter
|
|
19
|
+
CMD ["python", "-u", "exporter.py"]
|