Files
memind/scripts/install-deep-search-runtime-prod.sh
john 22a45f34f5
Memind CI / Test, build, and release guards (pull_request) Successful in 4m7s
fix: start deep search launchagent reliably
2026-07-24 10:26:16 +08:00

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