@nitsan-ai/ragsuite-test 0.1.3 → 0.1.5
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 +46 -71
- package/package.json +2 -3
- package/src/commands/doctor.js +16 -16
- package/src/commands/init.js +129 -85
- package/src/commands/logs.js +23 -35
- package/src/commands/start.js +12 -37
- package/src/commands/stop.js +15 -24
- package/src/commands/update.js +55 -52
- package/src/index.js +7 -7
- package/src/utils/args.js +10 -3
- package/src/utils/config.js +11 -26
- package/src/utils/distribution.js +10 -16
- package/src/utils/git-install.js +13 -8
- package/src/utils/global-config.js +61 -0
- package/src/utils/paths.js +81 -22
- package/src/utils/port.js +3 -4
- package/src/utils/prereqs.js +25 -65
- package/src/utils/images-install.js +0 -100
- package/templates/images/.env.example +0 -76
- package/templates/images/docker-compose.yml +0 -165
- package/templates/images/scripts/docker-doctor-images.sh +0 -48
- package/templates/images/scripts/docker-start-images.sh +0 -107
- package/templates/images/scripts/docker-stop-images.sh +0 -22
|
@@ -1,165 +0,0 @@
|
|
|
1
|
-
# Pull-only stack (no monorepo source / no local build).
|
|
2
|
-
# Used by: ragsuite-test init --from-images
|
|
3
|
-
# Images: ghcr.io/nitsan-ai/ragsuite-backend and ragsuite-frontend
|
|
4
|
-
#
|
|
5
|
-
# Override tag: IMAGE_TAG=1.0.0 (default: latest)
|
|
6
|
-
# Registry: IMAGE_REGISTRY=ghcr.io/nitsan-ai (default)
|
|
7
|
-
|
|
8
|
-
name: ragsuite-server
|
|
9
|
-
|
|
10
|
-
networks:
|
|
11
|
-
ragsuite-server-net:
|
|
12
|
-
name: ragsuite-server-net
|
|
13
|
-
|
|
14
|
-
x-backend-image: &backend_image
|
|
15
|
-
image: ${IMAGE_REGISTRY:-ghcr.io/nitsan-ai}/ragsuite-backend:${IMAGE_TAG:-latest}
|
|
16
|
-
pull_policy: ${PULL_POLICY:-always}
|
|
17
|
-
|
|
18
|
-
services:
|
|
19
|
-
postgres:
|
|
20
|
-
image: postgres:15-alpine
|
|
21
|
-
environment:
|
|
22
|
-
POSTGRES_USER: ${POSTGRES_USER:-ragsuite}
|
|
23
|
-
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-ragsuite}
|
|
24
|
-
POSTGRES_DB: ${POSTGRES_DB:-ragsuite_v3}
|
|
25
|
-
ports:
|
|
26
|
-
- "${POSTGRES_HOST_PORT:-5436}:5432"
|
|
27
|
-
volumes:
|
|
28
|
-
- postgres_data:/var/lib/postgresql/data
|
|
29
|
-
healthcheck:
|
|
30
|
-
test: ["CMD-SHELL", "pg_isready -U $${POSTGRES_USER} -d $${POSTGRES_DB}"]
|
|
31
|
-
interval: 5s
|
|
32
|
-
timeout: 5s
|
|
33
|
-
retries: 10
|
|
34
|
-
networks:
|
|
35
|
-
- ragsuite-server-net
|
|
36
|
-
restart: unless-stopped
|
|
37
|
-
|
|
38
|
-
redis:
|
|
39
|
-
image: redis:7-alpine
|
|
40
|
-
ports:
|
|
41
|
-
- "${REDIS_HOST_PORT:-6382}:6379"
|
|
42
|
-
healthcheck:
|
|
43
|
-
test: ["CMD", "redis-cli", "ping"]
|
|
44
|
-
interval: 5s
|
|
45
|
-
timeout: 3s
|
|
46
|
-
retries: 10
|
|
47
|
-
networks:
|
|
48
|
-
- ragsuite-server-net
|
|
49
|
-
restart: unless-stopped
|
|
50
|
-
|
|
51
|
-
chromadb:
|
|
52
|
-
<<: *backend_image
|
|
53
|
-
entrypoint: []
|
|
54
|
-
command:
|
|
55
|
-
- chroma
|
|
56
|
-
- run
|
|
57
|
-
- --host
|
|
58
|
-
- "0.0.0.0"
|
|
59
|
-
- --port
|
|
60
|
-
- "8000"
|
|
61
|
-
- --path
|
|
62
|
-
- /data/chroma
|
|
63
|
-
volumes:
|
|
64
|
-
- chroma_data:/data/chroma
|
|
65
|
-
healthcheck:
|
|
66
|
-
test: ["CMD", "curl", "-sf", "http://localhost:8000/api/v2/heartbeat"]
|
|
67
|
-
interval: 10s
|
|
68
|
-
timeout: 5s
|
|
69
|
-
retries: 10
|
|
70
|
-
start_period: 30s
|
|
71
|
-
networks:
|
|
72
|
-
- ragsuite-server-net
|
|
73
|
-
restart: unless-stopped
|
|
74
|
-
|
|
75
|
-
backend:
|
|
76
|
-
<<: *backend_image
|
|
77
|
-
env_file:
|
|
78
|
-
- .env
|
|
79
|
-
environment:
|
|
80
|
-
DEBUG: "True"
|
|
81
|
-
CORS_ORIGINS: "http://localhost:${WEB_PORT:-9091}"
|
|
82
|
-
ENABLE_SCHEDULER: "true"
|
|
83
|
-
ENABLE_DURABLE_JOBS: "true"
|
|
84
|
-
DATABASE_URL: postgresql://${POSTGRES_USER:-ragsuite}:${POSTGRES_PASSWORD:-ragsuite}@postgres:5432/${POSTGRES_DB:-ragsuite_v3}
|
|
85
|
-
REDIS_HOST: redis
|
|
86
|
-
REDIS_PORT: "6379"
|
|
87
|
-
CHROMA_MODE: http
|
|
88
|
-
CHROMA_HOST: chromadb
|
|
89
|
-
CHROMA_PORT: "8000"
|
|
90
|
-
CHROMA_PERSIST_PATH: /data/chroma
|
|
91
|
-
DOCUMENT_STAGING_DIR: /data/staging
|
|
92
|
-
RUN_INLINE_WORKER: "false"
|
|
93
|
-
WEB_CONCURRENCY: "2"
|
|
94
|
-
FRONTEND_BASE_URL: http://localhost:${WEB_PORT:-9091}
|
|
95
|
-
PUBLIC_API_BASE_URL: http://localhost:${API_PORT:-9090}/api/v1
|
|
96
|
-
SSO_CALLBACK_BASE_URL: http://localhost:${API_PORT:-9090}/api/v1/auth/sso/callback
|
|
97
|
-
ports:
|
|
98
|
-
- "${API_PORT:-9090}:8000"
|
|
99
|
-
depends_on:
|
|
100
|
-
postgres:
|
|
101
|
-
condition: service_healthy
|
|
102
|
-
redis:
|
|
103
|
-
condition: service_healthy
|
|
104
|
-
chromadb:
|
|
105
|
-
condition: service_healthy
|
|
106
|
-
healthcheck:
|
|
107
|
-
test: ["CMD", "curl", "-sf", "http://localhost:8000/api/v1/health/ready"]
|
|
108
|
-
interval: 30s
|
|
109
|
-
timeout: 10s
|
|
110
|
-
retries: 5
|
|
111
|
-
start_period: 120s
|
|
112
|
-
volumes:
|
|
113
|
-
- staging_data:/data/staging
|
|
114
|
-
networks:
|
|
115
|
-
- ragsuite-server-net
|
|
116
|
-
restart: unless-stopped
|
|
117
|
-
|
|
118
|
-
worker:
|
|
119
|
-
<<: *backend_image
|
|
120
|
-
entrypoint: []
|
|
121
|
-
command: ["python", "-m", "app.worker"]
|
|
122
|
-
env_file:
|
|
123
|
-
- .env
|
|
124
|
-
environment:
|
|
125
|
-
DEBUG: "False"
|
|
126
|
-
CORS_ORIGINS: "http://localhost:${WEB_PORT:-9091}"
|
|
127
|
-
ENABLE_SCHEDULER: "true"
|
|
128
|
-
ENABLE_DURABLE_JOBS: "true"
|
|
129
|
-
DATABASE_URL: postgresql://${POSTGRES_USER:-ragsuite}:${POSTGRES_PASSWORD:-ragsuite}@postgres:5432/${POSTGRES_DB:-ragsuite_v3}
|
|
130
|
-
REDIS_HOST: redis
|
|
131
|
-
REDIS_PORT: "6379"
|
|
132
|
-
CHROMA_MODE: http
|
|
133
|
-
CHROMA_HOST: chromadb
|
|
134
|
-
CHROMA_PORT: "8000"
|
|
135
|
-
CHROMA_PERSIST_PATH: /data/chroma
|
|
136
|
-
DOCUMENT_STAGING_DIR: /data/staging
|
|
137
|
-
RUN_INLINE_WORKER: "false"
|
|
138
|
-
depends_on:
|
|
139
|
-
backend:
|
|
140
|
-
condition: service_healthy
|
|
141
|
-
volumes:
|
|
142
|
-
- staging_data:/data/staging
|
|
143
|
-
networks:
|
|
144
|
-
- ragsuite-server-net
|
|
145
|
-
restart: unless-stopped
|
|
146
|
-
|
|
147
|
-
frontend:
|
|
148
|
-
image: ${IMAGE_REGISTRY:-ghcr.io/nitsan-ai}/ragsuite-frontend:${IMAGE_TAG:-latest}
|
|
149
|
-
pull_policy: ${PULL_POLICY:-always}
|
|
150
|
-
ports:
|
|
151
|
-
- "${WEB_PORT:-9091}:80"
|
|
152
|
-
healthcheck:
|
|
153
|
-
test: ["CMD", "wget", "-q", "--spider", "http://localhost/healthz"]
|
|
154
|
-
interval: 15s
|
|
155
|
-
timeout: 5s
|
|
156
|
-
retries: 5
|
|
157
|
-
start_period: 10s
|
|
158
|
-
networks:
|
|
159
|
-
- ragsuite-server-net
|
|
160
|
-
restart: unless-stopped
|
|
161
|
-
|
|
162
|
-
volumes:
|
|
163
|
-
postgres_data:
|
|
164
|
-
chroma_data:
|
|
165
|
-
staging_data:
|
|
@@ -1,48 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env bash
|
|
2
|
-
# Lightweight doctor for images-only installs.
|
|
3
|
-
set -euo pipefail
|
|
4
|
-
|
|
5
|
-
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
6
|
-
ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
|
|
7
|
-
cd "$ROOT"
|
|
8
|
-
|
|
9
|
-
ok=0
|
|
10
|
-
fail=0
|
|
11
|
-
|
|
12
|
-
check() {
|
|
13
|
-
local label="$1"
|
|
14
|
-
shift
|
|
15
|
-
if "$@"; then
|
|
16
|
-
echo " ✓ $label"
|
|
17
|
-
ok=$((ok + 1))
|
|
18
|
-
else
|
|
19
|
-
echo " ✗ $label"
|
|
20
|
-
fail=$((fail + 1))
|
|
21
|
-
fi
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
echo "Doctor (images install):"
|
|
25
|
-
check "docker CLI" command -v docker >/dev/null
|
|
26
|
-
check "docker daemon" docker info >/dev/null 2>&1
|
|
27
|
-
check "docker compose" docker compose version >/dev/null 2>&1
|
|
28
|
-
check ".env present" test -f .env
|
|
29
|
-
check "compose file" test -f docker-compose.yml
|
|
30
|
-
|
|
31
|
-
API_PORT="${API_PORT:-9090}"
|
|
32
|
-
if curl -sf "http://127.0.0.1:${API_PORT}/api/v1/health/ping" >/dev/null 2>&1 \
|
|
33
|
-
|| curl -sf "http://127.0.0.1:${API_PORT}/api/v1/crawl/auth/public-config" >/dev/null 2>&1; then
|
|
34
|
-
echo " ✓ API reachable :${API_PORT}"
|
|
35
|
-
ok=$((ok + 1))
|
|
36
|
-
else
|
|
37
|
-
echo " ○ API not up yet on :${API_PORT} (start the stack if needed)"
|
|
38
|
-
fi
|
|
39
|
-
|
|
40
|
-
echo "Summary: ${ok} ok, ${fail} failed"
|
|
41
|
-
if [[ "$fail" -gt 0 ]]; then
|
|
42
|
-
echo "How to fix:"
|
|
43
|
-
echo " → Install Docker Desktop: https://www.docker.com/products/docker-desktop/"
|
|
44
|
-
echo " → Publish images: GitHub Actions → Publish images (GHCR)"
|
|
45
|
-
echo " → Start: ragsuite-test start --repo-root $ROOT --detach"
|
|
46
|
-
exit 1
|
|
47
|
-
fi
|
|
48
|
-
exit 0
|
|
@@ -1,107 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env bash
|
|
2
|
-
# Start pull-only images stack (no source build).
|
|
3
|
-
# Exit: 0 ok, 1 prereq, 2 env, 3 compose, 4 health
|
|
4
|
-
set -euo pipefail
|
|
5
|
-
|
|
6
|
-
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
7
|
-
ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
|
|
8
|
-
cd "$ROOT"
|
|
9
|
-
|
|
10
|
-
DETACH=1
|
|
11
|
-
for arg in "$@"; do
|
|
12
|
-
case "$arg" in
|
|
13
|
-
-d|--detach) DETACH=1 ;;
|
|
14
|
-
-h|--help)
|
|
15
|
-
echo "Usage: $0 [--detach|-d]"
|
|
16
|
-
echo " docker compose up -d (pull images, no --build)"
|
|
17
|
-
exit 0
|
|
18
|
-
;;
|
|
19
|
-
esac
|
|
20
|
-
done
|
|
21
|
-
|
|
22
|
-
if ! command -v docker >/dev/null 2>&1; then
|
|
23
|
-
echo "error: docker is required for images install" >&2
|
|
24
|
-
exit 1
|
|
25
|
-
fi
|
|
26
|
-
if ! docker info >/dev/null 2>&1; then
|
|
27
|
-
echo "error: Docker daemon is not running" >&2
|
|
28
|
-
exit 1
|
|
29
|
-
fi
|
|
30
|
-
if ! docker compose version >/dev/null 2>&1; then
|
|
31
|
-
echo "error: docker compose plugin is required" >&2
|
|
32
|
-
exit 1
|
|
33
|
-
fi
|
|
34
|
-
|
|
35
|
-
if [[ ! -f .env ]]; then
|
|
36
|
-
if [[ -f .env.example ]]; then
|
|
37
|
-
cp .env.example .env
|
|
38
|
-
echo "warn: created .env from .env.example — edit secrets for production"
|
|
39
|
-
else
|
|
40
|
-
echo "error: missing .env" >&2
|
|
41
|
-
exit 2
|
|
42
|
-
fi
|
|
43
|
-
fi
|
|
44
|
-
|
|
45
|
-
# shellcheck disable=SC1091
|
|
46
|
-
set -a
|
|
47
|
-
# shellcheck source=/dev/null
|
|
48
|
-
source .env
|
|
49
|
-
set +a
|
|
50
|
-
|
|
51
|
-
if [[ -z "${JWT_SECRET_KEY:-}" || "${JWT_SECRET_KEY}" == change-me* ]]; then
|
|
52
|
-
echo "error: JWT_SECRET_KEY must be set (non placeholder) in .env" >&2
|
|
53
|
-
exit 2
|
|
54
|
-
fi
|
|
55
|
-
if [[ -z "${CUSTOM_LLM_INTERNAL_API_KEY:-}" || "${CUSTOM_LLM_INTERNAL_API_KEY}" == change-me* ]]; then
|
|
56
|
-
echo "error: CUSTOM_LLM_INTERNAL_API_KEY must be set (non placeholder) in .env" >&2
|
|
57
|
-
exit 2
|
|
58
|
-
fi
|
|
59
|
-
|
|
60
|
-
export IMAGE_REGISTRY="${IMAGE_REGISTRY:-ghcr.io/nitsan-ai}"
|
|
61
|
-
export IMAGE_TAG="${IMAGE_TAG:-latest}"
|
|
62
|
-
export PULL_POLICY="${PULL_POLICY:-always}"
|
|
63
|
-
|
|
64
|
-
COMPOSE_FILE="${COMPOSE_FILE:-docker-compose.yml}"
|
|
65
|
-
if [[ ! -f "$COMPOSE_FILE" ]]; then
|
|
66
|
-
echo "error: missing $COMPOSE_FILE (images install)" >&2
|
|
67
|
-
exit 1
|
|
68
|
-
fi
|
|
69
|
-
|
|
70
|
-
echo "==> Pulling / starting images (no build) registry=${IMAGE_REGISTRY} tag=${IMAGE_TAG}"
|
|
71
|
-
set +e
|
|
72
|
-
docker compose -f "$COMPOSE_FILE" pull
|
|
73
|
-
docker compose -f "$COMPOSE_FILE" up -d --pull always
|
|
74
|
-
rc=$?
|
|
75
|
-
set -e
|
|
76
|
-
if [[ "$rc" -ne 0 ]]; then
|
|
77
|
-
echo "error: docker compose failed (exit $rc). Are GHCR images published and public/readable?" >&2
|
|
78
|
-
echo " Expected: ${IMAGE_REGISTRY}/ragsuite-backend:${IMAGE_TAG}" >&2
|
|
79
|
-
echo " Expected: ${IMAGE_REGISTRY}/ragsuite-frontend:${IMAGE_TAG}" >&2
|
|
80
|
-
exit 3
|
|
81
|
-
fi
|
|
82
|
-
|
|
83
|
-
API_PORT="${API_PORT:-9090}"
|
|
84
|
-
echo "==> Waiting for API :${API_PORT}"
|
|
85
|
-
ok=0
|
|
86
|
-
for _ in $(seq 1 60); do
|
|
87
|
-
if curl -sf "http://127.0.0.1:${API_PORT}/api/v1/crawl/auth/public-config" >/dev/null 2>&1 \
|
|
88
|
-
|| curl -sf "http://127.0.0.1:${API_PORT}/api/v1/health/ping" >/dev/null 2>&1; then
|
|
89
|
-
ok=1
|
|
90
|
-
break
|
|
91
|
-
fi
|
|
92
|
-
sleep 2
|
|
93
|
-
done
|
|
94
|
-
if [[ "$ok" -ne 1 ]]; then
|
|
95
|
-
echo "error: API health timed out" >&2
|
|
96
|
-
docker compose -f "$COMPOSE_FILE" ps -a || true
|
|
97
|
-
docker compose -f "$COMPOSE_FILE" logs backend --tail 80 || true
|
|
98
|
-
exit 4
|
|
99
|
-
fi
|
|
100
|
-
|
|
101
|
-
echo ""
|
|
102
|
-
echo "Stack URLs:"
|
|
103
|
-
echo " API http://localhost:${API_PORT}"
|
|
104
|
-
echo " Web UI http://localhost:${WEB_PORT:-9091}"
|
|
105
|
-
echo ""
|
|
106
|
-
echo "Images stack is up (no source tree required)."
|
|
107
|
-
exit 0
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env bash
|
|
2
|
-
# Stop pull-only images stack (volumes preserved).
|
|
3
|
-
set -euo pipefail
|
|
4
|
-
|
|
5
|
-
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
6
|
-
ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
|
|
7
|
-
cd "$ROOT"
|
|
8
|
-
|
|
9
|
-
if ! command -v docker >/dev/null 2>&1; then
|
|
10
|
-
echo "error: docker required" >&2
|
|
11
|
-
exit 1
|
|
12
|
-
fi
|
|
13
|
-
if ! docker info >/dev/null 2>&1; then
|
|
14
|
-
echo "error: Docker daemon is not running" >&2
|
|
15
|
-
exit 1
|
|
16
|
-
fi
|
|
17
|
-
|
|
18
|
-
COMPOSE_FILE="${COMPOSE_FILE:-docker-compose.yml}"
|
|
19
|
-
echo "==> Stopping images stack (volumes preserved)…"
|
|
20
|
-
docker compose -f "$COMPOSE_FILE" down
|
|
21
|
-
echo "Containers stopped. Volumes kept."
|
|
22
|
-
exit 0
|