Compare commits

...

181 Commits

Author SHA1 Message Date
eball
93ae305367 fix: handle case for system applications without configuration in provider list 2026-02-09 14:53:39 +08:00
eball
9de33829c0 cherry-pick: fix(cli): seperate dmesg args for dmesg logs 2026-02-06 11:13:41 +08:00
dkeven
3fa879e922 feat(cli): add more lines to default journalctl limit (#2505) 2026-02-05 23:52:08 +08:00
berg
e45a765ad4 settings, market, files, vault, desktop: fix some ui bugs (#2504)
feat: update system frontend version
2026-02-05 23:51:45 +08:00
eball
dad5dff06f app-service: handle case for system apps without configuration in permission API (#2500)
* app-service: handle case where sys app lacks application config in permission retrieval

* fix: update app-service image version to 0.4.82
2026-02-05 23:49:47 +08:00
lovehunter9
fc35ff6c11 fix: seafile trim commit_id for syncing and change psql ccnet init (#2494) 2026-02-05 12:08:38 +08:00
aby913
9a0e721589 backup: sync systemEnv default value (#2493) 2026-02-05 00:31:23 +08:00
simon
928c4b1b9f download-server: feat download server modify (#2490)
download -server
2026-02-05 00:30:18 +08:00
berg
de9f516f2a market, settings: support optional data deletion and fix bugs. (#2485)
* feat: support optional data deletion when uninstalling apps in Market

* market: add deleteData switch, add users info

* feat: update system frontend version

* update appsevice image tag to 0.4.81

---------

Co-authored-by: aby913 <aby913@163.com>
Co-authored-by: hys <hysyeah@gmail.com>
2026-02-04 21:50:47 +08:00
hysyeah
6f94dbefa3 feat: refactor permission parsing to use exported function and update related calls (#2487)
Co-authored-by: eball <liuy102@hotmail.com>
2026-02-04 20:40:28 +08:00
hysyeah
d3e7d3e64f fix: app uninstall delete data (#2479) 2026-02-03 20:17:04 +08:00
hysyeah
c627218184 appservice: fix add spec ports (#2477)
fix: add spec ports
2026-02-03 20:15:26 +08:00
hysyeah
6286fee6f7 feat: add icon filed to nats event (#2476) 2026-02-03 20:14:53 +08:00
eball
4cd4476885 cherry-pick: fix(cli): set node port range in minikube to allow smb service (#2460) 2026-02-03 13:43:52 +08:00
eball
b5f09d8e27 cherry-pick: desktop, settings, files, vault: fix multiple known issues (#2467) 2026-02-03 13:20:48 +08:00
eball
b8b22fe210 cherry-pick: authelia: add user regulation for TOTP authentication attempts (#2466) 2026-02-03 13:19:57 +08:00
eball
8b240521b9 cherry-pick: settings, user service: update wallpaper style (#2463) 2026-02-03 13:18:37 +08:00
eball
f2f3645b47 cherry-pick: bfl: enhance user login background handling with style support (#2464) 2026-02-03 13:18:12 +08:00
eball
60f0b123e8 cherry-pick: settings: add settings new version and update provider api (#2456) 2026-02-03 13:17:40 +08:00
eball
ad5ee4d9a7 cherry-pick: cli: upgrade l4-bfl-proxy to v0.3.10 (#2442) 2026-02-03 13:16:31 +08:00
eball
e3477d262b cherry-pick: l4: skip invalid expose port (#2441) 2026-02-03 13:15:46 +08:00
eball
12aacd9d56 cherry-pick: daemon: change pcap open timeout to 1 millisecond to prevent close hang (#2439) 2026-02-03 13:14:42 +08:00
eball
3224d8a81e cherry-pick: feat(olares-app): update version to v1.8.2 (#2433) 2026-02-03 13:13:48 +08:00
eball
8ab1c1997c cherry-pick: bfl: myapps api add rawAppName (#2432) 2026-02-03 13:13:05 +08:00
eball
41e8c188ee cherry-pick: feat(cli): collect nginx logs stored temporarily in some containers (#2429) 2026-02-03 13:12:16 +08:00
eball
e3885df940 cherry-pick: daemon: modify mDNS registration method (#2427) 2026-01-19 23:29:59 +08:00
eball
fa9662afbf cherry-pick: tapr: add max retry for delete action (#2426) 2026-01-19 20:32:02 +08:00
eball
d88f248e28 cherry-pick: hami: revert hami-core latest update (#2424) 2026-01-19 19:38:44 +08:00
eball
e5072023e4 cherry-pick: feat(olares-app): update olares-app version to v1.7.7 (#2423) 2026-01-19 14:09:13 +08:00
eball
0b155a8ea4 cherry-pick: feat(olares-app): update new version to v1.7.6 (#2422) 2026-01-19 14:08:49 +08:00
eball
529208055f cherry-pick: feat: optimize highlight segment order (#2420) 2026-01-16 15:43:05 +08:00
eball
2c3ce26b79 cherry-pick: fix: fix meaningless word highlight (#2418) 2026-01-15 19:34:57 +08:00
eball
4d9104c9f0 cherry-pick: settings: update search origin (#2417) 2026-01-15 19:34:30 +08:00
eball
75c76b80fb cherry-pick: kubeblocks: skip check pod spec,status image (#2414) 2026-01-15 19:33:58 +08:00
eball
4d4ae2c673 cherry-pick: olares-app, login: update version to v1.7.4 (#2413) 2026-01-15 19:33:30 +08:00
eball
644adacfab cherry-pick: fix: fix english highight missing (#2412) 2026-01-15 19:32:58 +08:00
eball
6c383b5a45 cherry-pick: daemon: handle missing auth token for WebSocket connections (#2411) 2026-01-15 19:32:27 +08:00
eball
db49d10b65 cherry-pick: feat(gpu): update gpu plugin version to v2.6.8 (#2410) 2026-01-15 19:31:59 +08:00
eball
1cd47a5abe cherry-pick: user-service: update mtranserverv2 (#2408) 2026-01-14 14:40:38 +08:00
eball
a7e455239e cherry-pick: fix: files check disk space for upload link and copy (#2407) 2026-01-14 14:40:11 +08:00
eball
5df6f3e5c6 cherry-pick: feat(cli): sync kubeconfig for the original user invoking sudo (#2406) 2026-01-14 14:39:42 +08:00
Power-One-2025
698bdf96ed docs: remove outdated environment variables (#2394) 2026-01-12 14:05:52 +08:00
wiy
69e6ac35f8 feat(olares-app): file upload add total_size parameter (#2404)
* feat(olares-app): file upload add total_size parameter

* fix: infisical update

---------

Co-authored-by: aby913 <aby913@163.com>
2026-01-12 14:01:09 +08:00
salt
f41e66b39a feat: search3 upgrade to v0.1.2 for juicefs watch (#2403)
Co-authored-by: ubuntu <you@example.com>
2026-01-12 14:00:32 +08:00
dkeven
1a36faaf6d feat(cli): add upgrader for main line version 1.12.4 (#2402) 2026-01-12 13:59:24 +08:00
Yajing
cbdd08d237 docs: add faqs and refactor help docs (#2376)
* docs: add faqs and refactor help docs

* align zh-cn
2026-01-10 12:56:33 +08:00
dkeven
2fd9d23371 feat(cli): optimize and unify pod readiness check logic (#2393) 2026-01-09 16:10:12 +08:00
hysyeah
f1714534db appservice: delay create nats conn (#2392)
* fix: failed release upgrade

* fix: helm upgrade do not use atomic param and allow upgrade failed release

* fix: delay create nats conn (#2391)

* set appservice image tag and add readiness probe
2026-01-09 15:59:35 +08:00
lovehunter9
9bc66369df fix: files sync reconnection error msg and upload chuck access token (#2390) 2026-01-09 15:22:31 +08:00
Meow33
ba85b0f60d docs/remove outdated env variables 2026-01-09 14:45:07 +08:00
aby913
7c2624d418 market: skip systemenv check in the cloud, add nsfw trigger in settings (#2387)
market: fix systemenv in public, add nsfw trigger in settings
2026-01-08 23:36:40 +08:00
hysyeah
7eb21516d0 authelia,lldap: distinguish error message in firstfactor authentication (#2389) 2026-01-08 23:35:52 +08:00
berg
266aef8616 system frontend: add the NSFW feature (#2388)
* market: fix sync app state on nats, add log levels

* feat: update system frontend to v1.6.42

---------

Co-authored-by: aby913 <aby913@163.com>
2026-01-08 23:35:09 +08:00
aby913
3755bede0c backup: folder set to UID 1000 (#2386)
* backup: backup folder set to UID 1000

* backup: folder set to UID 1000
2026-01-08 23:33:01 +08:00
hysyeah
cca39eed7e appservice: fix inorder nats event (#2384)
* fix: failed release upgrade

* fix: helm upgrade do not use atomic param and allow upgrade failed release

* fix: push all nats event to queue  (#2374)

* fix: push all nats event to queue and via one connection

* fix: wrap yaml decode error

* update appservice image tag to 0.4.74
2026-01-08 23:31:25 +08:00
dkeven
b27b90b9a8 fix(bfl): add backend cluster API handler for stats report (#2382)
* fix(bfl): add backend cluster API handler for stats report (#2381)

* chore(bfl): update image version to v0.4.38
2026-01-08 23:30:37 +08:00
eball
119ec75234 cli: enhance CUDA library handling for WSL with strace detection (#2380) 2026-01-08 23:30:05 +08:00
aby913
8739bfc040 market: fix sync app state on nats, add log levels, nsfw label (#2379)
market: fix sync app state on nats, add log levels
2026-01-08 00:54:34 +08:00
Yajing
6304739725 docs: merge 1.12.3 docs to main (#2377) 2026-01-07 19:25:30 +08:00
yajing wang
f8f452b27f fix formatting 2026-01-07 19:12:03 +08:00
yajing wang
36acf0384d fix conflicts 2026-01-07 17:09:41 +08:00
Meow33
aa5b073b5c docs: update based on comments 2026-01-07 16:58:44 +08:00
Meow33
18dfae6c87 docs: add steam guide zh cn 2026-01-07 16:58:42 +08:00
Meow33
a54445db8b docs: address comments 2026-01-07 16:58:20 +08:00
Meow33
375e2c4f63 Apply suggestions from code review
Co-authored-by: Yajing <110797546+fnalways@users.noreply.github.com>
2026-01-07 16:58:20 +08:00
Meow33
c366b56de9 docs: update based on suggestions 2026-01-07 16:58:20 +08:00
Meow33
85d90a36ed docs: update based on suggestions 2026-01-07 16:58:20 +08:00
Meow33
172c5342d8 docs: update file search guide 2026-01-07 16:58:20 +08:00
Yajing
dcc0ab1cd2 Update docs/zh/manual/olares/wise/index.md 2026-01-07 16:58:20 +08:00
Yajing
b078f80b5a fix wording 2026-01-07 16:58:20 +08:00
Meow33
854e25096f docs: update based on comments 2026-01-07 16:58:20 +08:00
Meow33
78949de2b6 docs: update based on comments 2026-01-07 16:58:20 +08:00
Meow33
bd72cb8067 docs: update based on comments 2026-01-07 16:58:20 +08:00
Meow33
3b9f0d33a3 docs: update based on suggestions 2026-01-07 16:58:20 +08:00
Meow33
3e782c6cea Apply suggestions from code review
Co-authored-by: Yajing <110797546+fnalways@users.noreply.github.com>
2026-01-07 16:58:20 +08:00
Meow33
28c2979db0 docs: update based on suggestions 2026-01-07 16:58:20 +08:00
Meow33
fc8ade657d docs: update based on comments 2026-01-07 16:58:20 +08:00
Meow33
74c80a9c7e Apply suggestions from code review
Co-authored-by: Yajing <110797546+fnalways@users.noreply.github.com>
2026-01-07 16:58:20 +08:00
Meow33
51a06f8964 docs: update relevant docs 2026-01-07 16:58:18 +08:00
Meow33
0c50d93d77 docs: refactor guide for gpu management 2026-01-07 16:57:42 +08:00
Power-One-2025
17b8d2d96e docs/updates/comment 2026-01-07 16:57:42 +08:00
Power-One-2025
5b5e5d289c docs/updates/comment 2026-01-07 16:57:42 +08:00
Power-One-2025
b113f66c4f Update docs/manual/olares/market/clone-apps.md
Co-authored-by: Yajing <110797546+fnalways@users.noreply.github.com>
2026-01-07 16:57:42 +08:00
Power-One-2025
bbbe3ecf9b docs/update/comment 2026-01-07 16:57:42 +08:00
Power-One-2025
b7ff5db985 docs/update/comments 2026-01-07 16:57:42 +08:00
Power-One-2025
f39e359ef8 Update docs/manual/olares/market/purchase-paid-apps.md
Co-authored-by: Yajing <110797546+fnalways@users.noreply.github.com>
2026-01-07 16:57:42 +08:00
Power-One-2025
4a80ef6148 Update docs/.vitepress/en.ts
Co-authored-by: Yajing <110797546+fnalways@users.noreply.github.com>
2026-01-07 16:57:42 +08:00
Power-One-2025
c4af7a5783 docs/updates/comment 2026-01-07 16:57:42 +08:00
Power-One-2025
5c498fbe18 Update docs/manual/olares/market/purchase-paid-apps.md
Co-authored-by: Yajing <110797546+fnalways@users.noreply.github.com>
2026-01-07 16:57:42 +08:00
Power-One-2025
4fbe32b141 docs/update/comment 2026-01-07 16:57:42 +08:00
Power-One-2025
46fc840302 docs/update/address-comments 2026-01-07 16:57:42 +08:00
Power-One-2025
5677026de0 Update docs/manual/olares/market/clone-apps.md
Co-authored-by: Yajing <110797546+fnalways@users.noreply.github.com>
2026-01-07 16:57:42 +08:00
Power-One-2025
4d95152e0a Update docs/manual/olares/market/clone-apps.md
Co-authored-by: Yajing <110797546+fnalways@users.noreply.github.com>
2026-01-07 16:57:42 +08:00
Power-One-2025
9560985965 Update docs/manual/olares/market/clone-apps.md
Co-authored-by: Yajing <110797546+fnalways@users.noreply.github.com>
2026-01-07 16:57:42 +08:00
Power-One-2025
1b6d90c2a5 Update docs/manual/olares/market/purchase-paid-apps.md
Co-authored-by: Yajing <110797546+fnalways@users.noreply.github.com>
2026-01-07 16:57:42 +08:00
Power-One-2025
2c73b3b7f8 Update docs/manual/olares/market/purchase-paid-apps.md
Co-authored-by: Yajing <110797546+fnalways@users.noreply.github.com>
2026-01-07 16:57:42 +08:00
Power-One-2025
22c52398ed docs/update/fix-comment 2026-01-07 16:57:42 +08:00
Power-One-2025
d1e55515d4 docs/updates/fix-note-style 2026-01-07 16:57:42 +08:00
Power-One-2025
5db251520d docs/updates/fix-comments 2026-01-07 16:57:42 +08:00
Power-One-2025
d2b630c7b4 docs/update/fix-links 2026-01-07 16:57:40 +08:00
Power-One-2025
0debd332a8 docs/updates/fix-toc 2026-01-07 16:54:40 +08:00
Power-One-2025
9a2c58e3fa docs/updates/market-comments-fix 2026-01-07 16:54:38 +08:00
Meow33
b8842cfe61 docs: update based on suggestions 2026-01-07 16:54:02 +08:00
Meow33
70e170b71a docs: update larepass upgrade descriptions 2026-01-07 16:54:02 +08:00
Power-One-2025
e975e4aec8 docs/update/files-index-update 2026-01-07 16:54:02 +08:00
Power-One-2025
9d6d242625 docs/update/refine-images 2026-01-07 16:54:02 +08:00
Power-One-2025
86d7b985a2 docs/update/preview-edit-files 2026-01-07 16:54:01 +08:00
Power-One-2025
31a2b3ee28 docs/updates/add-images 2026-01-07 16:54:01 +08:00
Power-One-2025
9aa7e0b108 docs/update/add-image-share 2026-01-07 16:54:01 +08:00
Power-One-2025
9092f28458 docs/updates/files-comments-fix 2026-01-07 16:54:01 +08:00
Yajing
f925268cd4 fix typo
Co-authored-by: Meow33 <supermonkey03@163.com>
2026-01-07 16:54:01 +08:00
yajing wang
e1c19f7327 update intro & screenshots 2026-01-07 16:54:01 +08:00
Yajing
5e925e0cb6 Apply suggestions
Co-authored-by: Meow33 <supermonkey03@163.com>
2026-01-07 16:54:01 +08:00
yajing wang
6a0885d37d fix lint 2026-01-07 16:54:00 +08:00
yajing wang
3e46af80e1 docs: add play games directly on olares device 2026-01-07 16:53:12 +08:00
yajing wang
74c48b81fb docs: update windows use case 2026-01-07 16:52:03 +08:00
Power-One-2025
56aed6b683 Update docs/zh/manual/olares/settings/gpu-resource.md 2026-01-07 16:52:03 +08:00
Meow33
cbfcf3d3aa docs: update screenshots 2026-01-07 16:52:03 +08:00
Meow33
fd23e52723 docs: update based on suggestions 2026-01-07 16:52:03 +08:00
Meow33
b48368b934 docs: update guide for manage gpu usage 2026-01-07 16:52:03 +08:00
Meow33
ca9ce45353 docs: update based on suggestions 2026-01-07 16:52:03 +08:00
Meow33
fa148969c5 docs: update en version based on suggestions and update translation 2026-01-07 16:52:03 +08:00
Meow33
21c1884bb8 docs: update tutorials for Wise 2026-01-07 16:52:03 +08:00
Meow33
b517d08981 docs: update based on suggestions 2026-01-07 16:52:03 +08:00
Meow33
73e2cd0eb4 docs: update based on suggestions 2026-01-07 16:52:03 +08:00
Meow33
a631db1e9e docs: add guide for search under settings 2026-01-07 16:52:03 +08:00
Meow33
f3b59b9b3e docs: add larepass upgrade restart prompt 2026-01-07 16:52:03 +08:00
Power-One-2025
910bf02b48 Update docs/manual/olares/market.md
Co-authored-by: Meow33 <supermonkey03@163.com>
2026-01-07 16:52:03 +08:00
Power-One-2025
dcc909a06e Update docs/manual/olares/market.md
Co-authored-by: Meow33 <supermonkey03@163.com>
2026-01-07 16:52:03 +08:00
Power-One-2025
1238ad01f1 Update docs/zh/manual/olares/market.md
Co-authored-by: Meow33 <supermonkey03@163.com>
2026-01-07 16:52:03 +08:00
Power-One-2025
77ee176f5e Update docs/manual/olares/market.md
Co-authored-by: Meow33 <supermonkey03@163.com>
2026-01-07 16:52:03 +08:00
Power-One-2025
1d9c3f7b4a Update docs/manual/olares/market.md
Co-authored-by: Meow33 <supermonkey03@163.com>
2026-01-07 16:52:03 +08:00
Power-One-2025
8a52737f89 docs/update/refine-description 2026-01-07 16:52:03 +08:00
Power-One-2025
bd7c46a663 docs/update/table-line-wrap 2026-01-07 16:52:03 +08:00
Power-One-2025
9ee4af9040 docs/update/add-faq-resume-app 2026-01-07 16:52:03 +08:00
Power-One-2025
fc86bbadc2 docs/update/image 2026-01-07 16:52:03 +08:00
Power-One-2025
52118b1126 docs/updates/clond-apps-images 2026-01-07 16:52:01 +08:00
Power-One-2025
76be9e82c0 docs/updates/resize-image 2026-01-07 16:51:21 +08:00
Power-One-2025
478d9f28c8 Update docs/manual/olares/market.md
Co-authored-by: Meow33 <supermonkey03@163.com>
2026-01-07 16:51:21 +08:00
Power-One-2025
114ed5ad7b Update docs/manual/olares/market.md
Co-authored-by: Meow33 <supermonkey03@163.com>
2026-01-07 16:51:21 +08:00
Power-One-2025
c85b23d9a9 Update docs/zh/manual/olares/market.md
Co-authored-by: Meow33 <supermonkey03@163.com>
2026-01-07 16:51:21 +08:00
Power-One-2025
fbc61764ca Update docs/zh/manual/olares/market.md
Co-authored-by: Meow33 <supermonkey03@163.com>
2026-01-07 16:51:21 +08:00
Power-One-2025
d866966531 Update docs/zh/manual/olares/market.md
Co-authored-by: Meow33 <supermonkey03@163.com>
2026-01-07 16:51:21 +08:00
Power-One-2025
d140849d7c Update docs/zh/manual/olares/market.md
Co-authored-by: Meow33 <supermonkey03@163.com>
2026-01-07 16:51:21 +08:00
Power-One-2025
679ddb0f8d Update docs/zh/manual/olares/market.md
Co-authored-by: Meow33 <supermonkey03@163.com>
2026-01-07 16:51:21 +08:00
Power-One-2025
0ec0a5a4ac Update docs/zh/manual/olares/market.md
Co-authored-by: Meow33 <supermonkey03@163.com>
2026-01-07 16:51:21 +08:00
Power-One-2025
74ecf9f73d Update docs/zh/manual/olares/market.md
Co-authored-by: Meow33 <supermonkey03@163.com>
2026-01-07 16:51:21 +08:00
Power-One-2025
028c5c7bdb Update docs/manual/olares/market.md
Co-authored-by: Meow33 <supermonkey03@163.com>
2026-01-07 16:51:21 +08:00
Power-One-2025
f3ab03becc docs/update/consistency 2026-01-07 16:51:21 +08:00
Power-One-2025
e408da75a4 docs/update/mobile-app-image-style 2026-01-07 16:51:21 +08:00
Power-One-2025
8ffbc82ebd docs/update/formatting-fix-zh 2026-01-07 16:51:21 +08:00
Power-One-2025
304dbf69c5 docs/updates/formatting-fix 2026-01-07 16:51:21 +08:00
Power-One-2025
66b0144b40 docs/update/add-restore-purchased-app 2026-01-07 16:51:21 +08:00
Power-One-2025
e91a76f92f docs/updates/dev-comments 2026-01-07 16:51:21 +08:00
Power-One-2025
45cd406cd4 docs/updates/add-images-paid-app 2026-01-07 16:51:21 +08:00
Power-One-2025
7ef7ae9335 docs/feat/purchase-paid-apps 2026-01-07 16:51:21 +08:00
Power-One-2025
f2f342a28a Update docs/zh/manual/olares/market.md
Co-authored-by: Meow33 <supermonkey03@163.com>
2026-01-07 16:51:21 +08:00
Power-One-2025
fdca458e4f docs/update/clone-apps 2026-01-07 16:51:21 +08:00
Power-One-2025
b7141373b7 docs/updates/add-note 2026-01-07 16:51:21 +08:00
Power-One-2025
21118c8e95 docs/updates/single-source-for-sync 2026-01-07 16:51:19 +08:00
Power-One-2025
307a6bb502 docs/updates/address comments on share files 2026-01-07 16:50:00 +08:00
Power-One-2025
91ec932c95 Update docs/manual/olares/files/add-edit-download.md
Co-authored-by: Meow33 <supermonkey03@163.com>
2026-01-07 16:50:00 +08:00
Power-One-2025
a1cb16cfe9 docs/feat/share-files 2026-01-07 16:49:57 +08:00
Power-One-2025
aec5e178b3 docs/update/add-title-level 2026-01-07 16:48:15 +08:00
Power-One-2025
2624ea5dc5 docs/updates/address comment on files sync 2026-01-07 16:48:15 +08:00
Power-One-2025
0d1bae720d Update docs/manual/olares/files/add-edit-download.md
Co-authored-by: Meow33 <supermonkey03@163.com>
2026-01-07 16:48:15 +08:00
Power-One-2025
96520a8bc3 docs/feature/sync-files-to-local 2026-01-07 16:48:15 +08:00
Power-One-2025
27b9356037 Update docs/zh/manual/olares/market.md
Co-authored-by: Meow33 <supermonkey03@163.com>
2026-01-07 16:48:15 +08:00
Power-One-2025
c289d5837c Update docs/zh/manual/olares/market.md
Co-authored-by: Meow33 <supermonkey03@163.com>
2026-01-07 16:48:15 +08:00
Power-One-2025
e6f9922951 address comment 2026-01-07 16:48:15 +08:00
Power-One-2025
a3ad8ce78c Update market.md 2026-01-07 16:48:15 +08:00
Power-One-2025
c70587062a Update market.md 2026-01-07 16:48:14 +08:00
Power-One-2025
f7306b66dc Update market.md 2026-01-07 16:48:14 +08:00
Power-One-2025
325bfeb90d Update market.md 2026-01-07 16:48:14 +08:00
Power-One-2025
bfc3ca0720 Update docs/manual/olares/market.md
Co-authored-by: Meow33 <supermonkey03@163.com>
2026-01-07 16:48:14 +08:00
Power-One-2025
ef071e43ca docs: new app clone feature to Market 2026-01-07 16:48:14 +08:00
eball
473898a715 daemon: bump zeroconf dependency to v0.2.4 (#2375)
daemon: bump zeroconf dependency to v0.2.4 and increase log verbosity for server events
2026-01-07 00:10:40 +08:00
lovehunter9
637b1839f7 fix: files sync reconnection at pipe client when sending has met broken pipe (#2373) 2026-01-05 23:46:42 +08:00
wiy
1f1c1a8d3b olares-app: update vault add websocket (#2372)
wizard: update qrcode size
2026-01-05 23:46:03 +08:00
dkeven
1ddcc3bd4c fix(gpu): handle scheduler inconsistency and device stuck in unhealthy (#2371) 2026-01-05 23:44:50 +08:00
dkeven
96a2eb524a fix(cli): remove olares name when uninstalling to prepare (#2370) 2026-01-05 23:44:08 +08:00
293 changed files with 5320 additions and 2322 deletions

View File

@@ -54,6 +54,7 @@ rules:
- "/system/configuration/encoding"
- "/api/search/get_directory/"
- "/api/search/sync_search/"
- "/api/share/smb_share_user/"
verbs: ["*"]
---

View File

@@ -317,7 +317,7 @@ spec:
chown -R 1000:1000 /uploadstemp && \
chown -R 1000:1000 /appdata
- name: olares-app-init
image: beclab/system-frontend:v1.6.38
image: beclab/system-frontend:v1.8.10
imagePullPolicy: IfNotPresent
command:
- /bin/sh
@@ -439,7 +439,7 @@ spec:
- name: NATS_SUBJECT_VAULT
value: os.vault.{{ .Values.bfl.username}}
- name: user-service
image: beclab/user-service:v0.0.81
image: beclab/user-service:v0.0.85
imagePullPolicy: IfNotPresent
ports:
- containerPort: 3000

View File

@@ -12,4 +12,5 @@ rules:
- "/task/*"
- "/search/*"
- "/monitorsetting/*"
- "/file/*"
verbs: ["*"]

View File

@@ -29,7 +29,7 @@ spec:
containers:
- name: wizard
image: beclab/wizard:v1.6.30
image: beclab/wizard:v1.6.40
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80

View File

@@ -3,6 +3,7 @@ package os
import (
"archive/tar"
"compress/gzip"
"context"
"fmt"
"io"
"log"
@@ -13,6 +14,9 @@ import (
"strings"
"time"
corev1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/client-go/kubernetes"
"k8s.io/client-go/rest"
"k8s.io/client-go/tools/clientcmd"
ctrl "sigs.k8s.io/controller-runtime"
@@ -276,7 +280,7 @@ func collectSystemdLogs(tw *tar.Writer, options *LogCollectOptions) error {
}
func collectDmesgLogs(tw *tar.Writer, options *LogCollectOptions) error {
cmd := exec.Command("dmesg")
cmd := exec.Command("dmesg", "-T")
output, err := cmd.Output()
if err != nil {
return err
@@ -399,6 +403,126 @@ func collectKubernetesLogs(tw *tar.Writer, options *LogCollectOptions) error {
}
}
if err := collectNginxLogsFromLabeledPods(tw); err != nil {
if !options.IgnoreKubeErrors {
return fmt.Errorf("failed to collect nginx logs from labeled pods: %v", err)
}
}
return nil
}
func collectNginxLogsFromLabeledPods(tw *tar.Writer) error {
if _, err := util.GetCommand("kubectl"); err != nil {
fmt.Printf("warning: kubectl not found, skipping collecting nginx logs from labeled pods\n")
return nil
}
cfg, err := ctrl.GetConfig()
if err != nil {
return fmt.Errorf("failed to get kubeconfig: %v", err)
}
clientset, err := kubernetes.NewForConfig(cfg)
if err != nil {
return fmt.Errorf("failed to create kube client: %v", err)
}
type selectorSpec struct {
LabelSelector string
ContainerName string
}
selectors := []selectorSpec{
{LabelSelector: "app=l4-bfl-proxy", ContainerName: ""},
{LabelSelector: "tier=bfl", ContainerName: "ingress"},
}
type targetPod struct {
Namespace string
Name string
ContainerName string
}
var targets []targetPod
ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
defer cancel()
for _, sel := range selectors {
podList, err := clientset.CoreV1().Pods(corev1.NamespaceAll).List(ctx, metav1.ListOptions{LabelSelector: sel.LabelSelector})
if err != nil {
return fmt.Errorf("failed to list pods by label %q: %v", sel.LabelSelector, err)
}
for _, pod := range podList.Items {
targets = append(targets, targetPod{
Namespace: pod.Namespace,
Name: pod.Name,
ContainerName: sel.ContainerName,
})
}
}
if len(targets) == 0 {
return nil
}
// simplest approach: use kubectl cp (it already implements copy via tar over exec)
tempDir, err := os.MkdirTemp("", "olares-nginx-logs-*")
if err != nil {
return fmt.Errorf("failed to create temp directory for nginx logs: %v", err)
}
defer os.RemoveAll(tempDir)
files := []string{"/var/log/nginx/access.log", "/var/log/nginx/error.log"}
for _, target := range targets {
for _, remotePath := range files {
base := filepath.Base(remotePath)
archivePath := filepath.Join("nginx", target.Namespace, target.Name, base)
dest := filepath.Join(tempDir, fmt.Sprintf("%s__%s__%s", target.Namespace, target.Name, base))
err := kubectlCopyFile(target.Namespace, target.Name, target.ContainerName, remotePath, dest)
if err != nil {
return fmt.Errorf("failed to kubectl cp %s/%s:%s: %v", target.Namespace, target.Name, remotePath, err)
}
fi, err := os.Stat(dest)
if err != nil {
return fmt.Errorf("failed to stat copied nginx log %s: %v", dest, err)
}
f, err := os.Open(dest)
if err != nil {
return fmt.Errorf("failed to open copied nginx log %s: %v", dest, err)
}
defer f.Close()
header := &tar.Header{
Name: archivePath,
Mode: 0644,
Size: fi.Size(),
ModTime: time.Now(),
}
if err := tw.WriteHeader(header); err != nil {
return fmt.Errorf("failed to write header for %s: %v", archivePath, err)
}
if _, err := io.CopyN(tw, f, header.Size); err != nil {
return fmt.Errorf("failed to write data for %s: %v", archivePath, err)
}
}
}
return nil
}
func kubectlCopyFile(namespace, pod, container, remotePath, destPath string) error {
args := []string{"-n", namespace, "cp"}
if container != "" {
args = append(args, "-c", container)
}
args = append(args, fmt.Sprintf("%s:%s", pod, remotePath), destPath)
cmd := exec.Command("kubectl", args...)
if out, err := cmd.CombinedOutput(); err != nil {
return fmt.Errorf("kubectl %s failed: %v, output: %s", strings.Join(args, " "), err, strings.TrimSpace(string(out)))
}
return nil
}
@@ -524,7 +648,7 @@ func checkServiceExists(service string) bool {
func NewCmdLogs() *cobra.Command {
options := &LogCollectOptions{
Since: "7d",
MaxLines: 3000,
MaxLines: 20000,
OutputDir: "./olares-logs",
IgnoreKubeErrors: false,
}

View File

@@ -287,7 +287,7 @@ func (a *Argument) LoadReleaseInfo() error {
return nil
}
func (a *Argument) SaveReleaseInfo() error {
func (a *Argument) SaveReleaseInfo(withoutName bool) error {
if a.BaseDir == "" {
return errors.New("invalid: empty base directory")
}
@@ -300,15 +300,17 @@ func (a *Argument) SaveReleaseInfo() error {
ENV_OLARES_VERSION: a.OlaresVersion,
}
if a.User != nil && a.User.UserName != "" && a.User.DomainName != "" {
releaseInfoMap["OLARES_NAME"] = fmt.Sprintf("%s@%s", a.User.UserName, a.User.DomainName)
} else {
if util.IsExist(OlaresReleaseFile) {
// if the user is not set, try to load the user name from the release file
envs, err := godotenv.Read(OlaresReleaseFile)
if err == nil {
if userName, ok := envs["OLARES_NAME"]; ok {
releaseInfoMap["OLARES_NAME"] = userName
if !withoutName {
if a.User != nil && a.User.UserName != "" && a.User.DomainName != "" {
releaseInfoMap["OLARES_NAME"] = fmt.Sprintf("%s@%s", a.User.UserName, a.User.DomainName)
} else {
if util.IsExist(OlaresReleaseFile) {
// if the user is not set, try to load the user name from the release file
envs, err := godotenv.Read(OlaresReleaseFile)
if err == nil {
if userName, ok := envs["OLARES_NAME"]; ok {
releaseInfoMap["OLARES_NAME"] = userName
}
}
}
}

View File

@@ -263,6 +263,10 @@ func (t *PatchK3sDriver) Execute(runtime connector.Runtime) error {
return err
}
if _, err := runtime.GetRunner().SudoCmd("apt install -y strace", false, false); err != nil {
return err
}
if _, err := runtime.GetRunner().SudoCmd(dstName, false, false); err != nil {
return errors.Wrap(err, "failed to apply CUDA patch for WSL")
}

View File

@@ -10,17 +10,39 @@ var (
K3sCudaFixValues = template.Must(template.New("cuda_lib_fix.sh").Parse(
dedent.Dedent(`#!/bin/bash
sh_c="sh -c"
real_driver=$($sh_c "find /usr/lib/wsl/drivers/ -name libcuda.so.1.1|head -1")
real_driver=""
real_nvml=""
# Try to find the real driver path via strace
real_driver_path=$($sh_c "strace -qq -e trace=openat /usr/lib/wsl/lib/nvidia-smi 2>&1|grep '/usr/lib/wsl/drivers'|grep libnvidia-ml.so.1|awk '{print \$2}'|sed 's/[\",]//g'|sed 's/libnvidia-ml.so.1//g'")
if [[ x"$real_driver_path" != x"" ]]; then
real_driver="${real_driver_path}libcuda.so.1.1"
real_nvml="${real_driver_path}libnvidia-ml.so.1"
else
driver_path=$($sh_c "strace -qq -e trace=openat /usr/lib/wsl/lib/nvidia-smi 2>&1|grep '/usr/lib/wsl/'|grep libnvidia-ml.so.1")
if [[ x"$driver_path" != x"" ]]; then
echo "already fixed cuda libs, exit now."
exit 0
fi
fi
if [[ x"$real_driver" == x"" ]]; then
real_driver=$($sh_c "find /usr/lib/wsl/drivers/ -name libcuda.so.1.1|head -1")
real_nvml=$($sh_c "find /usr/lib/wsl/drivers/ -name libnvidia-ml.so.1|head -1")
fi
if [[ x"$real_driver" != x"" ]]; then
$sh_c "ln -s /usr/lib/wsl/lib/libcuda* /usr/lib/x86_64-linux-gnu/"
$sh_c "rm -f /usr/lib/x86_64-linux-gnu/libcuda.so"
$sh_c "rm -f /usr/lib/x86_64-linux-gnu/libcuda.so.1"
$sh_c "rm -f /usr/lib/x86_64-linux-gnu/libcuda.so.1.1"
$sh_c "rm -f /usr/lib/x86_64-linux-gnu/libnvidia-ml.so.1"
$sh_c "cp -f $real_driver /usr/lib/wsl/lib/libcuda.so"
$sh_c "cp -f $real_driver /usr/lib/wsl/lib/libcuda.so.1"
$sh_c "cp -f $real_driver /usr/lib/wsl/lib/libcuda.so.1.1"
$sh_c "ln -s $real_driver /usr/lib/x86_64-linux-gnu/libcuda.so.1"
$sh_c "ln -s $real_driver /usr/lib/x86_64-linux-gnu/libcuda.so.1.1"
$sh_c "cp -f $real_nvml /usr/lib/wsl/lib/libnvidia-ml.so.1"
$sh_c "cp -f $real_driver /usr/lib/x86_64-linux-gnu/"
$sh_c "cp -f $real_nvml /usr/lib/x86_64-linux-gnu/"
$sh_c "ln -s /usr/lib/x86_64-linux-gnu/libcuda.so.1.1 /usr/lib/x86_64-linux-gnu/libcuda.so.1"
$sh_c "ln -s /usr/lib/x86_64-linux-gnu/libcuda.so.1 /usr/lib/x86_64-linux-gnu/libcuda.so"
fi`),
))

View File

@@ -36,6 +36,7 @@ import (
"github.com/beclab/Olares/cli/pkg/k3s/templates"
"github.com/beclab/Olares/cli/pkg/manifest"
"github.com/beclab/Olares/cli/pkg/registry"
"github.com/beclab/Olares/cli/pkg/storage"
)
type InstallContainerModule struct {
@@ -470,6 +471,18 @@ func (j *JoinNodesModule) Init() {
Parallel: true,
}
createSharedLibDirForWorker := &task.RemoteTask{
Name: "CreateSharedLibDir(k3s)",
Desc: "Create shared lib directory on worker",
Hosts: j.Runtime.GetHostsByRole(common.Worker),
Prepare: &prepare.PrepareCollection{
&kubernetes.NodeInCluster{Not: true},
new(common.OnlyWorker),
},
Action: new(storage.CreateSharedLibDir),
Parallel: true,
}
enableK3s := &task.RemoteTask{
Name: "EnableK3sService",
Desc: "Enable k3s service",
@@ -536,6 +549,7 @@ func (j *JoinNodesModule) Init() {
k3sService,
k3sEnv,
k3sRegistryConfig,
createSharedLibDirForWorker,
enableK3s,
copyKubeConfigForMaster,
syncKubeConfigToWorker,

View File

@@ -397,53 +397,23 @@ type CopyK3sKubeConfig struct {
}
func (c *CopyK3sKubeConfig) Execute(runtime connector.Runtime) error {
createConfigDirCmd := "mkdir -p /root/.kube && mkdir -p $HOME/.kube"
getKubeConfigCmd := "cp -f /etc/rancher/k3s/k3s.yaml /root/.kube/config"
chmodKubeConfigCmd := "chmod 0600 /root/.kube/config"
targetHome, targetUID, targetGID, err := utils.ResolveSudoUserHomeAndIDs(runtime)
if err != nil {
return err
}
cmd := strings.Join([]string{createConfigDirCmd, getKubeConfigCmd, chmodKubeConfigCmd}, " && ")
if _, err := runtime.GetRunner().SudoCmd(cmd, false, false); err != nil {
cmds := []string{
"mkdir -p /root/.kube",
"cp -f /etc/rancher/k3s/k3s.yaml /root/.kube/config",
"chmod 0600 /root/.kube/config",
fmt.Sprintf("mkdir -p %s", filepath.Join(targetHome, ".kube")),
fmt.Sprintf("cp -f /etc/rancher/k3s/k3s.yaml %s", filepath.Join(targetHome, ".kube", "config")),
fmt.Sprintf("chmod 0600 %s", filepath.Join(targetHome, ".kube", "config")),
fmt.Sprintf("chown -R %s:%s %s", targetUID, targetGID, filepath.Join(targetHome, ".kube")),
}
if _, err := runtime.GetRunner().SudoCmd(strings.Join(cmds, " && "), false, false); err != nil {
return errors.Wrap(errors.WithStack(err), "copy k3s kube config failed")
}
userMkdir := "mkdir -p $HOME/.kube"
if _, err := runtime.GetRunner().Cmd(userMkdir, false, false); err != nil {
return errors.Wrap(errors.WithStack(err), "user mkdir $HOME/.kube failed")
}
userCopyKubeConfig := "cp -f /etc/rancher/k3s/k3s.yaml $HOME/.kube/config"
if _, err := runtime.GetRunner().SudoCmd(userCopyKubeConfig, false, false); err != nil {
return errors.Wrap(errors.WithStack(err), "user copy /etc/rancher/k3s/k3s.yaml to $HOME/.kube/config failed")
}
if _, err := runtime.GetRunner().SudoCmd("chmod 0600 $HOME/.kube/config", false, false); err != nil {
return errors.Wrap(errors.WithStack(err), "chmod k3s $HOME/.kube/config 0600 failed")
}
// userId, err := runtime.GetRunner().Cmd("echo $(id -u)", false, false)
// if err != nil {
// return errors.Wrap(errors.WithStack(err), "get user id failed")
// }
// userGroupId, err := runtime.GetRunner().Cmd("echo $(id -g)", false, false)
// if err != nil {
// return errors.Wrap(errors.WithStack(err), "get user group id failed")
// }
userId, err := runtime.GetRunner().Cmd("echo $SUDO_UID", false, false)
if err != nil {
return errors.Wrap(errors.WithStack(err), "get user id failed")
}
userGroupId, err := runtime.GetRunner().Cmd("echo $SUDO_GID", false, false)
if err != nil {
return errors.Wrap(errors.WithStack(err), "get user group id failed")
}
chownKubeConfig := fmt.Sprintf("chown -R %s:%s $HOME/.kube", userId, userGroupId)
if _, err := runtime.GetRunner().SudoCmd(chownKubeConfig, false, false); err != nil {
return errors.Wrap(errors.WithStack(err), "chown user kube config failed")
}
return nil
}
@@ -493,59 +463,29 @@ func (s *SyncKubeConfigToWorker) Execute(runtime connector.Runtime) error {
if v, ok := s.PipelineCache.Get(common.ClusterStatus); ok {
cluster := v.(*K3sStatus)
createConfigDirCmd := "mkdir -p /root/.kube"
if _, err := runtime.GetRunner().SudoCmd(createConfigDirCmd, false, false); err != nil {
return errors.Wrap(errors.WithStack(err), "create .kube dir failed")
}
oldServer := "server: https://127.0.0.1:6443"
newServer := fmt.Sprintf("server: https://%s:%d",
s.KubeConf.Cluster.ControlPlaneEndpoint.Domain,
s.KubeConf.Cluster.ControlPlaneEndpoint.Port)
newKubeConfig := strings.Replace(cluster.KubeConfig, oldServer, newServer, -1)
syncKubeConfigForRootCmd := fmt.Sprintf("echo '%s' > %s", newKubeConfig, "/root/.kube/config")
if _, err := runtime.GetRunner().SudoCmd(syncKubeConfigForRootCmd, false, false); err != nil {
return errors.Wrap(errors.WithStack(err), "sync kube config for root failed")
}
if _, err := runtime.GetRunner().SudoCmd("chmod 0600 /root/.kube/config", false, false); err != nil {
return errors.Wrap(errors.WithStack(err), "chmod k3s $HOME/.kube/config failed")
}
userConfigDirCmd := "mkdir -p $HOME/.kube"
if _, err := runtime.GetRunner().Cmd(userConfigDirCmd, false, false); err != nil {
return errors.Wrap(errors.WithStack(err), "user mkdir $HOME/.kube failed")
}
syncKubeConfigForUserCmd := fmt.Sprintf("echo '%s' > %s", newKubeConfig, "$HOME/.kube/config")
if _, err := runtime.GetRunner().Cmd(syncKubeConfigForUserCmd, false, false); err != nil {
return errors.Wrap(errors.WithStack(err), "sync kube config for normal user failed")
}
// userId, err := runtime.GetRunner().Cmd("echo $(id -u)", false, false)
// if err != nil {
// return errors.Wrap(errors.WithStack(err), "get user id failed")
// }
// userGroupId, err := runtime.GetRunner().Cmd("echo $(id -g)", false, false)
// if err != nil {
// return errors.Wrap(errors.WithStack(err), "get user group id failed")
// }
userId, err := runtime.GetRunner().Cmd("echo $SUDO_UID", false, false)
targetHome, targetUID, targetGID, err := utils.ResolveSudoUserHomeAndIDs(runtime)
if err != nil {
return errors.Wrap(errors.WithStack(err), "get user id failed")
return err
}
targetKubeConfigPath := filepath.Join(targetHome, ".kube", "config")
userGroupId, err := runtime.GetRunner().Cmd("echo $SUDO_GID", false, false)
if err != nil {
return errors.Wrap(errors.WithStack(err), "get user group id failed")
cmds := []string{
"mkdir -p /root/.kube",
fmt.Sprintf("echo '%s' > %s", newKubeConfig, "/root/.kube/config"),
"chmod 0600 /root/.kube/config",
fmt.Sprintf("mkdir -p %s", filepath.Join(targetHome, ".kube")),
fmt.Sprintf("echo '%s' > %s", newKubeConfig, targetKubeConfigPath),
fmt.Sprintf("chmod 0600 %s", targetKubeConfigPath),
fmt.Sprintf("chown -R %s:%s %s", targetUID, targetGID, filepath.Join(targetHome, ".kube")),
}
chownKubeConfig := fmt.Sprintf("chown -R %s:%s -R $HOME/.kube", userId, userGroupId)
if _, err := runtime.GetRunner().SudoCmd(chownKubeConfig, false, false); err != nil {
return errors.Wrap(errors.WithStack(err), "chown user kube config failed")
if _, err := runtime.GetRunner().SudoCmd(strings.Join(cmds, " && "), false, false); err != nil {
return errors.Wrap(errors.WithStack(err), "sync kube config failed")
}
}
return nil

View File

@@ -23,6 +23,7 @@ import (
"github.com/beclab/Olares/cli/pkg/core/prepare"
"github.com/beclab/Olares/cli/pkg/core/task"
"github.com/beclab/Olares/cli/pkg/manifest"
"github.com/beclab/Olares/cli/pkg/storage"
)
type StatusModule struct {
@@ -243,6 +244,18 @@ func (j *JoinNodesModule) Init() {
Retry: 5,
}
createSharedLibDirForWorker := &task.RemoteTask{
Name: "CreateSharedLibDir(k8s)",
Desc: "Create shared lib directory on worker",
Hosts: j.Runtime.GetHostsByRole(common.Worker),
Prepare: &prepare.PrepareCollection{
&NodeInCluster{Not: true},
new(common.OnlyWorker),
},
Action: new(storage.CreateSharedLibDir),
Parallel: true,
}
joinWorkerNode := &task.RemoteTask{
Name: "JoinWorkerNode(k8s)",
Desc: "Join worker node",
@@ -323,6 +336,7 @@ func (j *JoinNodesModule) Init() {
j.Tasks = []task.Interface{
generateKubeadmConfig,
joinMasterNode,
createSharedLibDirForWorker,
joinWorkerNode,
copyKubeConfig,
removeMasterTaint,

View File

@@ -417,51 +417,23 @@ type CopyKubeConfigForControlPlane struct {
}
func (c *CopyKubeConfigForControlPlane) Execute(runtime connector.Runtime) error {
createConfigDirCmd := "mkdir -p /root/.kube"
getKubeConfigCmd := "cp -f /etc/kubernetes/admin.conf /root/.kube/config"
cmd := strings.Join([]string{createConfigDirCmd, getKubeConfigCmd}, " && ")
if _, err := runtime.GetRunner().SudoCmd(cmd, false, false); err != nil {
targetHome, targetUID, targetGID, err := utils.ResolveSudoUserHomeAndIDs(runtime)
if err != nil {
return err
}
cmds := []string{
"mkdir -p /root/.kube",
"cp -f /etc/kubernetes/admin.conf /root/.kube/config",
"chmod 0600 /root/.kube/config",
fmt.Sprintf("mkdir -p %s", filepath.Join(targetHome, ".kube")),
fmt.Sprintf("cp -f /etc/kubernetes/admin.conf %s", filepath.Join(targetHome, ".kube", "config")),
fmt.Sprintf("chmod 0600 %s", filepath.Join(targetHome, ".kube", "config")),
fmt.Sprintf("chown -R %s:%s %s", targetUID, targetGID, filepath.Join(targetHome, ".kube")),
}
if _, err := runtime.GetRunner().SudoCmd(strings.Join(cmds, " && "), false, false); err != nil {
return errors.Wrap(errors.WithStack(err), "copy kube config failed")
}
userMkdir := "mkdir -p $HOME/.kube"
if _, err := runtime.GetRunner().Cmd(userMkdir, false, false); err != nil {
return errors.Wrap(errors.WithStack(err), "user mkdir $HOME/.kube failed")
}
userCopyKubeConfig := "cp -f /etc/kubernetes/admin.conf $HOME/.kube/config"
if _, err := runtime.GetRunner().SudoCmd(userCopyKubeConfig, false, false); err != nil {
return errors.Wrap(errors.WithStack(err), "user copy /etc/kubernetes/admin.conf to $HOME/.kube/config failed")
}
if _, err := runtime.GetRunner().SudoCmd("chmod 0600 $HOME/.kube/config", false, false); err != nil {
return errors.Wrap(errors.WithStack(err), "chmod $HOME/.kube/config failed")
}
// userId, err := runtime.GetRunner().Cmd("echo $(id -u)", false, false)
// if err != nil {
// return errors.Wrap(errors.WithStack(err), "get user id failed")
// }
// userGroupId, err := runtime.GetRunner().Cmd("echo $(id -g)", false, false)
// if err != nil {
// return errors.Wrap(errors.WithStack(err), "get user group id failed")
// }
userId, err := runtime.GetRunner().Cmd("echo $SUDO_UID", false, false)
if err != nil {
return errors.Wrap(errors.WithStack(err), "get user id failed")
}
userGroupId, err := runtime.GetRunner().Cmd("echo $SUDO_GID", false, false)
if err != nil {
return errors.Wrap(errors.WithStack(err), "get user group id failed")
}
chownKubeConfig := fmt.Sprintf("chown -R %s:%s $HOME/.kube", userId, userGroupId)
if _, err := runtime.GetRunner().SudoCmd(chownKubeConfig, false, false); err != nil {
return errors.Wrap(errors.WithStack(err), "chown user kube config failed")
}
return nil
}
@@ -521,53 +493,23 @@ func (s *SyncKubeConfigToWorker) Execute(runtime connector.Runtime) error {
if v, ok := s.PipelineCache.Get(common.ClusterStatus); ok {
cluster := v.(*KubernetesStatus)
createConfigDirCmd := "mkdir -p /root/.kube"
if _, err := runtime.GetRunner().SudoCmd(createConfigDirCmd, false, false); err != nil {
return errors.Wrap(errors.WithStack(err), "create .kube dir failed")
}
syncKubeConfigForRootCmd := fmt.Sprintf("echo '%s' > %s", cluster.KubeConfig, "/root/.kube/config")
if _, err := runtime.GetRunner().SudoCmd(syncKubeConfigForRootCmd, false, false); err != nil {
return errors.Wrap(errors.WithStack(err), "sync kube config for root failed")
}
if _, err := runtime.GetRunner().SudoCmd("chmod 0600 /root/.kube/config", false, false); err != nil {
return errors.Wrap(errors.WithStack(err), "chmod $HOME/.kube/config failed")
}
userConfigDirCmd := "mkdir -p $HOME/.kube"
if _, err := runtime.GetRunner().Cmd(userConfigDirCmd, false, false); err != nil {
return errors.Wrap(errors.WithStack(err), "user mkdir $HOME/.kube failed")
}
syncKubeConfigForUserCmd := fmt.Sprintf("echo '%s' > %s", cluster.KubeConfig, "$HOME/.kube/config")
if _, err := runtime.GetRunner().Cmd(syncKubeConfigForUserCmd, false, false); err != nil {
return errors.Wrap(errors.WithStack(err), "sync kube config for normal user failed")
}
// userId, err := runtime.GetRunner().Cmd("echo $(id -u)", false, false)
// if err != nil {
// return errors.Wrap(errors.WithStack(err), "get user id failed")
// }
// userGroupId, err := runtime.GetRunner().Cmd("echo $(id -g)", false, false)
// if err != nil {
// return errors.Wrap(errors.WithStack(err), "get user group id failed")
// }
userId, err := runtime.GetRunner().Cmd("echo $SUDO_UID", false, false)
targetHome, targetUID, targetGID, err := utils.ResolveSudoUserHomeAndIDs(runtime)
if err != nil {
return errors.Wrap(errors.WithStack(err), "get user id failed")
return err
}
targetKubeConfigPath := filepath.Join(targetHome, ".kube", "config")
userGroupId, err := runtime.GetRunner().Cmd("echo $SUDO_GID", false, false)
if err != nil {
return errors.Wrap(errors.WithStack(err), "get user group id failed")
cmds := []string{
"mkdir -p /root/.kube",
fmt.Sprintf("echo '%s' > %s", cluster.KubeConfig, "/root/.kube/config"),
"chmod 0600 /root/.kube/config",
fmt.Sprintf("mkdir -p %s", filepath.Join(targetHome, ".kube")),
fmt.Sprintf("echo '%s' > %s", cluster.KubeConfig, targetKubeConfigPath),
fmt.Sprintf("chmod 0600 %s", targetKubeConfigPath),
fmt.Sprintf("chown -R %s:%s %s", targetUID, targetGID, filepath.Join(targetHome, ".kube")),
}
chownKubeConfig := fmt.Sprintf("chown -R %s:%s -R $HOME/.kube", userId, userGroupId)
if _, err := runtime.GetRunner().SudoCmd(chownKubeConfig, false, false); err != nil {
return errors.Wrap(errors.WithStack(err), "chown user kube config failed")
if _, err := runtime.GetRunner().SudoCmd(strings.Join(cmds, " && "), false, false); err != nil {
return errors.Wrap(errors.WithStack(err), "sync kube config failed")
}
}
return nil

View File

@@ -52,7 +52,7 @@ func (t *CreateMiniKubeCluster) Execute(runtime connector.Runtime) error {
}
}
logger.Infof("creating minikube cluster %s ...", t.KubeConf.Arg.MinikubeProfile)
cmd = fmt.Sprintf("%s start -p '%s' --kubernetes-version=v1.33.3 --container-runtime=containerd --network-plugin=cni --cni=calico --cpus='4' --memory='8g' --ports=30180:30180,443:443,80:80", minikube, t.KubeConf.Arg.MinikubeProfile)
cmd = fmt.Sprintf("%s start -p '%s' --extra-config=apiserver.service-node-port-range=445-32767 --kubernetes-version=v1.33.3 --container-runtime=containerd --network-plugin=cni --cni=calico --cpus='4' --memory='8g' --ports=30180:30180,443:443,80:80", minikube, t.KubeConf.Arg.MinikubeProfile)
if _, err := runtime.GetRunner().Cmd(cmd, false, true); err != nil {
return errors.Wrap(err, "failed to create minikube cluster")
}

View File

@@ -111,6 +111,7 @@ func (p *phaseBuilder) phaseInstall() *phaseBuilder {
PhaseFile: common.TerminusStateFileInstalled,
BaseDir: p.runtime.GetBaseDir(),
},
&terminus.WriteReleaseFileModule{WithoutName: true},
)
}
return p

View File

@@ -396,3 +396,17 @@ func (t *DeleteTerminusData) Execute(runtime connector.Runtime) error {
return nil
}
type CreateSharedLibDir struct {
common.KubeAction
}
func (t *CreateSharedLibDir) Execute(runtime connector.Runtime) error {
if runtime.GetSystemInfo().IsDarwin() {
return nil
}
if _, err := runtime.GetRunner().SudoCmd(fmt.Sprintf("mkdir -p %s && chown 1000:1000 %s", OlaresSharedLibDir, OlaresSharedLibDir), false, false); err != nil {
return errors.Wrap(errors.WithStack(err), "failed to create shared lib dir")
}
return nil
}

View File

@@ -74,6 +74,7 @@ func (m *PreparedModule) Init() {
type WriteReleaseFileModule struct {
common.KubeModule
WithoutName bool
}
func (m *WriteReleaseFileModule) Init() {
@@ -82,7 +83,7 @@ func (m *WriteReleaseFileModule) Init() {
m.Tasks = []task.Interface{
&task.LocalTask{
Name: "WriteReleaseFile",
Action: new(WriteReleaseFile),
Action: &WriteReleaseFile{WithoutName: m.WithoutName},
},
}
}

View File

@@ -38,12 +38,6 @@ type InstallOsSystem struct {
}
func (t *InstallOsSystem) Execute(runtime connector.Runtime) error {
if !runtime.GetSystemInfo().IsDarwin() {
if _, err := runtime.GetRunner().SudoCmd(fmt.Sprintf("mkdir -p %s && chown 1000:1000 %s", storage.OlaresSharedLibDir, storage.OlaresSharedLibDir), false, false); err != nil {
return errors.Wrap(errors.WithStack(err), "failed to create shared lib dir")
}
}
config, err := ctrl.GetConfig()
if err != nil {
return err
@@ -367,6 +361,11 @@ func (m *InstallOsSystemModule) Init() {
Action: &CreateUserEnvConfigMap{},
}
createSharedLibDir := &task.LocalTask{
Name: "CreateSharedLibDir",
Action: &storage.CreateSharedLibDir{},
}
installOsSystem := &task.LocalTask{
Name: "InstallOsSystem",
Action: &InstallOsSystem{},
@@ -399,6 +398,7 @@ func (m *InstallOsSystemModule) Init() {
m.Tasks = []task.Interface{
applySystemEnv,
createUserEnvConfigMap,
createSharedLibDir,
installOsSystem,
createBackupConfigMap,
checkSystemService,

View File

@@ -97,25 +97,8 @@ func (t *CheckKeyPodsRunning) Execute(runtime connector.Runtime) error {
if !strings.HasPrefix(pod.Namespace, "user-") && !strings.HasPrefix(pod.Namespace, "os-") {
continue
}
if pod.Status.Phase != corev1.PodRunning {
return fmt.Errorf("pod %s/%s is not running", pod.Namespace, pod.Name)
}
if len(pod.Status.ContainerStatuses) != len(pod.Spec.Containers) {
return fmt.Errorf("pod %s/%s has not started all containers yet", pod.Namespace, pod.Name)
}
for _, cStatus := range pod.Status.ContainerStatuses {
if cStatus.State.Terminated != nil {
if cStatus.State.Terminated.ExitCode != 0 {
return fmt.Errorf("container %s in pod %s/%s is terminated", cStatus.Name, pod.Namespace, pod.Name)
}
continue
}
if cStatus.State.Running == nil {
return fmt.Errorf("container %s in pod %s/%s is not running", cStatus.Name, pod.Namespace, pod.Name)
}
if !cStatus.Ready {
return fmt.Errorf("container %s in pod %s/%s is not ready", cStatus.Name, pod.Namespace, pod.Name)
}
if err := utils.AssertPodReady(&pod); err != nil {
return err
}
}
return nil
@@ -126,29 +109,39 @@ type CheckPodsRunning struct {
labels map[string][]string
}
func (c *CheckPodsRunning) Execute(runtime connector.Runtime) error {
func (c *CheckPodsRunning) Execute(_ connector.Runtime) error {
if c.labels == nil {
return nil
}
kubectl, err := util.GetCommand(common.CommandKubectl)
if err != nil {
return errors.Wrap(errors.WithStack(err), "kubectl not found")
}
var ctx, cancel = context.WithTimeout(context.Background(), 3*time.Minute)
defer cancel()
kubeConfig, err := ctrl.GetConfig()
if err != nil {
return errors.Wrap(err, "failed to load kubeconfig")
}
kubeClient, err := kubernetes.NewForConfig(kubeConfig)
if err != nil {
return errors.Wrap(err, "failed to create kube client")
}
for ns, labels := range c.labels {
for _, label := range labels {
var cmd = fmt.Sprintf("%s get pod -n %s -l '%s' -o jsonpath='{.items[*].status.phase}'", kubectl, ns, label)
phase, err := runtime.GetRunner().SudoCmdContext(ctx, cmd, false, false)
podList, err := kubeClient.CoreV1().Pods(ns).List(ctx, metav1.ListOptions{LabelSelector: label})
if err != nil {
return fmt.Errorf("pod status invalid, namespace: %s, label: %s, waiting ...", ns, label)
}
if phase != "Running" {
logger.Infof("pod in namespace: %s, label: %s, current phase: %s, waiting ...", ns, label, phase)
return fmt.Errorf("pod is %s, namespace: %s, label: %s, waiting ...", phase, ns, label)
if podList == nil || len(podList.Items) == 0 {
return fmt.Errorf("no pod found, namespace: %s, label: %s, waiting ...", ns, label)
}
for i := range podList.Items {
pod := &podList.Items[i]
if err := utils.AssertPodReady(pod); err != nil {
return err
}
}
}
}
@@ -250,13 +243,14 @@ func (t *PrepareFinished) Execute(runtime connector.Runtime) error {
type WriteReleaseFile struct {
common.KubeAction
WithoutName bool
}
func (t *WriteReleaseFile) Execute(runtime connector.Runtime) error {
if util.IsExist(common.OlaresReleaseFile) {
logger.Debugf("found existing release file: %s, overriding ...", common.OlaresReleaseFile)
}
return t.KubeConf.Arg.SaveReleaseInfo()
return t.KubeConf.Arg.SaveReleaseInfo(t.WithoutName)
}
type RemoveReleaseFile struct {

View File

@@ -8,36 +8,36 @@ import (
"github.com/beclab/Olares/cli/version"
)
var version_1_12_3 = semver.MustParse("1.12.3")
var version_1_12_4 = semver.MustParse("1.12.4")
type upgrader_1_12_3 struct {
type upgrader_1_12_4 struct {
breakingUpgraderBase
}
func (u upgrader_1_12_3) Version() *semver.Version {
func (u upgrader_1_12_4) Version() *semver.Version {
cliVersion, err := semver.NewVersion(version.VERSION)
// tolerate local dev version
if err != nil {
return version_1_12_3
return version_1_12_4
}
if samePatchLevelVersion(version_1_12_3, cliVersion) && getReleaseLineOfVersion(cliVersion) == mainLine {
if samePatchLevelVersion(version_1_12_4, cliVersion) && getReleaseLineOfVersion(cliVersion) == mainLine {
return cliVersion
}
return version_1_12_3
return version_1_12_4
}
func (u upgrader_1_12_3) AddedBreakingChange() bool {
if u.Version().Equal(version_1_12_3) {
func (u upgrader_1_12_4) AddedBreakingChange() bool {
if u.Version().Equal(version_1_12_4) {
return true
}
return false
}
func (u upgrader_1_12_3) NeedRestart() bool {
func (u upgrader_1_12_4) NeedRestart() bool {
return true
}
func (u upgrader_1_12_3) PrepareForUpgrade() []task.Interface {
func (u upgrader_1_12_4) PrepareForUpgrade() []task.Interface {
tasks := make([]task.Interface, 0)
tasks = append(tasks, upgradeKsConfig()...)
@@ -57,7 +57,7 @@ func (u upgrader_1_12_3) PrepareForUpgrade() []task.Interface {
return tasks
}
func (u upgrader_1_12_3) UpgradeSystemComponents() []task.Interface {
func (u upgrader_1_12_4) UpgradeSystemComponents() []task.Interface {
pre := []task.Interface{
&task.LocalTask{
Name: "UpgradeL4BFLProxy",
@@ -69,7 +69,7 @@ func (u upgrader_1_12_3) UpgradeSystemComponents() []task.Interface {
return append(pre, u.upgraderBase.UpgradeSystemComponents()...)
}
func (u upgrader_1_12_3) UpdateOlaresVersion() []task.Interface {
func (u upgrader_1_12_4) UpdateOlaresVersion() []task.Interface {
var tasks []task.Interface
tasks = append(tasks,
&task.LocalTask{
@@ -88,5 +88,5 @@ func (u upgrader_1_12_3) UpdateOlaresVersion() []task.Interface {
}
func init() {
registerMainUpgrader(upgrader_1_12_3{})
registerMainUpgrader(upgrader_1_12_4{})
}

View File

@@ -0,0 +1,32 @@
package upgrade
import (
"time"
"github.com/Masterminds/semver/v3"
"github.com/beclab/Olares/cli/pkg/core/task"
)
type upgrader_1_12_5_20260122 struct {
breakingUpgraderBase
}
func (u upgrader_1_12_5_20260122) Version() *semver.Version {
return semver.MustParse("1.12.3-20260122")
}
func (u upgrader_1_12_5_20260122) UpgradeSystemComponents() []task.Interface {
pre := []task.Interface{
&task.LocalTask{
Name: "UpgradeL4BFLProxy",
Action: &upgradeL4BFLProxy{Tag: "v0.3.10"},
Retry: 3,
Delay: 5 * time.Second,
},
}
return append(pre, u.upgraderBase.UpgradeSystemComponents()...)
}
func init() {
registerDailyUpgrader(upgrader_1_12_5_20260122{})
}

111
cli/pkg/utils/pod.go Normal file
View File

@@ -0,0 +1,111 @@
package utils
import (
"fmt"
corev1 "k8s.io/api/core/v1"
)
func AssertPodReady(pod *corev1.Pod) error {
if pod == nil {
return fmt.Errorf("pod is nil")
}
podKey := fmt.Sprintf("%s/%s", pod.Namespace, pod.Name)
if pod.DeletionTimestamp != nil {
return fmt.Errorf("pod %s is terminating", podKey)
}
if pod.Status.Phase != corev1.PodRunning {
return fmt.Errorf("pod %s is not running (phase=%s)", podKey, pod.Status.Phase)
}
if len(pod.Spec.InitContainers) > 0 {
initStatusByName := make(map[string]corev1.ContainerStatus, len(pod.Status.InitContainerStatuses))
for i := range pod.Status.InitContainerStatuses {
s := pod.Status.InitContainerStatuses[i]
initStatusByName[s.Name] = s
}
for _, ic := range pod.Spec.InitContainers {
s, ok := initStatusByName[ic.Name]
if !ok {
return fmt.Errorf("pod %s has not started init container %s yet", podKey, ic.Name)
}
if t := s.State.Terminated; t != nil {
if t.ExitCode != 0 {
return fmt.Errorf(
"init container %s in pod %s terminated (exitCode=%d, reason=%s, message=%s)",
s.Name, podKey, t.ExitCode, t.Reason, t.Message,
)
}
continue
}
if w := s.State.Waiting; w != nil {
return fmt.Errorf(
"init container %s in pod %s is waiting (reason=%s, message=%s)",
s.Name, podKey, w.Reason, w.Message,
)
}
return fmt.Errorf("pod %s init container %s is still running", podKey, s.Name)
}
}
readyCondFound := false
for i := range pod.Status.Conditions {
cond := pod.Status.Conditions[i]
if cond.Type != corev1.PodReady {
continue
}
readyCondFound = true
if cond.Status != corev1.ConditionTrue {
if cond.Reason != "" || cond.Message != "" {
return fmt.Errorf("pod %s is not ready (reason=%s, message=%s)", podKey, cond.Reason, cond.Message)
}
return fmt.Errorf("pod %s is not ready", podKey)
}
break
}
if !readyCondFound {
return fmt.Errorf("pod %s is not ready (missing Ready condition)", podKey)
}
statusByName := make(map[string]corev1.ContainerStatus, len(pod.Status.ContainerStatuses))
for i := range pod.Status.ContainerStatuses {
s := pod.Status.ContainerStatuses[i]
statusByName[s.Name] = s
}
for _, c := range pod.Spec.Containers {
cStatus, ok := statusByName[c.Name]
if !ok {
return fmt.Errorf("pod %s has not started container %s yet", podKey, c.Name)
}
if t := cStatus.State.Terminated; t != nil {
return fmt.Errorf(
"container %s in pod %s terminated (exitCode=%d, reason=%s, message=%s)",
cStatus.Name,
podKey,
t.ExitCode,
t.Reason,
t.Message,
)
}
if cStatus.State.Running == nil {
if w := cStatus.State.Waiting; w != nil {
return fmt.Errorf(
"container %s in pod %s is waiting (reason=%s, message=%s)",
cStatus.Name,
podKey,
w.Reason,
w.Message,
)
}
return fmt.Errorf("container %s in pod %s is not running", cStatus.Name, podKey)
}
if !cStatus.Ready {
return fmt.Errorf("container %s in pod %s is not ready", cStatus.Name, podKey)
}
}
return nil
}

View File

@@ -321,3 +321,54 @@ func GetBufIOReaderOfTerminalInput() (*bufio.Reader, error) {
}
return bufio.NewReader(tty), nil
}
// ResolveSudoUserHomeAndIDs resolves the home directory, uid, and gid for the user
// who invoked sudo. If not running under sudo, it falls back to the current user.
// This is useful for commands that need to operate on the invoking user's home
// directory rather than /root when running with sudo.
func ResolveSudoUserHomeAndIDs(runtime connector.Runtime) (home, uid, gid string, err error) {
uid, err = runtime.GetRunner().Cmd("echo ${SUDO_UID:-}", false, false)
if err != nil {
return "", "", "", errors.Wrap(errors.WithStack(err), "get SUDO_UID failed")
}
gid, err = runtime.GetRunner().Cmd("echo ${SUDO_GID:-}", false, false)
if err != nil {
return "", "", "", errors.Wrap(errors.WithStack(err), "get SUDO_GID failed")
}
uid = strings.TrimSpace(uid)
gid = strings.TrimSpace(gid)
if uid == "" {
uid, err = runtime.GetRunner().Cmd("id -u", false, false)
if err != nil {
return "", "", "", errors.Wrap(errors.WithStack(err), "get current uid failed")
}
gid, err = runtime.GetRunner().Cmd("id -g", false, false)
if err != nil {
return "", "", "", errors.Wrap(errors.WithStack(err), "get current gid failed")
}
uid = strings.TrimSpace(uid)
gid = strings.TrimSpace(gid)
}
home, err = runtime.GetRunner().Cmd(fmt.Sprintf(`getent passwd %s | awk -F: 'NR==1{print $6; exit}'`, uid), false, false)
if err != nil {
home = ""
}
home = strings.TrimSpace(home)
if home == "" {
home, _ = runtime.GetRunner().Cmd(fmt.Sprintf(`awk -F: -v uid=%s '$3==uid {print $6; exit}' /etc/passwd 2>/dev/null`, uid), false, false)
home = strings.TrimSpace(home)
}
if home == "" {
home, err = runtime.GetRunner().Cmd("echo $HOME", false, false)
if err != nil {
return "", "", "", errors.Wrap(errors.WithStack(err), "get HOME failed")
}
home = strings.TrimSpace(home)
}
if home == "" {
return "", "", "", errors.New("resolve user home failed")
}
return home, uid, gid, nil
}

View File

@@ -23,7 +23,7 @@ require (
github.com/containerd/containerd v1.7.29
github.com/distribution/distribution/v3 v3.0.0
github.com/dustin/go-humanize v1.0.1
github.com/eball/zeroconf v0.2.2
github.com/eball/zeroconf v0.2.5
github.com/godbus/dbus/v5 v5.1.0
github.com/gofiber/fiber/v2 v2.52.9
github.com/google/gopacket v1.1.19

View File

@@ -87,8 +87,8 @@ github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkp
github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto=
github.com/eball/echo/v4 v4.13.4-patch h1:5w83KQrEqrxhc1BO0BpRBHssC37vFrWualUM27Rt2sg=
github.com/eball/echo/v4 v4.13.4-patch/go.mod h1:ORgy8LWTq8knpwgaz538rAJMri7WgpoAD6H3zYccn84=
github.com/eball/zeroconf v0.2.2 h1:y23X67tLFlU+b35LyM9THXGsdC88IUz803G+mzfeSeE=
github.com/eball/zeroconf v0.2.2/go.mod h1:eIbIjGYo9sSMaKWLcveHEPRWdyblz7q9ih2R1HnNw5M=
github.com/eball/zeroconf v0.2.5 h1:RNINVvj8kbm/r4YoqYu/jWD57l5NJmvRUCfbjlIsbJg=
github.com/eball/zeroconf v0.2.5/go.mod h1:eIbIjGYo9sSMaKWLcveHEPRWdyblz7q9ih2R1HnNw5M=
github.com/ebitengine/purego v0.8.4 h1:CF7LEKg5FFOsASUj0+QwaXf8Ht6TlFxg09+S9wz0omw=
github.com/ebitengine/purego v0.8.4/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ=
github.com/emicklei/go-restful/v3 v3.13.0 h1:C4Bl2xDndpU6nJ4bc1jXd+uTmYPVUwkD6bFY/oTyCes=

View File

@@ -81,7 +81,7 @@ func (s *mDNSServer) StartAll() error {
host: &DNSConfig{Domain: domain},
}
}
klog.Info("Intranet mDNS server started")
klog.V(8).Info("Intranet mDNS server started")
return nil
}

View File

@@ -477,7 +477,7 @@ func (d *DSRProxy) regonfigure() error {
klog.Infof("Calico interface: %s", d.calicoInterface.Name)
var err error
d.pcapHandle, err = pcap.OpenLive(d.vipInterface.Name, 65536, false, pcap.BlockForever)
d.pcapHandle, err = pcap.OpenLive(d.vipInterface.Name, 65536, false, time.Millisecond)
if err != nil {
klog.Error("pcap openlive failed:", err)
return err

View File

@@ -84,8 +84,15 @@ func (p *proxyServer) Start() error {
clientIp = h
}
}
if c.IsWebSocket() {
ctx = context.WithValue(ctx, WSKey, true)
swp := c.Request().Header.Get("Sec-WebSocket-Protocol")
authToken := c.Request().Header.Get("X-Authorization")
if len(authToken) == 0 && len(swp) > 0 {
// handle missing auth token for websocket
c.Request().Header.Set("X-Authorization", swp)
}
}
r := c.Request().WithContext(ctx)
if clientIp != "" {
@@ -243,7 +250,7 @@ func (p *proxyServer) customDialContext(d *net.Dialer) func(ctx context.Context,
}
if isWs {
klog.Info("WebSocket connection detected, using upgraded dialer")
klog.Info("WebSocket connection detected, using upgraded dialer, ", addr)
return tlsDial(ctx, d, func(ctx context.Context, network, addr string) (net.Conn, error) {
return proxyDial(ctx, d, network, newAddr)
}, network, addr, &tls.Config{InsecureSkipVerify: true})

View File

@@ -147,6 +147,6 @@ func (s *Server) Reload(o *ServerOptions) error {
return fmt.Errorf("reload intranet server with %d errors", len(errs))
}
klog.Info("Intranet server reloaded")
klog.V(8).Info("Intranet server reloaded")
return nil
}

View File

@@ -99,7 +99,7 @@ func (s *server) Restart() error {
instanceName = hostname
}
s.server, err = zeroconf.Register(instanceName, s.serviceName, "local.", hostname, s.port, []string{""}, []net.Interface{*iface})
s.server, err = zeroconf.RegisterAll(instanceName, s.serviceName, "local.", hostname, s.port, []string{""}, []net.Interface{*iface}, false, false, false)
if err != nil {
klog.Error("create mdns server error, ", err)
return err

View File

@@ -79,7 +79,7 @@ func (w *applicationWatcher) Watch(ctx context.Context) {
klog.Error("reload intranet server config error, ", err)
return
}
klog.Info("Intranet server config reloaded")
klog.V(8).Info("Intranet server config reloaded")
} else {
// Start the intranet server
err = w.intranetServer.Start(o)

View File

@@ -7,18 +7,33 @@ const side = {
link: "/manual/overview",
items: [
// { text: "Compare Olares and NAS", link: "/manual/olares-vs-nas" },
{ text: "Help and support", link: "/manual/help/request-technical-support"}
// collapsed: true,
// items: [
// { text: "FAQs", link: "/manual/help/faqs" },
// {
// text: "Request support",
// link: "/manual/help/request-technical-support",
// },
//{
// text: "Troubleshooting Guide",
// link: "/manual/help/troubleshooting-guide",
// },
{
text: "FAQs",
// link: "/manual/help/faqs",
collapsed: true,
items: [
{
text: "Olares FAQs",
link: "/manual/help/olares",
},
{
text: "Installation FAQs",
link: "/manual/help/installation",
},
{
text: "Usage FAQs",
link: "/manual/help/usage",
},
// {
// text: "Request support",
// link: "/manual/help/request-technical-support",
// },
// {
// text: "Troubleshooting",
// link: "/manual/help/troubleshooting",
// },
],
},
],
},
{
@@ -127,39 +142,39 @@ const side = {
text: "Manage accounts",
collapsed: true,
items: [
{text: "Create accounts", link:"/manual/larepass/create-account"},
{text: "Back up mnemonics", link: "/manual/larepass/back-up-mnemonics"},
{text: "Manage integrations", link:"/manual/larepass/integrations"},
{ text: "Create accounts", link: "/manual/larepass/create-account" },
{ text: "Back up mnemonics", link: "/manual/larepass/back-up-mnemonics" },
{ text: "Manage integrations", link: "/manual/larepass/integrations" },
],
},
{text: "Use VPN", link:"/manual/larepass/private-network"},
{ text: "Use VPN", link: "/manual/larepass/private-network" },
{
text: "Manage device",
collapsed: true,
items: [
{text: "Activate Olares", link:"/manual/larepass/activate-olares"},
{text: "Manage Olares", link:"/manual/larepass/manage-olares"},
{ text: "Activate Olares", link: "/manual/larepass/activate-olares" },
{ text: "Manage Olares", link: "/manual/larepass/manage-olares" },
],
},
{text: "Manage files", link:"/manual/larepass/manage-files"},
// collapsed: true,
//items: [
// {text: "Common file operations", link:"/manual/larepass/manage-files"},
// {text: "Sync and share", link:"/manual/larepass/sync-share"}
// ]
// },
{ text: "Manage files", link: "/manual/larepass/manage-files" },
// collapsed: true,
//items: [
// {text: "Common file operations", link:"/manual/larepass/manage-files"},
// {text: "Sync and share", link:"/manual/larepass/sync-share"}
// ]
// },
{
text: "Manage passwords",
collapsed: true,
items: [
{text: "Autofill passwords", link: "/manual/larepass/autofill"},
{text: "Generate 2FA codes", link: "/manual/larepass/two-factor-verification"},
{ text: "Autofill passwords", link: "/manual/larepass/autofill" },
{ text: "Generate 2FA codes", link: "/manual/larepass/two-factor-verification" },
],
},
{
/*{
text: "Manage knowledge",
link: "/manual/larepass/manage-knowledge",
},
},*/
],
},
{
@@ -168,7 +183,24 @@ const side = {
link: "/manual/olares/",
items: [
{ text: "Desktop", link: "/manual/olares/desktop", },
{ text: "Market", link: "/manual/olares/market", },
{
text: "Market",
collapsed: true,
items: [
{
text: "Basic operations",
link: "/manual/olares/market/market",
},
{
text: "Clone applications",
link: "/manual/olares/market/clone-apps",
},
{
text: "Manage paid applications",
link: "/manual/olares/market/purchase-paid-apps",
},
],
},
{
text: "Files",
collapsed: true,
@@ -178,18 +210,26 @@ const side = {
text: "Basic file operations",
link: "/manual/olares/files/add-edit-download",
},
// {
// text: "Sync and share",
// link: "/manual/larepass/sync-share",
// },
// {
// text: "Sync and share",
// link: "/manual/larepass/sync-share",
// },
{
text: "Share files",
link: "/manual/olares/files/share-files",
},
{
text: "Sync files to local",
link: "/manual/olares/files/sync-files",
},
{
text: "Mount SMB",
link: "/manual/olares/files/mount-SMB",
},
{
text: "Mount cloud storage",
link: "/manual/olares/files/mount-cloud-storage",
},
{
text: "Mount cloud storage",
link: "/manual/olares/files/mount-cloud-storage",
},
],
},
{
@@ -224,17 +264,32 @@ const side = {
text: "Basic operations",
link: "/manual/olares/wise/basics",
},
{
/*{
text: "Get recommendation engine",
link: "/manual/olares/wise/recommend",
},
},*/
{
text: "Manage your feeds",
link: "/manual/olares/wise/subscribe",
},
{
text: "Organize your knowledge",
text: "Manage cookies",
link: "/manual/olares/wise/manage-cookies",
},
{
text: "Organize with filters",
link: "/manual/olares/wise/filter",
collapsed: true,
items: [
{
text: "Filter syntax",
link: "/manual/olares/wise/filter-syntax-guide",
},
{
text: "Filter example",
link: "/manual/olares/wise/filter-examples",
},
],
},
],
},
@@ -305,16 +360,16 @@ const side = {
link: "/manual/olares/settings/manage-app-env",
},
],
},
},
{
text: "Manage integrations",
link:"/manual/olares/settings/integrations",
},
{
link: "/manual/olares/settings/integrations",
},
{
text: "Customize appearance",
link:"/manual/olares/settings/language-appearance",
},
{text: "Manage VPN", link: "/manual/olares/settings/remote-access",},
link: "/manual/olares/settings/language-appearance",
},
{ text: "Manage VPN", link: "/manual/olares/settings/remote-access", },
{
text: "Configure network",
collapsed: true,
@@ -325,54 +380,55 @@ const side = {
},
{
text: "Set up hosts file",
link:"/manual/olares/settings/set-up-hosts",
link: "/manual/olares/settings/set-up-hosts",
},
],
},
{text: "Manage GPU", link: "/manual/olares/settings/gpu-resource"},
{text: "Set video playback", link: "/manual/olares/settings/video"},
},
{ text: "Manage GPU", link: "/manual/olares/settings/gpu-resource" },
{ text: "Set video playback", link: "/manual/olares/settings/video" },
{ text: "Manage search rules", link: "/manual/olares/settings/search" },
{
text: "Backup and restore",
collapsed: true,
items: [
{text: "Backup", link: "/manual/olares/settings/backup"},
{text: "Restore", link: "/manual/olares/settings/restore"},
{ text: "Backup", link: "/manual/olares/settings/backup" },
{ text: "Restore", link: "/manual/olares/settings/restore" },
],
},
{text: "Developer resources", link: "/manual/olares/settings/developer"},
]
},
{text: "Dashboard", link: "/manual/olares/resources-usage"},
{text: "Profile", link: "/manual/olares/profile"},
],
{ text: "Developer resources", link: "/manual/olares/settings/developer" },
]
},
{ text: "Dashboard", link: "/manual/olares/resources-usage" },
{ text: "Profile", link: "/manual/olares/profile" },
],
},
{
text: "Best practices",
link: "/manual/best-practices/",
collapsed: true,
items: [
{
text: "Set up custom domain",
link: "/manual/best-practices/set-custom-domain",
},
{
text: "Manage knowledge with Wise",
link: "/manual/best-practices/organize-content",
},
{
text: "Install a multi-node Olares cluster",
link: "/manual/best-practices/install-olares-multi-node",
},
{
text: "Install Olares on PVE with GPU Passthrough",
link: "/manual/best-practices/install-olares-gpu-passthrough",
},
{
text: "Expand storage in Olares",
{
text: "Best practices",
link: "/manual/best-practices/",
collapsed: true,
items: [
{
text: "Set up custom domain",
link: "/manual/best-practices/set-custom-domain",
},
{
text: "Manage knowledge with Wise",
link: "/manual/best-practices/organize-content",
},
{
text: "Install a multi-node Olares cluster",
link: "/manual/best-practices/install-olares-multi-node",
},
{
text: "Install Olares on PVE with GPU Passthrough",
link: "/manual/best-practices/install-olares-gpu-passthrough",
},
{
text: "Expand storage in Olares",
link: "/manual/best-practices/expand-storage-in-olares",
},
],
},
],
},
{ text: "Glossary", link: "/manual/glossary" },
],
"/space/": [
@@ -421,83 +477,94 @@ const side = {
},
],
"/use-cases/": [
{
text: "Use cases",
link: "/use-cases/",
items: [
{
text: "Stable Diffusion",
link: "/use-cases/stable-diffusion",
},
{
text: "ComfyUI",
link: "/use-cases/comfyui",
collapsed: true,
items: [
{
text: "Manage ComfyUI",
link: "/use-cases/comfyui-launcher",
},
{
text: "Use ComfyUI for Krita",
link: "/use-cases/comfyui-for-krita",
},
]
},
{
text: "Ollama",
link: "/use-cases/ollama",
},
{
text: "Open WebUI",
link: "/use-cases/openwebui",
},
{
text: "Perplexica",
link: "/use-cases/perplexica",
},
{
text: "Dify",
link: "/use-cases/dify",
},
{
text: "Jellyfin",
link: "/use-cases/stream-media",
},
{
text: "Steam",
link: "/use-cases/stream-game",
},
// {
// text: "Redroid",
// link: "/use-cases/host-cloud-android",
// },
{
text: "Windows",
link: "/use-cases/windows",
},
{
text: "DeerFlow",
link: "/use-cases/deerflow",
},
{
text: "Duix.Avatar",
link: "/use-cases/duix-avatar",
},
{
text: "ACE-Step",
link: "/use-cases/ace-step",
},
],
},
],
{
text: "Use cases",
link: "/use-cases/",
items: [
{
text: "Stable Diffusion",
link: "/use-cases/stable-diffusion",
},
{
text: "ComfyUI",
link: "/use-cases/comfyui",
collapsed: true,
items: [
{
text: "Manage ComfyUI",
link: "/use-cases/comfyui-launcher",
},
{
text: "Use ComfyUI for Krita",
link: "/use-cases/comfyui-for-krita",
},
]
},
{
text: "Ollama",
link: "/use-cases/ollama",
},
{
text: "Open WebUI",
link: "/use-cases/openwebui",
},
{
text: "Perplexica",
link: "/use-cases/perplexica",
},
{
text: "Dify",
link: "/use-cases/dify",
},
{
text: "Jellyfin",
link: "/use-cases/stream-media",
},
{
text: "Steam",
collapsed: true,
items: [
{
text: "Play directly on Olares",
link: "/use-cases/play-games-directly",
},
{
text: "Stream to other devices",
link: "/use-cases/stream-game",
}
]
},
// {
// text: "Redroid",
// link: "/use-cases/host-cloud-android",
// },
{
text: "Windows",
link: "/use-cases/windows",
},
{
text: "DeerFlow",
link: "/use-cases/deerflow",
},
{
text: "Duix.Avatar",
link: "/use-cases/duix-avatar",
},
{
text: "ACE-Step",
link: "/use-cases/ace-step",
},
],
},
],
"/developer/": [
{
text: "Concepts",
link: "/developer/concepts/",
items: [
{ text: "Olares architecture", link: "/developer/concepts/system-architecture" },
{ text: "Olares ID",
{
text: "Olares ID",
link: "/developer/concepts/olares-id",
collapsed: true,
items: [
@@ -534,7 +601,7 @@ const side = {
{ text: "Secrets", link: "/developer/concepts/secrets" },
],
},
{
{
text: "Installation deep-dive",
link: "/developer/install/",
items: [
@@ -567,12 +634,12 @@ const side = {
link: "/developer/install/cli/backups",
collapsed: true,
items: [
{text: "download", link: "/developer/install/cli/backups-download"},
{text: "region", link: "/developer/install/cli/backups-region"},
{text: "backup", link: "/developer/install/cli/backups-backup"},
{text: "restore", link: "/developer/install/cli/backups-restore"},
{text: "snapshots", link: "/developer/install/cli/backups-snapshots"},
],
{ text: "download", link: "/developer/install/cli/backups-download" },
{ text: "region", link: "/developer/install/cli/backups-region" },
{ text: "backup", link: "/developer/install/cli/backups-backup" },
{ text: "restore", link: "/developer/install/cli/backups-restore" },
{ text: "snapshots", link: "/developer/install/cli/backups-snapshots" },
],
},
{
text: "change-ip",
@@ -621,12 +688,12 @@ const side = {
},
],
},
{
text: "Olares versioning",
link: "/developer/install/versioning",
},
],
},
{
text: "Olares versioning",
link: "/developer/install/versioning",
},
],
},
{
text: "Develop Olares apps",
link: "/developer/develop/",
@@ -682,43 +749,43 @@ const side = {
// items: [
// {
// text: "terminus-info",
// link: "/developer/develop/advanced/terminus-info",
// link: "/developer/develop/advanced/terminus-info",
// },
// {
// text: "Service provider",
// link: "/developer/develop/advanced/provider",
// link: "/developer/develop/advanced/provider",
// },
// {
// text: "AI",
// link: "/developer/develop/advanced/ai",
// link: "/developer/develop/advanced/ai",
// },
// { text: "Cookie", link: "/developer/develop/advanced/cookie" },
// { text: "Database", link: "/developer/develop/advanced/database" },
// {
// text: "Account",
// link: "/developer/develop/advanced/account",
// link: "/developer/develop/advanced/account",
// },
// {
// text: "Market",
// link: "/developer/develop/advanced/market",
// link: "/developer/develop/advanced/market",
// },
// {
// text: "Websocket",
// link: "/developer/develop/advanced/websocket",
// link: "/developer/develop/advanced/websocket",
// },
// {
// text: "File upload",
// link: "/developer/develop/advanced/file-upload",
// link: "/developer/develop/advanced/file-upload",
// },
// {
// text: "Secret",
// link: "/developer/develop/advanced/secret",
// link: "/developer/develop/advanced/secret",
// },
// {
// text: "Kubesphere",
// link: "/developer/develop/advanced/kubesphere",
// link: "/developer/develop/advanced/kubesphere",
// },
// ],
// ],
// },
{
text: "Submit application",
@@ -756,86 +823,86 @@ const side = {
},
],
},
{
text: "Develop protocols",
collapsed: true,
items: [
{
text: "Contract",
link: "/developer/contribute/olares-id/contract/contract",
collapsed: true,
items: [
{
text: "Architecture",
link: "/developer/contribute/olares-id/contract/architecture",
},
{
text: "DID",
collapsed: true,
items: [
{
text: "Design",
link: "/developer/contribute/olares-id/contract/did/design",
},
{
text: "Official Taggers",
link: "/developer/contribute/olares-id/contract/did/official-taggers",
},
{
text: "Release History",
link: "/developer/contribute/olares-id/contract/did/release-history",
},
{
text: "FAQ",
link: "/developer/contribute/olares-id/contract/did/faq",
},
],
},
{
text: "Reputation",
link: "/developer/contribute/olares-id/contract/contract-reputation",
},
{
text: "Manage",
collapsed: true,
items: [
{
text: "Contract",
link: "/developer/contribute/olares-id/contract/manage/contract",
},
{
text: "SDK",
link: "/developer/contribute/olares-id/contract/manage/sdk",
},
{
text: "Environment",
link: "/developer/contribute/olares-id/contract/manage/environment",
},
],
},
],
},
{
text: "Verifiable Credential",
link: "/developer/contribute/olares-id/verifiable-credential/overview",
collapsed: true,
items: [
{
text: "Issuer",
link: "/developer/contribute/olares-id/verifiable-credential/issuer",
},
{
text: "Verifer",
link: "/developer/contribute/olares-id/verifiable-credential/verifer",
},
{
text: "Olares",
link: "/developer/contribute/olares-id/verifiable-credential/olares",
},
],
},
],
},
{
text: "Develop protocols",
collapsed: true,
items: [
{
text: "Contract",
link: "/developer/contribute/olares-id/contract/contract",
collapsed: true,
items: [
{
text: "Architecture",
link: "/developer/contribute/olares-id/contract/architecture",
},
{
text: "DID",
collapsed: true,
items: [
{
text: "Design",
link: "/developer/contribute/olares-id/contract/did/design",
},
{
text: "Official Taggers",
link: "/developer/contribute/olares-id/contract/did/official-taggers",
},
{
text: "Release History",
link: "/developer/contribute/olares-id/contract/did/release-history",
},
{
text: "FAQ",
link: "/developer/contribute/olares-id/contract/did/faq",
},
],
},
{
text: "Reputation",
link: "/developer/contribute/olares-id/contract/contract-reputation",
},
{
text: "Manage",
collapsed: true,
items: [
{
text: "Contract",
link: "/developer/contribute/olares-id/contract/manage/contract",
},
{
text: "SDK",
link: "/developer/contribute/olares-id/contract/manage/sdk",
},
{
text: "Environment",
link: "/developer/contribute/olares-id/contract/manage/environment",
},
],
},
],
},
{
text: "Verifiable Credential",
link: "/developer/contribute/olares-id/verifiable-credential/overview",
collapsed: true,
items: [
{
text: "Issuer",
link: "/developer/contribute/olares-id/verifiable-credential/issuer",
},
{
text: "Verifer",
link: "/developer/contribute/olares-id/verifiable-credential/verifer",
},
{
text: "Olares",
link: "/developer/contribute/olares-id/verifiable-credential/olares",
},
],
},
],
},
],
},
],

View File

@@ -6,23 +6,36 @@ const side = {
text: "Olares 是什么?",
link: "/zh/manual/overview",
items: [
// { text: "应用场景", link: "/zh/manual/why-olares" },
//{ text: "功能对比", link: "/zh/manual/feature-overview" },
// { text: "比较 Olares 和 NAS", link: "/zh/manual/olares-vs-nas" },
{text: "帮助与支持", link: "/zh/manual/help/request-technical-support",}
// collapsed: true,
// items: [
// { text: "常见问题", link: "/zh/manual/help/faqs" },
// {
// text: "技术支持",
// link: "/zh/manual/help/request-technical-support",
// },
{
text: "常见问题",
// link: "/zh/manual/help/faqs",
collapsed: true,
items: [
{
text: "产品",
link: "/zh/manual/help/olares",
},
{
text: "安装激活",
link: "/zh/manual/help/installation",
},
{
text: "使用",
link: "/zh/manual/help/usage",
},
// {
// text: "技术支持",
// link: "/zh/manual/help/request-technical-support",
// },
// {
// text: "Troubleshooting Guide",
// link: "/zh/manual/help/troubleshooting-guide",
// },
],
},
],
},
{
text: "快速开始",
collapsed: false,
@@ -128,39 +141,39 @@ const side = {
text: "管理账户",
collapsed: true,
items: [
{text: "创建账户", link:"/zh/manual/larepass/create-account"},
{text: "备份助记词", link: "/zh/manual/larepass/back-up-mnemonics"},
{text: "管理集成", link:"/zh/manual/larepass/integrations"},
{ text: "创建账户", link: "/zh/manual/larepass/create-account" },
{ text: "备份助记词", link: "/zh/manual/larepass/back-up-mnemonics" },
{ text: "管理集成", link: "/zh/manual/larepass/integrations" },
],
},
{text: "使用专用网络", link:"/zh/manual/larepass/private-network"},
{ text: "使用专用网络", link: "/zh/manual/larepass/private-network" },
{
text: "管理设备",
collapsed: true,
items: [
{text: "激活 Olares", link:"/zh/manual/larepass/activate-olares"},
{text: "管理 Olares", link:"/zh/manual/larepass/manage-olares"},
{ text: "激活 Olares", link: "/zh/manual/larepass/activate-olares" },
{ text: "管理 Olares", link: "/zh/manual/larepass/manage-olares" },
],
},
{text: "管理文件", link:"/zh/manual/larepass/manage-files"},
// collapsed: true,
{ text: "管理文件", link: "/zh/manual/larepass/manage-files" },
// collapsed: true,
// items: [
// {text: "常用文件操作", link:"/zh/manual/larepass/manage-files"},
// {text: "同步与共享", link:"/zh/manual/larepass/sync-share"}
// ]
// ]
// },
{
text: "管理密码",
collapsed: true,
items: [
{text: "自动填充", link: "/zh/manual/larepass/autofill"},
{text: "双重验证", link: "/zh/manual/larepass/two-factor-verification"},
{ text: "自动填充", link: "/zh/manual/larepass/autofill" },
{ text: "双重验证", link: "/zh/manual/larepass/two-factor-verification" },
],
},
{
/*{
text: "管理内容",
link: "/zh/manual/larepass/manage-knowledge",
},
},*/
],
},
{
@@ -169,7 +182,24 @@ const side = {
"link": "/zh/manual/olares/",
"items": [
{ "text": "桌面", "link": "/zh/manual/olares/desktop" },
{ "text": "应用市场", "link": "/zh/manual/olares/market" },
{
"text": "应用市场",
"collapsed": true,
"items": [
{
"text": "基本操作",
"link": "/zh/manual/olares/market/market"
},
{
"text": "管理付费应用",
"link": "/zh/manual/olares/market/purchase-paid-apps"
},
{
"text": "克隆应用",
"link": "/zh/manual/olares/market/clone-apps"
},
],
},
{
"text": "文件管理器",
"collapsed": true,
@@ -181,8 +211,16 @@ const side = {
},
//{
// "text": "同步与共享",
// "link": "/zh/manual/larepass/sync-share"
// "link": "/zh/manual/larepass/sync-share"
// },
{
"text": "分享文件",
"link": "/zh/manual/olares/files/share-files"
},
{
"text": "同步文件至本地",
"link": "/zh/manual/olares/files/sync-files"
},
{
"text": "挂载 SMB",
"link": "/zh/manual/olares/files/mount-SMB"
@@ -225,19 +263,34 @@ const side = {
"text": "基本操作",
"link": "/zh/manual/olares/wise/basics"
},
{
/*{
"text": "获取推荐引擎",
"link": "/zh/manual/olares/wise/recommend"
},
},*/
{
"text": "管理订阅",
"link": "/zh/manual/olares/wise/subscribe"
},
{
"text": "整理知识",
"link": "/zh/manual/olares/wise/filter"
}
]
text: "管理 Cookie",
link: "/zh/manual/olares/wise/manage-cookies",
},
{
"text": "管理知识",
"link": "/zh/manual/olares/wise/filter",
collapsed: true,
items: [
{
"text": "过滤语法参考",
"link": "/zh/manual/olares/wise/filter-syntax-guide"
},
{
"text": "过滤视图示例",
"link": "/zh/manual/olares/wise/filter-examples"
}
],
},
],
},
{
"text": "控制面板",
@@ -271,7 +324,7 @@ const side = {
"collapsed": true,
"link": "/zh/manual/olares/settings/",
"items": [
{"text": "我的 Olares", link: "/zh/manual/olares/settings/my-olares"},
{ "text": "我的 Olares", link: "/zh/manual/olares/settings/my-olares" },
{
"text": "管理用户",
"collapsed": true,
@@ -303,16 +356,16 @@ const side = {
link: "/zh/manual/olares/settings/manage-app-env",
},
],
},
},
{
"text": "管理集成",
"link":"/zh/manual/olares/settings/integrations",
},
{
"link": "/zh/manual/olares/settings/integrations",
},
{
"text": "自定义外观",
"link":"/zh/manual/olares/settings/language-appearance",
},
{text: "管理 VPN", link: "/zh/manual/olares/settings/remote-access",},
"link": "/zh/manual/olares/settings/language-appearance",
},
{ text: "管理 VPN", link: "/zh/manual/olares/settings/remote-access", },
{
"text": "配置网络",
"collapsed": true,
@@ -323,23 +376,24 @@ const side = {
},
{
"text": "设置 hosts 文件",
"link":"/zh/manual/olares/settings/set-up-hosts",
"link": "/zh/manual/olares/settings/set-up-hosts",
},
],
},
{text: "管理 GPU", link: "/zh/manual/olares/settings/gpu-resource"},
{text: "视频设置", link: "/zh/manual/olares/settings/video"},
},
{ text: "管理 GPU", link: "/zh/manual/olares/settings/gpu-resource" },
{ text: "视频设置", link: "/zh/manual/olares/settings/video" },
{ text: "文件搜索", link: "/zh/manual/olares/settings/search" },
{
"text": "备份与恢复",
"collapsed": true,
"items": [
{text: "备份", link: "/zh/manual/olares/settings/backup"},
{text: "恢复", link: "/zh/manual/olares/settings/restore"},
{ text: "备份", link: "/zh/manual/olares/settings/backup" },
{ text: "恢复", link: "/zh/manual/olares/settings/restore" },
],
},
{text: "开发者资源", link: "/zh/manual/olares/settings/developer"},
]
},
{ text: "开发者资源", link: "/zh/manual/olares/settings/developer" },
]
},
{ "text": "仪表盘", "link": "/zh/manual/olares/resources-usage" },
{ "text": "Profile", "link": "/zh/manual/olares/profile" }
]
@@ -368,8 +422,8 @@ const side = {
{
text: "在启用显卡直通的 PVE 上安装 Olares",
link: "/zh/manual/best-practices/install-olares-gpu-passthrough",
},
{
},
{
text: "在 Olares 中扩展存储空间",
link: "/zh/manual/best-practices/expand-storage-in-olares",
},
@@ -469,7 +523,17 @@ const side = {
},
{
text: "Steam",
link: "/zh/use-cases/stream-game",
collapsed: true,
items: [
{
text: "在 Olares 本机游玩",
link: "/zh/use-cases/play-games-directly",
},
{
text: "串流到其他设备",
link: "/zh/use-cases/stream-game",
}
]
},
// {
// text: "Redroid",
@@ -484,7 +548,8 @@ const side = {
link: "/zh/developer/concepts/",
items: [
{ text: "系统架构", link: "/zh/developer/concepts/system-architecture" },
{ text: "Olares ID",
{
text: "Olares ID",
link: "/zh/developer/concepts/olares-id",
collapsed: true,
items: [
@@ -546,73 +611,73 @@ const side = {
collapsed: true,
link: "/zh/developer/install/cli/olares-cli",
items: [
{text: "gpu", link: "/zh/developer/install/cli/gpu"},
{text: "osinfo", link: "/zh/developer/install/cli/osinfo"},
{text: "node", link: "/zh/developer/install/cli/node"},
{ text: "gpu", link: "/zh/developer/install/cli/gpu" },
{ text: "osinfo", link: "/zh/developer/install/cli/osinfo" },
{ text: "node", link: "/zh/developer/install/cli/node" },
{
text: "backups",
link: "/zh/developer/install/cli/backups",
collapsed: true,
items: [
{text: "download", link: "/zh/developer/install/cli/backups-download"},
{text: "region", link: "/zh/developer/install/cli/backups-region"},
{text: "backup", link: "/zh/developer/install/cli/backups-backup"},
{text: "restore", link: "/zh/developer/install/cli/backups-restore"},
{text: "snapshots", link: "/zh/developer/install/cli/backups-snapshots"},
],
},
{
text: "change-ip",
link: "/zh/developer/install/cli/change-ip",
},
{
text: "download",
link: "/zh/developer/install/cli/download",
},
{ text: "info", link: "/zh/developer/install/cli/info" },
{
text: "install",
link: "/zh/developer/install/cli/install",
},
{
text: "user activate",
link: "/zh/developer/install/cli/user-activate",
},
{
text: "logs",
link: "/zh/developer/install/cli/logs",
},
{
text: "precheck",
link: "/zh/developer/install/cli/precheck",
},
{
text: "prepare",
link: "/zh/developer/install/cli/prepare",
},
{
text: "release",
link: "/zh/developer/install/cli/release",
},
{
text: "start",
link: "/zh/developer/install/cli/start",
},
{
text: "stop",
link: "/zh/developer/install/cli/stop",
},
{
text: "uninstall",
link: "/zh/developer/install/cli/uninstall",
},
],
},
{
text: "版本说明",
link: "/zh/developer/install/versioning",
{ text: "download", link: "/zh/developer/install/cli/backups-download" },
{ text: "region", link: "/zh/developer/install/cli/backups-region" },
{ text: "backup", link: "/zh/developer/install/cli/backups-backup" },
{ text: "restore", link: "/zh/developer/install/cli/backups-restore" },
{ text: "snapshots", link: "/zh/developer/install/cli/backups-snapshots" },
],
},
{
text: "change-ip",
link: "/zh/developer/install/cli/change-ip",
},
{
text: "download",
link: "/zh/developer/install/cli/download",
},
{ text: "info", link: "/zh/developer/install/cli/info" },
{
text: "install",
link: "/zh/developer/install/cli/install",
},
{
text: "user activate",
link: "/zh/developer/install/cli/user-activate",
},
{
text: "logs",
link: "/zh/developer/install/cli/logs",
},
{
text: "precheck",
link: "/zh/developer/install/cli/precheck",
},
{
text: "prepare",
link: "/zh/developer/install/cli/prepare",
},
{
text: "release",
link: "/zh/developer/install/cli/release",
},
{
text: "start",
link: "/zh/developer/install/cli/start",
},
{
text: "stop",
link: "/zh/developer/install/cli/stop",
},
{
text: "uninstall",
link: "/zh/developer/install/cli/uninstall",
},
],
},
{
text: "版本说明",
link: "/zh/developer/install/versioning",
},
],
},
{
@@ -664,66 +729,66 @@ const side = {
},
],
},
// {
// {
// text: "进阶",
// collapsed: true,
// items: [
// {
// text: "terminus-info",
// link: "/zh/developer/develop/advanced/terminus-info",
// link: "/zh/developer/develop/advanced/terminus-info",
// },
// {
// text: "Service Provider",
// link: "/zh/developer/develop/advanced/provider",
// link: "/zh/developer/develop/advanced/provider",
// },
// {
// text: "AI",
// link: "/zh/developer/develop/advanced/ai",
// link: "/zh/developer/develop/advanced/ai",
// },
// { text: "Cookie", link: "/zh/developer/develop/advanced/cookie" },
// { text: "数据库", link: "/zh/developer/develop/advanced/database" },
// {
// text: "账户",
// link: "/zh/developer/develop/advanced/account",
// link: "/zh/developer/develop/advanced/account",
// },
// {
// text: "应用市场",
// link: "/zh/developer/develop/advanced/market",
// link: "/zh/developer/develop/advanced/market",
// },
// {
// text: "Analytic",
// link: "/zh/developer/develop/advanced/analytic",
// },
// {
// text: "Analytic",
// link: "/zh/developer/develop/advanced/analytic",
// },
// {
// text: "Websocket",
// link: "/zh/developer/develop/advanced/websocket",
// link: "/zh/developer/develop/advanced/websocket",
// },
// {
// text: "文件上传",
// link: "/zh/developer/develop/advanced/file-upload",
// },
// {
// text: "Rss",
// link: "/zh/developer/develop/advanced/rss",
// },
// {
// text: "密钥",
// link: "/zh/developer/develop/advanced/secret",
// link: "/zh/developer/develop/advanced/file-upload",
// },
// {
// text: "Rss",
// link: "/zh/developer/develop/advanced/rss",
// },
// {
// text: "密钥",
// link: "/zh/developer/develop/advanced/secret",
// },
// {
// text: "Notification",
// link: "/zh/developer/develop/advanced/notification",
// },
// {
// text: "Frontend",
// link: "/zh/developer/develop/advanced/frontend",
// },
// {
// text: "Kubesphere",
// link: "/zh/developer/develop/advanced/kubesphere",
// },
// ],
// },
// {
// text: "Notification",
// link: "/zh/developer/develop/advanced/notification",
// },
// {
// text: "Frontend",
// link: "/zh/developer/develop/advanced/frontend",
// },
// {
// text: "Kubesphere",
// link: "/zh/developer/develop/advanced/kubesphere",
// },
// ],
// },
{
text: "提交应用",
collapsed: true,
@@ -842,8 +907,8 @@ const side = {
},
],
},
],
};
],
};
export const zh = defineConfig({
lang: "zh",

View File

@@ -122,7 +122,7 @@ The mechanism consists of three procedures
- User
[Manage apps in Market](../../manual/olares/market.md)<br>
[Manage apps in Market](../../manual/olares/market/market.md)<br>
- Developer

View File

@@ -17,7 +17,7 @@ outline: [2, 3]
### 1. Develop and test your application
Before submitting an application, please ensure that it has been thoroughly tested on your Olares.
- Use Studio's dev-container to test and debug your application in a real online environment. [Learn more about Studio](../tutorial/).
- Use Studio's dev-container to test and debug your application in a real online environment. [Learn more about Studio](../tutorial/develop.md).
- Use the [custom installation](../tutorial/package-upload.md) in the Market app for user testing.
### 2. Submit an application

View File

@@ -34,20 +34,6 @@ Specifies whether to enable the Cloudflare proxy.
- `1` (enable)
- **Default**: `0`
### `DID_GATE_URL`
Specifies the endpoint for the DID gateway.
- **Valid values**:
- `https://did-gate-v3.bttcdn.com`
- `https://did-gate-v3.api.jointerminus.cn/` (recommended for better connectivity in mainland China)
- **Default**: `https://did-gate-v3.bttcdn.com`
### `FIREBASE_PUSH_URL`
Specifies the endpoint for Firebase push services.
- **Valid values**:
- `https://firebase-push-test.bttcdn.com/v1/api/push`
- `https://firebase-push-test.api.jointerminus.cn/v1/api/push` (recommended for better connectivity in mainland China)
- **Default**: `https://firebase-push-test.bttcdn.com/v1/api/push`
### `FRP_AUTH_METHOD`
Sets the FRP authentication method.
- **Valid values**:
@@ -68,13 +54,6 @@ Specifies whether to enable FRP for internal network tunneling. Requires additio
- `1` (enable)
- **Default**: `0`
### `FRP_LIST_URL`
Specifies the endpoint for the Olares FRP information service.
- **Valid values**:
- `https://terminus-frp.snowinning.com`
- `https://terminus-frp.api.jointerminus.cn` (recommended for better connectivity in mainland China)
- **Default**: `https://terminus-frp.snowinning.com`
### `FRP_PORT`
Specifies the FRP server's listening port.
- **Valid values**: An integer in the range `165535`
@@ -106,13 +85,6 @@ Specifies whether to enable GPU sharing. Applies only if GPU is enabled.
- `1` (enable)
- **Default**: `0`
### `MARKET_PROVIDER`
Specifies the backend domain used by the application marketplace (Market).
- **Valid values**:
- `appstore-server-prod.bttcdn.com`
- `appstore-china-server-prod.api.jointerminus.cn` (recommended for better connectivity in mainland China)
- **Default**: `appstore-server-prod.bttcdn.com`
### `NVIDIA_CONTAINER_REPO_MIRROR`
Specifies the APT repository mirror for installing NVIDIA Container Toolkit.
- **Valid values**:
@@ -120,13 +92,6 @@ Specifies the APT repository mirror for installing NVIDIA Container Toolkit.
- `mirrors.ustc.edu.cn` (recommended for better connectivity in mainland China)
- **Default**: `nvidia.github.io`
### `OLARES_SPACE_URL`
Specifies the endpoint for the Olares Space service.
- **Valid values**:
- `https://cloud-api.bttcdn.com/`
- `https://cloud-api.api.jointerminus.cn/` (recommended for better connectivity in mainland China)
- **Default**: `https://cloud-api.bttcdn.com/`
### `PREINSTALL`
Runs only the pre-installation phase (system dependency setup) without proceeding to the full Olares installation.
- **Valid values**: `1`
@@ -145,27 +110,6 @@ Specifies a custom Docker registry mirror for faster image pulls.
- **Valid values**: `https://mirrors.olares.com` or any other valid URL
- **Default**: `https://registry-1.docker.io`
### `TAILSCALE_CONTROLPLANE_URL`
Specifies the endpoint for the Olares Tailscale control-plane service.
- **Valid values**:
- `https://controlplane.snowinning.com`
- `https://controlplane.api.jointerminus.cn` (recommended for better connectivity in mainland China)
- **Default**: `https://controlplane.snowinning.com`
### `TERMINUS_CERT_SERVICE_API`
Specifies the endpoint for the Olares HTTPS certificate service.
- **Valid values**:
- `https://terminus-cert.snowinning.com`
- `https://terminus-cert.api.jointerminus.cn` (recommended for better connectivity in mainland China)
- **Default**: `https://terminus-cert.snowinning.com`
### `TERMINUS_DNS_SERVICE_API`
Specifies the endpoint for the Olares DNS service.
- **Valid values**:
- `https://terminus-dnsop.snowinning.com`
- `https://terminus-dnsop.api.jointerminus.cn` (recommended for better connectivity in mainland China)
- **Default**: `https://terminus-dnsop.snowinning.com`
### `TERMINUS_IS_CLOUD_VERSION`
Marks the machine explicitly as a cloud instance.
- **Valid values**: `true`

View File

@@ -9,7 +9,33 @@ You can use Docker to install and run Olares in a containerized environment. Thi
For best performance and stability, we recommend [installing Olares on Linux via script](/manual/get-started/install-olares.md).
:::
<!--@include: ./reusables.md{52,65}-->
## System requirements
Make sure your device meets the following requirements.
### Required specifications
- **CPU**: At least 4 cores.
- **RAM**: At least 8 GB of available memory.
- **Storage**: At least 150 GB of available SSD storage.
:::warning SSD required
The installation will fail if an HDD (mechanical hard drive) is used instead of an SSD.
:::
- **Supported systems**:
- Ubuntu 22.04-25.04 LTS
- Debian 12 or 13
:::info Version compatibility
While these specific versions are confirmed to work, the process may still work on other versions. Adjustments may be necessary depending on your environment. If you meet any issues with these platforms, feel free to raise an issue on [GitHub](https://github.com/beclab/Olares/issues/new).
:::
### Optional hardware
A GPU is not required to install Olares, but is necessary for AI applications.
- **GPU (NVIDIA only)**:
- **Architecture**: Turing or newer (e.g., GTX 16 series, RTX 20 series).
- **Verification**: Run `lspci | grep -i nvidia` and check the [compatible GPU table](https://github.com/NVIDIA/open-gpu-kernel-modules?tab=readme-ov-file#compatible-gpus).
## Before you begin
Before you begin, ensure the following:

View File

@@ -1,4 +1,5 @@
---
outline: [2, 3]
description: Install Olares on a physical machine using the official ISO image, including system requirements, installation steps, and activation process.
---
@@ -10,6 +11,7 @@ This guide explains how to install Olares on a physical machine using the offici
## Prerequisites
### Required
- **Host requirements**:
- **CPU**: Minimum 4 cores with **x86-64 architecture** (Intel or AMD). ARM-based processors are not currently supported for this method.
- **Memory**: At least 8 GB of available RAM.
@@ -19,7 +21,15 @@ This guide explains how to install Olares on a physical machine using the offici
The installation will likely fail if an HDD (mechanical hard drive) is used instead of an SSD.
:::
- **Other**: A USB flash drive with at least **8 GB** capacity.
- **USB flash drive**: **8 GB** capacity or larger.
### Optional
A GPU is not required to install Olares, but is necessary for AI applications.
- **GPU (NVIDIA only)**:
- **Architecture**: Turing or newer (e.g., GTX 16 series, RTX 20 series).
- **Verification**: Run `lspci | grep -i nvidia` and check the [compatible GPU table](https://github.com/NVIDIA/open-gpu-kernel-modules?tab=readme-ov-file#compatible-gpus).
## Create a bootable USB drive

View File

@@ -1,4 +1,5 @@
---
outline: [2, 3]
description: Detailed instructions for installing Olares on Linux systems including Ubuntu and Debian. Covers system requirements, installation steps, and activation process.
---
# Install Olares on Linux via the script
@@ -6,7 +7,33 @@ This guide explains how to install Olares on Linux using the provided installati
<!--@include: ./reusables.md{44,51}-->
<!--@include: ./reusables.md{52,65}-->
## System requirements
Make sure your device meets the following requirements.
### Required specifications
- **CPU**: At least 4 cores.
- **RAM**: At least 8 GB of available memory.
- **Storage**: At least 150 GB of available SSD storage.
:::warning SSD required
The installation will fail if an HDD (mechanical hard drive) is used instead of an SSD.
:::
- **Supported systems**:
- Ubuntu 22.04-25.04 LTS
- Debian 12 or 13
:::info Version compatibility
While these specific versions are confirmed to work, the process may still work on other versions. Adjustments may be necessary depending on your environment. If you meet any issues with these platforms, feel free to raise an issue on [GitHub](https://github.com/beclab/Olares/issues/new).
:::
### Optional hardware
A GPU is not required to install Olares, but is necessary for AI applications.
- **GPU (NVIDIA only)**:
- **Architecture**: Turing or newer (e.g., GTX 16 series, RTX 20 series).
- **Verification**: Run `lspci | grep -i nvidia` and check the [compatible GPU table](https://github.com/NVIDIA/open-gpu-kernel-modules?tab=readme-ov-file#compatible-gpus).
## Install Olares

View File

@@ -12,21 +12,31 @@ Currently, Olares on LXC has certain limitations. We recommend using it only for
## System requirements
Make sure your device meets the following requirements.
### Required specifications
- CPU: At least 4 cores
- RAM: At least 8GB of available memory
- Storage: At least 150GB of available SSD storage.
- RAM: At least 8 GB of available memory
- Storage: At least 150 GB of available SSD storage.
::: warning SSD required
The installation will likely fail if an HDD (mechanical hard drive) is used instead of an SSD.
:::
- Supported systems:
- PVE 8.2.2
- Linux container: Debian 12 (for existing LXC containers on PVE)
::: warning SSD required
The installation will likely fail if an HDD (mechanical hard drive) is used instead of an SSD.
:::
:::info Version compatibility
While the specific versions are confirmed to work, the process may still work on other versions. Adjustments may be necessary depending on your environment. If you meet any issues with these platforms, feel free to raise an issue on [GitHub](https://github.com/beclab/Olares/issues/new).
:::
### Optional hardware
A GPU is not required to install Olares, but is necessary for AI applications.
- GPU (NVIDIA only):
- Architecture: Turing or newer (e.g., GTX 16 series, RTX 20 series, and later).
- Verification: Run `lspci | grep -i nvidia` in the PVE host shell to confirm the card is detected.
- Setup: To utilize the GPU, you must configure LXC device passthrough. Please refer to [Configure GPU passthrough in PVE](/manual/best-practices/install-olares-gpu-passthrough.md#configure-gpu-passthrough-in-pve) for detailed instructions.
## Prerequisites
- Working directories for storing images and packages on the PVE host. You can set it using the following command:

View File

@@ -20,11 +20,14 @@ Make sure your device meets the following requirements.
- Architecture: AMD64 or ARM64
- CPU: At least 4 cores
- RAM: At least 8GB of available memory
- Storage: At least 150GB of available SSD storage.
- RAM: At least 8 GB of available memory
- Storage: At least 150 GB of available SSD storage.
::: warning SSD required
The installation will fail if an HDD (mechanical hard drive) is used instead of an SSD.
:::
::: info GPU limitation
Olares GPU acceleration currently supports NVIDIA GPUs only. Consequently, GPU resources cannot be managed or utilized for AI workloads on macOS devices.
:::
## Before you begin
Before you begin, ensure the following:

View File

@@ -16,12 +16,16 @@ We recommend using it only for development or testing purposes.
## System compatibility
Make sure your Mac meets the following requirements.
- Architecture: X86-64 or ARM64
- RAM: 8 GB or above (available memory)
- Storage: 150 GB or above of available space on SSD
- MacOS: Monterey (12) or later
::: warning SSD required
The installation will likely fail if an HDD (mechanical hard drive) is used instead of an SSD.
- Architecture: X86-64 or ARM64.
- RAM: At least 8 GB of available memory.
- Storage: At least 150 GB of available SSD storage.
::: warning SSD required
The installation will likely fail if an HDD (mechanical hard drive) is used instead of an SSD.
:::
- MacOS: Monterey (12) or later.
::: info GPU limitation
Olares GPU acceleration currently supports NVIDIA GPUs only. Consequently, GPU resources cannot be managed or utilized for AI workloads on macOS devices.
:::
## Before you begin

View File

@@ -12,12 +12,24 @@ Currently, Olares on PVE has certain limitations. We recommend using it only for
## System requirements
Make sure your device meets the following requirements.
**CPU**: Minimum 4 cores with **x86-64 architecture** (Intel or AMD). ARM-based processors are not currently supported for this method.
- RAM: At least 8GB of available memory
- Storage: At least 200GB of available SSD storage. The installation will likely fail if an HDD (mechanical hard drive) is used instead of an SSD.
### Required specifications
- CPU: Minimum 4 cores with x86-64 architecture (Intel or AMD). ARM-based processors are not currently supported for this method.
- RAM: At least 8 GB of available memory
- Storage: At least 200 GB of available SSD storage.
::: warning SSD required
The installation will likely fail if an HDD (mechanical hard drive) is used instead of an SSD.
:::
- Supported Systems: PVE 8.2.2
### Optional hardware
A GPU is not required to install Olares, but is necessary for AI applications.
- GPU (NVIDIA only):
- Architecture: Turing or newer (e.g., GTX 16 series, RTX 20 series, and later).
- Verification: Run `lspci | grep -i nvidia` in the PVE host shell to confirm the card is detected.
- Setup: To utilize the GPU, you must configure PCI passthrough. Please refer to [Configure GPU passthrough in PVE](/manual/best-practices/install-olares-gpu-passthrough.md#configure-gpu-passthrough-in-pve) for detailed instructions.
## Download Olares ISO image
Click [here](https://cdn.olares.com/olares-latest-amd64.iso) to download the official Olares ISO image.

View File

@@ -13,19 +13,28 @@ Currently, Olares on PVE has certain limitations. We recommend using it only for
## System requirements
Make sure your device meets the following requirements.
### Required specifications
- CPU: At least 4 cores
- RAM: At least 8GB of available memory
- Storage: At least 150GB of available SSD storage.
- RAM: At least 8 GB of available memory
- Storage: At least 150 GB of available SSD storage.
::: warning SSD required
The installation will likely fail if an HDD (mechanical hard drive) is used instead of an SSD.
:::
- Supported Systems: PVE 8.2.2
::: warning SSD required
The installation will likely fail if an HDD (mechanical hard drive) is used instead of an SSD.
:::
:::info Version compatibility
While the specific version is confirmed to work, the process may still work on other versions. Adjustments may be necessary depending on your environment. If you meet any issues with these platforms, feel free to raise an issue on [GitHub](https://github.com/beclab/Olares/issues/new).
:::
### Optional hardware
A GPU is not required to install Olares, but is necessary for AI applications.
- GPU (NVIDIA only):
- Architecture: Turing or newer (e.g., GTX 16 series, RTX 20 series, and later).
- Verification: Run `lspci | grep -i nvidia` in the PVE host shell to confirm the card is detected.
- Setup: To utilize the GPU, you must configure PCI passthrough. Please refer to [Configure GPU passthrough in PVE](/manual/best-practices/install-olares-gpu-passthrough.md#configure-gpu-passthrough-in-pve) for detailed instructions.
## Install on PVE
In PVE CLI, run the following command:

View File

@@ -14,10 +14,12 @@ Make sure your Raspbian device meets the following requirements.
- Hardware: Raspberry Pi 4B or Raspberry Pi 5 with 8GB memory
- Operating system: Raspbian 12
- Storage: At least 150GB of available SSD storage.
::: warning SSD required
The installation will likely fail if an HDD (mechanical hard drive) is used instead of an SSD.
:::
::: info GPU limitation
Olares GPU acceleration currently supports NVIDIA GPUs only. Consequently, GPU resources cannot be managed or utilized for AI workloads on macOS devices.
:::
## Set up system environment
1. Configure the Raspbian environment to enable necessary features:

View File

@@ -17,15 +17,27 @@ We recommend using it only for development or testing purposes.
## System compatibility
Make sure your Windows meets the following requirements.
### Required specifications
- CPU: At least 4 cores
- RAM: At least 16GB of available memory
- Storage: At least 150GB of available SSD storage.
- RAM: At least 16 GB of available memory
- Storage: At least 150 GB of available SSD storage.
::: warning SSD required
The installation will likely fail if an HDD (mechanical hard drive) is used instead of an SSD.
:::
- Supported systems:
- Windows 10 or 11
- Linux (on WSL 2): Ubuntu 22.04 LTS or later; Debian 12 or later
::: warning SSD required
The installation will likely fail if an HDD (mechanical hard drive) is used instead of an SSD.
:::
### Optional hardware
A GPU is not required to install Olares, but is necessary for AI applications.
- **GPU (NVIDIA only)**:
- Architecture: Turing or newer (e.g., GTX 16 series, RTX 20 series, and later).
- Verification:
1. Open **Task Manager > Performance** to confirm your GPU model (must be NVIDIA).
2. Run `nvidia-smi` inside your WSL terminal to confirm the driver is accessible.
## Set up system environment
1. Enable the required Windows features for virtualization.

View File

@@ -62,4 +62,47 @@ Make sure your device meets the following requirements.
:::info Version compatibility
While these specific versions are confirmed to work, the process may still work on other versions. Adjustments may be necessary depending on your environment. If you meet any issues with these platforms, feel free to raise an issue on [GitHub](https://github.com/beclab/Olares/issues/new).
:::
:::
<!--Sync files, reused in LarePass > Manage files-->
## Sync files to local computer
With LarePass desktop, you can sync cloud files (organized by libraries or folders) to your local computer. This creates a corresponding folder on your machine. After set up, your files will stay updated bi-directionally in real time.
:::tip Note
The **Sync to local** feature is only available for libraries or folders within the **Sync** directory.
:::
### Create a library
Library is the fundamental unit for organizing, syncing, and sharing your digital content. Each user is automatically provided with their own personal library (My Library) as a starting point.
To create a new library:
1. To the right of **Sync**, click <i class="material-symbols-outlined">add_circle</i> to open the **New library** dialog.
![Create a new library for sync](/images/manual/olares/sync-new-library.png#bordered){width=55%}
2. Enter a name for the library and click **Create**.
### Enable synchronization
To enable sync for a library or folder:
1. Open LarePass desktop and locate the **Sync** directory.
2. Hover your mouse over the target library or folder, click <i class="material-symbols-outlined">more_horiz</i> that appears on the right, and then click **Sync to local**.
![Sync files to local](/images/manual/olares/sync-files-local.png#bordered){width=58%}
3. In the **Sync library** popup window, set the file download location, and then click **Confirm**.
Syncing will begin immediately. Once completed, a green checkmark will appear on the bottom-left corner of the folder icon, indicating that the sync is finished.
### Manage synchronization
After setting up synchronization, you can manage your files and control the sync status with the following operations:
- If you want to quickly locate the sync directory on your local drive, hover your mouse over the target library or folder, click <i class="material-symbols-outlined">more_horiz</i> that appears on the right, and then click **Open local sync folder**. The system will directly open the folder's location on your computer.
- If you no longer need to sync a folder, hover your mouse over it, click <i class="material-symbols-outlined">more_horiz</i> that appears on the right, and then click **Unsychronize**.
- If you want to temporarily stop data transfer, click <i class="material-symbols-outlined">pause_circle</i> to the right of the **Sync** directory. All sync tasks will be paused.

View File

@@ -1,105 +1,2 @@
---
description: Find answers to common questions about Olares.
---
# FAQs
## What license is Olares using?
Olares consists of a series of projects using a hierarchical authorization approach. The basic principles are:
- Projects running on blockchain use Apache 2.0, such as [Snowinning Protocol](https://github.com/beclab/terminusdid-contract-system).
- Projects related to protocols use Apache 2.0, such as [r4](https://github.com/beclab/r4).
- Projects around Olares and LarePass use the [Olares License](https://github.com/beclab/Olares/blob/main/LICENSE.md).
- For third-party applications running on Olares, it is up to the developer to decide whether they want them open source or not and choose the license accordingly.
For more details, visit our projects on [GitHub](https://github.com/beclab).
## Is the Olares License an open source license?
Olares's choice of license for its major projects is inspired by [fair code](https://faircode.io/). The [Olares License](https://github.com/beclab/Olares/blob/main/LICENSE.md) also follows these principles:
> - Is generally free to use and can be distributed by anybody
> - Has its source code openly available
> - Can be extended by anybody in public and private communities
> - Is commercially restricted by its authors
## Why can't I restore my account if the mnemonics goes missing?
From 1Passwords MasterKey to crypto wallets mnemonic phrase, for more than ten years, the problem of mnemonic storage has not been well solved.
The mnemonic phrase of Olares will be encrypted and stored on all devices that install LarePass. Generally, you only lose the mnemonic phrase if you lose all the devices with LarePass installed at the same time.
Safety is the most important principle in designing our system. We will continue to improve it in the future to provide you with a better solution that balances convenience and safety.
## Is there a difference between Olares and the current operating systems running on NAS?
At the inception of Olares (formerly Terminus), the market already had excellent NAS operating systems such as [Synology](https://www.synology.com/en-global/dsm/packages), [CasaOS](https://github.com/IceWhaleTech/CasaOS), and [Umbrel](https://github.com/getumbrel/umbrel). They have indeed inspired us.
But we do think the operating system running on Edge should be able to:
- Orchestrate resources for multiple hardware
- Manage applications in sandboxes
This is difficult to achieve with the above-mentioned NAS operating systems built on Docker Compose.
Meanwhile, Olares aims to provide a one-stop self-hosted solution, which goes beyond the scope of general NAS operating systems.
## Do I need to pay for Olares?
When you're self-hosting, you can essentially use Olares for free.
But for the following two features, we may introduce reasonable charges due to the cost (currently both are provided for free):
- **Backup**
We provide 10G of free backup space for each Olares ID on Olares Space. When the archive size exceeds this limit, we will charge you a certain fee to cover the cloud provider fee.
- **Fast Reverse Proxy (FRP)**
Accessing Olares locally or via VPN is essentially free. However, if youre providing external services like hosting a blog, traffic will be forwarded to a Fast Reverse Proxy (FRP) server before reaching Olares. In this case:
- If you use your own FRP service, Olares does not impose any charges.
- If you opt to use the default FRP service from Olares, we offer a free monthly traffic allowance of 2GB. This is usually sufficient for users who do not provide external services through Olares. Additional charges may apply if your usage exceeds this limit.
## When are other languages available?
Right now we only support English and Simplified Chinese.
In fact, we have completed i18n replacement in all front-end projects. However, we lack the experience in maintaining translation resources for a fast iterating project through the open source community. We are still learning.
## What are the differences among the different "passwords"?
Olares does have various passwords to ensure its security, including:
- Private key
- The password of LarePass:
- On mobile phones, biometrics can be used for login
- On computers and browser plug-ins, manual input is required
- Password for first activation of Olares
- Password for Olares login
- Second verification code when logging in to Olares
Don't panic! For daily use, what you need to enter is the two-step verification code when logging in to Olares.
## How to deploy multi-user applications?
It depends on whether you want to provide external service or simply let internal Olares users use it.
- To provide services to the public, you can select the Entrance to access the application as **Public**. This allows the application to manage its own user registration and authentication.
- To provide internal access only, you can deploy the Cluster-scoped version of such products on Olares.
For Gitlab, we provide two versions of porting: [Gitlab Pure](https://github.com/beclab/apps/tree/main/gitlabpure) and [Gitlab Fusion](https://github.com/RLovelett/gitlab-fusion).
## How can I reactivate Olares with the same Olares ID?
If you've reinstalled Olares, the Olares instance you originally activated will no longer be accessible. To reactivate Olares using the same Olares ID:
::: tip Install with the same Olares ID
During the Olares installation, ensure that you have entered the exact same domain and Olares ID that you used previously.
:::
![Reactivate](/images/manual/help/reactivate.png)
1. Open LarePass on your phone and enter your previous account. You should see a red prompt on the top saying "No active Olares found".
2. Tap **Learn more** > **Reactivate** to enter the QR scan screen.
3. Tap **Scan QR code** to scan the QR code on the wizard page and activate Olares.
This section summarizes frequently asked questions about Olares.

View File

@@ -0,0 +1,78 @@
---
outline: [2, 3]
description: Find answers to common questions during the installation and activation of Olares.
---
# Olares installation and activation FAQs
This page lists the FAQs about installing, configuring, and activating Olares on your hardware.
## Installation
### What platforms does Olares support?
You can install Olares on Linux (Ubuntu or Debian) for best performance.
For product evaluation, you can also install Olares on the following platforms:
* Proxmox VE
* Raspberry Pi
* macOS
* Windows
### What is the minimum hardware requirements for installing Olares?
The requirements vary by platform. Generally:
* **CPU**: Minimum 4 cores with x86-64 architecture (Intel or AMD).
* **Memory**: At least 8 GB of available RAM.
* **Storage**: Minimum 150 GB SSD.
For detailed requirements, refer to the [installation docs](../get-started/install-olares.md).
### Can I use a mechanical hard drive to install Olares?
No. You must use an SSD. The installation will likely fail if a mechanical hard drive is used due to slower read and write speeds, which can cause timeouts during the system initialization.
### Does the system support NVIDIA GPUs?
Yes. Olares is fully optimized for NVIDIA hardware. It automatically handles driver installation, allowing you to get immediate AI and gaming performance.
It also supports multiple GPUs on a single motherboard (currently NVIDIA only), allowing users with custom hardware to leverage all available compute power for AI workloads.
### How do I manually install NVIDIA drivers if the automatic setup fails?
The Olares installer usually detects and installs drivers automatically. However, if your system previously had NVIDIA drivers installed, the process might be skipped or fail due to conflicts.
In this case, you should:
1. Reboot the machine after the Olares installation to ensure any old driver components are fully cleared.
2. Manually trigger the driver installation using the command `olares-cli gpu install`.
After installation, you can confirm that the drivers are installed and your GPU is recognized by running `nvidia-smi`.
### Why does installation fail with `failed to build Kubernetes objects` or `Ensure CRDs are installed first`?
While these error messages suggest a problem with Custom Resource Definitions (CRDs), they are often a symptom of poor disk performance.
Olares relies on etcd, the backing database for Kubernetes. etcd is very sensitive to storage speed. If you are installing Olares on a slow disk, such as a traditional HDD, etcd cannot respond fast enough. This causes the API server to time out while attempting to apply CRDs.
Installing Olares on SSD storage should fix this issue.
### My Olares installation timed out and didn't show a password, but the system seems to be running. How can I find the password?
This typically occurs when the installation times out due to insufficient system resources, especially in a virtual machine (VM). You can retrieve the password from the installation log file with the following command:
```bash
# Replace v1.12.2 with your specific Olares version number.
grep password $HOME/.olares/versions/v1.12.2/logs/install.log
```
An installation timeout often means some services failed to start correctly. After finding your password, run `kubectl get pod -A` to check the status of all services.
## Activation
### Is it possible to activate Olares with a non-local network?
Yes. Before activation, users typically access the activation wizard using the local IP address, which generally requires both parties to be on the same network. However, if Olares is assigned a public IP, such as on a public cloud, this local network limitation no longer applies.
Note that IP access is only used during activation. Once activated, devices can be accessed via domain names on both internal and external networks.
### My Olares is powered on and connected to LAN, but I can't find it in LarePass. What should I do?
Ensure both your phone and Olares device are on the same network. If they are not, LarePass cannot discover Olares automatically.
In situations where you cannot connect via Wi-Fi, you can use the Bluetooth network setup in the LarePass app to connect Olares to the same network as your phone.
For details, see [Activate Olares using Bluetooth](../../manual/larepass/activate-olares.md#activate-olares-using-bluetooth).

125
docs/manual/help/olares.md Normal file
View File

@@ -0,0 +1,125 @@
---
outline: [2, 3]
description: Find answers to common questions about the Olares platform.
---
# Olares FAQs
This page lists most frequently asked questions about Olares.
## General information
### What is Olares?
Olares is an open-source personal cloud operating system based on Kubernetes designed to empower users to own and manage their digital assets locally.
It features native resource orchestration, application sandboxing, and production-grade infrastructure for edge computing. The goal of Olares is to provide a one-stop personal cloud solution that runs powerful local alternatives to public cloud services such as large language models and automation workflows. It is suitable for use cases ranging from personal media servers and AI development to decentralized identity management.
### What is "personal cloud"?
A personal cloud is a private infrastructure that replicates the utility of public cloud services such as anywhere-access to files and computing power but runs entirely on your own hardware to ensure data sovereignty.
### Who is Olares for?
Olares is designed for anyone who wants to use powerful AI tools locally without dealing with complex technical setups.
* **For general users**: You can deploy complex applications like ComfyUI or Perplexica from the Market with a single click.
* **For developers**: Olares functions as an efficient local development environment. You can leverage the sandboxing and agent infrastructure to build and test applications directly on your Olares device, saving time on environment configuration.
### How is Olares different from NAS operating systems?
Olares is designed fundamentally as a Personal AI Cloud rather than a storage server. Traditional NAS systems like Synology DSM or CasaOS are optimized primarily for storing files and hosting lightweight containers.
Olares distinguishes itself by focusing on high-performance computing:
* **Orchestrating resources**: It natively manages hardware resources such as GPUs to power local AI workloads.
* **Sandboxing**: It enforces strict application isolation, providing a security model that goes beyond standard file servers.
For detailed comparisons, refer to [Compare Olares and NAS](https://blog.olares.com/compare-olares-and-nas/).
### Why is an Olares ID required?
The Olares ID is currently required to automate secure remote access for your device. It allows the system to configure a reverse proxy, register a subdomain, and manage HTTPS certificates on your behalf. Without this, you would need to manually handle complex network configurations such as port forwarding and DNS management to access your device from outside your home.
Unlike a centralized cloud account, the Olares ID is owned entirely by you. We never see your credentials, and we cannot recover your data if you lose your mnemonic phrase.
We understand the community's preference for flexibility. In the upcoming March update, we plan to introduce new activation options that will make the Olares ID optional if you prefer to configure your own network access.
### Can I use Olares offline or without internet?
Yes, we support local-first usage, though the initial activation currently requires internet access.
For users prioritizing strict local control, we offer these options:
* **VPN-Only mode**: You can restrict your Olares so it is only accessible remotely via VPN.
* **Local-Only access**: You can access Olares services via `.local` domains even if the router has no internet access.
For detailed local access options, refer to [Access Olares services locally](../get-started/local-access.md).
Note that we are also working on an option to allow full device activation in a completely offline environment.
### What is LarePass and why is it required?
LarePass is the official client for Olares. It acts as a secure bridge to enable seamless access, file synchronization across devices, etc. Currently, it is required to handle the device activation.
### Can I use Olares without the LarePass app?
We understand this is a core requirement for advanced users. We are working on decoupling these functions:
* **CLI activation**: We plan to move activation logic into the `olares-cli`, allowing for a terminal-based setup without the app.
* **Standalone components**: We aim to provide standalone deployment options for components like the Reverse Proxy, DID service, and Market repo in future updates.
### Can I use my own domain name?
Yes. You can use your own custom domain instead of the default `olares.com` domain. Note that setting this up currently requires the LarePass app.
For details, refer to [Set up a custom domain for your Olares](../best-practices/set-custom-domain.md).
### Do I need to pay for Olares?
Olares OS itself is free and open source for self-hosting. If you purchase Olares One, it is a one-time hardware cost.
We offer two optional cloud-assisted services for convenience, but free alternatives are available so you are never locked in:
* **Cloud backup**: You can subscribe to Olares Space for integrated cloud backups. The free alternative is to back up to your own external storage or S3-compatible service.
* **Remote access (FRP)**: For easy remote access, we offer a built-in FRP (Fast Reverse Proxy) service with 2 GB of free monthly traffic, with paid options for higher usage. The completely free alternative is to access Olares services via LarePass VPN, or to configure and use your own FRP server.
### How often does Olares update?
We aim for a major release approximately every 2 months. You can view specific changes in our [changelog](https://www.olares.com/changelog).
## License
### Is Olares open source?
Yes. The Olares OS software is open source, ensuring transparency and community collaboration. The project consists of a family of repositories licensed under appropriate models:
* **Olares and LarePass**: Licensed under AGPL-3.0. You can view our [GitHub organization](https://github.com/beclab).
* **Protocol projects**: Projects like the Smart contract system for Olares ID use Apache 2.0.
* **Third-party apps**: Developers adopt any license they choose.
### Can I build Olares from source code?
The short answer is yes, but it is currently complex.
Olares is a massive project spanning over 90 repositories. Because our architecture is evolving quickly, we currently lack a fully integrated local build system that provides a simple "what you see is what you get" experience.
We are actively working to streamline the build process and documentation. We expect to improve the local build experience and release standalone deployment guides for core services such as reverse proxy in 2026. Our goal is to refine the foundation first, then invite broader community collaboration.
## Security and privacy
### Does Olares collect my data?
No. Olares is built to reclaim your data ownership. All storage, computation, and AI processing happen locally on your hardware. Olares does not collect or transmit your private data to any centralized service.
### Does Olares support backup?
Yes. Data safety is user-controlled and private. Olares includes a [built-in backup feature](../olares/settings/backup.md) that allows you to save specific file directories and set automatic schedules.
Critically, every backup file is end-to-end encrypted. This allows you to store the backup file on any medium including external drive or third-party cloud with full confidence that the data remains inaccessible to others.
### What is app sandboxing?
Sandboxing is a security standard used to prevent a single malicious app from compromising the entire system. In Olares, every app runs in its own secure, isolated environment. If an app malfunctions, it is completely contained and cannot access or damage your other applications or personal data.
### Does the system support multi-user environments?
Yes. Olares supports sub-accounts with a built-in roles and permissions system including Super Admin, Admin, and Member.
This allows a team to access shared tools on a single server. For example, you can share files within the same Olares cluster or install a large AI model once for everyone to use.

49
docs/manual/help/usage.md Normal file
View File

@@ -0,0 +1,49 @@
---
outline: [2, 3]
description: Find answers to common questions about using Olares and community apps.
---
# Usage FAQs
Find answers to common questions about daily usage, applications, and system management.
## Applications
### What apps can I run in Olares?
The [Olares Market](https://market.olares.com/) maintains popular open-source apps like Ollama, ComfyUI, and Open WebUI.
If you have Docker experience, you can manually [deploy apps](../../developer/develop/tutorial/index.md) not listed in the Olares Market in a testing environment.
### Can I play games on my Olares device?
Yes. The Steam Headless app transforms your Olares device into a gaming server.
* [**Streaming**](../../use-cases/stream-game.md): You can run games locally on Olares and stream them to devices like phones and tablets.
* [**Direct play**](../../use-cases/play-games-directly.md): You can connect a monitor, keyboard, and mouse directly to the Olares device to play games without streaming.
### How do I access the Windows environment in Olares?
You can run a Windows VM from the Olares Market and access it using any standard RDP client.
For detailed instructions, refer to [Run a Windows VM on your Olares device](../../use-cases/windows.md).
### Can I develop apps on Olares?
Yes. You can install [Studio](../../developer/develop/tutorial/index.md) to code directly in your browser or connect your local VS Code to the device. This provides a development experience similar to your local machine but leverages the greater power of your server hardware.
## Storage
### If I add new disks to a running Olares machine, will Olares use them automatically?
It depends on the type of drive:
* **USB drives**: Yes, these are automatically mounted and will appear immediately in the Files app.
* **Internal drives**: No, internal HDDs or SSDs are not automatically added to the storage pool. You must configure them manually.
* **SMB shares**: Network storage can be added via **External** > **Connect to server** in Files.
For detailed instructions, see [Expand storage in Olares](../best-practices/expand-storage-in-olares.md).
## Multi-node clusters
### How do I add more machines to my cluster?
By default, Olares installs as a single-node cluster. However, you can install Olares as a master node and then add worker nodes to create a scalable, multi-node cluster.
Note that this is currently an Alpha feature and works on Linux only. For detailed steps, refer to [Install a multi-node Olares cluster](../best-practices/install-olares-multi-node.md).

View File

@@ -1,4 +1,5 @@
---
outline: [2, 3]
description: Learn essential file operations in Larepass including adding new files, editing existing content, and downloading files across different devices.
---
# Common file operations on LarePass
@@ -72,6 +73,8 @@ You can view, pause, or cancel the download tasks in **Transfer** > **Download**
</template>
</Tabs>
<!--@include: ../get-started/reusables.md{67,108}-->
## Delete files
:::warning
Deleted files cannot be recovered.

View File

@@ -54,12 +54,19 @@ To install a system update:
2. On the **System update** page, confirm the available version in the **New version** field, then click **Upgrade**.
![Check for available version](/images/manual/larepass/check-version.png#bordered)
3. In the pop-up dialog, choose your upgrade method and tap **Confirm**:
- **Download only**: Olares will only download the update package. After the download completes, click **Upgrade** on the **System update** page to start the installation. You can continue using Olares during the download process.
- **Download and upgrade**: Olares will immediately download and install the update package. The system will be temporarily unavailable during the upgrade process.
![Upgrade method](/images/manual/larepass/olares-upgrade1.png#bordered)
3. In the pop-up dialog, select how you want to upgrade:
4. Wait for the upgrade to finish. You will see a success message, and Olares will automatically resume normal operation.
- **Download only**<br>
Olares downloads the update package in the background while you continue using the system.
- **Download and upgrade**<br>
Olares downloads the update package and will install it after you confirm a restart.
![Choose upgrade method](/images/manual/larepass/olares-upgrade1.png#bordered)
4. If you selected **Download only**, click **Upgrade now** on the **System update** page to initiate the process.
5. If you selected **Download and upgrade**, confirm the restart when prompted to begin installation.
6. Wait for the upgrade and restart to finish. When Olares starts up again, you'll see a success message and can continue using it.
### Restart or shut down Olares remotely

View File

@@ -35,8 +35,7 @@ From the Launchpad, you can:
Built-in system applications such as Files, Market, and Profile cannot be uninstalled.
:::
### Controll application windows
### Control application windows
You can access applications via two modes.
@@ -53,20 +52,26 @@ Some applications only support opening in a tabbed view.
## Search within Olares
You can quickly call out global search using one of the following methods:
You can quickly open global search using one of the following methods:
* Press the keyboard shortcut: `Shift + Space`
* Click the "Search" icon in the Dock.
- Press the keyboard shortcut: `Shift + Space`
- Click the <i class="material-symbols-outlined">search</i> icon in the Dock.
Global search can find applications, files, and other supported search targets.
| Search target | Supported actions |
|:--------------------------------------------|:----------------------------------------------------------|
| Installed Applications | Open the application directly. |
| Documents directory in File Manager Storage | Search by filename or full-text content. |
| Other directories in File Manager Storage | Search by filename only. |
| File Manager Synced Drive | Search by filename only. |
| Wise Reader Content | Search full-text content of RSS feeds, web pages, & PDFs. |
| **More** | |
| Settings | Adjust Olares appearance. |
| Applications | Install, uninstall, or update applications. |
| Supported search target | Supported search capability |
|:--|:--|
| Applications (built-in and installed) | Search by application name and open the app directly.|
| Directories enabled for full-text search | Search files by filename and by text content inside <br>supported documents. |
| Other directories in File manager storage | Search files by filename only. |
| Team shared files | Search shared files by filename only. |
| File manager synced drive | Search synced files by filename only. |
| Wise reader content | Search RSS feeds, web pages, and PDFs by name. |
### Configure file search rules
By default, global search searches files by filename only.
To improve search efficiency or enable searching file contents, go to **Settings** > **Search** > **File Search** to configure full-text search and exclusion rules.
For details, see [Configure file search](/manual/olares/settings/search.md).

View File

@@ -1,8 +1,9 @@
---
outline: [2, 3]
description: Learn essential file operations in Olares including adding new files, editing existing content, and downloading files across different devices.
---
# Basic file operations
Operations in Fileare essentially the same as in other file managers. This page will introduce some common tasks in Files to get you started.
Operations in Files are essentially the same as in other file managers. This page will introduce some common tasks in Files to get you started.
## Upload files
@@ -72,16 +73,28 @@ When downloading multiple files, the behavior differs between the Files in Olare
3. Select the save location in the popup window.
## Preview and edit files
Double-click a file to open its preview. The Files app supports previewing the following file formats:
* **Images**: JPG, JPEG, PNG, BMP, WEBP, SVG
* **Videos**: MP4, MKV, AVI, MOV, MPEG, MTS, TS, WMV, WEBM, RM, 3GP
* **Audio**: MP3, WMA, WAV, OGG, AAC, M4A, APE, FLAC
* **Text**: PDF, TXT, JS, CSS, XML, YAML, HTML
### Supported formats
The Files app also supports editing the following text formats: TXT, JS, CSS, XML, YAML, HTML.
The Files app supports the following file formats for previewing and editing:
- Preview:
* Images: JPG, JPEG, PNG, BMP, WEBP, SVG
* Videos: MP4, MKV, MOV, MPEG, MTS, WMV, WEBM, RM, 3GP
* Audio: MP3, WMA, WAV, OGG, AAC, M4A, APE, FLAC
* Text: PDF, TXT, JS, CSS, XML, YAML, HTML
- Edit:
* TXT, JS, CSS, XML, YAML, HTML
### Procedure
- To preview a file, double-click the target file.
- To edit a file:
1. Double-click a supported text file.
2. Click <i class="material-symbols-outlined">edit_square</i> in the top-right corner.
3. Modify the content, and then save your changes by clicking <i class="material-symbols-outlined">save</i>.
![Preview](/images/manual/olares/files-preview.png#bordered)
![Preview](/images/manual/olares/files-preview.png#bordered)
## Search files
You can easily find files in the Files app using desktop search.
:::tip

View File

@@ -10,15 +10,18 @@ Olares's built-in Files app offers users a secure and efficient solution for fil
* **Centralized storage**: Simplifies information retrieval and integration, making it easier to access, manage, and update your data, whether personal documents or team-shared materials.
## Understand the interface
The interface is similar to Windows Explorer or macOS Finder, allowing you to organize and access documents, images, videos, or any other files you own.
![Files](/images/manual/olares/files.png#bordered)
![Files](/images/manual/olares/files-index.png#bordered)
It consists of three main components:
It mainly consists of the following components:
* **Drive**: Stores personal files that dont require constant synchronization or frequent edits. Each user has a Home directory with default folders such as Documents, Pictures, Videos, and Downloads. External storage (e.g., USB drives or SMB shares) appears under External.
* **Sync**: A library-based high-efficiency storage area providing file synchronization services. You can create multiple independent libraries, each serving as a separate file entry point (similar to an independent cloud drive). Ideal for storing files and data requiring frequent modifications, real-time cross-device synchronization, or team collaboration.
* **Application**: Reserved for application-specific data. Primarily for development and debugging, not general file storage.
* **Cloud storage**: Connected through [Integrations](../../larepass/integrations.md), including Google Drive, AWS S3, and Tencent Cloud Object Storage (COS). These allow you to link, access, and manage remote files directly from Olares.
* **Share**: The centralized hub for managing all shared folders, including Internal shares, SMB shares, and Public shares, allowing you to monitor sharing status, adjust permissions, or cancel shares in one place.
---
<div>

View File

@@ -0,0 +1,146 @@
---
outline: [2, 3]
description: A comprehensive guide to sharing files in Olares using Internal, Public, and SMB methods. Learn how to configure access permissions, manage shared content, and facilitate secure collaboration within your team or via LAN.
---
# Share files
This feature supports sharing folders with internal members or external users through different methods. You can flexibly set access permissions, passwords, and expiration dates, and manage or cancel these shares at any time.
## Share types and support scope
Currently, file sharing is only supported at the **folder** level. Supported sharing types vary depending on the directory location of the folder. Refer to the following table for details:
| Directory type | Public share | Internal share | SMB share |
| :--- | :---: | :---: | :---: |
| **Home** | Supported | Supported | Supported |
| **External** | - | Supported | Supported |
| **Sync** | - | Supported | - |
| **Data** | Supported | Supported | Supported |
| **Cache** | - | Supported | Supported |
Where,
- **Public share**: Generates an access link with password protection supported, suitable for external sharing.
- **Internal share**: Restricted to members within the same Olares cluster, suitable for internal team collaboration. For more information, see [Manage your team](../settings/manage-team.md).
- **SMB share**: Shared via the SMB protocol within the Local Area Network (LAN).
![Share file type](/images/manual/olares/share-files.png#bordered)
## User permissions
You can assign specific permissions to members in **Internal share** and **SMB share** to control their level of access and allowed operations.
| Permission | Description |
| :--- | :--- |
| **Admin** | The user has the full access, including:<ul><li>Add, view, edit, and delete files.</li><li>Invite and remove members.</li> <li>Modify share settings.</li></ul> |
| **Edit** | The user can add, view, modify, and delete files. |
| **View** | The user can only open, view, and download files. They cannot upload, modify, or <br>delete any content. |
## Create share
### Create Internal share
1. Right-click the target folderand then click **Internal share**.
2. In the **Invite users** section, click <i class="material-symbols-outlined">add</i>, search for and select the target user or group, and then click **Invite**.
![Invite users for Internal Share](/images/manual/olares/internal-share-invite.png#bordered){width=60%}
3. In the **Set user permissions** list, click <i class="material-symbols-outlined">chevron_forward</i> to the right of the user avatar to assign specific permissions, and then click **Submit**.
4. Click **Confirm**.
### Create SMB share
SMB sharing utilizes a dedicated local Linux account system. The SMB accounts generated within this system are independent of Olares members, strictly for LAN file access.
1. Right-click the target folder, and then click **SMB share**.
2. Select whether to make it **Public**.
- If you selected **Yes**, click **Confirm**, and then it will be accessible to anyone on the LAN.
- If you selected **No**, authentication is required. You must select or create a dedicated SMB account by using Step3 or Step4.
3. Select an existing SMB account to authorize.
a. In the **Invite users** field, click <i class="material-symbols-outlined">add</i>.
![Invite existing users for SMB Share](/images/manual/olares/smb-share-invite.png#bordered){width=60%}
b. Search for the SMB account, select it, and then click **Invite**.
c. In the **Set user permissions** list, click <i class="material-symbols-outlined">chevron_forward</i> to the right of the user avatar to assign specific permissions, and then click **Submit**.
d. Click **Confirm**.
4. Create a new SMB account to authorize.
a. To the right of **Invite users**, click **Add user accounts**.
![Create new users for SMB Share](/images/manual/olares/smb-share-new-usr.png#bordered){width=60%}
b. Enter a unique user name.
c. In the **Set password** field, a secure system-generated password is provided by default. You can also manually enter a new password or click **Regenerate** to create a new random one.
d. Click **Confirm**. The system will automatically generate this account for you.
e. In the **Invite users** field, click <i class="material-symbols-outlined">add</i>.
f. Search for the newly created account, select it, and then click **Invite**.
g. In the **Set user permissions** list, click <i class="material-symbols-outlined">chevron_forward</i> to the right of the user avatar to assign specific permissions, and then click **Submit**.
h. Click **Confirm**.
### Create Public share
1. Right-click the target folder, and then click **Public share**.
![Public share settings](/images/manual/olares/public-share-settings.png#bordered){width=56%}
2. In the **Set password** field, a secure system-generated password is provided by default. You can also manually enter a new password or click **Regenerate** to create a new random one.
3. In the **Set expiration** region, select the specific expiration time for the share link.
4. Select the following restrictions as needed:
- **Limit file size**: To limit the size of files uploaded by visitors, select this checkbox, enter a value, and then select the unit (Mi/Gi/Ti).
- **Allow uploads only**: If you select this checkbox, visitors can only upload files and cannot view or download existing content.
5. Click **Confirm** to generate the link.
6. Copy or note down the link address, and then click **Confirm**.
## Manage shares
You can view and manage all shared folders in the **Share** list.
### View share list and attributes
1. Open the Files application from the Dock or Launchpad on Olares.
2. Click **Share** in the left sidebar.
2. You can view the list of all currently shared folders on the right.
3. If you want to view the details of a specific folder, right-click the target folder and click **Attributes**.
You will see the sharer, current path, original path, share scope, owner, current permissions, expiration date, and link details.
### Modify password or permissions
For shared folders, you can change their password and permission settings at any time.
1. Open the Files application from the Dock or Launchpad on Olares.
2. Click **Share** in the left sidebar to view the **Share** list on the right.
3. To reset password (**Public share** only):
a. Right-click the folder and select **Reset Password**.
b. Enter a new password or click **Regenerate**.
c. Click **Confirm**.
4. To edit permissions (**Internal share** and **SMB share** only):
a. Right-click the folder and select **Edit permissions**.
b. Add or remove users, or modify permissions for existing users.
c. Click **Confirm**.
### Cancel share
If you no longer need to share a folder, you can cancel the share at any time.
1. Open the Files application from the Dock or Launchpad on Olares.
2. Click **Share** in the left sidebar, and then to the **Share** list is displayed on the right.
3. Right-click the target folder and click **Revoke sharing**.
4. Click **Confirm**.

View File

@@ -0,0 +1,20 @@
---
outline: [2, 3]
description: Guide to synchronizing files between your local devices and Olares. Learn how to set up two-way sync tasks, manage sync status, and ensure seamless data access across all your platforms.
---
# Sync files to local computer
<!--@include: ../../get-started/reusables.md{69,73}-->
## Create a library
<!--@include: ../../get-started/reusables.md{77,85}-->
## Enable synchronization
<!--@include: ../../get-started/reusables.md{89,98}-->
## Manage synchronization
<!--@include: ../../get-started/reusables.md{102,108}-->

View File

@@ -13,7 +13,7 @@ Explore the following guides to get the most out of Olaress built-in apps:
[**Navigate and customize your Desktop**](./desktop.md): Launch apps, organize your workspace, and search across Olares.
[**Install and manage apps with Market**](./market.md): Discover, install, update, or remove apps and recommendation algorithms from an open permisionless application store.
[**Install and manage apps with Market**](./market/market.md): Discover, install, update, remove, and clone apps, as well as purchase and restore paid applications.
[**Store, sync, and access Files**](./files/): Upload, download, organize, and share files securely across devices with centralized storage and real-time synchronization.

View File

@@ -0,0 +1,43 @@
---
outline: [2, 3]
description: Learn how to use the Clone feature in Olares to run multiple instances of the same application with independent configurations.
---
# Clone applications
You can install multiple instances of the same application, which is also known as "clone". This is useful for scenarios requiring different configurations or versions, such as running multiple Windows virtual machines.
## Clone an application
The following steps demonstrate the cloning workflow by using the Windows application as an example.
### Step 1. Verify cloning support
Confirm that the target application supports cloning:
1. Open **Market** from Dock or Launchpad, and click the application to open the details page.
2. Check the **Required permissions** section. Only applications with the **Multiple Instances** property support cloning.
![Clone applications support](/images/manual/olares/clone-apps-support.png#bordered)
### Step 2. Clone and configure the instance
To create a clone, a primary instance must exist on your system. Ensure that the application is installed, and then complete the following steps:
1. Click **My Olares** from the left sidebar of **Market**. The list of installed applications will appear on the right.
2. Locate the target application, click the drop-down arrow next to the **Open** button, and then click **Clone**.
![Clone applications](/images/manual/olares/clone-apps.png#bordered)
3. In the **Clone app** window, configure the instance details:
a. **New app title**: Enter a unique name to identify the application in the **Market** and **My Olares** list.
b. **Desktop shortcut name**: Set the name for the desktop shortcut. You can name each icon individually if the application has multiple entry points.
4. Click **Confirm** to proceed.
5. In the **Configure Environment Variables** window, complete the corresponding setup, and then click **Confirm**.
In the installed applications list, the newly created application will appear with a "Clone" tag next to it.
![Clone applications result](/images/manual/olares/clone-apps-result.png#bordered)

View File

@@ -14,40 +14,42 @@ Before you start, it is recommended to familiarize yourself with a few concepts
| Terminology | Description |
|-----------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| [System application](../../developer/concepts/application.md#system-applications) | Built-in applications that come pre-installed with Olares,<br/> such as Profile, Files, and Vault. |
| [Community application](../../developer/concepts/application.md#community-applications) | Applications that are created and maintained by third-party<br/> developers. |
| [Shared application](../../developer/concepts/application.md#cluster-scoped-applications) | A special category of community applications on Olares<br/> designed to provide unified, shared resources or services to all <br/>users within an Olares cluster. Only one <br/>instance is allowed per cluster. |
| [Reference application](../../developer/concepts/application.md#reference-applications) | The applications that have been granted access to specific<br/> shared applications |
| [Dependencies](../../developer/concepts/application.md#dependencies) | Prerequisite applications that must already be<br/> installed before a user can access an application <br/>that requires them. |
| [System application](../../../developer/concepts/application.md#system-applications) | Built-in applications that come pre-installed with Olares,<br/> such as Profile, Files, and Vault. [](../../../developer/concepts/) |
| [Community application](../../../developer/concepts/application.md#community-applications) | Applications that are created and maintained by third-party<br/> developers. |
| [Shared application](../../../developer/concepts/application.md#cluster-scoped-applications) | A special category of community applications on Olares<br/> designed to provide unified, shared resources or services to all <br/>users within an Olares cluster. Only one <br/>instance is allowed per cluster. |
| [Reference application](../../../developer/concepts/application.md#reference-applications) | The applications that have been granted access to specific<br/> shared applications |
| [Dependencies](../../../developer/concepts/application.md#dependencies) | Prerequisite applications that must already be<br/> installed before a user can access an application <br/>that requires them. |
## Find applications
The Olares Market offers various ways to discover and browse applications.
![Market](/images/manual/olares/market-discover.png#bordered)
![Market](/images/manual/olares/market-discover1.png#bordered)
### Browse by categories
On **Discover** page:
* **Featured Applications**: Curated by the editorial team, showcasing trending and seasonally relevant apps.
Upon launching the Market app, the **Discover** page serves as your central hub for exploration, organizing content into intuitive sections to guide your journey:
* **Discover Amazing Apps**: Featured applications curated by the editorial team, showcasing trending and seasonally relevant apps. Click these banners to access in-depth editorial features such as comprehensive guides, industry use cases, and detailed app comparisons to help you choose the right tools.
* **Community choices**: Most loved and recommended apps by the Olares community.
* **Top apps**: Apps with the highest usage and download rates.
* **Latest apps**: Recently added applications to the market.
* **Top apps on Olares**: Apps with the highest usage and download rates.
* **Latest apps on Olares**: Recently added applications to the market.
You can also browse applications based on their functionality:
* **Creativity**: Apps for creating and publishing digital content, from AI-generated art and 3D models to blogs and design projects.
* **Productivity**: Apps for team collaboration, project management, data organization, and building custom AI-powered agents.
* **Developer Tools**: Toolchain for the software development lifecycle, including code hosting, CI/CD, observability, and database management.
* **Fun**: Self-hosted applications for entertainment and fun such as gaming, video streaming, and connecting with people.
* **Lifestyle**: Self-hosted applications for managing your smart home, personal photo libraries, and AI identity.
* **Fun**: Selfhosted applications for entertainment and fun such as gaming, video streaming, and connecting with people.
* **Utilities**: Tools for system management, file sharing, data backup, and running local AI models.
* **Developer Tools** Toolchain for the software development lifecycle, including code hosting, CI/CD, observability, and database management.
* **AI**: Latest open-source LLMs and generative tools for text, audio, and 3D assets.
### Search using keywords
To search an app in the market:
1. Open the Market app from the Dock or Launchpad.
2. In the **Manage** sub-memu on the left, click **Search**.
2. In the **Manage** submenu on the left, click **Search**.
2. Enter the keywords. The relevant results will appear as you type.
![Search app](/images/manual/olares/search-app.png#bordered)
@@ -63,7 +65,7 @@ You can switch market sources to speed up browsing, searching, and downloading,
3. Fill in the source name, URL, and description as required, then click **Confirm** to finish adding.
4. In the source list, select the target source to activate it. Wait for about 10 minutes for the store page to switch.
::: tip Note
:::info
Applications from different installation sources will generate corresponding tabs in **My Olares** for easier application management.
:::
@@ -73,8 +75,8 @@ To install an application from Market:
1. Open Market from Dock or Launchpad.
2. Navigate to the app you want, and click **Get**.
3. When the operation button changes to "**Install**", click it to start the installation.
4. Once finished, the button will change to "**Open**".
3. When the operation button changes to **Install**, click it to start the installation.
4. Once finished, the button will change to **Open**.
:::tip
To cancel an installation, hover over the operation button and click **Cancel** when it appears.
@@ -157,7 +159,7 @@ The application operation log details the processes and statuses of app operatio
You can also click the <i class="material-symbols-outlined">download</i> button to download the logs.
## FAQ
## FAQs
### Why can't I install an application?
If you can't install an application, it might be due to:
@@ -165,3 +167,34 @@ If you can't install an application, it might be due to:
* **Missing dependencies**: Check the **Dependency** section on the application details page and make sure all required apps are installed.
* **Incompatible system version**: Try upgrading Olares to the latest version.
* **Shared application restrictions** (for Olares member): Install the reference app, and contact your Olares admin to install the corresponding shared application.
### Why can't I resume my application?
When you try to resume an application in Olares and receive an error message about insufficient CPU, memory, or disk, it means the system's current available resources cannot support running the application. You need to close other applications to free up resources.
#### Why was my application stopped?
An application is usually stopped due to one of the following reasons:
* **System auto stop**: To ensure Olares's stability, the Olares system monitors resource usage. If an application consumes excessive resources (such as CPU or memory) causing a high system load, the system might automatically pause it to prevent the entire device from freezing or crashing.
* **Manual stop**: You or an administrator might have manually stopped the application previously, and the application has not been resumed yet.
#### Why can't I resume my application now?
Starting an application requires reserving a specific amount of computing resources. If other running applications are already occupying most of the resources, the remaining free resources are not enough for the application you want to start.
Therefore, when you try to resume the application, you might encounter the following messages:
| Error message | Description |
| :--- | :--- |
| Insufficient system CPU/memory | The physical resources of the entire system are nearly exhausted. |
| Insufficient disk space | The hard drive is full, and new data cannot be written. |
| Available CPU/memory insufficient | There are some resources left, they are less than the minimum<br> amount required by this specific application. |
#### How to resume my application?
To resume your application, you need to free up some occupied resources:
1. Go to **Settings** > **Application** to view the applications that are currently **Running**.
2. Find applications that you do not need to use right now.
3. Stop each application by clicking the app and clicking <i class="material-symbols-outlined">toggle_on</i> to toggle off **Running**.
4. After resources are freed, go back to your target application and click **Resume** again.

View File

@@ -0,0 +1,97 @@
---
outline: [2, 3]
description: Learn how to purchase paid applications on Olares Market and restore previously purchased applications.
---
# Manage paid applications
You can purchase paid applications directly from the Olares Market, or restore your previously purchased apps without additional payment.
## Purchase paid applications
You can purchase paid applications directly from the Olares Market. The payment process requires coordination between the Olares system, the LarePass mobile app, and a digital wallet such as MetaMask.
### Prerequisites
Before you begin, ensure that you have completed the following tasks:
- You have installed and logged into a browser wallet extension, such as MetaMask. To successfully complete the transaction, ensure that your wallet holds both of the following funds:
- Application fee: Used to pay for the software license. The specific token required is determined by the app's `price.yaml` configuration, typically USDC or USDT.
- Network gas fee: Used to pay for blockchain transaction costs. Note that gas fees must be paid in ETH.
- You have installed the LarePass app on your phone and logged into the same account as your Olares system.
### Step 1: Initiate purchase and identity verification
1. Open the Olares Market.
2. Search for the target paid app, click **Get**, and then click **Buy**.
3. In the **Verify payment access** popup, click **Verify now**.
4. Open your LarePass mobile app:
a. Review the request popup titled **Authorize payment access**.
b. Tap **Confirm**.
c. If the popup does not appear, return to the app page in Olares Market and click **Buy** again to re-initiate the request.
![Authorize payment access](/images/manual/olares/authorize-pay.png#bordered)
### Step 2: Confirm order
1. After successful verification, return to the app page in Olares Market and click **Buy** again.
2. In the **Verify purchase request** popup, click **Verify now**.
3. Check your LarePass mobile app again:
a. Review the request popup titled **Authorize purchase**.
b. Tap **Confirm**.
![Authorize purchase](/images/manual/olares/authorize-purchase.png#bordered)
### Step 3: Complete payment via wallet
1. Return to the app page in Olares Market and click **Pay**.
2. The browser will automatically open **MetaMask** or your connected wallet extension.
3. Review the amount in the wallet popup, and then confirm and approve the transaction.
4. Wait for the blockchain to confirm the transaction.
5. Once the payment is successfully completed, click **Install** to install the application.
6. After the payment is completed, navigate to **Settings** > **Safety** > **VC cards** to verify your purchase credential from your LarePass mobile app.
![Authorize purchase](/images/manual/olares/vc.png#bordered)
## Restore purchased applications
If you have previously purchased a paid application, you can restore and re-install it without additional payment, whether you simply uninstalled the app, reset your system, or migrated to a new Olares host.
### Re-install after uninstallation
If you are re-installing a paid app that was uninstalled from your current Olares system, the system preserves your license locally.
You can find the app in the Market, click **Get**, and then click **Install** to re-install it.
### Restore after system reset or migration
:::info Identity binding
Your purchase history binds to your Olares ID rather than specific hardware. If you have access to LarePass or a backup of your mnemonic phrase, you can activate the new system with the same Olares ID and restore your apps.
:::
:::warning Risk of data loss
If you lose your mnemonic phrase, you permanently lose your digital identity and all paid apps. In this case, you must create a new account and repurchase the application.
Note that license restoration also requires the developer's service to be online. If their service is unavailable, you might be unable to restore the application.
:::
If you have reset Olares OS or switched to new hardware, your local license data is cleared. You must verify your on-chain identity to retrieve your purchase rights, which will allow you to re-install the application.
1. Ensure that the current Olares OS is activated with the same **Olares ID** used for the original purchase.
2. Open the Olares Market.
3. Search for the target paid app, click **Get**, and then click **Buy**.
:::info
The system will detect your on-chain purchase record and will not charge you again.
:::
4. In the **Authorize payment access** popup, click **Verify now**.
:::info
This step verifies your identity ownership and does not initiate a new transaction.
:::
5. Once verified, the button will change to **Install**. Click it to start installation.

View File

@@ -4,107 +4,127 @@ description: Manage and optimize GPU resources in Olares with centralized contro
---
# Manage GPU usage
:::info
Only Olares admin can configure GPU usage mode. This ensures optimal resource management across the system and prevents conflicts between users' resource needs.
Only Olares admins can change GPU modes. This helps avoid conflicts and keeps GPU performance predictable for everyone.
:::
Olares allows you to harness the full power of your GPUs to accelerate demanding tasks such as large language models, image and video generation, and gaming. Whether your GPUs are on a single node or spread across multiple nodes, you can manage them conveniently from one centralized interface.
Olares lets you manage your graphics cards, or GPUs, to speed up tasks like AI, image and video generation, and gaming. You can control how your applications use these resources from Olares Settings page.
This guide helps you understand and configure GPU allocation modes to maximize hardware performance.
This guide explains:
- How to choose the right GPU mode.
- How to configure GPU modes step by step.
::: tip GPU support
Olares supports **only Nvidia GPUs** of **Turing architecture or later** (Turing, Ampere, Ada Lovelace, and Blackwell).
## Choose the right GPU mode
- Quick check: GTX/RTX **16 series and newer** consumer cards are supported.
- For other models, cross-check with the [compatible GPU table](https://github.com/NVIDIA/open-gpu-kernel-modules?tab=readme-ov-file#compatible-gpus).
- Other models: Cross-check with the [compatible GPU table](https://github.com/NVIDIA/open-gpu-kernel-modules?tab=readme-ov-file#compatible-gpus).
- Unknown model: Run `lspci | grep -i nvidia` to query the GPU architecture code and determine compatibility.
:::
Use the table below to pick a mode based on your workload.
:::warning AI Performance
Even if your GPU architecture is supported, **low VRAM capacity may cause AI applications to fail**. Ensure your GPU has enough memory for your workloads.
:::
## Understand GPU allocation modes
Olares supports three GPU allocation modes. Choosing the right mode helps optimize performance based on your needs.
### Time Slicing
In this mode, a GPU can be bound to multiple applications and rotates execution in time slices.
* At any instant, only one application uses all available compute and VRAM of the GPU.
* Other apps enter a wait queue; Their VRAM contents (e.g., CUDA context, etc.) may be temporarily swapped out to system memory.
:::info Default GPU allocation
By default, GPUs run in time-slicing mode. Applications without allocated GPU resources automatically join the time-sliced GPU queue. If no time-sliced GPU is available, the application pauses after a startup timeout. In this case, you need to allocate a GPU (for example, set a GPU to time-slicing mode, or assign a VRAM quota to the application), then manually resume the application.
:::
### App Exclusive
In this mode, the entire GPU is allocated to a single application.
* During execution, the app can use all compute and VRAM of the bound GPU.
* No cross-app contention or scheduling overhead so that best performance is guaranteed.
### Memory Slicing
In this mode, VRAM of the GPU is partitioned into fixed quotas for multiple designated applications.
* Users need to manually set a quota for each app.
* The sum of quotas must not exceed physical VRAM of the bound GPU. Oversubscription is not supported.
* Apps with quota assigned can run concurrently, each limited to its own quota.
:::tip Multi-GPU allocation
- All three allcation modes support assigning multiple GPUs to the same application. Olares only assigns multiple GPUs to the applications container without fusing VRAM or compute in any way. Whether multi-GPU is utilized depends on the application/framework itself.
- In multi-node environments, you can't assign multiple GPUs across nodes to the same application simultaneously.
:::
| GPU mode | Definition | Use scenario |
| :--- | :--- | :--- |
| **Time slicing** (Default) | Multiple apps share one GPU<br> by taking turns using compute<br> and VRAM. | General workloads that run several lightweight apps. |
| **App exclusive** | One app gets full, uninterrupted<br> access to the compute and VRAM<br> of a single GPU. | Heavy workloads that require maximum stability, such as LLMs and highend gaming. |
| **Memory slicing** | The GPU's VRAM is divided into<br> fixed quotas, and apps run concurrently<br> within their limits. | Running specific apps simultaneously while strictly limiting their memory usage. |
## View GPU status
To view your GPU status:
To see your GPUs and their current configuration:
1. Navigate to **Settings** > **GPU**. The GPU list shows each GPUs model, associated node, total VRAM, and current GPU mode.
2. Click on a specific GPU to visit its details.
1. Go to **Settings** > **GPU**.
2. Review the list to see each GPU's model, node, total VRAM, and current mode.
![GPU overview](/images/manual/olares/gpu-overview.png#bordered)
3. Click a GPU to open its details page.
![GPU overview](/images/manual/olares/gpu-overview.png#bordered)
::: tip Note
If your Olares only has one GPU, navigating to the GPU section will take you directly to the GPU details page.
:::tip
If you have only one GPU, Olares may open the GPU details page directly.
:::
## Configure GPU mode
On the **GPU details** page, select your desired mode from the **GPU mode** dropdown. Depending on your selected mode, different follow-up options apply.
Follow these steps to change how a GPU is used:
* **Time Slicing**
1. Select this mode from the GPU mode dropdown.
2. In the **Pin application** section, click **+Add an application** to manually pin an application to this specific GPU in a multi-GPU setup.
1. Go to **Settings** > **GPU**.
2. Click the GPU you want to configure.
3. Choose a mode from the **GPU mode** dropdown.
![Time slicing](/images/manual/olares/gpu-time-slicing.png#bordered)
:::warning Restart notice
Changing a GPU's mode will unbind apps from that GPU and restart their containers.
:::tip Note
No manual binding is required if you only have one GPU in your cluster.
:::
* **App Exclusive**
1. Select this mode from the GPU mode dropdown.
2. In the **Select exclusive app** dropbox, choose your target application.
3. Click **Confirm**.
![App exclusive](/images/manual/olares/gpu-app-exclusive.png#bordered)
* **Memory Slicing**
1. Select this mode from the dropdown.
2. In the **Allocate VRAM** section, click **Add an application**.
3. Select your target application and assign it a specific amount of VRAM in GB.
4. Repeat for other applications and click **Confirm**.
![VRAM slicing](/images/manual/olares/gpu-memory-slicing.png#bordered)
:::tip Unbinding
- After binding an GPU or its VRAM to an application, you can manually unbind it under the corresponding GPU mode to release GPU resources.
- When you switch a GPUs allocation mode, all applications allocated under that mode are unbound, and the application containers will restart.
After restart, apps without specific GPU bindings are automatically scheduled to any available GPU in Time slicing mode.
:::
### Time slicing
**Time slicing** is the default mode in Olares. Use this mode to allow multiple applications to share resources.
Apps without a specific GPU binding are automatically scheduled onto GPUs in **Time slicing** mode.
![Time slicing](/images/manual/olares/gpu-time-slicing.png#bordered)
#### Bind app
To assign an app to this GPU:
1. In **Pin application** section, click **Bind App**.
2. Choose your target application and click **Confirm**.
#### Switch GPU
:::info Same-node limitation
An application can use multiple GPUs only if they are located on the same node. If you switch an app to a GPU on a different node, the app is moved and bound only to the target GPU.
:::
If your system has more than one GPU, you can move an assigned app to a different GPU:
1. In **Pin application** section, find the app you want to move.
2. Click <i class="material-symbols-outlined">repeat</i>, then choose the target GPU and click **Confirm**.
#### Unbind app
To remove an app from this GPU:
1. In **Pin application** section, find the app you want to remove.
2. Click <i class="material-symbols-outlined">link_off</i>, then **Confirm**.
### App exclusive
Use **App exclusive** mode to dedicate a GPU entirely to one high-demand application.
![App exclusive](/images/manual/olares/gpu-app-exclusive.png#bordered)
#### Bind app
To give an app exclusive access:
1. In **Select exclusive app** section, click **Bind App**.
2. Select your target application and click **Confirm**.
#### Switch app
To replace the current exclusive app with a new one:
1. In **Select exclusive app** section, click **Switch App**.
2. Choose the new application and confirm.
The previous app is unbound, and the new app takes over exclusive access.
#### Switch GPU
If your system has more than one GPU, you can move the exclusive app to a different GPU:
1. In **Select exclusive app** section, click <i class="material-symbols-outlined">repeat</i>.
2. Choose the target GPU and confirm.
:::info Same-node limitation
An application can use multiple GPUs only if they are located on the same node. If you switch an app to a GPU on a different node, the app is moved and bound only to the target GPU.
:::
#### Unbind app
To remove the exclusive binding:
1. In **Select exclusive app** section, click <i class="material-symbols-outlined">link_off</i>.
2. Click **Confirm**.
### Memory slicing
Use **Memory slicing** to run apps concurrently with strict VRAM limits.
![Memory slicing](/images/manual/olares/gpu-memory-slicing.png#bordered)
#### Bind app and allocate VRAM
1. In **Allocate VRAM** section, click **Bind App**.
2. Select your target application, assign it a specific amount of VRAM in GB, and click **Confirm**.
:::warning
The total of all VRAM limits must not exceed the GPU total VRAM.
:::
3. Repeat for other apps as needed.
## Learn more
- [Monitor GPU usage in Olares](../resources-usage.md)

View File

@@ -14,6 +14,7 @@ Settings is organized into the following sections:
- Manage integrations Connect Olares to external web services and tools.
- Customize appearance Set system language and background preferences.
- Configure network Set up FRP, VPN, and edit the hosts file.
- Configure search - Configure indexing rules to optimize your search experience.
- Backup and restore Create and manage backup and restore tasks for selected directories.
- Update system View system details and install updates.
- Export system log Generate and export system logs for diagnostics.

View File

@@ -0,0 +1,77 @@
---
outline: [2,3]
description: Configure file indexing in Olares to control search scope, manage exclusions, and enable full-text search for specific directories.
---
# Configure file search
File search settings allow you to customize how Olares indexes and searches your data. By defining specific rules, you can control which files are excluded from global search and which directories support deep content searching.
This guide helps you understand and configure indexing rules to optimize your search experience.
See also [Search within Olares](/manual/olares/desktop.md#search-within-olares) for how to use global search.
:::tip Search scope
These settings apply only to your own files in Olares.
Files or folders shared with you by other team members are searchable globally by default and do not need to be manually added to these rules.
:::
## Understand search settings
Olares file search is configured in **File search**, which contains three main sections:
- **Search index**: Shows the current indexing status and lets you manually rebuild the index when needed.
- **Excluded files**: Acts as a global ignore list for the search engine, defining which files are excluded from the index.
- **Full-text search directories**: Lists the folders where content search is enabled, so files are searchable by both filename and text content.
![File search](/images/manual/olares/file-search.png#bordered)
## View search index status
To view the current search indexing status:
1. Open Settings from the Launchpad.
2. Go to **Search** > **File search**.
3. Locate the Search Index section at the top of the panel.
If you need changes reflected immediately, click **Rebuild**.
## Exclude files from search
Use the Excluded files section if certain files, such as logs or temporary files, clutter your search results.
You exclude them by adding exclusion rules. Each rule uses a regex pattern to specify the file paths you want Olares to ignore.
### Add a rule
1. Under Excluded files, click **Add pattern**.
2. Enter a valid regular expression (regex) to match the files you wish to ignore.
3. Click **Confirm**.
### Remove a rule
1. Under Excluded files, locate the target rule.
2. Click the <i class="material-symbols-outlined">delete</i> icon next to the pattern.
3. In the prompt window, click **Confirm**.
:::warning Regex patterns
If you are not familiar with regular expressions, start with simple patterns and test them carefully. Incorrect patterns may cause important files to disappear from search results
:::
## Search inside file content
Use the Full-text search directories section when you want to search inside documents, not just by filename.
By adding a folder to the full-text directory list, you enable full-text search. Once added, supported files in that folder become searchable by both filename and content.
### Add a rule
1. Under Full-text search directories, click **Add directory**.
2. Select the target folder from the file picker.
3. Click **Confirm** to add it to the list.
### Remove a rule
1. Under Full-text search directories, locate the target directory.
2. Click the <i class="material-symbols-outlined">delete</i> icon next to the directory.
3. In the prompt window, click **Confirm**.
:::tip Supported formats
Full-text search is supported for the following file types:<br> `.pdf`, `.doc`, `.docx`, `.csv`, `.rtf`, `.txt`, `.md`, `.json`, `.xml`.
:::

View File

@@ -4,83 +4,144 @@ description: Get started with Wise in Olares. Learn to collect content, organize
---
# Wise basics
Wise helps you curate and organize your reading materials with flexible options for collecting, reading, and managing content. This page covers the essential tasks to get you started with Wise.
Wise helps you build a focused reading workflow on top of your personal information hub. This page walks you through the core actions you'll use every day: collecting content, organizing what to read next, and capturing your own insights.
## Add content to your library
Save interesting content using any of these methods.
This page focuses on saving and working with individual items. For a deeper look at feeds and subscriptions, see [Subscribe and manage feeds](./subscribe).
### Add to Inbox or Read Later
Organize your reading flow with two collections:
* **Inbox**: Your primary collection for content you want to read soon.
* **Read Later**: Your backlog for content to revisit in the future.
## Before you begin
While browsing the title or reading, click **<i class="material-symbols-outlined">inbox</i> Inbox** or **<i class="material-symbols-outlined">schedule</i> Read Later** to save content to either collection.
To unlock the full potential of Wise, it is recommended to install the following apps from Olares Market:
![Inbox or Read later](/images/manual/olares/inbox-read-later.png#bordered)
- **Rss Subscribe**: Use it to subscribe to RSS feeds directly while browsing web pages.
- **YT-DLP**: Use it to download audio and video from supported web pages into Wise.
### Manually add content
Wise supports various content types including videos, audio, PDFs, and eBooks:
:::tip
Wise works without these apps, but in-browser subscription and media download will be unavailable until you install them.
:::
1. Click <i class="material-symbols-outlined">add_circle</i> in the menu bar.
2. To add a web page, select **Web page**.
3. To add a downloadable link, select **Download link**.
4. To add a PDF or E-book (in EPUB format) from your local machine, select **Upload**.
5. To add an RSS feed, select **RSS**.
:::tip
To explore how you can leverage RSS subscription with Wise, see [Subscribe to an RSS feed](./subscribe).
:::
## Build your library
## Automatic download
Wise automatically creates download tasks for new audio or video content, saving media files to Olares for convenient offline access.
Wise pulls content into your library in two ways:
This feature:
- **Saved items:** Individual web pages, files, audio, and video that you capture manually. These items appear in your main **Inbox** and are automatically sorted into categories such as **Articles**.
- **Feeds:** Subscriptions to dynamic sources like websites, blogs, and podcasts. New updates appear under **Feeds**, where you can select specific entries to save to your library.
* Ensures your content is always available offline
* Prevents content loss if the original source becomes unavailable
* Provides quick access to your media files
### Save items
To view all your downloaded media files, go to <i class="material-symbols-outlined">settings</i> > **Transmission** > **Download**. This page shows a complete list of your downloads along with their details.
![Downloaded media files](/images/manual/olares/downloaded-media-files.png#bordered)
You can save individual items to Wise in three ways:
- Upload files
- Add items via link
- Save from browser with LarePass extension
You can click <i class="material-symbols-outlined">folder_open</i> to locate the target content in the Files app.
#### Upload files
## Organize your reading
Import files directly from your computer, including PDFs, EPUBs, audio, video, and other document types. Wise automatically places each supported format into the right content folder in your library.
### Use tags for organization
To create a structured content collection with tags:
1. Click <i class="material-symbols-outlined">add_circle</i> in the bottom-left menu bar, and select **Upload**.
2. Select one or more files from your local computer.
1. On the list page, click <i class="material-symbols-outlined" style="font-variation-settings: 'wght' 200;">sell</i> on the content card.
2. In the tag input box, select or create tags relevant to the current content.
#### Add items via link
![Tags](/images/manual/olares/tags.png#bordered)
Paste a URL to save articles, videos, or subscribe to feeds.
You can find and manage your tags in the page <i class="material-symbols-outlined">settings</i> > **Tags**.
::: tip Handle restricted content
If a link requires login or other access control, Wise may need cookies to fetch it correctly. To configure cookies for protected sites, see **[Manage cookies for Wise](./manage-cookies)**.
:::
### Capture insights with notes
1. While reading, click <i class="material-symbols-outlined" style="font-variation-settings: 'wght' 200;">right_panel_open</i> to open the **Info** panel.
2. Add your thoughts in the **Note** section.
3. Click **Save** to store your notes.
1. Click <i class="material-symbols-outlined">add_circle</i> in the bottom-left menu bar, and select **Add Link**.
2. Paste or type a URL.
You can edit or delete note later.
Wise analyzes the link and lists all actions available:
- **Save to library**: The content will be saved as an item in your library and added to **Inbox**.
- **Subscribe to RSS feed**: If Wise detects one or more RSS feeds for the site, they will be listed here. Select the feed you want to follow, and new items from that feed will be automatically [added to **Feeds**](./subscribe).
![Subscribe to RSS feed](/images/manual/olares/wise-add-link-subscribe.png#bordered){width=300}
- **Download file**: If Wise detects videos or other downloadable files on the page, this option will appear. Select the file you want to download to save it for offline access. **[YT-DLP](https://market.olares.com/app/market.olares/ytdlp)** is required.
![Download files](/images/manual/olares/wise-add-link-download.png#bordered){width=300}
![Notes](/images/manual/olares/notes.png#bordered)
Newly saved items will appear under their content type.
#### Save from browser with LarePass extension
You can also save content to Wise directly from your browser using the [LarePass extension](https://www.olares.com/larepass), without opening Wise first.
1. Open the LarePass browser extension and select the "Collect" icon.
2. Under **Save to library**, review the content detected on the current page.
3. Click <i class="material-symbols-outlined">box_add</i> next to the item you want to save.
![Save content via LarePass extension](/images/manual/olares/wise-larepass-add-to-lib.png#bordered)
Items saved via LarePass are added to your Wise library and appear in the main **Inbox** folder and under the appropriate content type.
### Monitor and manage media downloads
When you add new audio or video content, Wise automatically creates download tasks and save media files to Olares. This:
- Ensures your media is available offline.
- Protects your library if the original source is removed.
- Makes it faster to open and play items.
To manage all download tasks:
1. Go to **<i class="material-symbols-outlined">settings</i> Settings** > **Transmission** > **Download**.
2. Review the list of media downloads and their status.
3. You can:
- Click <i class="material-symbols-outlined">folder_open</i> to locate a downloaded file in Files.
- Click <i class="material-symbols-outlined">do_not_disturb_on</i> to remove it from the list.
## Use reading tools
Wise provides several tools to enhance your reading experience and help you keep track of what matters.
![Wise reading toolbar](/images/manual/olares/wise-reading-toolbar.png#bordered)
### Track reading progress
### Track your reading progress
Wise uses green dot indicators on article covers to help you track unread content. When you open an article, it's automatically marked as read.
![Wise unseen content](/images/manual/olares/wise-unseen-content.png#bordered){width=600}
While reading, you can manually toggle between **<i class="material-symbols-outlined">playlist_add_check</i>Seen** or **<i class="material-symbols-outlined">playlist_remove</i>Unseen** status in the toolbar to maintain your reading progress.
In the reader toolbar, you can manually toggle between **<i class="material-symbols-outlined">playlist_add_check</i>Seen** or **<i class="material-symbols-outlined">playlist_remove</i>Unseen** to maintain your reading progress.
### Search from Wise
<!--@include: ../tutorials/wise.reusables.md{4,13}-->
### Capture notes
You can add private notes to any content in your library:
1. While browsing, click <i class="material-symbols-outlined" style="font-variation-settings: 'wght' 200;">right_panel_open</i> to open the **Info** panel.
2. Type your thoughts in the **Note** section.
3. Click **Save**.
You can edit or delete notes from the same panel at any time.
## Use tags
Tags allow you to add flexible labels to your content for easy retrieval later.
1. On the list page, click <i class="material-symbols-outlined" style="font-variation-settings: 'wght' 200;">sell</i> on the content card to add tags to it.
2. Select an existing tag, or type a new name to create one.
![Tags](/images/manual/olares/wise-tags.png#bordered){width=600}
You can manage all your tags in **<i class="material-symbols-outlined">settings</i> Settings** > **Tags**.
::: tip
Tags become even more powerful when combined with filtered views. See [Organize your knowledge with filters](./filter) to build tag-based views such as "AI articles" or "Design inspiration".
:::
## Search your library
Once you've collected your content in Wise, you can search for particular content themes or entries using aggregated search in Olares.
1. Click <i class="material-symbols-outlined">search</i> in the Dock to open the search window.
2. Specify the search scope to Wise, and enter the keywords to search.
![Search in Wise](/images/manual/tutorials/wise-search.png#bordered)
## Customize appearance
## Change appearance
By default, Wise follows your system's light/dark theme settings. You can override this to set your preferred appearance:
1. Click the <i class="material-symbols-outlined">settings</i> in the bottom left corner and select **Preferences**
2. Under **Theme**, choose your preferred appearance:
1. Click the <i class="material-symbols-outlined">settings</i> in the bottom left corner and select **Preferences**.
2. Under **Theme**, choose your preferred system theme:
- Light mode
- Dark mode
## Learn more
- [Build your knowledge hub with Wise](../../best-practices/organize-content.md)
Your choice applies to the Wise interface and reader.

View File

@@ -1,58 +1,73 @@
---
outline: [2, 3]
description: Learn how to use Wise powerful filtering system to organize your library. Create tag-based views, add custom filtered views, and utilize advanced query parameters to manage your content effectively.
---
# Organize your knowledge with filters
# Organize your knowledge with filtered views
As your Wise library grows, staying organized can become challenging. With filtered views, you can easily sort and access content by applying filters based on parameters like tags, saved dates, authors, and more.
As your Wise library grows, finding specific content by browsing folders can become difficult. Filtered views allow you to group related content into dynamic "smart folders" based on rules you define, such as specific tags, content types, or dates.
This guide covers how to:
- Create filtered views from tags and subscribed feeds.
- Add custom filtered views using queries.
Unlike standard folders, these views update automatically. Once created, any new item that matches your criteria will instantly appear in the view without you having to move it manually.
:::info
Only entries from feeds or entries saved to **<i class="material-symbols-outlined">inbox</i> Inbox** or **<i class="material-symbols-outlined">schedule</i> Read Later** can be queried.
:::
## Use tags or feeds to filter entries
Filtered views allow you to organize your content by grouping entries based on tags or feeds. This helps you quickly access content related to specific topics or sources.
This guide explains how to:
- Build filtered views from existing tags and feeds.
- Create custom views using query language.
- Pin your favorite views to the sidebar.
- Discover advanced filter options.
1. Open Wise, click <i class="material-symbols-outlined">settings</i> in the bottom left corner.
2. Depending on your preference:
- Select **Tags** to filter content by specific topics or categories.
- Select **RSS feeds** to filter content from specific sources.
3. For existing tags, click **Manage views...**. You can:
- Group content from the tag or feed into an existing view, or
- Create a new view to group all related content.
## Create quick views from tags or feeds
![Filter entries from feeds](/images/manual/olares/filter-entries-from-feed.png#bordered)
4. If creating a new view:
- Enter a name for the view (e.g., `Tech Articles`).
- Click **Confirm** to save the view.
The quickest way to create a view is to base it on a tag or feed you already use.
## Add custom filter view
For more flexibility, you can create custom filtered views using query language. This allows you to define precise conditions for grouping content.
1. In Wise, click <i class="material-symbols-outlined">settings</i> in the bottom left corner.
2. Select either **Tags** (for topics) or **RSS feeds** (for sources).
3. Locate the item you want to use and click **Manage views...**.
4. Choose an action:
- Add to an existing view: Group this tag/feed into a view you already created.
- Create a new view: Create a standalone view that groups all related entries.
a. Enter a name for the view.
b. Click **Confirm** to save the view.
The following demonstrates how to create a view for the tag "AI" using query language:
![Filter entries by tags](/images/manual/olares/wise-create-views.png#bordered)
1. Open Wise, click <i class="material-symbols-outlined">settings</i> in the bottom left corner and select **Filtered views**.
2. In the top-right corner, select **Add view**.
3. Enter a name for the view (e.g., "AI trends"), and enter `tag:AI` in the **Query** filed.
4. Click **Confirm** to save this view.
## Create custom filtered views
![Add filtered view](/images/manual/olares/add-filtered-view.png#bordered){width=70%}
For more flexibility, you can create views using query language. This lets you define precise conditions for grouping content.
To create a custom filtered view:
1. In Wise, click <i class="material-symbols-outlined">settings</i> in the bottom left corner.
2. Select **Filtered views**.
3. In the top-right corner, click **Add view**.
4. Enter a name for the view (for example, `AI trends`).
5. In the **Query** field, enter your filter expression. For example:
- `tag:AI` entries tagged with `AI`.
![Add filtered view](/images/manual/olares/wise-add-filtered-view.png#bordered){width=60%}
6. Click **Confirm** to save the view.
The view will run immediately and include all entries that match the query.
## Pin views to sidebar
You can pin filtered views to the sidebar using either of these methods:
- Locate the view in the list and click <i class="material-symbols-outlined">keep</i> in the corresponding **Operations** column.
- Open the filtered view, click <i class="material-symbols-outlined">keyboard_arrow_down</i> in the header, and select **Pin to sidebar**.
You can pin your filtered views to the sidebar so they are always one click away.
![Pin to sidebar](/images/manual/olares/pin-to-sidebar.png#bordered){width=50%}
## Available filters
1. In Wise, click <i class="material-symbols-outlined">settings</i> in the bottom left corner.
2. Select **Filtered views**.
3. Choose the ways to pin your target view:
- Click <i class="material-symbols-outlined">keep</i> in the **Operations** column.
- Click the filtered view to open it, click <i class="material-symbols-outlined">keyboard_arrow_down</i> in the header, and select **Pin to sidebar**.
![Pin to sidebar](/images/manual/olares/wise-pin-sidebar.png#bordered){width=50%}
Pinned views appear in the sidebar alongside your other navigation items.
## Common filters and syntax
To explore all available filtering options and learn how to use them, refer to the following:
- [Filtered view examples](filter-examples)
- [Filter syntax reference](filter-syntax-guide.md)
- [Filter syntax reference](filter-syntax-guide.md)

View File

@@ -1,33 +1,62 @@
---
description: Transform your Olares into a powerful information hub with Wise - featuring AI-driven content curation, cross-platform aggregation, and seamless bookmarking capabilities.
outline: [2, 3]
description: Transform your Olares into a powerful information hub with Wise, featuring cross-platform aggregation, and seamless bookmarking capabilities.
---
# Curate information hub with Wise
# Curate your information hub with Wise
Wise is a local-first, AI-driven modern reader and a core application within the Olares ecosystem. Working together with the LarePass Chrome extension, Wise assists you in collecting, consuming, and managing content from various platforms, thereby creating and maintaining a personal information hub.
Wise is a local-first modern reader designed to turn scattered information into a personal information hub. As a core application within the Olares ecosystem, it serves as your central repository for managing digital content securely and efficiently.
Key features include:
Wise empowers you to build this hub through two main capabilities:
* **Self-hosted recommendation algorithms**: You can run personalized algorithms to filter and sort online content, breaking through the information bubble and receiving diverse and personalized content recommendations.
* **Cross-platform content aggregation**: Wise integrates articles, videos, audio, and feeds from different sources, offering you a comprehensive experience.
* **Seamless bookmarking**: With the LarePass browser extension, you can save web pages to Olares with a single click, making it easy to access and manage content anytime.
- **Cross-platform content aggregation**: Centralize your reading by integrating articles, videos, audio, and feeds from various sources into a single, distraction-free interface.
- **One-click bookmarking**: Save web pages directly to Olares using the LarePass browser extension, ensuring your content is always accessible and owned by you.
---
## Install and open Wise
1. Open the Market, and search for "Wise".
2. Click **Get**, then **Install**.
3. Once installed, open Wise from the Launchpad.
## Understand the interface
The Wise interface is designed to help you organize and consume content efficiently.
![Wise interface](/images/manual/olares/wise-interface.png#bordered)
### Sidebar navigation
The sidebar organizes your content into the following sections:
- **Feeds:** Contains your subscribed sources, including websites, blogs, and video channels.
- **Inbox:** Your central workspace for active content. It aggregates items from all sources, including saved web pages, uploaded files like PDFs or EPUBs, and feed items added to your library.
- **Content types:** Automatically categorizes your content by format, such as **Articles**, **Videos**, and **Books**.
### Item status
Every item in Wise has a status that can be either **Inbox** or **Read Later**. You can change an item's status using the icons in the list view or the reader view.
- **<i class="material-symbols-outlined">inbox</i> Inbox**: Your primary collection for content you want to read soon.
- **<i class="material-symbols-outlined">schedule</i> Read Later**: Your backlog for content to revisit in the future.
## Next steps
Explore the following guides to master your Wise workflow:
<div>
<h4><a href="./wise-basics">Wise basics</a></h4>
Learn the essential tasks for collecting, reading, and managing your content library in Wise.
</div>
<div>
<h4><a href="./recommend">Discover themed content</a></h4>
Learn how self-hosted recommendation algorithms work in Wise.
<h4><a href="./basics">Wise basics</a></h4>
Learn essential tasks for collecting, reading, and managing your content library.
</div>
<div>
<h4><a href="./subscribe">Subscribe and manage feeds</a></h4>
Set up and organize your content sources through RSS feeds, manual subscriptions, and the LarePass browser extension.
Set up and organize content sources via RSS, manual subscriptions, and LarePass browser extension.
</div>
<div>
<h4><a href="./manage-cookies">Manage cookies for Wise</a></h4>
Learn how to upload cookies to grant Wise access to content behind logins or paywalls.
</div>
<div>
<h4><a href="./filter">Add filtered view</a></h4>
Learn how to use advanced filters to organize and display content based on specific criteria like tags, authors, or publication dates.
Use advanced filters to organize content by tags, authors, or publication dates.
</div>

View File

@@ -0,0 +1,93 @@
---
outline: [2, 3]
description: Manage cookies for Wise so it can access protected websites and feeds. Learn why cookies matter, supported formats, how to obtain them, and ways to upload and maintain cookies.
---
# Manage cookies for Wise
Some websites require a login to access their content. To allow Wise to fetch content from these protected sources, you may need to upload cookies so it can authenticate the connection.
This grants Wise permission to pass login checks, ensuring that features like **Save to library** or **Subscribe to RSS feed** work securely on restricted sites.
This guide explains how to manage cookies in Olares for Wise.
## Upload cookies
Olares provides flexible options for uploading cookies, depending on whether you want to capture them instantly while browsing or manage them manually in batch.
### Upload via LarePass browser extension
This is the easiest way to handle cookies. When you are browsing a site that requires a login, [LarePass browser extension](https://www.olares.com/larepass) can capture and upload the cookies for the current page in one flow.
1. Navigate to the target website and make sure you are logged in.
2. Open the LarePass browser extension and select the "Collect" icon.
3. Click **Upload** to upload the cookies for the current page.
![Upload cookies via LarePass extension](/images/manual/olares/wise-upload-cookie-larepass.png#bordered){width=40%}
After upload, Wise will use these cookies when you **Save to library** or **Subscribe to RSS feed** for that site.
### Upload manually in batch
You can manually paste cookie strings in Netscape, JSON, or Header String formats. This is useful if you use browser extensions like [Cookie-Editor](https://chromewebstore.google.com/detail/cookie-editor/iphcomljdfghbkdcfndaijbokpgddeno?utm_source=ext_app_menu) to export credentials from specific websites.
You can upload cookie strings via the Wise app interface or directly through the system Settings.
<Tabs>
<template #Upload-to-Wise>
This method allows you to upload cookies directly without leaving the Wise application.
:::info
Wise supports uploading only. To view, manage, or delete these cookies later, you must navigate to the **Settings** > **Integration** > **Manage Your Cookies** page.
:::
1. In Wise, click <i class="material-symbols-outlined">settings</i> **Settings** in the bottom left corner.
2. Select **Preferences**.
3. Enable **Batch cookie upload**.
4. Click <i class="material-symbols-outlined">add_circle</i> in the bottom-left menu bar.
5. Select **Upload Cookie**.
6. Select the format for your cookie file, and paste the corresponding raw text into the input box.
7. Click **Confirm**.
![Upload cookies to Wise in batch](/images/manual/olares/wise-upload-cookie-in-pre.png#bordered)
Cookies uploaded this way are stored for Wise and will be used whenever Wise accesses matching domains.
</template>
<template #Upload-to-Integration>
This method allows you to upload, view, and manage your cookies in the same interface.
1. Open **Settings** from the Launchpad.
2. Go to **Integration** > **Manage Your Cookies**.
3. Click **Import Cookie** or the <i class="material-symbols-outlined">add_circle</i> icon in the top-right corner to open the **Upload Cookie** dialog.
4. Select the format for your cookie file, paste the corresponding raw text into the input box, and click **Confirm**.
Wise automatically detects and uses these cookies when accessing matching domains.
</template>
</Tabs>
## Manage cookies
You usually do not need to manage cookies frequently, but it can be helpful to review or clean them up from time to time.
### Check cookie status
To view existing cookies and their details:
1. Open **Settings** from the Launchpad.
2. Go to **Integration** > **Manage Your Cookies**.
When needed, you can update them by re-uploading new cookie strings using the same steps as above.
### Remove cookies
If you no longer need access to a particular site, or want to clean up old credentials:
1. Open **Settings** from the Launchpad.
2. Go to **Integration** > **Manage Your Cookies**.
3. Find your target cookie item and click <i class="material-symbols-outlined">delete</i> or **Delete All**.
After removal, Wise will no longer use those cookies and may not be able to access protected content for that site until new cookies are provided.

View File

@@ -4,79 +4,93 @@ description: Learn how to manage content subscriptions in Olares, including addi
---
# Subscribe and manage feeds
Wise offers flexible subscription options to help you follow your favorite content sources, including articles, blogs, podcasts, and video channels. This guide explains how to add and manage your subscriptions.
## Subscribe methods
:::tip
When you subscribe to podcast or video channels in Wise, new episodes automatically download to your Olares storage. This ensures your media content is always available—even offline—and protected from source deletion or unavailability.
## Understand feeds
Subscribing to a feed creates a direct link to a content source. New entries will appear in the **Feeds** list automatically as they are published.
Please note the difference between viewing and keeping:
- **Feeds are for discovery**: You can open and read any entry from the feed list, but these items are temporary. If the feed changes or you unsubscribe, they may no longer be available.
- **Your library is for ownership**: If you find an entry you want to keep or read later, you must **Save to library**. Only saved items become part of your library and can be managed with status, tags, notes, and filters.
## Add subscriptions
You can subscribe to feeds from within Wise or directly from your browser.
::: tip Handle restricted content
If a link requires login or other access control, Wise may need cookies to fetch it correctly. To configure cookies for protected sites, see **[Manage cookies for Wise](./manage-cookies)**.
:::
### Add subscriptions from For you
When browsing recommended content on the **For you** page, you can subscribe to content sources using the following options:
### Add feeds via link
* Click **Subscribe this Feed** in the **Info** column
* Click <i class="material-symbols-outlined">bookmark_add</i> in the toolbar
If you have a website or feed URL, you can subscribe using **Add Link**.
### Add RSS feeds manually
1. Open the RSS feed dialog with either option:
* Click <i class="material-symbols-outlined">add_circle</i> on the bottom left, and select **RSS feed**.
* Click <i class="material-symbols-outlined">settings</i> on the bottom left, select **RSS feeds**, then click **Add feed** in the top right corner.
2. In the dialog, enter the feed information using any of these formats:
* Feed name. For example, `techcrunch`.
* Website URL for RSS feed search.
* Direct RSS link.
3. Click **Add** to complete the subscription.
1. Click <i class="material-symbols-outlined">add_circle</i> in the bottom-left menu bar and choose **Add Link**.
2. Paste a website or feed URL. If one or more feeds are detected, they will be listed under the **Subscribe to RSS feed** section.
3. Click <i class="material-symbols-outlined">bookmark_add</i> next to the feed you want to subscribe to.
### Import RSS feeds from OPML
OPML files allow you to easily import RSS feed collections from other users or RSS readers. This is a convenient way to migrate your existing feed subscriptions or add curated feed collections.
![Subscribe to RSS feed](/images/manual/olares/wise-add-link-subscribe.png#bordered){width=300}
1. Click <i class="material-symbols-outlined">settings</i> in the bottom left corner and select **Preferences**.
2. Under **Import/Export**, click **Import feeds from OPML file**.
3. Select your OPML file and open it.
The selected feed will be added to **Feeds**, and new entries from it will be fetched automatically.
After import, you can view and manage your RSS feeds under <i class="material-symbols-outlined">settings</i> > **RSS feeds**.
### Import feeds from OPML files
:::info
Only new feed subscriptions will be imported. Historical feed content from your previous reader won't be transferred.
The OPML file imports your subscription list only, not the articles themselves.
Wise will fetch the latest available content from these sources immediately after import, but it cannot transfer your reading history or archived articles from your previous reader.
:::
### Use LarePass for web subscriptions
:::tip
LarePass extension is currently available for Chrome browsers only. Download it from the [official page](https://www.olares.com/larepass).
:::
1. Open the LarePass browser extension, and click **Collect**.
2. For the current webpage, check available subscriptions in the **RSS** section.
:::info
The **RSS** option appears only when feeds are detected on the current page.
:::
3. Click <i class="material-symbols-outlined">bookmark_add</i> to add the feed to Wise.
:::tip Upload cookie
If you already use another RSS reader, or someone shares a curated feed list, you can import those subscriptions using an OPML file.
Some websites require cookies for accessing content:
1. Log in to the target website.
2. Open the LarePass browser extension, and click **Collect** > **Cookie**.
3. Click **Upload** to apply changes or enable **Auto Sync**.
1. Click <i class="material-symbols-outlined">settings</i> in the bottom left corner and select **Preferences**.
2. Under **Import/Export**, click **Import feeds from OPML**.
3. Select your OPML file and open it.
You can hover over cookies to view details.
:::
## View subscription list
Access all your RSS feed subscriptions from <i class="material-symbols-outlined">settings</i> > **RSS feeds**.
After import, the feeds will appear under <i class="material-symbols-outlined">settings</i> > **RSS feeds**.
You can:
### Use LarePass browser extension
* View feed details and descriptions
* Search for specific feeds
* Copy RSS links
* Edit feed names and descriptions
The [LarePass browser extension](https://www.olares.com/larepass) lets you subscribe to feeds while you browse, without switching back to Wise.
1. Open the LarePass browser extension and click the "Collect" icon.
2. If one or more feeds are detected, they will be listed under the **Subscribe to RSS feed** section.
3. Click <i class="material-symbols-outlined">bookmark_add</i> next to the feed you want to subscribe to.
![Subscribe to RSS feed via LarePass](/images/manual/olares/wise-larepass-collect.png#bordered)
## Manage subscriptions
You can view, rename, organize, or remove feeds from the central management page or directly within the reader interface.
### View and edit details
1. Click <i class="material-symbols-outlined">settings</i> in the bottom left corner.
2. Select **RSS feeds**.
3. Perform the following operations as needed:
- View feed details and descriptions.
- Search for specific feeds.
- Copy RSS links.
- Edit feed names and descriptions.
- Remove RSS links.
Changes here are reflected in the **Feeds** section of the Wise sidebar.
### Unsubscribe
If you no longer want to follow a source, you can unsubscribe from its feed.
## Unsubscribe
:::warning
Unsubscribing removes all articles from this feed unless they're saved to your Library. This action cannot be undone.
When you unsubscribe from a feed, all entries from that feed are removed from Wise unless they have been explicitly saved to your library. This action cannot be undone.
:::
You can unsubscribe from content sources in several ways:
You can remove a feed subscription in several places:
* From the **Info** column
* Through the reading page toolbar
* Via the LarePass browser extension
* On the **RSS Feeds management** page
- From the **Info** panel of an entry belonging to that feed.
![Unsubscribe via Info panel](/images/manual/olares/wise-info-unsub.png#bordered){width=500}
- From the reader toolbar while viewing an entry.
![Unsubscribe via toolbar](/images/manual/olares/wise-toolbar-unsub.png#bordered){width=500}
- From <i class="material-symbols-outlined">settings</i> > **RSS feeds** in Wise.
![Unsubscribe in RSS feeds](/images/manual/olares/wise-unsub-rss-feeds.png#bordered){width=500}

Binary file not shown.

After

Width:  |  Height:  |  Size: 509 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 74 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 67 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 205 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 208 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 199 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 201 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 962 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 993 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 303 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 957 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 117 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 66 KiB

After

Width:  |  Height:  |  Size: 191 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 22 KiB

After

Width:  |  Height:  |  Size: 127 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 24 KiB

After

Width:  |  Height:  |  Size: 117 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 61 KiB

After

Width:  |  Height:  |  Size: 130 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 23 KiB

After

Width:  |  Height:  |  Size: 126 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 730 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 69 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.7 MiB

After

Width:  |  Height:  |  Size: 466 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 142 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 157 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 55 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 55 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 346 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 340 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 326 KiB

Some files were not shown because too many files have changed in this diff Show More