jishushell 0.4.17 → 0.4.24
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/Dockerfile.hermes-slim +193 -0
- package/apps/hermes-container.yaml +35 -0
- package/apps/ollama-binary.yaml +200 -0
- package/apps/ollama-cpu-container.yaml +37 -0
- package/apps/ollama-with-hollama-binary.yaml +195 -0
- package/apps/openclaw-binary.yaml +69 -0
- package/apps/openclaw-container.yaml +37 -0
- package/apps/openclaw-with-ollama-container.yaml +42 -0
- package/apps/openclaw-with-searxng-container.yaml +136 -0
- package/apps/openwebui-container.yaml +53 -0
- package/apps/playwright-container.yaml +120 -0
- package/apps/searxng-container.yaml +115 -0
- package/dist/auth.d.ts +1 -0
- package/dist/auth.js +15 -14
- package/dist/auth.js.map +1 -1
- package/dist/cli/app.d.ts +1 -0
- package/dist/cli/app.js +710 -52
- package/dist/cli/app.js.map +1 -1
- package/dist/cli/backup.d.ts +3 -0
- package/dist/cli/backup.js +434 -0
- package/dist/cli/backup.js.map +1 -0
- package/dist/cli/doctor.d.ts +1 -0
- package/dist/cli/doctor.js +61 -35
- package/dist/cli/doctor.js.map +1 -1
- package/dist/cli/job.d.ts +1 -0
- package/dist/cli/job.js +37 -99
- package/dist/cli/job.js.map +1 -1
- package/dist/cli/llm.d.ts +1 -0
- package/dist/cli/llm.js +20 -14
- package/dist/cli/llm.js.map +1 -1
- package/dist/cli/managed-list.d.ts +30 -0
- package/dist/cli/managed-list.js +129 -0
- package/dist/cli/managed-list.js.map +1 -0
- package/dist/cli/panel.d.ts +4 -3
- package/dist/cli/panel.js +94 -24
- package/dist/cli/panel.js.map +1 -1
- package/dist/cli/version.d.ts +1 -0
- package/dist/cli/version.js +12 -0
- package/dist/cli/version.js.map +1 -0
- package/dist/cli.js +47 -516
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts +68 -0
- package/dist/config.js +266 -12
- package/dist/config.js.map +1 -1
- package/dist/control.d.ts +10 -6
- package/dist/control.js +87 -6
- package/dist/control.js.map +1 -1
- package/dist/install.d.ts +16 -0
- package/dist/install.js +75 -26
- package/dist/install.js.map +1 -1
- package/dist/routes/agent-apps.d.ts +15 -0
- package/dist/routes/agent-apps.js +78 -0
- package/dist/routes/agent-apps.js.map +1 -0
- package/dist/routes/apps.js +186 -7
- package/dist/routes/apps.js.map +1 -1
- package/dist/routes/backup.js +3 -3
- package/dist/routes/backup.js.map +1 -1
- package/dist/routes/instances.d.ts +6 -0
- package/dist/routes/instances.js +862 -879
- package/dist/routes/instances.js.map +1 -1
- package/dist/routes/llm.js +9 -8
- package/dist/routes/llm.js.map +1 -1
- package/dist/routes/runtime.d.ts +15 -0
- package/dist/routes/runtime.js +69 -0
- package/dist/routes/runtime.js.map +1 -0
- package/dist/routes/setup.js +103 -8
- package/dist/routes/setup.js.map +1 -1
- package/dist/routes/system.js +25 -3
- package/dist/routes/system.js.map +1 -1
- package/dist/server.js +71 -7
- package/dist/server.js.map +1 -1
- package/dist/services/agent-apps/catalog.d.ts +30 -0
- package/dist/services/agent-apps/catalog.js +60 -0
- package/dist/services/agent-apps/catalog.js.map +1 -0
- package/dist/services/agent-apps/index.d.ts +36 -0
- package/dist/services/agent-apps/index.js +171 -0
- package/dist/services/agent-apps/index.js.map +1 -0
- package/dist/services/agent-apps/installers/adapter-probes.d.ts +49 -0
- package/dist/services/agent-apps/installers/adapter-probes.js +223 -0
- package/dist/services/agent-apps/installers/adapter-probes.js.map +1 -0
- package/dist/services/agent-apps/installers/adapter.d.ts +30 -0
- package/dist/services/agent-apps/installers/adapter.js +171 -0
- package/dist/services/agent-apps/installers/adapter.js.map +1 -0
- package/dist/services/agent-apps/installers/registry-probe.d.ts +38 -0
- package/dist/services/agent-apps/installers/registry-probe.js +183 -0
- package/dist/services/agent-apps/installers/registry-probe.js.map +1 -0
- package/dist/services/agent-apps/installers/shell-script.d.ts +47 -0
- package/dist/services/agent-apps/installers/shell-script.js +471 -0
- package/dist/services/agent-apps/installers/shell-script.js.map +1 -0
- package/dist/services/agent-apps/types.d.ts +125 -0
- package/dist/services/agent-apps/types.js +17 -0
- package/dist/services/agent-apps/types.js.map +1 -0
- package/dist/services/{app-compiler.d.ts → app/app-compiler.d.ts} +3 -3
- package/dist/services/{app-compiler.js → app/app-compiler.js} +10 -7
- package/dist/services/app/app-compiler.js.map +1 -0
- package/dist/services/app/app-manager.d.ts +142 -0
- package/dist/services/app/app-manager.js +1988 -0
- package/dist/services/app/app-manager.js.map +1 -0
- package/dist/services/app/custom-manager.d.ts +27 -0
- package/dist/services/app/custom-manager.js +285 -0
- package/dist/services/app/custom-manager.js.map +1 -0
- package/dist/services/app/hermes-agent-manager.d.ts +20 -0
- package/dist/services/app/hermes-agent-manager.js +289 -0
- package/dist/services/app/hermes-agent-manager.js.map +1 -0
- package/dist/services/app/id-normalizer.d.ts +27 -0
- package/dist/services/app/id-normalizer.js +77 -0
- package/dist/services/app/id-normalizer.js.map +1 -0
- package/dist/services/app/ollama-manager.d.ts +18 -0
- package/dist/services/app/ollama-manager.js +207 -0
- package/dist/services/app/ollama-manager.js.map +1 -0
- package/dist/services/app/openclaw-manager.d.ts +63 -0
- package/dist/services/app/openclaw-manager.js +1178 -0
- package/dist/services/app/openclaw-manager.js.map +1 -0
- package/dist/services/app/paths.d.ts +47 -0
- package/dist/services/app/paths.js +68 -0
- package/dist/services/app/paths.js.map +1 -0
- package/dist/services/app/registry.d.ts +17 -0
- package/dist/services/app/registry.js +31 -0
- package/dist/services/app/registry.js.map +1 -0
- package/dist/services/app/remote-spec.d.ts +14 -0
- package/dist/services/app/remote-spec.js +58 -0
- package/dist/services/app/remote-spec.js.map +1 -0
- package/dist/services/app/terminal-session-manager.d.ts +27 -0
- package/dist/services/app/terminal-session-manager.js +157 -0
- package/dist/services/app/terminal-session-manager.js.map +1 -0
- package/dist/services/app/types.d.ts +72 -0
- package/dist/services/app/types.js +16 -0
- package/dist/services/app/types.js.map +1 -0
- package/dist/services/backup-manager.js +60 -22
- package/dist/services/backup-manager.js.map +1 -1
- package/dist/services/instance-manager.d.ts +82 -39
- package/dist/services/instance-manager.js +575 -1142
- package/dist/services/instance-manager.js.map +1 -1
- package/dist/services/llm-proxy/circuit-breaker.js +10 -2
- package/dist/services/llm-proxy/circuit-breaker.js.map +1 -1
- package/dist/services/llm-proxy/index.d.ts +14 -1
- package/dist/services/llm-proxy/index.js +51 -6
- package/dist/services/llm-proxy/index.js.map +1 -1
- package/dist/services/nomad-manager.d.ts +260 -3
- package/dist/services/nomad-manager.js +2866 -449
- package/dist/services/nomad-manager.js.map +1 -1
- package/dist/services/panel-manager.d.ts +10 -0
- package/dist/services/panel-manager.js +97 -0
- package/dist/services/panel-manager.js.map +1 -1
- package/dist/services/plugin-installer.js +28 -2
- package/dist/services/plugin-installer.js.map +1 -1
- package/dist/services/process-manager.js +22 -0
- package/dist/services/process-manager.js.map +1 -1
- package/dist/services/runtime/adapters/custom.d.ts +20 -0
- package/dist/services/runtime/adapters/custom.js +90 -0
- package/dist/services/runtime/adapters/custom.js.map +1 -0
- package/dist/services/runtime/adapters/hermes.d.ts +174 -0
- package/dist/services/runtime/adapters/hermes.js +1316 -0
- package/dist/services/runtime/adapters/hermes.js.map +1 -0
- package/dist/services/runtime/adapters/openclaw-routes.d.ts +17 -0
- package/dist/services/runtime/adapters/openclaw-routes.js +946 -0
- package/dist/services/runtime/adapters/openclaw-routes.js.map +1 -0
- package/dist/services/runtime/adapters/openclaw.d.ts +188 -0
- package/dist/services/runtime/adapters/openclaw.js +2195 -0
- package/dist/services/runtime/adapters/openclaw.js.map +1 -0
- package/dist/services/runtime/errors.d.ts +28 -0
- package/dist/services/runtime/errors.js +31 -0
- package/dist/services/runtime/errors.js.map +1 -0
- package/dist/services/runtime/index.d.ts +34 -0
- package/dist/services/runtime/index.js +51 -0
- package/dist/services/runtime/index.js.map +1 -0
- package/dist/services/runtime/instance.d.ts +24 -0
- package/dist/services/runtime/instance.js +143 -0
- package/dist/services/runtime/instance.js.map +1 -0
- package/dist/services/runtime/migrations.d.ts +15 -0
- package/dist/services/runtime/migrations.js +25 -0
- package/dist/services/runtime/migrations.js.map +1 -0
- package/dist/services/runtime/registry.d.ts +13 -0
- package/dist/services/runtime/registry.js +32 -0
- package/dist/services/runtime/registry.js.map +1 -0
- package/dist/services/runtime/types.d.ts +545 -0
- package/dist/services/runtime/types.js +14 -0
- package/dist/services/runtime/types.js.map +1 -0
- package/dist/services/setup-manager.d.ts +70 -29
- package/dist/services/setup-manager.js +278 -597
- package/dist/services/setup-manager.js.map +1 -1
- package/dist/services/task-registry.d.ts +44 -0
- package/dist/services/task-registry.js +74 -0
- package/dist/services/task-registry.js.map +1 -0
- package/dist/services/telemetry/heartbeat.d.ts +6 -6
- package/dist/services/telemetry/heartbeat.js +29 -30
- package/dist/services/telemetry/heartbeat.js.map +1 -1
- package/dist/types.d.ts +162 -2
- package/dist/utils/docker-host.d.ts +15 -0
- package/dist/utils/docker-host.js +64 -0
- package/dist/utils/docker-host.js.map +1 -0
- package/install/jishu-install.sh +25 -1
- package/package.json +14 -4
- package/public/assets/Dashboard-B-JoOjBQ.js +1 -0
- package/public/assets/HermesChatPanel-mFSureyc.js +1 -0
- package/public/assets/HermesConfigForm-DvR05LK1.js +4 -0
- package/public/assets/InitPassword-CVA8wQA6.js +1 -0
- package/public/assets/InstanceDetail-DcZW2QGO.js +91 -0
- package/public/assets/{Login-D1Bt-Lyk.js → Login-BWsZH2mu.js} +1 -1
- package/public/assets/NewInstance-BCIrAd86.js +1 -0
- package/public/assets/Settings-xkDcduFz.js +1 -0
- package/public/assets/Setup-Cfuwj4gV.js +1 -0
- package/public/assets/WeixinLoginPanel-CnjR8xMu.js +9 -0
- package/public/assets/index-CPhVFEsx.css +1 -0
- package/public/assets/index-DQsM6Joa.js +19 -0
- package/public/assets/input-paste-CrNVAyOy.js +1 -0
- package/public/assets/registry-B4UFJdpA.js +2 -0
- package/public/assets/{usePolling-CK0DfI4h.js → usePolling-Do5Erqm_.js} +1 -1
- package/public/assets/vendor-i18n-ucpM0OR0.js +9 -0
- package/public/assets/{vendor-react-B1-3Yrt-.js → vendor-react-Bk1hRGiY.js} +1 -1
- package/public/favicon.png +0 -0
- package/public/index.html +9 -4
- package/public/logos/hermes.png +0 -0
- package/public/logos/ollama.png +0 -0
- package/public/logos/openclaw.svg +60 -0
- package/scripts/build-hermes-image.sh +21 -0
- package/scripts/build-local.sh +54 -0
- package/scripts/check-adapter-isolation.ts +293 -0
- package/scripts/fixtures/instances/hermes-sample/instance.json +37 -0
- package/scripts/fixtures/instances/legacy-openclaw-sample/instance.json +7 -0
- package/scripts/smoke/hermes-bootstrap.sh +195 -0
- package/templates/hermes-entrypoint.sh +154 -0
- package/dist/cli/openclaw.d.ts +0 -12
- package/dist/cli/openclaw.js +0 -156
- package/dist/cli/openclaw.js.map +0 -1
- package/dist/services/app-compiler.js.map +0 -1
- package/dist/services/app-manager.d.ts +0 -17
- package/dist/services/app-manager.js +0 -168
- package/dist/services/app-manager.js.map +0 -1
- package/dist/services/job-manager.d.ts +0 -22
- package/dist/services/job-manager.js +0 -102
- package/dist/services/job-manager.js.map +0 -1
- package/public/assets/Dashboard-CQsp1Mr9.js +0 -1
- package/public/assets/InitPassword-BEC8SE4A.js +0 -1
- package/public/assets/InstanceDetail-B5wTgNEg.js +0 -17
- package/public/assets/NewInstance-GQzm3K9D.js +0 -1
- package/public/assets/Settings-ByjGlqhP.js +0 -1
- package/public/assets/Setup-cMF21Y-8.js +0 -1
- package/public/assets/index-B6qQP4mH.css +0 -1
- package/public/assets/index-BuTQtuNy.js +0 -16
- package/public/assets/vendor-i18n-CfW0RvgE.js +0 -9
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
# syntax=docker/dockerfile:1.7
|
|
2
|
+
|
|
3
|
+
ARG BASE_IMAGE=node:22-bookworm-slim
|
|
4
|
+
|
|
5
|
+
FROM ${BASE_IMAGE} AS builder
|
|
6
|
+
|
|
7
|
+
ARG HERMES_REPO=https://github.com/NousResearch/hermes-agent.git
|
|
8
|
+
ARG HERMES_REF=main
|
|
9
|
+
|
|
10
|
+
ENV DEBIAN_FRONTEND=noninteractive \
|
|
11
|
+
PIP_DISABLE_PIP_VERSION_CHECK=1 \
|
|
12
|
+
PYTHONDONTWRITEBYTECODE=1 \
|
|
13
|
+
UV_LINK_MODE=copy
|
|
14
|
+
|
|
15
|
+
RUN apt-get update && apt-get install -y --no-install-recommends \
|
|
16
|
+
bash \
|
|
17
|
+
build-essential \
|
|
18
|
+
ca-certificates \
|
|
19
|
+
curl \
|
|
20
|
+
ffmpeg \
|
|
21
|
+
git \
|
|
22
|
+
pkg-config \
|
|
23
|
+
python3 \
|
|
24
|
+
python3-dev \
|
|
25
|
+
python3-venv \
|
|
26
|
+
ripgrep && \
|
|
27
|
+
rm -rf /var/lib/apt/lists/*
|
|
28
|
+
|
|
29
|
+
RUN curl -LsSf https://astral.sh/uv/install.sh | sh
|
|
30
|
+
|
|
31
|
+
ENV PATH=/root/.local/bin:${PATH}
|
|
32
|
+
|
|
33
|
+
WORKDIR /opt
|
|
34
|
+
RUN git clone --recurse-submodules "${HERMES_REPO}" hermes && \
|
|
35
|
+
cd /opt/hermes && \
|
|
36
|
+
git checkout "${HERMES_REF}" && \
|
|
37
|
+
git submodule update --init --recursive
|
|
38
|
+
|
|
39
|
+
#
|
|
40
|
+
# Skip the `tinker-atropos` submodule install. It brings in the RL
|
|
41
|
+
# training stack (transformers, datasets, wandb, gymnasium, polars,
|
|
42
|
+
# pyarrow, safetensors, …) — ~300 MB of deps used only by
|
|
43
|
+
# `tools/rl_training_tool.py` and `environments/*.py`, both of which
|
|
44
|
+
# are lazy-imported and only exercised during model training runs.
|
|
45
|
+
# JishuShell targets inference on edge devices (Pi / RK3588 / CIX), no
|
|
46
|
+
# RL training happens here, so we match the upstream
|
|
47
|
+
# `nousresearch/hermes-agent` image's choice to omit it.
|
|
48
|
+
#
|
|
49
|
+
WORKDIR /opt/hermes
|
|
50
|
+
RUN uv venv .venv --python 3.11 && \
|
|
51
|
+
uv pip install --python .venv/bin/python -e ".[all]"
|
|
52
|
+
|
|
53
|
+
#
|
|
54
|
+
# Small extras the upstream image bundles but `[all]` doesn't pull.
|
|
55
|
+
# Both are tiny (~0.3 MB each) so we match the upstream image rather
|
|
56
|
+
# than leave users `pip install`-ing them by hand.
|
|
57
|
+
# - apscheduler: cron-style scheduler used by the agent's job tools
|
|
58
|
+
# - qrcode + pypng: QR image generation using pure-Python PNG
|
|
59
|
+
# backend (avoids dragging Pillow in)
|
|
60
|
+
#
|
|
61
|
+
RUN uv pip install --python .venv/bin/python apscheduler qrcode pypng
|
|
62
|
+
|
|
63
|
+
#
|
|
64
|
+
# Three things happen here:
|
|
65
|
+
#
|
|
66
|
+
# 1. `npm install --omit=dev` vendors agent-browser + its transitive
|
|
67
|
+
# deps (playwright-core, better-sqlite3, impit, zod, lodash, …)
|
|
68
|
+
# into /opt/hermes/node_modules (~171 MB). This is what
|
|
69
|
+
# `hermes's browser_tool.py` resolves when it runs `npx
|
|
70
|
+
# agent-browser` — without pre-installing we'd pay a ~15 s npm
|
|
71
|
+
# download on the first browser_navigate call of every fresh
|
|
72
|
+
# container.
|
|
73
|
+
#
|
|
74
|
+
# 2. `playwright install chromium --only-shell` drops the headless
|
|
75
|
+
# Chromium renderer (~330 MB) under $PLAYWRIGHT_BROWSERS_PATH.
|
|
76
|
+
# agent-browser auto-discovers it via that env var, so we don't
|
|
77
|
+
# need an apt `chromium` in the final image — just the shared
|
|
78
|
+
# libs headless_shell links against (installed in the final
|
|
79
|
+
# stage). `--package=playwright` borrows the Playwright CLI
|
|
80
|
+
# without persisting its own node_modules.
|
|
81
|
+
#
|
|
82
|
+
# 3. The native web UI (`hermes web`, served on port 9119) is built
|
|
83
|
+
# and its build-time node_modules removed; only the ~8 MB dist
|
|
84
|
+
# bundle ships.
|
|
85
|
+
#
|
|
86
|
+
ENV PLAYWRIGHT_BROWSERS_PATH=/opt/hermes/.playwright
|
|
87
|
+
RUN if [ -f package.json ]; then \
|
|
88
|
+
npm install --omit=dev --prefer-offline --no-audit --no-fund ; \
|
|
89
|
+
fi && \
|
|
90
|
+
npx --yes --package=playwright playwright install chromium --only-shell && \
|
|
91
|
+
if [ -f web/package.json ]; then \
|
|
92
|
+
(cd web && npm install --prefer-offline --no-audit --no-fund && npm run build) && \
|
|
93
|
+
rm -rf web/node_modules ; \
|
|
94
|
+
fi && \
|
|
95
|
+
npm cache clean --force
|
|
96
|
+
|
|
97
|
+
RUN rm -rf /root/.cache /tmp/* .git .github website tests .pytest_cache .mypy_cache .ruff_cache && \
|
|
98
|
+
find /opt/hermes -type d -name "__pycache__" -prune -exec rm -rf {} + && \
|
|
99
|
+
find /opt/hermes -type f \( -name "*.pyc" -o -name "*.pyo" \) -delete
|
|
100
|
+
|
|
101
|
+
FROM ${BASE_IMAGE}
|
|
102
|
+
|
|
103
|
+
ENV DEBIAN_FRONTEND=noninteractive \
|
|
104
|
+
HERMES_HOME=/opt/data \
|
|
105
|
+
PATH=/opt/hermes/.venv/bin:${PATH} \
|
|
106
|
+
PIP_DISABLE_PIP_VERSION_CHECK=1 \
|
|
107
|
+
PLAYWRIGHT_BROWSERS_PATH=/opt/hermes/.playwright \
|
|
108
|
+
PYTHONDONTWRITEBYTECODE=1
|
|
109
|
+
|
|
110
|
+
#
|
|
111
|
+
# The headless Chromium binary itself rides in from the builder stage
|
|
112
|
+
# (see PLAYWRIGHT_BROWSERS_PATH above). What the final stage adds is:
|
|
113
|
+
#
|
|
114
|
+
# • Chromium runtime libs: the 17 .so dependencies headless_shell
|
|
115
|
+
# dynamically links against. Same set that
|
|
116
|
+
# `playwright install --with-deps chromium` would pull in on
|
|
117
|
+
# Debian 12 — explicit here so the diff is auditable.
|
|
118
|
+
# • curl: `hermes auth login` device-code OAuth flow + ad-hoc HTTP.
|
|
119
|
+
# • poppler-utils: pdftotext / pdfinfo back Hermes's PDF readers.
|
|
120
|
+
#
|
|
121
|
+
# Note: capability-specific Python packages (python-pptx, weasyprint,
|
|
122
|
+
# pillow, xlsxwriter, qrcode, dingtalk SDK, …) are NOT baked in —
|
|
123
|
+
# users `pip install --user` them on demand via the `terminal` tool.
|
|
124
|
+
# Same for `whatsapp-bridge`, which our panel's channel plugins don't
|
|
125
|
+
# rely on.
|
|
126
|
+
#
|
|
127
|
+
RUN apt-get update && apt-get install -y --no-install-recommends \
|
|
128
|
+
bash \
|
|
129
|
+
ca-certificates \
|
|
130
|
+
curl \
|
|
131
|
+
ffmpeg \
|
|
132
|
+
fonts-liberation \
|
|
133
|
+
git \
|
|
134
|
+
gosu \
|
|
135
|
+
libasound2 \
|
|
136
|
+
libatk1.0-0 \
|
|
137
|
+
libatk-bridge2.0-0 \
|
|
138
|
+
libatspi2.0-0 \
|
|
139
|
+
libcairo2 \
|
|
140
|
+
libcups2 \
|
|
141
|
+
libdbus-1-3 \
|
|
142
|
+
libdrm2 \
|
|
143
|
+
libgbm1 \
|
|
144
|
+
libnspr4 \
|
|
145
|
+
libnss3 \
|
|
146
|
+
libpango-1.0-0 \
|
|
147
|
+
libx11-6 \
|
|
148
|
+
libxcb1 \
|
|
149
|
+
libxcomposite1 \
|
|
150
|
+
libxdamage1 \
|
|
151
|
+
libxext6 \
|
|
152
|
+
libxfixes3 \
|
|
153
|
+
libxkbcommon0 \
|
|
154
|
+
libxrandr2 \
|
|
155
|
+
poppler-utils \
|
|
156
|
+
procps \
|
|
157
|
+
python3 \
|
|
158
|
+
python3-venv \
|
|
159
|
+
ripgrep && \
|
|
160
|
+
ln -sf /usr/bin/python3 /usr/local/bin/python && \
|
|
161
|
+
rm -rf /var/lib/apt/lists/*
|
|
162
|
+
|
|
163
|
+
RUN usermod -l hermes -d /home/hermes -m node && \
|
|
164
|
+
groupmod -n hermes node
|
|
165
|
+
|
|
166
|
+
COPY --chown=hermes:hermes --from=builder /opt/hermes /opt/hermes
|
|
167
|
+
|
|
168
|
+
WORKDIR /opt/hermes
|
|
169
|
+
|
|
170
|
+
RUN mkdir -p /opt/data && \
|
|
171
|
+
chown -R hermes:hermes /opt/data /home/hermes
|
|
172
|
+
|
|
173
|
+
# Bake the jishushell orchestration shim into the image. The panel used
|
|
174
|
+
# to bind-mount this from ~/.jishushell/runtimes/hermes/ but that coupled
|
|
175
|
+
# instance startup to a host file outside the instance dir. Baking it in
|
|
176
|
+
# keeps all runtime-critical assets inside the image, and the LABEL below
|
|
177
|
+
# lets the panel detect whether a pulled image actually has it.
|
|
178
|
+
COPY templates/hermes-entrypoint.sh /usr/local/bin/jishushell-hermes-entry.sh
|
|
179
|
+
RUN chmod 0755 /usr/local/bin/jishushell-hermes-entry.sh
|
|
180
|
+
|
|
181
|
+
# Advertise the protocol contract this image satisfies. The panel reads
|
|
182
|
+
# this label via `docker inspect` before launching an instance; a panel
|
|
183
|
+
# that only knows protocol version N refuses to start an image that
|
|
184
|
+
# declares N+1, which is how we gate rolling upgrades without silent
|
|
185
|
+
# behavioral drift.
|
|
186
|
+
LABEL runtime.protocol.version="1"
|
|
187
|
+
|
|
188
|
+
# Zombie reaping is handled by Nomad's `init: true` flag (docker-init
|
|
189
|
+
# becomes PID 1 regardless of this image's entrypoint — see the hermes
|
|
190
|
+
# adapter's docker Config). We deliberately leave ENTRYPOINT unset so
|
|
191
|
+
# anyone running this image directly with `docker run --init` gets the
|
|
192
|
+
# same guarantee without surprise.
|
|
193
|
+
CMD ["hermes", "--help"]
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
id: hermes-container
|
|
2
|
+
name: Hermes Agent
|
|
3
|
+
version: "1.0.0"
|
|
4
|
+
jishushell:
|
|
5
|
+
min_version: "0.4.24"
|
|
6
|
+
agentType: hermes
|
|
7
|
+
description: "Hermes Agent 容器运行时,使用 apps 目录作为统一安装根"
|
|
8
|
+
singleInstance: false
|
|
9
|
+
|
|
10
|
+
tasks:
|
|
11
|
+
- name: gateway
|
|
12
|
+
role: service
|
|
13
|
+
runtime: container
|
|
14
|
+
image: "ghcr.io/x-aijishu/hermes-runtime:latest"
|
|
15
|
+
command: "/bin/bash"
|
|
16
|
+
args: ["/usr/local/bin/jishushell-hermes-entry.sh", "gateway", "run"]
|
|
17
|
+
env:
|
|
18
|
+
API_SERVER_ENABLED: "true"
|
|
19
|
+
API_SERVER_HOST: "0.0.0.0"
|
|
20
|
+
API_SERVER_PORT: "8642"
|
|
21
|
+
resources:
|
|
22
|
+
cpu: "1000m"
|
|
23
|
+
memory: "1024Mi"
|
|
24
|
+
ports:
|
|
25
|
+
- name: gateway
|
|
26
|
+
port: 8642
|
|
27
|
+
visibility: external
|
|
28
|
+
health:
|
|
29
|
+
http:
|
|
30
|
+
path: /health
|
|
31
|
+
port: 8642
|
|
32
|
+
interval: "15s"
|
|
33
|
+
timeout: "5s"
|
|
34
|
+
retries: 3
|
|
35
|
+
start_period: "30s"
|
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
id: ollama-binary
|
|
2
|
+
name: Ollama
|
|
3
|
+
version: "1.0.0"
|
|
4
|
+
jishushell:
|
|
5
|
+
min_version: "0.4.24"
|
|
6
|
+
description: "通过官方脚本,安装并运行Ollama"
|
|
7
|
+
singleInstance: true
|
|
8
|
+
|
|
9
|
+
tasks:
|
|
10
|
+
- name: gateway
|
|
11
|
+
role: service
|
|
12
|
+
runtime: process
|
|
13
|
+
command: /usr/local/bin/ollama
|
|
14
|
+
args: ["serve"]
|
|
15
|
+
env:
|
|
16
|
+
OLLAMA_HOST: "0.0.0.0:11434"
|
|
17
|
+
resources:
|
|
18
|
+
cpu: "2000m"
|
|
19
|
+
memory: "4096Mi"
|
|
20
|
+
ports:
|
|
21
|
+
- name: gateway
|
|
22
|
+
port: 11434
|
|
23
|
+
visibility: external
|
|
24
|
+
health:
|
|
25
|
+
http:
|
|
26
|
+
path: /api/version
|
|
27
|
+
port: 11434
|
|
28
|
+
interval: "15s"
|
|
29
|
+
timeout: "5s"
|
|
30
|
+
retries: 3
|
|
31
|
+
start_period: "30s"
|
|
32
|
+
|
|
33
|
+
provides:
|
|
34
|
+
- capability: "ollama-terminal"
|
|
35
|
+
protocol: "terminal"
|
|
36
|
+
description: "Ollama快速终端,可直接执行 ollama 命令"
|
|
37
|
+
terminal:
|
|
38
|
+
command: ["ollama"]
|
|
39
|
+
task: "gateway"
|
|
40
|
+
prompt: "ollama"
|
|
41
|
+
welcome: "输入 list / ps / pull / run 等命令开始;终端会自动补齐前缀 ollama。"
|
|
42
|
+
commands:
|
|
43
|
+
recommend:
|
|
44
|
+
- "pull qwen3.5:0.8b"
|
|
45
|
+
- "pull qwen3.6:35b"
|
|
46
|
+
- "pull gemma4:26b"
|
|
47
|
+
- "pull gemma4:e4b"
|
|
48
|
+
- "pull gemma4:e2b"
|
|
49
|
+
others:
|
|
50
|
+
- cmd: "show"
|
|
51
|
+
description: "Show information for a model"
|
|
52
|
+
- cmd: "stop"
|
|
53
|
+
description: "Stop a running model"
|
|
54
|
+
- cmd: "pull"
|
|
55
|
+
description: "Pull a model from a registry"
|
|
56
|
+
- cmd: "list"
|
|
57
|
+
description: "List models"
|
|
58
|
+
- cmd: "ps"
|
|
59
|
+
description: "List running models"
|
|
60
|
+
- cmd: "rm"
|
|
61
|
+
description: "Remove a model"
|
|
62
|
+
- cmd: "help"
|
|
63
|
+
description: "Help about any command"
|
|
64
|
+
- capability: "ollama-api"
|
|
65
|
+
port: 11434
|
|
66
|
+
description: "Ollama HTTP API,兼容 OpenAI /v1/chat/completions 端点"
|
|
67
|
+
|
|
68
|
+
lifecycle:
|
|
69
|
+
pre_install:
|
|
70
|
+
- run: >-
|
|
71
|
+
if ! command -v ollama >/dev/null 2>&1; then
|
|
72
|
+
echo "未检测到 ollama 命令,将通过官方脚本安装 Ollama..." >&2;
|
|
73
|
+
else
|
|
74
|
+
echo "检测到系统中已安装 ollama,跳过安装步骤,直接使用系统版本。" >&2;
|
|
75
|
+
fi;
|
|
76
|
+
install:
|
|
77
|
+
- run: >-
|
|
78
|
+
if ! command -v ollama >/dev/null 2>&1; then
|
|
79
|
+
echo "未检测到 ollama,开始安装..." >&2;
|
|
80
|
+
if [ "$(id -u)" -ne 0 ]; then
|
|
81
|
+
if ! command -v sudo >/dev/null 2>&1; then
|
|
82
|
+
echo "未检测到 sudo,当前环境无法自动安装 Ollama。请以 root 身份重试。" >&2;
|
|
83
|
+
exit 1;
|
|
84
|
+
fi;
|
|
85
|
+
if [ -n "${JISHUSHELL_SUDO_ASKPASS:-}" ]; then
|
|
86
|
+
sudo_probe_output="$(sudo -k -A true 2>&1)" || {
|
|
87
|
+
if printf '%s\n' "$sudo_probe_output" | grep -qi "no new privileges"; then
|
|
88
|
+
echo "当前运行环境禁止 sudo 提权(no new privileges),无法自动安装 Ollama。请在系统终端手动安装,或调整容器/服务配置后重试。" >&2;
|
|
89
|
+
else
|
|
90
|
+
echo "提供的 sudo 密码无效,无法安装 Ollama。" >&2;
|
|
91
|
+
fi;
|
|
92
|
+
exit 1;
|
|
93
|
+
};
|
|
94
|
+
run_as_root() { sudo -A "$@"; };
|
|
95
|
+
else
|
|
96
|
+
sudo_probe_output="$(sudo -n true 2>&1)" || {
|
|
97
|
+
if printf '%s\n' "$sudo_probe_output" | grep -qi "no new privileges"; then
|
|
98
|
+
echo "当前运行环境禁止 sudo 提权(no new privileges),无法自动安装 Ollama。请在系统终端手动安装,或调整容器/服务配置后重试。" >&2;
|
|
99
|
+
else
|
|
100
|
+
echo "安装 Ollama 需要 sudo 密码;请在页面弹窗中输入后重试。" >&2;
|
|
101
|
+
fi;
|
|
102
|
+
exit 1;
|
|
103
|
+
};
|
|
104
|
+
run_as_root() { sudo -n "$@"; };
|
|
105
|
+
fi;
|
|
106
|
+
else
|
|
107
|
+
run_as_root() { "$@"; };
|
|
108
|
+
fi;
|
|
109
|
+
for BINDIR in /usr/local/bin /usr/bin /bin; do
|
|
110
|
+
echo "$PATH" | grep -q "$BINDIR" && break || continue;
|
|
111
|
+
done;
|
|
112
|
+
OLLAMA_INSTALL_DIR="$(dirname "${BINDIR:-/usr/local/bin}")";
|
|
113
|
+
if [ -d "$OLLAMA_INSTALL_DIR/lib/ollama" ]; then
|
|
114
|
+
old_dir="$OLLAMA_INSTALL_DIR/lib/ollama.jishushell-old-$(date +%s)";
|
|
115
|
+
echo "检测到旧版 Ollama 目录,先移动到 $old_dir 以避免长时间卡在清理步骤..." >&2;
|
|
116
|
+
run_as_root mv "$OLLAMA_INSTALL_DIR/lib/ollama" "$old_dir";
|
|
117
|
+
( run_as_root rm -rf "$old_dir" >/dev/null 2>&1 || true ) &
|
|
118
|
+
fi;
|
|
119
|
+
curl -fsSL https://ollama.com/install.sh | run_as_root sh;
|
|
120
|
+
else
|
|
121
|
+
echo "检测到系统中已安装 ollama,跳过二进制安装。" >&2;
|
|
122
|
+
fi
|
|
123
|
+
timeout_ms: 900000
|
|
124
|
+
successIfCommandExists: "ollama"
|
|
125
|
+
- run: >-
|
|
126
|
+
case "$(uname -s)" in
|
|
127
|
+
Linux)
|
|
128
|
+
if command -v systemctl >/dev/null 2>&1 && systemctl list-unit-files ollama.service >/dev/null 2>&1; then
|
|
129
|
+
echo "停止并禁用 ollama.service,后续交由 Nomad 管理..." >&2;
|
|
130
|
+
if [ "$(id -u)" -eq 0 ]; then
|
|
131
|
+
run_as_root() { "$@"; };
|
|
132
|
+
elif [ -n "${JISHUSHELL_SUDO_ASKPASS:-}" ]; then
|
|
133
|
+
sudo_probe_output="$(sudo -k -A true 2>&1)" || {
|
|
134
|
+
if printf '%s\n' "$sudo_probe_output" | grep -qi "no new privileges"; then
|
|
135
|
+
echo "当前运行环境禁止 sudo 提权(no new privileges),无法清理 ollama.service。请在系统终端手动执行后重试。" >&2;
|
|
136
|
+
else
|
|
137
|
+
echo "提供的 sudo 密码无效,无法清理 ollama.service。" >&2;
|
|
138
|
+
fi;
|
|
139
|
+
exit 1;
|
|
140
|
+
};
|
|
141
|
+
run_as_root() { sudo -A "$@"; };
|
|
142
|
+
elif command -v sudo >/dev/null 2>&1; then
|
|
143
|
+
run_as_root() { sudo -n "$@"; };
|
|
144
|
+
else
|
|
145
|
+
run_as_root() { "$@"; };
|
|
146
|
+
fi;
|
|
147
|
+
run_as_root systemctl disable --now ollama;
|
|
148
|
+
else
|
|
149
|
+
echo "Linux 环境未检测到 ollama.service,跳过 systemd 清理。" >&2;
|
|
150
|
+
fi
|
|
151
|
+
;;
|
|
152
|
+
Darwin)
|
|
153
|
+
echo "macOS 环境尝试关闭 Ollama 自启与正在运行的进程..." >&2;
|
|
154
|
+
if command -v launchctl >/dev/null 2>&1; then
|
|
155
|
+
launchctl bootout "gui/$(id -u)"/com.ollama.ollama 2>/dev/null || true;
|
|
156
|
+
launchctl disable "gui/$(id -u)/com.ollama.ollama" 2>/dev/null || true;
|
|
157
|
+
fi;
|
|
158
|
+
osascript -e 'tell application "Ollama" to quit' >/dev/null 2>&1 || true;
|
|
159
|
+
pkill -TERM -x ollama 2>/dev/null || true;
|
|
160
|
+
pkill -TERM -x Ollama 2>/dev/null || true
|
|
161
|
+
;;
|
|
162
|
+
*)
|
|
163
|
+
echo "当前平台不支持自动清理 Ollama 自启,跳过。" >&2
|
|
164
|
+
;;
|
|
165
|
+
esac
|
|
166
|
+
|
|
167
|
+
uninstall:
|
|
168
|
+
- run: >-
|
|
169
|
+
if [ "$(id -u)" -ne 0 ]; then
|
|
170
|
+
if ! command -v sudo >/dev/null 2>&1; then
|
|
171
|
+
echo "当前环境未检测到 sudo,无法卸载 Ollama。请以 root 身份重试。" >&2;
|
|
172
|
+
exit 1;
|
|
173
|
+
fi;
|
|
174
|
+
if [ -n "${JISHUSHELL_SUDO_ASKPASS:-}" ]; then
|
|
175
|
+
sudo_probe_output="$(sudo -k -A true 2>&1)" || {
|
|
176
|
+
if printf '%s\n' "$sudo_probe_output" | grep -qi "no new privileges"; then
|
|
177
|
+
echo "当前运行环境禁止 sudo 提权(no new privileges),无法卸载 Ollama。请在系统终端手动执行,或调整容器/服务配置后重试。" >&2;
|
|
178
|
+
else
|
|
179
|
+
echo "提供的 sudo 密码无效,无法卸载 Ollama。" >&2;
|
|
180
|
+
fi;
|
|
181
|
+
exit 1;
|
|
182
|
+
};
|
|
183
|
+
run_as_root() { sudo -A "$@"; };
|
|
184
|
+
else
|
|
185
|
+
sudo_probe_output="$(sudo -n true 2>&1)" || {
|
|
186
|
+
if printf '%s\n' "$sudo_probe_output" | grep -qi "no new privileges"; then
|
|
187
|
+
echo "当前运行环境禁止 sudo 提权(no new privileges),无法卸载 Ollama。请在系统终端手动执行,或调整容器/服务配置后重试。" >&2;
|
|
188
|
+
else
|
|
189
|
+
echo "卸载 Ollama 需要 sudo 密码;请在页面弹窗中输入后重试。" >&2;
|
|
190
|
+
fi;
|
|
191
|
+
exit 1;
|
|
192
|
+
};
|
|
193
|
+
run_as_root() { sudo -n "$@"; };
|
|
194
|
+
fi;
|
|
195
|
+
else
|
|
196
|
+
run_as_root() { "$@"; };
|
|
197
|
+
fi;
|
|
198
|
+
run_as_root rm -f /usr/local/bin/ollama /usr/bin/ollama /bin/ollama;
|
|
199
|
+
run_as_root rm -rf /usr/local/lib/ollama /usr/lib/ollama /usr/share/ollama 2>/dev/null || true
|
|
200
|
+
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
id: ollama-cpu-docker
|
|
2
|
+
name: Ollama CPU(Docker)
|
|
3
|
+
version: "1.0.0"
|
|
4
|
+
jishushell:
|
|
5
|
+
min_version: "0.4.24"
|
|
6
|
+
description: "使用 alpine/ollama 镜像运行的纯 CPU 版 Ollama"
|
|
7
|
+
singleInstance: true
|
|
8
|
+
|
|
9
|
+
tasks:
|
|
10
|
+
- name: gateway
|
|
11
|
+
role: service
|
|
12
|
+
runtime: container
|
|
13
|
+
image: "alpine/ollama:latest"
|
|
14
|
+
env:
|
|
15
|
+
OLLAMA_HOST: "0.0.0.0:11434"
|
|
16
|
+
volumes:
|
|
17
|
+
- source: "~/.ollama"
|
|
18
|
+
target: "/root/.ollama"
|
|
19
|
+
resources:
|
|
20
|
+
cpu: "2000m"
|
|
21
|
+
memory: "4096Mi"
|
|
22
|
+
ports:
|
|
23
|
+
- name: gateway
|
|
24
|
+
port: 11434
|
|
25
|
+
health:
|
|
26
|
+
http:
|
|
27
|
+
path: /api/version
|
|
28
|
+
port: 11434
|
|
29
|
+
interval: "15s"
|
|
30
|
+
timeout: "5s"
|
|
31
|
+
retries: 3
|
|
32
|
+
start_period: "30s"
|
|
33
|
+
|
|
34
|
+
provides:
|
|
35
|
+
- capability: "ollama-api"
|
|
36
|
+
port: 11434
|
|
37
|
+
description: "Ollama HTTP API,兼容 OpenAI /v1/chat/completions 端点"
|
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
id: ollama-with-hollama-binary
|
|
2
|
+
name: Ollama
|
|
3
|
+
version: "1.0.0"
|
|
4
|
+
jishushell:
|
|
5
|
+
min_version: "0.4.24"
|
|
6
|
+
description: "通过官方脚本安装并运行 Ollama,同时提供 Hollama Web UI。"
|
|
7
|
+
singleInstance: true
|
|
8
|
+
|
|
9
|
+
tasks:
|
|
10
|
+
- name: gateway
|
|
11
|
+
role: service
|
|
12
|
+
runtime: process
|
|
13
|
+
command: /usr/local/bin/ollama
|
|
14
|
+
args: ["serve"]
|
|
15
|
+
env:
|
|
16
|
+
OLLAMA_HOST: "0.0.0.0:11434"
|
|
17
|
+
resources:
|
|
18
|
+
cpu: "2000m"
|
|
19
|
+
memory: "4096Mi"
|
|
20
|
+
ports:
|
|
21
|
+
- name: gateway
|
|
22
|
+
port: 11434
|
|
23
|
+
visibility: external
|
|
24
|
+
health:
|
|
25
|
+
http:
|
|
26
|
+
path: /api/version
|
|
27
|
+
port: 11434
|
|
28
|
+
interval: "15s"
|
|
29
|
+
timeout: "5s"
|
|
30
|
+
retries: 3
|
|
31
|
+
start_period: "30s"
|
|
32
|
+
|
|
33
|
+
- name: hollama
|
|
34
|
+
role: sidecar
|
|
35
|
+
runtime: container
|
|
36
|
+
image: "ghcr.io/fmaclen/hollama:latest"
|
|
37
|
+
resources:
|
|
38
|
+
cpu: "500m"
|
|
39
|
+
memory: "512Mi"
|
|
40
|
+
ports:
|
|
41
|
+
- name: webui
|
|
42
|
+
port: 4173
|
|
43
|
+
visibility: external
|
|
44
|
+
health:
|
|
45
|
+
http:
|
|
46
|
+
path: /
|
|
47
|
+
port: 4173
|
|
48
|
+
interval: "15s"
|
|
49
|
+
timeout: "5s"
|
|
50
|
+
retries: 6
|
|
51
|
+
start_period: "30s"
|
|
52
|
+
|
|
53
|
+
provides:
|
|
54
|
+
- capability: "hollama-web"
|
|
55
|
+
port: 4173
|
|
56
|
+
protocol: "http"
|
|
57
|
+
description: "Hollama Web 界面"
|
|
58
|
+
- capability: "ollama-api"
|
|
59
|
+
port: 11434
|
|
60
|
+
protocol: "http"
|
|
61
|
+
description: "Ollama HTTP API,兼容 OpenAI /v1/chat/completions 端点"
|
|
62
|
+
|
|
63
|
+
lifecycle:
|
|
64
|
+
pre_install:
|
|
65
|
+
- run: >-
|
|
66
|
+
if ! command -v ollama >/dev/null 2>&1; then
|
|
67
|
+
echo "未检测到 ollama 命令,将通过官方脚本安装 Ollama..." >&2;
|
|
68
|
+
else
|
|
69
|
+
echo "检测到系统中已安装 ollama,跳过安装步骤,直接使用系统版本。" >&2;
|
|
70
|
+
fi;
|
|
71
|
+
install:
|
|
72
|
+
- downloadImage: "ghcr.io/fmaclen/hollama:latest"
|
|
73
|
+
- run: >-
|
|
74
|
+
if ! command -v ollama >/dev/null 2>&1; then
|
|
75
|
+
echo "未检测到 ollama,开始安装..." >&2;
|
|
76
|
+
if [ "$(id -u)" -ne 0 ]; then
|
|
77
|
+
if ! command -v sudo >/dev/null 2>&1; then
|
|
78
|
+
echo "未检测到 sudo,当前环境无法自动安装 Ollama。请以 root 身份重试。" >&2;
|
|
79
|
+
exit 1;
|
|
80
|
+
fi;
|
|
81
|
+
if [ -n "${JISHUSHELL_SUDO_ASKPASS:-}" ]; then
|
|
82
|
+
sudo_probe_output="$(sudo -A true 2>&1)" || {
|
|
83
|
+
if printf '%s\n' "$sudo_probe_output" | grep -qi "no new privileges"; then
|
|
84
|
+
echo "当前运行环境禁止 sudo 提权(no new privileges),无法自动安装 Ollama。请在系统终端手动安装,或调整容器/服务配置后重试。" >&2;
|
|
85
|
+
else
|
|
86
|
+
echo "提供的 sudo 密码无效,无法安装 Ollama。" >&2;
|
|
87
|
+
fi;
|
|
88
|
+
exit 1;
|
|
89
|
+
};
|
|
90
|
+
run_as_root() { sudo -A "$@"; };
|
|
91
|
+
else
|
|
92
|
+
sudo_probe_output="$(sudo -n true 2>&1)" || {
|
|
93
|
+
if printf '%s\n' "$sudo_probe_output" | grep -qi "no new privileges"; then
|
|
94
|
+
echo "当前运行环境禁止 sudo 提权(no new privileges),无法自动安装 Ollama。请在系统终端手动安装,或调整容器/服务配置后重试。" >&2;
|
|
95
|
+
else
|
|
96
|
+
echo "安装 Ollama 需要 sudo 密码;请在页面弹窗中输入后重试。" >&2;
|
|
97
|
+
fi;
|
|
98
|
+
exit 1;
|
|
99
|
+
};
|
|
100
|
+
run_as_root() { sudo -n "$@"; };
|
|
101
|
+
fi;
|
|
102
|
+
else
|
|
103
|
+
run_as_root() { "$@"; };
|
|
104
|
+
fi;
|
|
105
|
+
for BINDIR in /usr/local/bin /usr/bin /bin; do
|
|
106
|
+
echo "$PATH" | grep -q "$BINDIR" && break || continue;
|
|
107
|
+
done;
|
|
108
|
+
OLLAMA_INSTALL_DIR="$(dirname "${BINDIR:-/usr/local/bin}")";
|
|
109
|
+
if [ -d "$OLLAMA_INSTALL_DIR/lib/ollama" ]; then
|
|
110
|
+
old_dir="$OLLAMA_INSTALL_DIR/lib/ollama.jishushell-old-$(date +%s)";
|
|
111
|
+
echo "检测到旧版 Ollama 目录,先移动到 $old_dir 以避免长时间卡在清理步骤..." >&2;
|
|
112
|
+
run_as_root mv "$OLLAMA_INSTALL_DIR/lib/ollama" "$old_dir";
|
|
113
|
+
( run_as_root rm -rf "$old_dir" >/dev/null 2>&1 || true ) &
|
|
114
|
+
fi;
|
|
115
|
+
curl -fsSL https://ollama.com/install.sh | run_as_root sh;
|
|
116
|
+
else
|
|
117
|
+
echo "检测到系统中已安装 ollama,跳过二进制安装。" >&2;
|
|
118
|
+
fi
|
|
119
|
+
timeout_ms: 900000
|
|
120
|
+
successIfCommandExists: "ollama"
|
|
121
|
+
- run: >-
|
|
122
|
+
case "$(uname -s)" in
|
|
123
|
+
Linux)
|
|
124
|
+
if command -v systemctl >/dev/null 2>&1 && systemctl list-unit-files ollama.service >/dev/null 2>&1; then
|
|
125
|
+
echo "停止并禁用 ollama.service,后续交由 Nomad 管理..." >&2;
|
|
126
|
+
if [ "$(id -u)" -eq 0 ]; then
|
|
127
|
+
run_as_root() { "$@"; };
|
|
128
|
+
elif [ -n "${JISHUSHELL_SUDO_ASKPASS:-}" ]; then
|
|
129
|
+
sudo_probe_output="$(sudo -A true 2>&1)" || {
|
|
130
|
+
if printf '%s\n' "$sudo_probe_output" | grep -qi "no new privileges"; then
|
|
131
|
+
echo "当前运行环境禁止 sudo 提权(no new privileges),无法清理 ollama.service。请在系统终端手动执行后重试。" >&2;
|
|
132
|
+
else
|
|
133
|
+
echo "提供的 sudo 密码无效,无法清理 ollama.service。" >&2;
|
|
134
|
+
fi;
|
|
135
|
+
exit 1;
|
|
136
|
+
};
|
|
137
|
+
run_as_root() { sudo -A "$@"; };
|
|
138
|
+
elif command -v sudo >/dev/null 2>&1; then
|
|
139
|
+
run_as_root() { sudo -n "$@"; };
|
|
140
|
+
else
|
|
141
|
+
run_as_root() { "$@"; };
|
|
142
|
+
fi;
|
|
143
|
+
run_as_root systemctl disable --now ollama;
|
|
144
|
+
else
|
|
145
|
+
echo "Linux 环境未检测到 ollama.service,跳过 systemd 清理。" >&2;
|
|
146
|
+
fi
|
|
147
|
+
;;
|
|
148
|
+
Darwin)
|
|
149
|
+
echo "macOS 环境尝试关闭 Ollama 自启与正在运行的进程..." >&2;
|
|
150
|
+
if command -v launchctl >/dev/null 2>&1; then
|
|
151
|
+
launchctl bootout "gui/$(id -u)"/com.ollama.ollama 2>/dev/null || true;
|
|
152
|
+
launchctl disable "gui/$(id -u)/com.ollama.ollama" 2>/dev/null || true;
|
|
153
|
+
fi;
|
|
154
|
+
osascript -e 'tell application "Ollama" to quit' >/dev/null 2>&1 || true;
|
|
155
|
+
pkill -TERM -x ollama 2>/dev/null || true;
|
|
156
|
+
pkill -TERM -x Ollama 2>/dev/null || true
|
|
157
|
+
;;
|
|
158
|
+
*)
|
|
159
|
+
echo "当前平台不支持自动清理 Ollama 自启,跳过。" >&2
|
|
160
|
+
;;
|
|
161
|
+
esac
|
|
162
|
+
|
|
163
|
+
uninstall:
|
|
164
|
+
- run: >-
|
|
165
|
+
if [ "$(id -u)" -ne 0 ]; then
|
|
166
|
+
if ! command -v sudo >/dev/null 2>&1; then
|
|
167
|
+
echo "当前环境未检测到 sudo,无法卸载 Ollama。请以 root 身份重试。" >&2;
|
|
168
|
+
exit 1;
|
|
169
|
+
fi;
|
|
170
|
+
if [ -n "${JISHUSHELL_SUDO_ASKPASS:-}" ]; then
|
|
171
|
+
sudo_probe_output="$(sudo -A true 2>&1)" || {
|
|
172
|
+
if printf '%s\n' "$sudo_probe_output" | grep -qi "no new privileges"; then
|
|
173
|
+
echo "当前运行环境禁止 sudo 提权(no new privileges),无法卸载 Ollama。请在系统终端手动执行,或调整容器/服务配置后重试。" >&2;
|
|
174
|
+
else
|
|
175
|
+
echo "提供的 sudo 密码无效,无法卸载 Ollama。" >&2;
|
|
176
|
+
fi;
|
|
177
|
+
exit 1;
|
|
178
|
+
};
|
|
179
|
+
run_as_root() { sudo -A "$@"; };
|
|
180
|
+
else
|
|
181
|
+
sudo_probe_output="$(sudo -n true 2>&1)" || {
|
|
182
|
+
if printf '%s\n' "$sudo_probe_output" | grep -qi "no new privileges"; then
|
|
183
|
+
echo "当前运行环境禁止 sudo 提权(no new privileges),无法卸载 Ollama。请在系统终端手动执行,或调整容器/服务配置后重试。" >&2;
|
|
184
|
+
else
|
|
185
|
+
echo "卸载 Ollama 需要 sudo 密码;请在页面弹窗中输入后重试。" >&2;
|
|
186
|
+
fi;
|
|
187
|
+
exit 1;
|
|
188
|
+
};
|
|
189
|
+
run_as_root() { sudo -n "$@"; };
|
|
190
|
+
fi;
|
|
191
|
+
else
|
|
192
|
+
run_as_root() { "$@"; };
|
|
193
|
+
fi;
|
|
194
|
+
run_as_root rm -f /usr/local/bin/ollama /usr/bin/ollama /bin/ollama;
|
|
195
|
+
run_as_root rm -rf /usr/local/lib/ollama /usr/lib/ollama /usr/share/ollama 2>/dev/null || true
|