88 lines
2.9 KiB
Bash
88 lines
2.9 KiB
Bash
#!/usr/bin/env bash
|
|
# Runs on 103 from a verified Deep Search release directory.
|
|
set -euo pipefail
|
|
|
|
RUNTIME_BASE="${DEEP_SEARCH_RUNTIME_BASE:-/Users/john/Project/deep-search-runtime}"
|
|
RELEASE_DIR="${DEEP_SEARCH_RELEASE_DIR:?DEEP_SEARCH_RELEASE_DIR is required}"
|
|
ENV_DIR="${RUNTIME_BASE}/shared"
|
|
ENV_FILE="${ENV_DIR}/.env"
|
|
DATA_DIR="${RUNTIME_BASE}/data"
|
|
LOG_DIR="${RUNTIME_BASE}/logs"
|
|
PLIST="${HOME}/Library/LaunchAgents/cn.tkmind.memind-deep-search.plist"
|
|
LABEL="cn.tkmind.memind-deep-search"
|
|
GUI="gui/$(id -u)"
|
|
NODE_BIN="${NODE_BIN:-/opt/homebrew/opt/node@24/bin/node}"
|
|
|
|
[[ -x "${NODE_BIN}" ]] || {
|
|
echo "missing Node.js runtime: ${NODE_BIN}" >&2
|
|
exit 1
|
|
}
|
|
[[ -f "${RELEASE_DIR}/deep-search-server.mjs" ]] || {
|
|
echo "missing Deep Search server in ${RELEASE_DIR}" >&2
|
|
exit 1
|
|
}
|
|
|
|
mkdir -p "${ENV_DIR}" "${DATA_DIR}" "${LOG_DIR}" "$(dirname "${PLIST}")"
|
|
touch "${ENV_FILE}"
|
|
chmod 600 "${ENV_FILE}"
|
|
|
|
ensure_env() {
|
|
local key="$1"
|
|
local value="$2"
|
|
if ! grep -qE "^${key}=" "${ENV_FILE}"; then
|
|
printf '%s=%s\n' "${key}" "${value}" >> "${ENV_FILE}"
|
|
fi
|
|
}
|
|
|
|
if ! grep -qE '^TKMIND_DEEP_SEARCH_SECRET=.+$' "${ENV_FILE}"; then
|
|
secret="$(openssl rand -hex 32)"
|
|
ensure_env TKMIND_DEEP_SEARCH_SECRET "${secret}"
|
|
fi
|
|
ensure_env TKMIND_DEEP_SEARCH_HOST "127.0.0.1"
|
|
ensure_env TKMIND_DEEP_SEARCH_PORT "20100"
|
|
ensure_env TKMIND_DEEP_SEARCH_DB "${DATA_DIR}/research.sqlite"
|
|
ensure_env TKMIND_DEEP_SEARCH_SEARXNG_URL "http://127.0.0.1:20080/search"
|
|
ensure_env TKMIND_DEEP_SEARCH_LLM_GATEWAY_URL "http://127.0.0.1:8081/api/internal/deep-search/llm"
|
|
ensure_env TKMIND_DEEP_SEARCH_LLM_GATEWAY_SECRET '${TKMIND_DEEP_SEARCH_SECRET}'
|
|
|
|
ln -sfn "${RELEASE_DIR}" "${RUNTIME_BASE}/current"
|
|
|
|
cat > "${PLIST}" <<EOF
|
|
<?xml version="1.0" encoding="UTF-8"?>
|
|
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
|
<plist version="1.0"><dict>
|
|
<key>Label</key><string>${LABEL}</string>
|
|
<key>ProgramArguments</key><array>
|
|
<string>/bin/bash</string>
|
|
<string>${RUNTIME_BASE}/current/scripts/run-deep-search-prod.sh</string>
|
|
</array>
|
|
<key>WorkingDirectory</key><string>${RUNTIME_BASE}</string>
|
|
<key>EnvironmentVariables</key><dict>
|
|
<key>DEEP_SEARCH_RUNTIME_BASE</key><string>${RUNTIME_BASE}</string>
|
|
<key>NODE_BIN</key><string>${NODE_BIN}</string>
|
|
</dict>
|
|
<key>RunAtLoad</key><true/>
|
|
<key>KeepAlive</key><true/>
|
|
<key>ProcessType</key><string>Background</string>
|
|
<key>ThrottleInterval</key><integer>10</integer>
|
|
<key>StandardOutPath</key><string>${LOG_DIR}/deep-search.log</string>
|
|
<key>StandardErrorPath</key><string>${LOG_DIR}/deep-search.log</string>
|
|
</dict></plist>
|
|
EOF
|
|
|
|
plutil -lint "${PLIST}" >/dev/null
|
|
launchctl bootout "${GUI}/${LABEL}" >/dev/null 2>&1 || true
|
|
launchctl bootstrap "${GUI}" "${PLIST}"
|
|
launchctl enable "${GUI}/${LABEL}"
|
|
launchctl kickstart -k "${GUI}/${LABEL}"
|
|
|
|
for _ in $(seq 1 30); do
|
|
if curl -fsS --max-time 2 "http://127.0.0.1:20100/health" >/dev/null 2>&1; then
|
|
exit 0
|
|
fi
|
|
sleep 1
|
|
done
|
|
|
|
echo "Deep Search health check timed out" >&2
|
|
exit 1
|