jishushell 0.6.18 → 0.7.3
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/apps/anythingllm-container.yaml +1 -0
- package/apps/browserless-chromium-container.yaml +1 -0
- package/apps/filebrowser-container.yaml +1 -0
- package/apps/hermes-container.yaml +1 -7
- package/apps/immich-container-lite.yaml +337 -0
- package/apps/immich-container.yaml +371 -0
- package/apps/jishu-kb-container.yaml +26 -21
- package/apps/ollama-binary.yaml +1 -0
- package/apps/ollama-cpu-container.yaml +1 -0
- package/apps/ollama-with-hollama-binary.yaml +2 -0
- package/apps/openclaw-binary.yaml +4 -8
- package/apps/openclaw-container.yaml +1 -7
- package/apps/openclaw-with-ollama-container.yaml +1 -0
- package/apps/openclaw-with-searxng-container.yaml +20 -0
- package/apps/searxng-container.yaml +20 -0
- package/apps/weknora-container.yaml +5 -0
- package/dependencies/jishushell-panel-0.7.3.tgz +0 -0
- package/dist/cli/core.js +1 -1
- package/dist/cli/core.js.map +1 -1
- package/dist/cli/doctor.js +96 -0
- package/dist/cli/doctor.js.map +1 -1
- package/dist/config.d.ts +9 -1
- package/dist/config.js +72 -2
- package/dist/config.js.map +1 -1
- package/dist/install.js +60 -19
- package/dist/install.js.map +1 -1
- package/dist/routes/admin.d.ts +2 -0
- package/dist/routes/admin.js +72 -0
- package/dist/routes/admin.js.map +1 -0
- package/dist/routes/docker.d.ts +2 -0
- package/dist/routes/docker.js +58 -0
- package/dist/routes/docker.js.map +1 -0
- package/dist/routes/file-mounts.js +5 -8
- package/dist/routes/file-mounts.js.map +1 -1
- package/dist/routes/instances.d.ts +0 -14
- package/dist/routes/instances.js +44 -1184
- package/dist/routes/instances.js.map +1 -1
- package/dist/server.d.ts +6 -0
- package/dist/server.js +53 -20
- package/dist/server.js.map +1 -1
- package/dist/services/app-common/catalog-service.js +15 -5
- package/dist/services/app-common/catalog-service.js.map +1 -1
- package/dist/services/app-common/delete-service.js +5 -0
- package/dist/services/app-common/delete-service.js.map +1 -1
- package/dist/services/app-common/instance-store.js +3 -0
- package/dist/services/app-common/instance-store.js.map +1 -1
- package/dist/services/app-common/lifecycle-service.js +12 -4
- package/dist/services/app-common/lifecycle-service.js.map +1 -1
- package/dist/services/app-common/ownership.d.ts +3 -0
- package/dist/services/app-common/ownership.js +11 -0
- package/dist/services/app-common/ownership.js.map +1 -0
- package/dist/services/app-common/runtime-facts.js +2 -0
- package/dist/services/app-common/runtime-facts.js.map +1 -1
- package/dist/services/app-common/spec-materializer.d.ts +0 -1
- package/dist/services/app-common/spec-materializer.js +21 -87
- package/dist/services/app-common/spec-materializer.js.map +1 -1
- package/dist/services/app-common/status-refresh.js +25 -13
- package/dist/services/app-common/status-refresh.js.map +1 -1
- package/dist/services/app-modules/browserless/routes.js +5 -3
- package/dist/services/app-modules/browserless/routes.js.map +1 -1
- package/dist/services/capabilities/contract.d.ts +1 -2
- package/dist/services/capabilities/contract.js +0 -10
- package/dist/services/capabilities/contract.js.map +1 -1
- package/dist/services/capabilities/endpoint-validator.js +0 -1
- package/dist/services/capabilities/endpoint-validator.js.map +1 -1
- package/dist/services/capabilities/health.js +1 -1
- package/dist/services/capabilities/health.js.map +1 -1
- package/dist/services/capability-proxy/http.d.ts +7 -0
- package/dist/services/capability-proxy/http.js +555 -0
- package/dist/services/capability-proxy/http.js.map +1 -0
- package/dist/services/capability-proxy/terminal.d.ts +4 -0
- package/dist/services/capability-proxy/terminal.js +179 -0
- package/dist/services/capability-proxy/terminal.js.map +1 -0
- package/dist/services/connections/admin.js +19 -9
- package/dist/services/connections/admin.js.map +1 -1
- package/dist/services/connections/apply.d.ts +3 -9
- package/dist/services/connections/apply.js +0 -29
- package/dist/services/connections/apply.js.map +1 -1
- package/dist/services/connections/transactor.js +2 -2
- package/dist/services/connections/transactor.js.map +1 -1
- package/dist/services/files/bootstrap.d.ts +7 -0
- package/dist/services/files/bootstrap.js +16 -0
- package/dist/services/files/bootstrap.js.map +1 -0
- package/dist/services/files/photos/upload-page.d.ts +2 -0
- package/dist/services/files/photos/upload-page.js +248 -0
- package/dist/services/files/photos/upload-page.js.map +1 -0
- package/dist/services/files/photos/upload-store.d.ts +74 -0
- package/dist/services/files/photos/upload-store.js +432 -0
- package/dist/services/files/photos/upload-store.js.map +1 -0
- package/dist/services/http/proxy-utils.d.ts +7 -0
- package/dist/services/http/proxy-utils.js +29 -0
- package/dist/services/http/proxy-utils.js.map +1 -0
- package/dist/services/http/request-utils.d.ts +3 -0
- package/dist/services/http/request-utils.js +23 -0
- package/dist/services/http/request-utils.js.map +1 -0
- package/dist/services/instances/manager.d.ts +6 -5
- package/dist/services/instances/manager.js +45 -51
- package/dist/services/instances/manager.js.map +1 -1
- package/dist/services/instances/pairing.d.ts +17 -0
- package/dist/services/instances/pairing.js +53 -0
- package/dist/services/instances/pairing.js.map +1 -0
- package/dist/services/instances/status.d.ts +2 -0
- package/dist/services/instances/status.js +11 -0
- package/dist/services/instances/status.js.map +1 -0
- package/dist/services/integrations/hermes/integration.d.ts +1 -1
- package/dist/services/integrations/hermes/integration.js +7 -8
- package/dist/services/integrations/hermes/integration.js.map +1 -1
- package/dist/services/integrations/immich/client.d.ts +93 -0
- package/dist/services/integrations/immich/client.js +458 -0
- package/dist/services/integrations/immich/client.js.map +1 -0
- package/dist/services/integrations/immich/config.d.ts +15 -0
- package/dist/services/integrations/immich/config.js +178 -0
- package/dist/services/integrations/immich/config.js.map +1 -0
- package/dist/services/integrations/immich/discovery.d.ts +9 -0
- package/dist/services/integrations/immich/discovery.js +101 -0
- package/dist/services/integrations/immich/discovery.js.map +1 -0
- package/dist/services/integrations/immich/gallery-renderer.d.ts +5 -0
- package/dist/services/integrations/immich/gallery-renderer.js +150 -0
- package/dist/services/integrations/immich/gallery-renderer.js.map +1 -0
- package/dist/services/integrations/immich/immich-shim.d.ts +11 -0
- package/dist/services/integrations/immich/immich-shim.js +439 -0
- package/dist/services/integrations/immich/immich-shim.js.map +1 -0
- package/dist/services/integrations/immich/integration.d.ts +18 -0
- package/dist/services/integrations/immich/integration.js +64 -0
- package/dist/services/integrations/immich/integration.js.map +1 -0
- package/dist/services/integrations/immich/photo-library.d.ts +4 -0
- package/dist/services/integrations/immich/photo-library.js +63 -0
- package/dist/services/integrations/immich/photo-library.js.map +1 -0
- package/dist/services/integrations/immich/review-executor.d.ts +3 -0
- package/dist/services/integrations/immich/review-executor.js +41 -0
- package/dist/services/integrations/immich/review-executor.js.map +1 -0
- package/dist/services/integrations/immich/review-session-service.d.ts +27 -0
- package/dist/services/integrations/immich/review-session-service.js +206 -0
- package/dist/services/integrations/immich/review-session-service.js.map +1 -0
- package/dist/services/integrations/immich/review-store.d.ts +47 -0
- package/dist/services/integrations/immich/review-store.js +347 -0
- package/dist/services/integrations/immich/review-store.js.map +1 -0
- package/dist/services/integrations/immich/routes.d.ts +7 -0
- package/dist/services/integrations/immich/routes.js +363 -0
- package/dist/services/integrations/immich/routes.js.map +1 -0
- package/dist/services/integrations/immich/types.d.ts +186 -0
- package/dist/services/integrations/immich/types.js +2 -0
- package/dist/services/integrations/immich/types.js.map +1 -0
- package/dist/services/integrations/index.d.ts +1 -0
- package/dist/services/integrations/index.js +1 -0
- package/dist/services/integrations/index.js.map +1 -1
- package/dist/services/integrations/installable/installers/integration.js +113 -7
- package/dist/services/integrations/installable/installers/integration.js.map +1 -1
- package/dist/services/integrations/jishukb/integration.d.ts +3 -1
- package/dist/services/integrations/jishukb/integration.js +121 -10
- package/dist/services/integrations/jishukb/integration.js.map +1 -1
- package/dist/services/integrations/openclaw/integration.d.ts +21 -7
- package/dist/services/integrations/openclaw/integration.js +385 -158
- package/dist/services/integrations/openclaw/integration.js.map +1 -1
- package/dist/services/integrations/openclaw/jishukb-native-mcp.d.ts +58 -0
- package/dist/services/integrations/openclaw/jishukb-native-mcp.js +373 -0
- package/dist/services/integrations/openclaw/jishukb-native-mcp.js.map +1 -0
- package/dist/services/integrations/openclaw/jishukb-shim.d.ts +8 -4
- package/dist/services/integrations/openclaw/jishukb-shim.js +624 -17
- package/dist/services/integrations/openclaw/jishukb-shim.js.map +1 -1
- package/dist/services/integrations/openclaw/mcporter.d.ts +13 -0
- package/dist/services/integrations/openclaw/mcporter.js +31 -0
- package/dist/services/integrations/openclaw/mcporter.js.map +1 -1
- package/dist/services/integrations/openclaw/native-mcp.d.ts +48 -0
- package/dist/services/integrations/openclaw/native-mcp.js +125 -0
- package/dist/services/integrations/openclaw/native-mcp.js.map +1 -0
- package/dist/services/integrations/openclaw/routes.js +4 -1
- package/dist/services/integrations/openclaw/routes.js.map +1 -1
- package/dist/services/integrations/types.d.ts +5 -17
- package/dist/services/repair/runtime-repair.js +68 -1
- package/dist/services/repair/runtime-repair.js.map +1 -1
- package/dist/services/runtime/docker-network.d.ts +8 -0
- package/dist/services/runtime/docker-network.js +123 -0
- package/dist/services/runtime/docker-network.js.map +1 -0
- package/dist/services/runtime/driver-registry.d.ts +4 -0
- package/dist/services/runtime/driver-registry.js.map +1 -1
- package/dist/services/runtime/drivers/nomad.d.ts +1 -0
- package/dist/services/runtime/drivers/nomad.js +35 -5
- package/dist/services/runtime/drivers/nomad.js.map +1 -1
- package/dist/services/runtime/service-manager.d.ts +2 -0
- package/dist/services/runtime/service-manager.js +18 -0
- package/dist/services/runtime/service-manager.js.map +1 -0
- package/dist/services/runtime/types.d.ts +1 -0
- package/dist/services/runtime/workload-compiler.js +29 -4
- package/dist/services/runtime/workload-compiler.js.map +1 -1
- package/dist/services/setup/setup-manager.js +29 -73
- package/dist/services/setup/setup-manager.js.map +1 -1
- package/dist/services/system/runtime-ownership.d.ts +36 -0
- package/dist/services/system/runtime-ownership.js +250 -0
- package/dist/services/system/runtime-ownership.js.map +1 -0
- package/dist/services/system/system-reconciler.js +53 -0
- package/dist/services/system/system-reconciler.js.map +1 -1
- package/dist/types.d.ts +19 -3
- package/dist/utils/path-safety.js +1 -1
- package/dist/utils/service-user.d.ts +13 -0
- package/dist/utils/service-user.js +129 -0
- package/dist/utils/service-user.js.map +1 -0
- package/install/jishu-install.sh +0 -1
- package/node_modules/brace-expansion/dist/commonjs/index.js +24 -14
- package/node_modules/brace-expansion/dist/commonjs/index.js.map +1 -1
- package/node_modules/brace-expansion/dist/esm/index.js +24 -14
- package/node_modules/brace-expansion/dist/esm/index.js.map +1 -1
- package/node_modules/brace-expansion/package.json +2 -2
- package/node_modules/fast-uri/index.js +1 -1
- package/node_modules/fast-uri/package.json +1 -1
- package/node_modules/fast-uri/test/security.test.js +28 -0
- package/node_modules/fastify/SECURITY.md +1 -1
- package/node_modules/fastify/SPONSORS.md +6 -4
- package/node_modules/fastify/docs/Guides/Database.md +0 -28
- package/node_modules/fastify/docs/Guides/Ecosystem.md +13 -2
- package/node_modules/fastify/docs/Guides/Serverless.md +2 -2
- package/node_modules/fastify/docs/Guides/Write-Plugin.md +1 -1
- package/node_modules/fastify/docs/Reference/Encapsulation.md +27 -26
- package/node_modules/fastify/docs/Reference/Errors.md +10 -4
- package/node_modules/fastify/docs/Reference/HTTP2.md +10 -10
- package/node_modules/fastify/docs/Reference/Hooks.md +4 -4
- package/node_modules/fastify/docs/Reference/Index.md +14 -16
- package/node_modules/fastify/docs/Reference/LTS.md +12 -13
- package/node_modules/fastify/docs/Reference/Lifecycle.md +9 -8
- package/node_modules/fastify/docs/Reference/Logging.md +44 -39
- package/node_modules/fastify/docs/Reference/Middleware.md +21 -25
- package/node_modules/fastify/docs/Reference/Principles.md +2 -2
- package/node_modules/fastify/docs/Reference/Reply.md +6 -1
- package/node_modules/fastify/docs/Reference/Request.md +27 -16
- package/node_modules/fastify/docs/Reference/Routes.md +5 -2
- package/node_modules/fastify/docs/Reference/Server.md +31 -3
- package/node_modules/fastify/docs/Reference/Type-Providers.md +29 -5
- package/node_modules/fastify/docs/Reference/Validation-and-Serialization.md +15 -2
- package/node_modules/fastify/docs/Reference/Warnings.md +7 -6
- package/node_modules/fastify/eslint.config.js +7 -2
- package/node_modules/fastify/fastify.d.ts +8 -3
- package/node_modules/fastify/fastify.js +43 -14
- package/node_modules/fastify/lib/content-type-parser.js +13 -1
- package/node_modules/fastify/lib/decorate.js +11 -3
- package/node_modules/fastify/lib/error-handler.js +4 -3
- package/node_modules/fastify/lib/error-serializer.js +59 -59
- package/node_modules/fastify/lib/errors.js +16 -1
- package/node_modules/fastify/lib/four-oh-four.js +14 -9
- package/node_modules/fastify/lib/handle-request.js +11 -5
- package/node_modules/fastify/lib/plugin-override.js +2 -1
- package/node_modules/fastify/lib/plugin-utils.js +5 -5
- package/node_modules/fastify/lib/reply.js +63 -8
- package/node_modules/fastify/lib/request.js +14 -4
- package/node_modules/fastify/lib/route.js +20 -6
- package/node_modules/fastify/lib/schema-controller.js +1 -1
- package/node_modules/fastify/lib/schemas.js +37 -30
- package/node_modules/fastify/lib/symbols.js +3 -1
- package/node_modules/fastify/lib/validation.js +1 -13
- package/node_modules/fastify/lib/warnings.js +3 -3
- package/node_modules/fastify/package.json +13 -15
- package/node_modules/fastify/scripts/validate-ecosystem-links.js +1 -0
- package/node_modules/fastify/test/bundler/esbuild/package.json +1 -1
- package/node_modules/fastify/test/close-pipelining.test.js +1 -2
- package/node_modules/fastify/test/custom-http-server.test.js +38 -0
- package/node_modules/fastify/test/decorator-instance-properties.test.js +63 -0
- package/node_modules/fastify/test/diagnostics-channel/async-error-handler.test.js +74 -0
- package/node_modules/fastify/test/hooks.test.js +23 -0
- package/node_modules/fastify/test/http-methods/get.test.js +1 -1
- package/node_modules/fastify/test/http2/plain.test.js +135 -0
- package/node_modules/fastify/test/http2/secure-with-fallback.test.js +1 -1
- package/node_modules/fastify/test/https/https.test.js +1 -2
- package/node_modules/fastify/test/internals/errors.test.js +31 -1
- package/node_modules/fastify/test/internals/plugin.test.js +3 -1
- package/node_modules/fastify/test/internals/request.test.js +27 -3
- package/node_modules/fastify/test/internals/schema-controller-perf.test.js +33 -0
- package/node_modules/fastify/test/logger/logging.test.js +18 -1
- package/node_modules/fastify/test/logger/options.test.js +38 -1
- package/node_modules/fastify/test/reply-error.test.js +1 -1
- package/node_modules/fastify/test/reply-trailers.test.js +70 -0
- package/node_modules/fastify/test/request-media-type.test.js +105 -0
- package/node_modules/fastify/test/route-prefix.test.js +34 -0
- package/node_modules/fastify/test/router-options.test.js +222 -11
- package/node_modules/fastify/test/schema-serialization.test.js +108 -0
- package/node_modules/fastify/test/schema-validation.test.js +24 -0
- package/node_modules/fastify/test/scripts/validate-ecosystem-links.test.js +40 -57
- package/node_modules/fastify/test/throw.test.js +14 -0
- package/node_modules/fastify/test/trust-proxy.test.js +21 -0
- package/node_modules/fastify/test/types/content-type-parser.tst.ts +70 -0
- package/node_modules/fastify/test/types/{decorate-request-reply.test-d.ts → decorate-request-reply.tst.ts} +4 -4
- package/node_modules/fastify/test/types/{dummy-plugin.ts → dummy-plugin.mts} +1 -1
- package/node_modules/fastify/test/types/errors.tst.ts +91 -0
- package/node_modules/fastify/test/types/fastify.tst.ts +351 -0
- package/node_modules/fastify/test/types/hooks.tst.ts +578 -0
- package/node_modules/fastify/test/types/instance.tst.ts +597 -0
- package/node_modules/fastify/test/types/{logger.test-d.ts → logger.tst.ts} +61 -62
- package/node_modules/fastify/test/types/plugin.tst.ts +96 -0
- package/node_modules/fastify/test/types/register.tst.ts +245 -0
- package/node_modules/fastify/test/types/reply.tst.ts +297 -0
- package/node_modules/fastify/test/types/request.tst.ts +199 -0
- package/node_modules/fastify/test/types/route.tst.ts +576 -0
- package/node_modules/fastify/test/types/{schema.test-d.ts → schema.tst.ts} +22 -22
- package/node_modules/fastify/test/types/{serverFactory.test-d.ts → serverFactory.tst.ts} +4 -4
- package/node_modules/fastify/test/types/tsconfig.json +9 -0
- package/node_modules/fastify/test/types/{type-provider.test-d.ts → type-provider.tst.ts} +256 -250
- package/node_modules/fastify/test/types/using.tst.ts +14 -0
- package/node_modules/fastify/types/errors.d.ts +3 -0
- package/node_modules/fastify/types/request.d.ts +23 -2
- package/node_modules/jishushell-panel/output/public/assets/{ApiKeyField-NKcbHjNz.js → ApiKeyField-Ce5d1xna.js} +1 -1
- package/node_modules/jishushell-panel/output/public/assets/{Dashboard-Da1fL38t.js → Dashboard-BXame3yg.js} +1 -1
- package/node_modules/jishushell-panel/output/public/assets/{HermesChatPanel-DZvmYsoh.js → HermesChatPanel-BHZtPCJd.js} +1 -1
- package/node_modules/jishushell-panel/output/public/assets/{HermesConfigForm-BLUWlKwm.js → HermesConfigForm-CB3GbNX9.js} +1 -1
- package/node_modules/jishushell-panel/output/public/assets/{InitPassword-BAKsshzk.js → InitPassword-Boab9F6g.js} +1 -1
- package/node_modules/jishushell-panel/output/public/assets/InstanceDetail-DrIWCqo-.js +14 -0
- package/node_modules/jishushell-panel/output/public/assets/{Login-DHeOmwI8.js → Login-CzpOkNau.js} +1 -1
- package/node_modules/jishushell-panel/output/public/assets/NewInstance-CANXyCcL.js +1 -0
- package/node_modules/jishushell-panel/output/public/assets/{ProviderRecommendations-H0ByEYF0.js → ProviderRecommendations-BABo9VOC.js} +1 -1
- package/node_modules/jishushell-panel/output/public/assets/Settings-CKp5XxFh.js +1 -0
- package/node_modules/jishushell-panel/output/public/assets/Setup-C7xVDPow.js +1 -0
- package/node_modules/jishushell-panel/output/public/assets/{WeixinLoginPanel-D-T6BxkQ.js → WeixinLoginPanel-B765Xz4C.js} +1 -1
- package/node_modules/jishushell-panel/output/public/assets/{index-ERt6_ngA.js → index-Bs6DSbiR.js} +6 -6
- package/node_modules/jishushell-panel/output/public/assets/{registry-DF93EzIb.js → registry-sWIZsIEF.js} +2 -2
- package/node_modules/jishushell-panel/output/public/assets/{usePolling-DeoThIQn.js → usePolling-D4IDOQd_.js} +1 -1
- package/node_modules/jishushell-panel/output/public/assets/vendor-i18n-Df8aUdv8.js +1 -0
- package/node_modules/jishushell-panel/output/public/assets/{vendor-react-Cc84NArf.js → vendor-react-0L0rjmYG.js} +3 -3
- package/node_modules/jishushell-panel/output/public/index.html +3 -3
- package/node_modules/jishushell-panel/package.json +1 -1
- package/node_modules/semver/classes/range.js +6 -2
- package/node_modules/semver/package.json +1 -1
- package/package.json +4 -4
- package/scripts/check-app-spec.mjs +4 -12
- package/scripts/check-architecture-boundaries.mjs +178 -0
- package/scripts/pack-gui-and-send-pi.sh +5 -3
- package/dependencies/jishushell-panel-0.6.18.tgz +0 -0
- package/dist/services/connections/suggestions.d.ts +0 -27
- package/dist/services/connections/suggestions.js +0 -124
- package/dist/services/connections/suggestions.js.map +0 -1
- package/node_modules/fastify/test/types/content-type-parser.test-d.ts +0 -72
- package/node_modules/fastify/test/types/errors.test-d.ts +0 -90
- package/node_modules/fastify/test/types/fastify.test-d.ts +0 -352
- package/node_modules/fastify/test/types/hooks.test-d.ts +0 -550
- package/node_modules/fastify/test/types/import.ts +0 -2
- package/node_modules/fastify/test/types/instance.test-d.ts +0 -588
- package/node_modules/fastify/test/types/plugin.test-d.ts +0 -97
- package/node_modules/fastify/test/types/register.test-d.ts +0 -237
- package/node_modules/fastify/test/types/reply.test-d.ts +0 -254
- package/node_modules/fastify/test/types/request.test-d.ts +0 -188
- package/node_modules/fastify/test/types/route.test-d.ts +0 -553
- package/node_modules/fastify/test/types/using.test-d.ts +0 -17
- package/node_modules/jishushell-panel/output/public/assets/InstanceDetail-Dgyc_TX5.js +0 -14
- package/node_modules/jishushell-panel/output/public/assets/NewInstance-CIy0cYtp.js +0 -1
- package/node_modules/jishushell-panel/output/public/assets/Settings-DAT-UMfP.js +0 -1
- package/node_modules/jishushell-panel/output/public/assets/Setup-g3uckFYR.js +0 -1
- package/node_modules/jishushell-panel/output/public/assets/vendor-i18n-CS8DFbkQ.js +0 -1
|
@@ -0,0 +1,371 @@
|
|
|
1
|
+
id: immich-container
|
|
2
|
+
name: Immich
|
|
3
|
+
version: "1.0.2"
|
|
4
|
+
jishushell:
|
|
5
|
+
min_version: "0.5.15"
|
|
6
|
+
description: "Self-hosted photo and video backup/gallery."
|
|
7
|
+
singleInstance: true
|
|
8
|
+
|
|
9
|
+
# Converted from https://github.com/immich-app/immich/releases/latest/download/docker-compose.yml
|
|
10
|
+
# and https://github.com/immich-app/immich/releases/latest/download/example.env.
|
|
11
|
+
# Compose features that are intentionally normalized here:
|
|
12
|
+
# - env_file/.env values are inlined as explicit env keys because AppSpec has no env_file field.
|
|
13
|
+
# - compose service DNS is preserved through an app-scoped Docker bridge network.
|
|
14
|
+
# - the top-level named volume model-cache is represented as an app-scoped bind mount.
|
|
15
|
+
# - image HEALTHCHECK and command healthcheck entries are not reused by AppSpec.
|
|
16
|
+
# - database shm_size is not expressible as a first-class AppSpec field today.
|
|
17
|
+
|
|
18
|
+
network:
|
|
19
|
+
mode: docker-bridge
|
|
20
|
+
name: "jishushell-${instance.id}"
|
|
21
|
+
|
|
22
|
+
tasks:
|
|
23
|
+
- name: database
|
|
24
|
+
role: sidecar
|
|
25
|
+
runtime: container
|
|
26
|
+
image: "ghcr.io/immich-app/postgres:14-vectorchord0.4.3-pgvectors0.2.0@sha256:bcf63357191b76a916ae5eb93464d65c07511da41e3bf7a8416db519b40b1c23"
|
|
27
|
+
user: "0:0"
|
|
28
|
+
cap_add: ["CHOWN", "FOWNER", "DAC_OVERRIDE", "SETUID", "SETGID", "SETPCAP"]
|
|
29
|
+
env:
|
|
30
|
+
POSTGRES_PASSWORD: "postgres"
|
|
31
|
+
POSTGRES_USER: "postgres"
|
|
32
|
+
POSTGRES_DB: "immich"
|
|
33
|
+
POSTGRES_INITDB_ARGS: "--data-checksums"
|
|
34
|
+
resources:
|
|
35
|
+
cpu: "700m"
|
|
36
|
+
memory: "1024Mi"
|
|
37
|
+
ports:
|
|
38
|
+
- name: pg
|
|
39
|
+
port: 5432
|
|
40
|
+
visibility: internal
|
|
41
|
+
volumes:
|
|
42
|
+
- source: "~/.jishushell/apps/${instance.id}/postgres"
|
|
43
|
+
target: "/var/lib/postgresql/data"
|
|
44
|
+
|
|
45
|
+
- name: redis
|
|
46
|
+
role: sidecar
|
|
47
|
+
runtime: container
|
|
48
|
+
image: "docker.io/valkey/valkey:9@sha256:3b55fbaa0cd93cf0d9d961f405e4dfcc70efe325e2d84da207a0a8e6d8fde4f9"
|
|
49
|
+
user: "0:0"
|
|
50
|
+
cap_add: ["CHOWN", "SETUID", "SETGID"]
|
|
51
|
+
resources:
|
|
52
|
+
cpu: "100m"
|
|
53
|
+
memory: "128Mi"
|
|
54
|
+
ports:
|
|
55
|
+
- name: redis
|
|
56
|
+
port: 6379
|
|
57
|
+
visibility: internal
|
|
58
|
+
|
|
59
|
+
- name: immich-machine-learning
|
|
60
|
+
role: sidecar
|
|
61
|
+
runtime: container
|
|
62
|
+
image: "ghcr.io/immich-app/immich-machine-learning:v2"
|
|
63
|
+
user: "0:0"
|
|
64
|
+
cap_add: ["CHOWN", "FOWNER", "DAC_OVERRIDE", "SETUID", "SETGID", "SETPCAP", "NET_BIND_SERVICE"]
|
|
65
|
+
env:
|
|
66
|
+
UPLOAD_LOCATION: "./library"
|
|
67
|
+
DB_DATA_LOCATION: "./postgres"
|
|
68
|
+
TZ: "Asia/Shanghai"
|
|
69
|
+
IMMICH_VERSION: "v2"
|
|
70
|
+
DB_PASSWORD: "postgres"
|
|
71
|
+
DB_USERNAME: "postgres"
|
|
72
|
+
DB_DATABASE_NAME: "immich"
|
|
73
|
+
resources:
|
|
74
|
+
cpu: "1000m"
|
|
75
|
+
memory: "1536Mi"
|
|
76
|
+
ports:
|
|
77
|
+
- name: ml-http
|
|
78
|
+
port: 3003
|
|
79
|
+
visibility: internal
|
|
80
|
+
volumes:
|
|
81
|
+
- source: "~/.jishushell/apps/${instance.id}/model-cache"
|
|
82
|
+
target: "/cache"
|
|
83
|
+
|
|
84
|
+
- name: immich-server
|
|
85
|
+
role: service
|
|
86
|
+
runtime: container
|
|
87
|
+
image: "ghcr.io/immich-app/immich-server:v2"
|
|
88
|
+
user: "0:0"
|
|
89
|
+
cap_add: ["CHOWN", "FOWNER", "DAC_OVERRIDE", "SETUID", "SETGID", "SETPCAP", "NET_BIND_SERVICE"]
|
|
90
|
+
env:
|
|
91
|
+
UPLOAD_LOCATION: "./library"
|
|
92
|
+
DB_DATA_LOCATION: "./postgres"
|
|
93
|
+
TZ: "Asia/Shanghai"
|
|
94
|
+
IMMICH_VERSION: "v2"
|
|
95
|
+
DB_PASSWORD: "postgres"
|
|
96
|
+
DB_USERNAME: "postgres"
|
|
97
|
+
DB_DATABASE_NAME: "immich"
|
|
98
|
+
resources:
|
|
99
|
+
cpu: "1200m"
|
|
100
|
+
memory: "1536Mi"
|
|
101
|
+
ports:
|
|
102
|
+
- name: http
|
|
103
|
+
port: 2283
|
|
104
|
+
container_port: 2283
|
|
105
|
+
visibility: external
|
|
106
|
+
volumes:
|
|
107
|
+
- source: "~/.jishushell/apps/${instance.id}/library"
|
|
108
|
+
target: "/data"
|
|
109
|
+
- source: "~/.jishushell/files/photos/library"
|
|
110
|
+
target: "/external/photos"
|
|
111
|
+
readonly: true
|
|
112
|
+
- source: "/etc/localtime"
|
|
113
|
+
target: "/etc/localtime"
|
|
114
|
+
readonly: true
|
|
115
|
+
health:
|
|
116
|
+
http:
|
|
117
|
+
path: /api/server/ping
|
|
118
|
+
port: 2283
|
|
119
|
+
interval: "15s"
|
|
120
|
+
timeout: "5s"
|
|
121
|
+
retries: 8
|
|
122
|
+
start_period: "120s"
|
|
123
|
+
|
|
124
|
+
provides:
|
|
125
|
+
- capability: "ui-immich"
|
|
126
|
+
kind: ui
|
|
127
|
+
interface: web-ui
|
|
128
|
+
task: "immich-server"
|
|
129
|
+
port: 2283
|
|
130
|
+
endpoint:
|
|
131
|
+
portName: http
|
|
132
|
+
path: "/"
|
|
133
|
+
protocol: "http"
|
|
134
|
+
visibility: "external"
|
|
135
|
+
embedded: "direct"
|
|
136
|
+
description: "Immich Web UI"
|
|
137
|
+
|
|
138
|
+
lifecycle:
|
|
139
|
+
install:
|
|
140
|
+
- downloadImage: "docker.io/valkey/valkey:9@sha256:3b55fbaa0cd93cf0d9d961f405e4dfcc70efe325e2d84da207a0a8e6d8fde4f9"
|
|
141
|
+
- downloadImage: "ghcr.io/immich-app/postgres:14-vectorchord0.4.3-pgvectors0.2.0@sha256:bcf63357191b76a916ae5eb93464d65c07511da41e3bf7a8416db519b40b1c23"
|
|
142
|
+
- downloadImage: "ghcr.io/immich-app/immich-server:v2"
|
|
143
|
+
timeout_ms: 1800000
|
|
144
|
+
idle_timeout_ms: 1800000
|
|
145
|
+
- downloadImage: "ghcr.io/immich-app/immich-machine-learning:v2"
|
|
146
|
+
timeout_ms: 1800000
|
|
147
|
+
idle_timeout_ms: 1800000
|
|
148
|
+
- mkdir: "~/.jishushell/apps/${instance.id}/library"
|
|
149
|
+
- mkdir: "~/.jishushell/apps/${instance.id}/postgres"
|
|
150
|
+
- mkdir: "~/.jishushell/apps/${instance.id}/model-cache"
|
|
151
|
+
|
|
152
|
+
post_start:
|
|
153
|
+
- run: |
|
|
154
|
+
set -eu
|
|
155
|
+
|
|
156
|
+
STATE_DIR="$HOME/.jishushell/apps/${instance.id}"
|
|
157
|
+
ENV_FILE="$STATE_DIR/.env"
|
|
158
|
+
mkdir -p "$STATE_DIR"
|
|
159
|
+
touch "$ENV_FILE"
|
|
160
|
+
chmod 600 "$ENV_FILE"
|
|
161
|
+
|
|
162
|
+
read_env() {
|
|
163
|
+
awk -F= -v key="$1" '$1 == key { value = substr($0, length(key) + 2) } END { if (value != "") print value }' "$ENV_FILE" 2>/dev/null || true
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
upsert_env() {
|
|
167
|
+
key="$1"
|
|
168
|
+
value="$2"
|
|
169
|
+
tmp="${ENV_FILE}.tmp"
|
|
170
|
+
awk -v key="$key" -v value="$value" '
|
|
171
|
+
BEGIN { updated = 0 }
|
|
172
|
+
index($0, key "=") == 1 { print key "=" value; updated = 1; next }
|
|
173
|
+
{ print }
|
|
174
|
+
END { if (!updated) print key "=" value }
|
|
175
|
+
' "$ENV_FILE" > "$tmp"
|
|
176
|
+
chmod 600 "$tmp"
|
|
177
|
+
mv "$tmp" "$ENV_FILE"
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
sync_openclaw() {
|
|
181
|
+
if [ -n "${JISHUSHELL_CORE_URL:-}" ] && [ -n "${JISHUSHELL_INTERNAL_TOKEN:-}" ]; then
|
|
182
|
+
curl -fsS -X POST \
|
|
183
|
+
-H "X-Jishushell-Internal-Token: $JISHUSHELL_INTERNAL_TOKEN" \
|
|
184
|
+
-H "X-Jishushell-Instance: ${instance.id}" \
|
|
185
|
+
"$JISHUSHELL_CORE_URL/api/integrations/immich/internal/sync-openclaw" >/dev/null || true
|
|
186
|
+
fi
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
IMMICH_API_KEY="$(read_env IMMICH_API_KEY)"
|
|
190
|
+
if [ -n "$IMMICH_API_KEY" ]; then
|
|
191
|
+
sync_openclaw
|
|
192
|
+
exit 0
|
|
193
|
+
fi
|
|
194
|
+
|
|
195
|
+
IMMICH_ADMIN_EMAIL="$(read_env IMMICH_ADMIN_EMAIL)"
|
|
196
|
+
if [ -z "$IMMICH_ADMIN_EMAIL" ]; then
|
|
197
|
+
IMMICH_ADMIN_EMAIL="admin@jishushell.local"
|
|
198
|
+
upsert_env IMMICH_ADMIN_EMAIL "$IMMICH_ADMIN_EMAIL"
|
|
199
|
+
fi
|
|
200
|
+
|
|
201
|
+
IMMICH_ADMIN_PASSWORD="$(read_env IMMICH_ADMIN_PASSWORD)"
|
|
202
|
+
if [ -z "$IMMICH_ADMIN_PASSWORD" ]; then
|
|
203
|
+
IMMICH_ADMIN_PASSWORD="JishuShell@2026"
|
|
204
|
+
upsert_env IMMICH_ADMIN_PASSWORD "$IMMICH_ADMIN_PASSWORD"
|
|
205
|
+
fi
|
|
206
|
+
|
|
207
|
+
find_immich_container() {
|
|
208
|
+
docker ps \
|
|
209
|
+
--format '{{.ID}}\t{{.Names}}\t{{.Label "com.hashicorp.nomad.job_name"}}\t{{.Label "com.hashicorp.nomad.task_name"}}' \
|
|
210
|
+
| awk -F '\t' -v instance="${instance.id}" '
|
|
211
|
+
$4 == "immich-server" && ($3 == instance || $3 == "jishushell-" instance) {
|
|
212
|
+
print $1;
|
|
213
|
+
found = 1;
|
|
214
|
+
exit;
|
|
215
|
+
}
|
|
216
|
+
$4 == "immich-server" && index($2, instance) > 0 { label_fallback = $1 }
|
|
217
|
+
$2 == "immich-server" || index($2, "immich-server-") == 1 { name_fallback = $1 }
|
|
218
|
+
END {
|
|
219
|
+
if (!found) {
|
|
220
|
+
if (label_fallback) print label_fallback;
|
|
221
|
+
else if (name_fallback) print name_fallback;
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
'
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
CONTAINER_ID=""
|
|
228
|
+
for attempt in $(seq 1 120); do
|
|
229
|
+
CONTAINER_ID="$(find_immich_container | head -n 1)"
|
|
230
|
+
if [ -n "$CONTAINER_ID" ]; then
|
|
231
|
+
break
|
|
232
|
+
fi
|
|
233
|
+
sleep 2
|
|
234
|
+
done
|
|
235
|
+
if [ -z "$CONTAINER_ID" ]; then
|
|
236
|
+
echo "immich-server container is not running" >&2
|
|
237
|
+
exit 1
|
|
238
|
+
fi
|
|
239
|
+
|
|
240
|
+
IMMICH_API_KEY="$(docker exec -i \
|
|
241
|
+
-e IMMICH_BOOTSTRAP_EMAIL="$IMMICH_ADMIN_EMAIL" \
|
|
242
|
+
-e IMMICH_BOOTSTRAP_PASSWORD="$IMMICH_ADMIN_PASSWORD" \
|
|
243
|
+
"$CONTAINER_ID" node - <<'NODE'
|
|
244
|
+
const baseUrl = "http://127.0.0.1:2283/api";
|
|
245
|
+
const email = process.env.IMMICH_BOOTSTRAP_EMAIL;
|
|
246
|
+
const password = process.env.IMMICH_BOOTSTRAP_PASSWORD;
|
|
247
|
+
|
|
248
|
+
const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
|
|
249
|
+
|
|
250
|
+
function fatal(message) {
|
|
251
|
+
const error = new Error(message);
|
|
252
|
+
error.fatal = true;
|
|
253
|
+
throw error;
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
async function request(path, options = {}) {
|
|
257
|
+
const response = await fetch(`${baseUrl}${path}`, {
|
|
258
|
+
...options,
|
|
259
|
+
headers: {
|
|
260
|
+
accept: "application/json",
|
|
261
|
+
"content-type": "application/json",
|
|
262
|
+
...(options.headers ?? {}),
|
|
263
|
+
},
|
|
264
|
+
});
|
|
265
|
+
const text = await response.text();
|
|
266
|
+
let body = null;
|
|
267
|
+
if (text) {
|
|
268
|
+
try {
|
|
269
|
+
body = JSON.parse(text);
|
|
270
|
+
} catch {
|
|
271
|
+
body = null;
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
return { response, body, text };
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
async function login() {
|
|
278
|
+
const result = await request("/auth/login", {
|
|
279
|
+
method: "POST",
|
|
280
|
+
body: JSON.stringify({ email, password }),
|
|
281
|
+
});
|
|
282
|
+
if (result.response.ok && result.body?.accessToken) {
|
|
283
|
+
return result.body.accessToken;
|
|
284
|
+
}
|
|
285
|
+
return null;
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
async function bootstrap() {
|
|
289
|
+
let lastError = "Immich API is not ready";
|
|
290
|
+
for (let attempt = 0; attempt < 150; attempt += 1) {
|
|
291
|
+
try {
|
|
292
|
+
const ping = await request("/server/ping", { method: "GET" });
|
|
293
|
+
if (!ping.response.ok) {
|
|
294
|
+
lastError = `ping failed: HTTP ${ping.response.status} ${ping.text}`;
|
|
295
|
+
await sleep(2000);
|
|
296
|
+
continue;
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
let accessToken = await login();
|
|
300
|
+
if (!accessToken) {
|
|
301
|
+
const signUp = await request("/auth/admin-sign-up", {
|
|
302
|
+
method: "POST",
|
|
303
|
+
body: JSON.stringify({ email, password, name: "JishuShell" }),
|
|
304
|
+
});
|
|
305
|
+
if (signUp.response.status === 400 || signUp.response.status === 409) {
|
|
306
|
+
fatal("Immich is already initialized and the stored JishuShell admin credentials did not work; set IMMICH_ADMIN_EMAIL/IMMICH_ADMIN_PASSWORD or IMMICH_API_KEY in the instance .env file");
|
|
307
|
+
}
|
|
308
|
+
if (!signUp.response.ok) {
|
|
309
|
+
lastError = `admin sign-up failed: HTTP ${signUp.response.status} ${signUp.text}`;
|
|
310
|
+
await sleep(2000);
|
|
311
|
+
continue;
|
|
312
|
+
}
|
|
313
|
+
accessToken = await login();
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
if (!accessToken) {
|
|
317
|
+
throw new Error("unable to log in with the stored Immich admin credentials");
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
const apiKey = await request("/api-keys", {
|
|
321
|
+
method: "POST",
|
|
322
|
+
headers: { Authorization: `Bearer ${accessToken}` },
|
|
323
|
+
body: JSON.stringify({ name: "JishuShell", permissions: ["all"] }),
|
|
324
|
+
});
|
|
325
|
+
if (!apiKey.response.ok) {
|
|
326
|
+
throw new Error(`API key creation failed: HTTP ${apiKey.response.status} ${apiKey.text}`);
|
|
327
|
+
}
|
|
328
|
+
if (!apiKey.body?.secret) {
|
|
329
|
+
throw new Error("API key creation response did not include a secret");
|
|
330
|
+
}
|
|
331
|
+
console.log(apiKey.body.secret);
|
|
332
|
+
return;
|
|
333
|
+
} catch (error) {
|
|
334
|
+
if (error?.fatal) {
|
|
335
|
+
throw error;
|
|
336
|
+
}
|
|
337
|
+
lastError = error instanceof Error ? error.message : String(error);
|
|
338
|
+
await sleep(2000);
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
throw new Error(lastError);
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
bootstrap().catch((error) => {
|
|
345
|
+
console.error(error instanceof Error ? error.message : String(error));
|
|
346
|
+
process.exit(1);
|
|
347
|
+
});
|
|
348
|
+
NODE
|
|
349
|
+
)"
|
|
350
|
+
|
|
351
|
+
if [ -z "$IMMICH_API_KEY" ]; then
|
|
352
|
+
echo "Immich API key generation returned an empty secret" >&2
|
|
353
|
+
exit 1
|
|
354
|
+
fi
|
|
355
|
+
upsert_env IMMICH_API_KEY "$IMMICH_API_KEY"
|
|
356
|
+
sync_openclaw
|
|
357
|
+
timeout_ms: 420000
|
|
358
|
+
|
|
359
|
+
uninstall:
|
|
360
|
+
- run: >-
|
|
361
|
+
rm -rf
|
|
362
|
+
"$HOME/.jishushell/apps/${instance.id}/.env"
|
|
363
|
+
"$HOME/.jishushell/apps/${instance.id}/library"
|
|
364
|
+
"$HOME/.jishushell/apps/${instance.id}/postgres"
|
|
365
|
+
"$HOME/.jishushell/apps/${instance.id}/model-cache"
|
|
366
|
+
sudo: true
|
|
367
|
+
timeout_ms: 1800000
|
|
368
|
+
- deleteImage: "ghcr.io/immich-app/immich-machine-learning:v2"
|
|
369
|
+
- deleteImage: "ghcr.io/immich-app/immich-server:v2"
|
|
370
|
+
- deleteImage: "ghcr.io/immich-app/postgres:14-vectorchord0.4.3-pgvectors0.2.0@sha256:bcf63357191b76a916ae5eb93464d65c07511da41e3bf7a8416db519b40b1c23"
|
|
371
|
+
- deleteImage: "docker.io/valkey/valkey:9@sha256:3b55fbaa0cd93cf0d9d961f405e4dfcc70efe325e2d84da207a0a8e6d8fde4f9"
|
|
@@ -1,30 +1,35 @@
|
|
|
1
1
|
id: jishu-kb-container
|
|
2
2
|
name: JishuShell KB
|
|
3
|
-
version: "0.1.
|
|
3
|
+
version: "0.1.2"
|
|
4
4
|
jishushell:
|
|
5
|
-
min_version: "0.
|
|
5
|
+
min_version: "0.6.19"
|
|
6
6
|
description: "JishuShell-KB: BM25 + 向量 + cross-encoder rerank 的本地知识库(单镜像)。提供 /api/kb/* 原生检索 API + OpenAI 兼容 /v1 透传 + Web UI。"
|
|
7
7
|
singleInstance: true
|
|
8
8
|
integrations:
|
|
9
9
|
- kind: jishukb
|
|
10
10
|
|
|
11
11
|
# 拓扑(单容器,无 sidecar)
|
|
12
|
-
# jishu-kb (container :8088) ── host :18095 ── 用户浏览器 /
|
|
12
|
+
# jishu-kb (container :8088) ── host :18095 ── 用户浏览器 / JishuShell / OpenClaw
|
|
13
|
+
# ├─ /mcp (OpenClaw native remote MCP)
|
|
13
14
|
# └─ /data (SQLite + 向量索引 + 上传文档 + ONNX rerank 模型)
|
|
14
15
|
#
|
|
15
16
|
# 端到端调用链(OpenClaw agent):
|
|
16
|
-
# 用户 → OpenClaw(自带 LLM)→
|
|
17
|
-
# →
|
|
18
|
-
# →
|
|
17
|
+
# 用户 → OpenClaw(自带 LLM)→ native mcp.servers.kb
|
|
18
|
+
# → POST http://<kb-host>:18095/mcp
|
|
19
|
+
# → JishuKB 在同一个运行中服务内执行 kb__* 工具
|
|
20
|
+
# → 返回 ranked chunks / 文档 / jobs / 配置摘要 → OpenClaw 自带 LLM 拼答案 + 引用
|
|
19
21
|
#
|
|
20
22
|
# 关键设计:
|
|
21
|
-
# -
|
|
22
|
-
#
|
|
23
|
+
# - remote MCP 是 opt-in 且需要 bearer token。JishuShell 的 jishukb
|
|
24
|
+
# integration 会在 start/restart 前生成 instance 私有 secret.env,
|
|
25
|
+
# 通过 Nomad env template 注入 JISHU_KB_AUTH_TOKEN,同时设置
|
|
26
|
+
# JISHU_KB_MCP_HTTP=1,然后把 mcpAuthToken 写入 provider-credentials,
|
|
27
|
+
# 供 OpenClaw 连接使用。
|
|
23
28
|
# - JishuKB 不再由 Core 注入 default LLM key。generation provider
|
|
24
29
|
# 由用户在 JishuKB 自己的 UI 中手动配置;Core 不把真实 upstream key
|
|
25
30
|
# 写进 /api/admin/provider。
|
|
26
31
|
# - Core 仍保留知识库默认 default KB 创建、provider-credentials 写入、
|
|
27
|
-
# knowledge capability 暴露等集成能力。
|
|
32
|
+
# knowledge/web capability 暴露等集成能力。
|
|
28
33
|
# - Ollama URL 通过 `requires: llm-ollama` 注入到 JISHU_KB_OLLAMA_URL,
|
|
29
34
|
# 供 embedding/rerank 模型按需调用;未绑定时为空字符串,jishu-kb
|
|
30
35
|
# fallback 到自身 config.go 默认值。
|
|
@@ -36,16 +41,14 @@ tasks:
|
|
|
36
41
|
- name: jishukb
|
|
37
42
|
role: service
|
|
38
43
|
runtime: container
|
|
39
|
-
# 镜像 GHCR public,多架构(amd64/arm64)。Pin 0.1.
|
|
40
|
-
image: "ghcr.io/x-aijishu/jishu-kb:0.1.
|
|
44
|
+
# 镜像 GHCR public,多架构(amd64/arm64)。Pin 0.1.2 避免 :latest 漂移。
|
|
45
|
+
image: "ghcr.io/x-aijishu/jishu-kb:0.1.2"
|
|
41
46
|
user: "host"
|
|
42
47
|
env:
|
|
43
48
|
# 监听端口(container 内)。
|
|
44
49
|
JISHU_KB_PORT: "8088"
|
|
45
50
|
# 数据持久化目录。镜像默认即 /data,显式声明便于看 spec 一目了然。
|
|
46
51
|
JISHU_KB_DATA: "/data"
|
|
47
|
-
# v1 ships without auth — see manifest top notes + plan.md §5.
|
|
48
|
-
JISHU_KB_AUTH_TOKEN: ""
|
|
49
52
|
# The panel now embeds KB through the capability proxy. That keeps
|
|
50
53
|
# absolute `/api/...` calls on the KB origin and lets the proxy
|
|
51
54
|
# bootstrap hydrate server-stored conversations into a new browser
|
|
@@ -53,15 +56,16 @@ tasks:
|
|
|
53
56
|
# embedding permissive for users who open :18095 manually.
|
|
54
57
|
#
|
|
55
58
|
# Wildcard is intentional here: panel origin can vary by LAN IP / host
|
|
56
|
-
# name
|
|
57
|
-
#
|
|
59
|
+
# name. API and remote MCP writes are protected by the generated bearer
|
|
60
|
+
# token; the static shell remains loadable so users can enter auth when
|
|
61
|
+
# opening :18095 manually.
|
|
58
62
|
JISHU_KB_FRAME_ANCESTORS: "*"
|
|
59
63
|
# Ollama URL: injected by `requires: llm-ollama` 下方的 capability slot。
|
|
60
64
|
# `${requires.X}` materialization 当前不支持 `:-default` 兜底语法;
|
|
61
65
|
# 未绑定时这里就是空字符串。jishu-kb 在 internal/config/config.go
|
|
62
66
|
# 中自带默认值 http://localhost:11434,不影响启动。
|
|
63
67
|
JISHU_KB_OLLAMA_URL: "${requires.JISHU_KB_OLLAMA_URL}"
|
|
64
|
-
# rerank 默认开;topK 默认 6(与
|
|
68
|
+
# rerank 默认开;topK 默认 6(与 OpenClaw KB guidance 保持一致)。
|
|
65
69
|
JISHU_KB_RERANK: "1"
|
|
66
70
|
JISHU_KB_TOPK: "6"
|
|
67
71
|
TZ: "Asia/Shanghai"
|
|
@@ -73,6 +77,7 @@ tasks:
|
|
|
73
77
|
cpu: "1000m"
|
|
74
78
|
memory: "1024Mi"
|
|
75
79
|
ports:
|
|
80
|
+
# Core 会先把这个值当作宿主端口 seed 尝试;最终 hostPort 以 instance.json 为准。
|
|
76
81
|
- name: http
|
|
77
82
|
port: 18095
|
|
78
83
|
container_port: 8088
|
|
@@ -108,9 +113,9 @@ requires:
|
|
|
108
113
|
cardinality: "one"
|
|
109
114
|
|
|
110
115
|
provides:
|
|
111
|
-
# 知识库 capability —
|
|
112
|
-
#
|
|
113
|
-
#
|
|
116
|
+
# 知识库 capability — OpenClaw 绑定此 provider 后,JishuShell 通过
|
|
117
|
+
# provider-credentials + /api/service/capabilities 发现 remote MCP,并写入
|
|
118
|
+
# openclaw.json -> mcp.servers.kb。命名遵循 <category>-<slug>。
|
|
114
119
|
- capability: "knowledge-jishukb"
|
|
115
120
|
id: "jishukb"
|
|
116
121
|
kind: "knowledge"
|
|
@@ -122,7 +127,7 @@ provides:
|
|
|
122
127
|
path: "/"
|
|
123
128
|
protocol: "http"
|
|
124
129
|
visibility: "external"
|
|
125
|
-
description: "JishuShell-KB native KB API (/
|
|
130
|
+
description: "JishuShell-KB native KB API and remote MCP (/mcp) for OpenClaw kb__* tools"
|
|
126
131
|
|
|
127
132
|
# Web UI capability。走 embedded: "proxy":panel 通过 capability proxy
|
|
128
133
|
# 同源托管 KB 页面,代理 bootstrap 会把绝对 `/api/...`、SSE、WS 等请求
|
|
@@ -149,4 +154,4 @@ lifecycle:
|
|
|
149
154
|
- mkdir: "~/.jishushell/apps/${instance.id}/data"
|
|
150
155
|
|
|
151
156
|
uninstall:
|
|
152
|
-
- deleteImage: "ghcr.io/x-aijishu/jishu-kb:0.1.
|
|
157
|
+
- deleteImage: "ghcr.io/x-aijishu/jishu-kb:0.1.2"
|
package/apps/ollama-binary.yaml
CHANGED
|
@@ -18,6 +18,7 @@ tasks:
|
|
|
18
18
|
cpu: "2000m"
|
|
19
19
|
memory: "4096Mi"
|
|
20
20
|
ports:
|
|
21
|
+
# Core 会先把这个值当作宿主端口 seed 尝试;最终 hostPort 以 instance.json 为准。
|
|
21
22
|
- name: gateway
|
|
22
23
|
port: 11434
|
|
23
24
|
visibility: external
|
|
@@ -38,6 +39,7 @@ tasks:
|
|
|
38
39
|
cpu: "500m"
|
|
39
40
|
memory: "512Mi"
|
|
40
41
|
ports:
|
|
42
|
+
# Core 会先把这个值当作宿主端口 seed 尝试;最终 hostPort 以 instance.json 为准。
|
|
41
43
|
- name: webui
|
|
42
44
|
port: 4173
|
|
43
45
|
visibility: external
|
|
@@ -13,7 +13,9 @@ tasks:
|
|
|
13
13
|
role: service
|
|
14
14
|
runtime: process
|
|
15
15
|
command: ~/.jishushell/apps/${instance.id}/bin/openclaw
|
|
16
|
-
|
|
16
|
+
# process runtime 直接监听宿主机端口,所以启动参数必须使用 Core 最终分配的
|
|
17
|
+
# hostPort,不能写死下面的 AppSpec seed。
|
|
18
|
+
args: ["gateway", "run", "--port", "${runtime.ports.gateway.http.hostPort}", "--allow-unconfigured"]
|
|
17
19
|
env:
|
|
18
20
|
NODE_ENV: production
|
|
19
21
|
resources:
|
|
@@ -21,6 +23,7 @@ tasks:
|
|
|
21
23
|
memory: "2024Mi"
|
|
22
24
|
ports:
|
|
23
25
|
- name: http
|
|
26
|
+
# Core 会先把这个值当作宿主端口 seed 尝试;最终 hostPort 以 instance.json 为准。
|
|
24
27
|
port: 18789
|
|
25
28
|
visibility: external
|
|
26
29
|
health:
|
|
@@ -75,13 +78,6 @@ requires:
|
|
|
75
78
|
inject_as: "BROWSER_CDP_URL"
|
|
76
79
|
required: false
|
|
77
80
|
cardinality: "one"
|
|
78
|
-
- capability: "mcp"
|
|
79
|
-
slot: "mcp"
|
|
80
|
-
kind: "mcp"
|
|
81
|
-
interface: "mcp-http"
|
|
82
|
-
inject_as: "MCP_SERVERS"
|
|
83
|
-
required: false
|
|
84
|
-
cardinality: "many"
|
|
85
81
|
- capability: "files"
|
|
86
82
|
slot: "files"
|
|
87
83
|
kind: "files"
|
|
@@ -21,6 +21,7 @@ tasks:
|
|
|
21
21
|
cpu: "1000m"
|
|
22
22
|
memory: "1536Mi"
|
|
23
23
|
ports:
|
|
24
|
+
# Core 会先把这个值当作宿主端口 seed 尝试;最终 hostPort 以 instance.json 为准。
|
|
24
25
|
- name: http
|
|
25
26
|
port: 18789
|
|
26
27
|
visibility: external
|
|
@@ -82,13 +83,6 @@ requires:
|
|
|
82
83
|
inject_as: "BROWSER_CDP_URL"
|
|
83
84
|
required: false
|
|
84
85
|
cardinality: "one"
|
|
85
|
-
- capability: "mcp"
|
|
86
|
-
slot: "mcp"
|
|
87
|
-
kind: "mcp"
|
|
88
|
-
interface: "mcp-http"
|
|
89
|
-
inject_as: "MCP_SERVERS"
|
|
90
|
-
required: false
|
|
91
|
-
cardinality: "many"
|
|
92
86
|
- capability: "files"
|
|
93
87
|
slot: "files"
|
|
94
88
|
kind: "files"
|
|
@@ -56,6 +56,7 @@ tasks:
|
|
|
56
56
|
cpu: "1000m"
|
|
57
57
|
memory: "1024Mi"
|
|
58
58
|
ports:
|
|
59
|
+
# Core 会先把这个值当作宿主端口 seed 尝试;最终 hostPort 以 instance.json 为准。
|
|
59
60
|
- name: http
|
|
60
61
|
port: 18789
|
|
61
62
|
visibility: external
|
|
@@ -139,6 +140,25 @@ lifecycle:
|
|
|
139
140
|
formats:
|
|
140
141
|
- html
|
|
141
142
|
- json
|
|
143
|
+
engines:
|
|
144
|
+
# The upstream default general engines (google, duckduckgo,
|
|
145
|
+
# startpage...) are unreachable from a mainland-China network,
|
|
146
|
+
# so the aggregated result is empty out of the box. Enable
|
|
147
|
+
# China-reachable engines here so search works without the
|
|
148
|
+
# manual "enable engines in preferences" workaround, and so the
|
|
149
|
+
# agent path (which sends no engine cookie) also returns hits.
|
|
150
|
+
# bing/baidu are reliable; quark/360search are best-effort and
|
|
151
|
+
# simply drop out on timeout without breaking aggregation.
|
|
152
|
+
- name: bing
|
|
153
|
+
disabled: false
|
|
154
|
+
- name: baidu
|
|
155
|
+
disabled: false
|
|
156
|
+
- name: quark
|
|
157
|
+
disabled: false
|
|
158
|
+
timeout: 5.0
|
|
159
|
+
- name: 360search
|
|
160
|
+
disabled: false
|
|
161
|
+
timeout: 5.0
|
|
142
162
|
'''
|
|
143
163
|
).lstrip(),
|
|
144
164
|
encoding="utf-8",
|
|
@@ -19,6 +19,7 @@ tasks:
|
|
|
19
19
|
cpu: "500m"
|
|
20
20
|
memory: "256Mi"
|
|
21
21
|
ports:
|
|
22
|
+
# Core 会先把这个值当作宿主端口 seed 尝试;最终 hostPort 以 instance.json 为准。
|
|
22
23
|
- name: http
|
|
23
24
|
port: 18080
|
|
24
25
|
container_port: 8080
|
|
@@ -138,6 +139,25 @@ lifecycle:
|
|
|
138
139
|
formats:
|
|
139
140
|
- html
|
|
140
141
|
- json
|
|
142
|
+
engines:
|
|
143
|
+
# The upstream default general engines (google, duckduckgo,
|
|
144
|
+
# startpage...) are unreachable from a mainland-China network,
|
|
145
|
+
# so the aggregated result is empty out of the box. Enable
|
|
146
|
+
# China-reachable engines here so search works without the
|
|
147
|
+
# manual "enable engines in preferences" workaround, and so the
|
|
148
|
+
# agent path (which sends no engine cookie) also returns hits.
|
|
149
|
+
# bing/baidu are reliable; quark/360search are best-effort and
|
|
150
|
+
# simply drop out on timeout without breaking aggregation.
|
|
151
|
+
- name: bing
|
|
152
|
+
disabled: false
|
|
153
|
+
- name: baidu
|
|
154
|
+
disabled: false
|
|
155
|
+
- name: quark
|
|
156
|
+
disabled: false
|
|
157
|
+
timeout: 5.0
|
|
158
|
+
- name: 360search
|
|
159
|
+
disabled: false
|
|
160
|
+
timeout: 5.0
|
|
141
161
|
'''
|
|
142
162
|
).lstrip(),
|
|
143
163
|
encoding="utf-8",
|