Compare commits
57 Commits
module-app
...
daemon/fea
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
0fb498fa7a | ||
|
|
8f5023ce17 | ||
|
|
4467bc61df | ||
|
|
85f1224616 | ||
|
|
4b3a42d728 | ||
|
|
3c821cbedb | ||
|
|
3129b295ce | ||
|
|
76bde01b86 | ||
|
|
32c652205d | ||
|
|
817316c1d6 | ||
|
|
e03eb40ed8 | ||
|
|
79b7d82748 | ||
|
|
20344416f8 | ||
|
|
8c59050529 | ||
|
|
f932d10916 | ||
|
|
e4762d880b | ||
|
|
017b2e2acd | ||
|
|
d3adeced3f | ||
|
|
48038504a7 | ||
|
|
d17d8fca14 | ||
|
|
35770fbe46 | ||
|
|
39cb3335d6 | ||
|
|
0e1208d555 | ||
|
|
65fa0c0da8 | ||
|
|
cf7125aac8 | ||
|
|
46ba0e64e8 | ||
|
|
a15fe1e3e0 | ||
|
|
1b3305dd98 | ||
|
|
54f2996efe | ||
|
|
7870520b57 | ||
|
|
2dbd99d64a | ||
|
|
44d3f5d26a | ||
|
|
0f67f6227f | ||
|
|
21e1c06794 | ||
|
|
838c146fc0 | ||
|
|
403460b9c2 | ||
|
|
9f1800c8c6 | ||
|
|
29756b392e | ||
|
|
fd122768e7 | ||
|
|
6c40d3a288 | ||
|
|
5b843d19e4 | ||
|
|
97e2b82d0e | ||
|
|
8614fa6253 | ||
|
|
b4966d5e38 | ||
|
|
a7f698faf7 | ||
|
|
d7ea9b40d6 | ||
|
|
5a5d00d910 | ||
|
|
7de7ff989c | ||
|
|
1a1fcfac89 | ||
|
|
452a6f2e78 | ||
|
|
2d1abe8965 | ||
|
|
744b4a3666 | ||
|
|
eb61923584 | ||
|
|
991d4e1dce | ||
|
|
5f513e2155 | ||
|
|
7c3246dd9b | ||
|
|
362c6f1cde |
22
.github/workflows/build-redis-231.yaml
vendored
22
.github/workflows/build-redis-231.yaml
vendored
@@ -11,10 +11,22 @@ jobs:
|
||||
- name: "Checkout source code"
|
||||
uses: actions/checkout@v3
|
||||
|
||||
# test
|
||||
- env:
|
||||
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
|
||||
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
|
||||
AWS_DEFAULT_REGION: "us-east-1"
|
||||
- name: Install coscmd
|
||||
run: pip install coscmd
|
||||
|
||||
- name: Configure coscmd
|
||||
env:
|
||||
TENCENT_SECRET_ID: ${{ secrets.TENCENT_SECRET_ID }}
|
||||
TENCENT_SECRET_KEY: ${{ secrets.TENCENT_SECRET_KEY }}
|
||||
COS_BUCKET: ${{ secrets.COS_BUCKET }}
|
||||
COS_REGION: ${{ secrets.COS_REGION }}
|
||||
END_POINT: ${{ secrets.END_POINT }}
|
||||
run: |
|
||||
coscmd config -a $TENCENT_SECRET_ID \
|
||||
-s $TENCENT_SECRET_KEY \
|
||||
-b $COS_BUCKET \
|
||||
-r $COS_REGION
|
||||
|
||||
# test
|
||||
- run: |
|
||||
bash build/build-redis.sh linux/amd64 glibc-231
|
||||
|
||||
44
.github/workflows/build-redis.yaml
vendored
44
.github/workflows/build-redis.yaml
vendored
@@ -11,12 +11,24 @@ jobs:
|
||||
- name: "Checkout source code"
|
||||
uses: actions/checkout@v3
|
||||
|
||||
# test
|
||||
- env:
|
||||
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
|
||||
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
|
||||
AWS_DEFAULT_REGION: "us-east-1"
|
||||
- name: Install coscmd
|
||||
run: pip install coscmd
|
||||
|
||||
- name: Configure coscmd
|
||||
env:
|
||||
TENCENT_SECRET_ID: ${{ secrets.TENCENT_SECRET_ID }}
|
||||
TENCENT_SECRET_KEY: ${{ secrets.TENCENT_SECRET_KEY }}
|
||||
COS_BUCKET: ${{ secrets.COS_BUCKET }}
|
||||
COS_REGION: ${{ secrets.COS_REGION }}
|
||||
END_POINT: ${{ secrets.END_POINT }}
|
||||
run: |
|
||||
coscmd config -a $TENCENT_SECRET_ID \
|
||||
-s $TENCENT_SECRET_KEY \
|
||||
-b $COS_BUCKET \
|
||||
-r $COS_REGION
|
||||
|
||||
# test
|
||||
- run: |
|
||||
bash build/build-redis.sh linux/amd64
|
||||
|
||||
push-arm64:
|
||||
@@ -34,10 +46,22 @@ jobs:
|
||||
run: |
|
||||
sudo apt install -y make gcc
|
||||
|
||||
# test
|
||||
- env:
|
||||
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
|
||||
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
|
||||
AWS_DEFAULT_REGION: "us-east-1"
|
||||
- name: Install coscmd
|
||||
run: pip install coscmd
|
||||
|
||||
- name: Configure coscmd
|
||||
env:
|
||||
TENCENT_SECRET_ID: ${{ secrets.TENCENT_SECRET_ID }}
|
||||
TENCENT_SECRET_KEY: ${{ secrets.TENCENT_SECRET_KEY }}
|
||||
COS_BUCKET: ${{ secrets.COS_BUCKET }}
|
||||
COS_REGION: ${{ secrets.COS_REGION }}
|
||||
END_POINT: ${{ secrets.END_POINT }}
|
||||
run: |
|
||||
coscmd config -a $TENCENT_SECRET_ID \
|
||||
-s $TENCENT_SECRET_KEY \
|
||||
-b $COS_BUCKET \
|
||||
-r $COS_REGION
|
||||
|
||||
# test
|
||||
- run: |
|
||||
sudo -E sh -c "bash build/build-redis.sh linux/arm64 && rm -rf redis*"
|
||||
|
||||
22
.github/workflows/build-ubuntu2204.yaml
vendored
22
.github/workflows/build-ubuntu2204.yaml
vendored
@@ -11,10 +11,22 @@ jobs:
|
||||
- name: "Checkout source code"
|
||||
uses: actions/checkout@v3
|
||||
|
||||
# test
|
||||
- env:
|
||||
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
|
||||
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
|
||||
AWS_DEFAULT_REGION: "us-east-1"
|
||||
- name: Install coscmd
|
||||
run: pip install coscmd
|
||||
|
||||
- name: Configure coscmd
|
||||
env:
|
||||
TENCENT_SECRET_ID: ${{ secrets.TENCENT_SECRET_ID }}
|
||||
TENCENT_SECRET_KEY: ${{ secrets.TENCENT_SECRET_KEY }}
|
||||
COS_BUCKET: ${{ secrets.COS_BUCKET }}
|
||||
COS_REGION: ${{ secrets.COS_REGION }}
|
||||
END_POINT: ${{ secrets.END_POINT }}
|
||||
run: |
|
||||
coscmd config -a $TENCENT_SECRET_ID \
|
||||
-s $TENCENT_SECRET_KEY \
|
||||
-b $COS_BUCKET \
|
||||
-r $COS_REGION
|
||||
|
||||
# test
|
||||
- run: |
|
||||
bash build/build-ubuntu2204.sh
|
||||
23
.github/workflows/build-wsl2326.yaml
vendored
23
.github/workflows/build-wsl2326.yaml
vendored
@@ -11,10 +11,23 @@ jobs:
|
||||
- name: "Checkout source code"
|
||||
uses: actions/checkout@v3
|
||||
|
||||
# test
|
||||
- env:
|
||||
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
|
||||
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
|
||||
AWS_DEFAULT_REGION: "us-east-1"
|
||||
- name: Install coscmd
|
||||
run: pip install coscmd
|
||||
|
||||
- name: Configure coscmd
|
||||
env:
|
||||
TENCENT_SECRET_ID: ${{ secrets.TENCENT_SECRET_ID }}
|
||||
TENCENT_SECRET_KEY: ${{ secrets.TENCENT_SECRET_KEY }}
|
||||
COS_BUCKET: ${{ secrets.COS_BUCKET }}
|
||||
COS_REGION: ${{ secrets.COS_REGION }}
|
||||
END_POINT: ${{ secrets.END_POINT }}
|
||||
run: |
|
||||
coscmd config -a $TENCENT_SECRET_ID \
|
||||
-s $TENCENT_SECRET_KEY \
|
||||
-b $COS_BUCKET \
|
||||
-r $COS_REGION
|
||||
|
||||
|
||||
# test
|
||||
- run: |
|
||||
bash build/build-wsl-install-msi.sh
|
||||
|
||||
107
.github/workflows/check.yaml
vendored
107
.github/workflows/check.yaml
vendored
@@ -60,14 +60,6 @@ jobs:
|
||||
- name: Run chart-testing (lint)
|
||||
run: ct lint --chart-dirs .dist/wizard/config,.dist/wizard/config/apps,.dist/wizard/config/gpu --check-version-increment=false --all
|
||||
|
||||
# - name: Create kind cluster
|
||||
# if: steps.list-changed.outputs.changed == 'true'
|
||||
# uses: helm/kind-action@v1.7.0
|
||||
|
||||
# - name: Run chart-testing (install)
|
||||
# if: steps.list-changed.outputs.changed == 'true'
|
||||
# run: ct install --chart-dirs wizard/charts,wizard/config --target-branch ${{ github.event.repository.default_branch }}
|
||||
|
||||
test-version:
|
||||
runs-on: ubuntu-latest
|
||||
outputs:
|
||||
@@ -107,12 +99,23 @@ jobs:
|
||||
ref: ${{ github.event.pull_request.head.ref }}
|
||||
repository: ${{ github.event.pull_request.head.repo.full_name }}
|
||||
|
||||
# test
|
||||
- env:
|
||||
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
|
||||
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
|
||||
AWS_DEFAULT_REGION: "us-east-1"
|
||||
- name: Install coscmd
|
||||
run: pip install coscmd
|
||||
|
||||
- name: Configure coscmd
|
||||
env:
|
||||
TENCENT_SECRET_ID: ${{ secrets.TENCENT_SECRET_ID }}
|
||||
TENCENT_SECRET_KEY: ${{ secrets.TENCENT_SECRET_KEY }}
|
||||
COS_BUCKET: ${{ secrets.COS_BUCKET }}
|
||||
COS_REGION: ${{ secrets.COS_REGION }}
|
||||
END_POINT: ${{ secrets.END_POINT }}
|
||||
run: |
|
||||
coscmd config -a $TENCENT_SECRET_ID \
|
||||
-s $TENCENT_SECRET_KEY \
|
||||
-b $COS_BUCKET \
|
||||
-r $COS_REGION
|
||||
# test
|
||||
- run: |
|
||||
bash build/image-manifest.sh && bash build/upload-images.sh .manifest/images.mf
|
||||
|
||||
push-image-arm64:
|
||||
@@ -132,12 +135,23 @@ jobs:
|
||||
ref: ${{ github.event.pull_request.head.ref }}
|
||||
repository: ${{ github.event.pull_request.head.repo.full_name }}
|
||||
|
||||
- name: Install coscmd
|
||||
run: pip install coscmd
|
||||
|
||||
- env:
|
||||
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
|
||||
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
|
||||
AWS_DEFAULT_REGION: 'us-east-1'
|
||||
- name: Configure coscmd
|
||||
env:
|
||||
TENCENT_SECRET_ID: ${{ secrets.TENCENT_SECRET_ID }}
|
||||
TENCENT_SECRET_KEY: ${{ secrets.TENCENT_SECRET_KEY }}
|
||||
COS_BUCKET: ${{ secrets.COS_BUCKET }}
|
||||
COS_REGION: ${{ secrets.COS_REGION }}
|
||||
END_POINT: ${{ secrets.END_POINT }}
|
||||
run: |
|
||||
coscmd config -a $TENCENT_SECRET_ID \
|
||||
-s $TENCENT_SECRET_KEY \
|
||||
-b $COS_BUCKET \
|
||||
-r $COS_REGION
|
||||
|
||||
- run: |
|
||||
export PATH=$PATH:/usr/local/bin:/home/ubuntu/.local/bin
|
||||
bash build/image-manifest.sh && bash build/upload-images.sh .manifest/images.mf linux/arm64
|
||||
|
||||
@@ -154,11 +168,23 @@ jobs:
|
||||
ref: ${{ github.event.pull_request.head.ref }}
|
||||
repository: ${{ github.event.pull_request.head.repo.full_name }}
|
||||
|
||||
- name: Install coscmd
|
||||
run: pip install coscmd
|
||||
|
||||
- name: Configure coscmd
|
||||
env:
|
||||
TENCENT_SECRET_ID: ${{ secrets.TENCENT_SECRET_ID }}
|
||||
TENCENT_SECRET_KEY: ${{ secrets.TENCENT_SECRET_KEY }}
|
||||
COS_BUCKET: ${{ secrets.COS_BUCKET }}
|
||||
COS_REGION: ${{ secrets.COS_REGION }}
|
||||
END_POINT: ${{ secrets.END_POINT }}
|
||||
run: |
|
||||
coscmd config -a $TENCENT_SECRET_ID \
|
||||
-s $TENCENT_SECRET_KEY \
|
||||
-b $COS_BUCKET \
|
||||
-r $COS_REGION
|
||||
# test
|
||||
- env:
|
||||
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
|
||||
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
|
||||
AWS_DEFAULT_REGION: "us-east-1"
|
||||
VERSION: ${{ needs.test-version.outputs.version }}
|
||||
REPO_PATH: '${{ secrets.REPO_PATH }}'
|
||||
run: |
|
||||
@@ -179,11 +205,21 @@ jobs:
|
||||
- name: Install coscmd
|
||||
run: pip install coscmd
|
||||
|
||||
- name: Configure coscmd
|
||||
env:
|
||||
TENCENT_SECRET_ID: ${{ secrets.TENCENT_SECRET_ID }}
|
||||
TENCENT_SECRET_KEY: ${{ secrets.TENCENT_SECRET_KEY }}
|
||||
COS_BUCKET: ${{ secrets.COS_BUCKET }}
|
||||
COS_REGION: ${{ secrets.COS_REGION }}
|
||||
END_POINT: ${{ secrets.END_POINT }}
|
||||
run: |
|
||||
coscmd config -a $TENCENT_SECRET_ID \
|
||||
-s $TENCENT_SECRET_KEY \
|
||||
-b $COS_BUCKET \
|
||||
-r $COS_REGION
|
||||
|
||||
# test
|
||||
- env:
|
||||
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
|
||||
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
|
||||
AWS_DEFAULT_REGION: "us-east-1"
|
||||
VERSION: ${{ needs.test-version.outputs.version }}
|
||||
REPO_PATH: '${{ secrets.REPO_PATH }}'
|
||||
run: |
|
||||
@@ -206,15 +242,28 @@ jobs:
|
||||
run: |
|
||||
bash build/build.sh ${{ needs.test-version.outputs.version }}
|
||||
|
||||
- name: Upload package
|
||||
- name: Install coscmd
|
||||
run: pip install coscmd
|
||||
|
||||
- name: Configure coscmd
|
||||
env:
|
||||
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
|
||||
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
|
||||
AWS_DEFAULT_REGION: 'us-east-1'
|
||||
TENCENT_SECRET_ID: ${{ secrets.TENCENT_SECRET_ID }}
|
||||
TENCENT_SECRET_KEY: ${{ secrets.TENCENT_SECRET_KEY }}
|
||||
COS_BUCKET: ${{ secrets.COS_BUCKET }}
|
||||
COS_REGION: ${{ secrets.COS_REGION }}
|
||||
END_POINT: ${{ secrets.END_POINT }}
|
||||
run: |
|
||||
coscmd config -a $TENCENT_SECRET_ID \
|
||||
-s $TENCENT_SECRET_KEY \
|
||||
-b $COS_BUCKET \
|
||||
-r $COS_REGION
|
||||
|
||||
|
||||
- name: Upload package
|
||||
run: |
|
||||
md5sum install-wizard-v${{ needs.test-version.outputs.version }}.tar.gz > install-wizard-v${{ needs.test-version.outputs.version }}.md5sum.txt && \
|
||||
aws s3 cp install-wizard-v${{ needs.test-version.outputs.version }}.md5sum.txt s3://terminus-os-install/install-wizard-v${{ needs.test-version.outputs.version }}.md5sum.txt --acl=public-read && \
|
||||
aws s3 cp install-wizard-v${{ needs.test-version.outputs.version }}.tar.gz s3://terminus-os-install/install-wizard-v${{ needs.test-version.outputs.version }}.tar.gz --acl=public-read
|
||||
coscmd upload install-wizard-v${{ needs.test-version.outputs.version }}.md5sum.txt /install-wizard-v${{ needs.test-version.outputs.version }}.md5sum.txt && \
|
||||
coscmd upload install-wizard-v${{ needs.test-version.outputs.version }}.tar.gz /install-wizard-v${{ needs.test-version.outputs.version }}.tar.gz
|
||||
|
||||
|
||||
install-test:
|
||||
|
||||
22
.github/workflows/release-cli.yaml
vendored
22
.github/workflows/release-cli.yaml
vendored
@@ -60,12 +60,24 @@ jobs:
|
||||
OLARES_RELEASE_ID: ${{ inputs.release-id }}
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
- name: Upload to S3
|
||||
- name: Install coscmd
|
||||
run: pip install coscmd
|
||||
|
||||
- name: Configure coscmd
|
||||
env:
|
||||
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
|
||||
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
|
||||
AWS_DEFAULT_REGION: "us-east-1"
|
||||
TENCENT_SECRET_ID: ${{ secrets.TENCENT_SECRET_ID }}
|
||||
TENCENT_SECRET_KEY: ${{ secrets.TENCENT_SECRET_KEY }}
|
||||
COS_BUCKET: ${{ secrets.COS_BUCKET }}
|
||||
COS_REGION: ${{ secrets.COS_REGION }}
|
||||
END_POINT: ${{ secrets.END_POINT }}
|
||||
run: |
|
||||
coscmd config -a $TENCENT_SECRET_ID \
|
||||
-s $TENCENT_SECRET_KEY \
|
||||
-b $COS_BUCKET \
|
||||
-r $COS_REGION
|
||||
|
||||
- name: Upload to CDN
|
||||
run: |
|
||||
cd cli/output && for file in $(ls *.tar.gz | grep -v no-release-id); do
|
||||
aws s3 cp "$file" s3://terminus-os-install${{ secrets.REPO_PATH }}${file} --acl=public-read
|
||||
coscmd upload "$file" ${{ secrets.REPO_PATH }}${file}
|
||||
done
|
||||
|
||||
23
.github/workflows/release-daemon.yaml
vendored
23
.github/workflows/release-daemon.yaml
vendored
@@ -72,12 +72,25 @@ jobs:
|
||||
version: v1.18.2
|
||||
args: release --clean
|
||||
|
||||
- name: Upload to CDN
|
||||
- name: Install coscmd
|
||||
run: pip install coscmd
|
||||
|
||||
- name: Configure coscmd
|
||||
env:
|
||||
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
|
||||
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
|
||||
AWS_DEFAULT_REGION: 'us-east-1'
|
||||
TENCENT_SECRET_ID: ${{ secrets.TENCENT_SECRET_ID }}
|
||||
TENCENT_SECRET_KEY: ${{ secrets.TENCENT_SECRET_KEY }}
|
||||
COS_BUCKET: ${{ secrets.COS_BUCKET }}
|
||||
COS_REGION: ${{ secrets.COS_REGION }}
|
||||
END_POINT: ${{ secrets.END_POINT }}
|
||||
run: |
|
||||
coscmd config -a $TENCENT_SECRET_ID \
|
||||
-s $TENCENT_SECRET_KEY \
|
||||
-b $COS_BUCKET \
|
||||
-r $COS_REGION
|
||||
|
||||
|
||||
- name: Upload to CDN
|
||||
run: |
|
||||
cd daemon/output && for file in $(ls *.tar.gz | grep -v no-release-id); do
|
||||
aws s3 cp "$file" s3://terminus-os-install${{ secrets.REPO_PATH }}${file} --acl=public-read
|
||||
coscmd upload "$file" ${{ secrets.REPO_PATH }}${file}
|
||||
done
|
||||
|
||||
108
.github/workflows/release-daily.yaml
vendored
108
.github/workflows/release-daily.yaml
vendored
@@ -55,11 +55,23 @@ jobs:
|
||||
- name: 'Checkout source code'
|
||||
uses: actions/checkout@v3
|
||||
|
||||
- env:
|
||||
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
|
||||
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
|
||||
AWS_DEFAULT_REGION: 'us-east-1'
|
||||
- name: Install coscmd
|
||||
run: pip install coscmd
|
||||
|
||||
- name: Configure coscmd
|
||||
env:
|
||||
TENCENT_SECRET_ID: ${{ secrets.TENCENT_SECRET_ID }}
|
||||
TENCENT_SECRET_KEY: ${{ secrets.TENCENT_SECRET_KEY }}
|
||||
COS_BUCKET: ${{ secrets.COS_BUCKET }}
|
||||
COS_REGION: ${{ secrets.COS_REGION }}
|
||||
END_POINT: ${{ secrets.END_POINT }}
|
||||
run: |
|
||||
coscmd config -a $TENCENT_SECRET_ID \
|
||||
-s $TENCENT_SECRET_KEY \
|
||||
-b $COS_BUCKET \
|
||||
-r $COS_REGION
|
||||
|
||||
- run: |
|
||||
bash build/image-manifest.sh && bash build/upload-images.sh .manifest/images.mf
|
||||
|
||||
push-images-arm64:
|
||||
@@ -69,11 +81,23 @@ jobs:
|
||||
- name: 'Checkout source code'
|
||||
uses: actions/checkout@v3
|
||||
|
||||
- env:
|
||||
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
|
||||
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
|
||||
AWS_DEFAULT_REGION: 'us-east-1'
|
||||
- name: Install coscmd
|
||||
run: pip install coscmd
|
||||
|
||||
- name: Configure coscmd
|
||||
env:
|
||||
TENCENT_SECRET_ID: ${{ secrets.TENCENT_SECRET_ID }}
|
||||
TENCENT_SECRET_KEY: ${{ secrets.TENCENT_SECRET_KEY }}
|
||||
COS_BUCKET: ${{ secrets.COS_BUCKET }}
|
||||
COS_REGION: ${{ secrets.COS_REGION }}
|
||||
END_POINT: ${{ secrets.END_POINT }}
|
||||
run: |
|
||||
coscmd config -a $TENCENT_SECRET_ID \
|
||||
-s $TENCENT_SECRET_KEY \
|
||||
-b $COS_BUCKET \
|
||||
-r $COS_REGION
|
||||
|
||||
- run: |
|
||||
export PATH=$PATH:/usr/local/bin:/home/ubuntu/.local/bin
|
||||
bash build/image-manifest.sh && bash build/upload-images.sh .manifest/images.mf linux/arm64
|
||||
|
||||
@@ -85,11 +109,24 @@ jobs:
|
||||
- name: "Checkout source code"
|
||||
uses: actions/checkout@v3
|
||||
|
||||
- name: Install coscmd
|
||||
run: pip install coscmd
|
||||
|
||||
- name: Configure coscmd
|
||||
env:
|
||||
TENCENT_SECRET_ID: ${{ secrets.TENCENT_SECRET_ID }}
|
||||
TENCENT_SECRET_KEY: ${{ secrets.TENCENT_SECRET_KEY }}
|
||||
COS_BUCKET: ${{ secrets.COS_BUCKET }}
|
||||
COS_REGION: ${{ secrets.COS_REGION }}
|
||||
END_POINT: ${{ secrets.END_POINT }}
|
||||
run: |
|
||||
coscmd config -a $TENCENT_SECRET_ID \
|
||||
-s $TENCENT_SECRET_KEY \
|
||||
-b $COS_BUCKET \
|
||||
-r $COS_REGION
|
||||
|
||||
# test
|
||||
- env:
|
||||
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
|
||||
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
|
||||
AWS_DEFAULT_REGION: "us-east-1"
|
||||
VERSION: ${{ needs.daily-version.outputs.version }}
|
||||
RELEASE_ID: ${{ needs.release-id.outputs.id }}
|
||||
REPO_PATH: '${{ secrets.REPO_PATH }}'
|
||||
@@ -104,11 +141,24 @@ jobs:
|
||||
- name: "Checkout source code"
|
||||
uses: actions/checkout@v3
|
||||
|
||||
- name: Install coscmd
|
||||
run: pip install coscmd
|
||||
|
||||
- name: Configure coscmd
|
||||
env:
|
||||
TENCENT_SECRET_ID: ${{ secrets.TENCENT_SECRET_ID }}
|
||||
TENCENT_SECRET_KEY: ${{ secrets.TENCENT_SECRET_KEY }}
|
||||
COS_BUCKET: ${{ secrets.COS_BUCKET }}
|
||||
COS_REGION: ${{ secrets.COS_REGION }}
|
||||
END_POINT: ${{ secrets.END_POINT }}
|
||||
run: |
|
||||
coscmd config -a $TENCENT_SECRET_ID \
|
||||
-s $TENCENT_SECRET_KEY \
|
||||
-b $COS_BUCKET \
|
||||
-r $COS_REGION
|
||||
|
||||
# test
|
||||
- env:
|
||||
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
|
||||
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
|
||||
AWS_DEFAULT_REGION: "us-east-1"
|
||||
VERSION: ${{ needs.daily-version.outputs.version }}
|
||||
RELEASE_ID: ${{ needs.release-id.outputs.id }}
|
||||
REPO_PATH: '${{ secrets.REPO_PATH }}'
|
||||
@@ -129,19 +179,31 @@ jobs:
|
||||
run: |
|
||||
bash build/build.sh ${{ needs.daily-version.outputs.version }} ${{ needs.release-id.outputs.id }}
|
||||
|
||||
- name: Upload to S3
|
||||
- name: Install coscmd
|
||||
run: pip install coscmd
|
||||
|
||||
- name: Configure coscmd
|
||||
env:
|
||||
TENCENT_SECRET_ID: ${{ secrets.TENCENT_SECRET_ID }}
|
||||
TENCENT_SECRET_KEY: ${{ secrets.TENCENT_SECRET_KEY }}
|
||||
COS_BUCKET: ${{ secrets.COS_BUCKET }}
|
||||
COS_REGION: ${{ secrets.COS_REGION }}
|
||||
END_POINT: ${{ secrets.END_POINT }}
|
||||
run: |
|
||||
coscmd config -a $TENCENT_SECRET_ID \
|
||||
-s $TENCENT_SECRET_KEY \
|
||||
-b $COS_BUCKET \
|
||||
-r $COS_REGION
|
||||
|
||||
- name: Upload to COS
|
||||
id: upload
|
||||
env:
|
||||
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
|
||||
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
|
||||
AWS_DEFAULT_REGION: 'us-east-1'
|
||||
run: |
|
||||
md5sum install-wizard-v${{ needs.daily-version.outputs.version }}.tar.gz > install-wizard-v${{ needs.daily-version.outputs.version }}.md5sum.txt && \
|
||||
aws s3 cp install-wizard-v${{ needs.daily-version.outputs.version }}.md5sum.txt s3://terminus-os-install${{ secrets.REPO_PATH }}install-wizard-v${{ needs.daily-version.outputs.version }}.md5sum.txt --acl=public-read && \
|
||||
aws s3 cp install-wizard-v${{ needs.daily-version.outputs.version }}.tar.gz s3://terminus-os-install${{ secrets.REPO_PATH }}install-wizard-v${{ needs.daily-version.outputs.version }}.tar.gz --acl=public-read && \
|
||||
coscmd upload install-wizard-v${{ needs.daily-version.outputs.version }}.md5sum.txt ${{ secrets.REPO_PATH }}install-wizard-v${{ needs.daily-version.outputs.version }}.md5sum.txt && \
|
||||
coscmd upload install-wizard-v${{ needs.daily-version.outputs.version }}.tar.gz ${{ secrets.REPO_PATH }}install-wizard-v${{ needs.daily-version.outputs.version }}.tar.gz && \
|
||||
|
||||
aws s3 cp install-wizard-v${{ needs.daily-version.outputs.version }}.md5sum.txt s3://terminus-os-install${{ secrets.REPO_PATH }}install-wizard-v${{ needs.daily-version.outputs.version }}.${{ needs.release-id.outputs.id }}.md5sum.txt --acl=public-read && \
|
||||
aws s3 cp install-wizard-v${{ needs.daily-version.outputs.version }}.tar.gz s3://terminus-os-install${{ secrets.REPO_PATH }}install-wizard-v${{ needs.daily-version.outputs.version }}.${{ needs.release-id.outputs.id }}.tar.gz --acl=public-read
|
||||
coscmd upload install-wizard-v${{ needs.daily-version.outputs.version }}.md5sum.txt ${{ secrets.REPO_PATH }}install-wizard-v${{ needs.daily-version.outputs.version }}.${{ needs.release-id.outputs.id }}.md5sum.txt && \
|
||||
coscmd upload install-wizard-v${{ needs.daily-version.outputs.version }}.tar.gz ${{ secrets.REPO_PATH }}install-wizard-v${{ needs.daily-version.outputs.version }}.${{ needs.release-id.outputs.id }}.tar.gz
|
||||
|
||||
|
||||
release:
|
||||
|
||||
22
.github/workflows/release-mdns-agent.yaml
vendored
22
.github/workflows/release-mdns-agent.yaml
vendored
@@ -60,12 +60,24 @@ jobs:
|
||||
args: release --clean --skip-validate -f .goreleaser.agent.yml
|
||||
workdir: './daemon'
|
||||
|
||||
- name: Upload to CDN
|
||||
- name: Install coscmd
|
||||
run: pip install coscmd
|
||||
|
||||
- name: Configure coscmd
|
||||
env:
|
||||
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
|
||||
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
|
||||
AWS_DEFAULT_REGION: 'us-east-1'
|
||||
TENCENT_SECRET_ID: ${{ secrets.TENCENT_SECRET_ID }}
|
||||
TENCENT_SECRET_KEY: ${{ secrets.TENCENT_SECRET_KEY }}
|
||||
COS_BUCKET: ${{ secrets.COS_BUCKET }}
|
||||
COS_REGION: ${{ secrets.COS_REGION }}
|
||||
END_POINT: ${{ secrets.END_POINT }}
|
||||
run: |
|
||||
coscmd config -a $TENCENT_SECRET_ID \
|
||||
-s $TENCENT_SECRET_KEY \
|
||||
-b $COS_BUCKET \
|
||||
-r $COS_REGION
|
||||
|
||||
- name: Upload to CDN
|
||||
run: |
|
||||
cd daemon/output && for file in *.tar.gz; do
|
||||
aws s3 cp "$file" s3://terminus-os-install/$file --acl=public-read
|
||||
coscmd upload "$file" ${{ secrets.REPO_PATH }}$file
|
||||
done
|
||||
|
||||
108
.github/workflows/release.yaml
vendored
108
.github/workflows/release.yaml
vendored
@@ -51,10 +51,23 @@ jobs:
|
||||
with:
|
||||
ref: ${{ github.event.inputs.tags }}
|
||||
|
||||
- name: Install coscmd
|
||||
run: pip install coscmd
|
||||
|
||||
- name: Configure coscmd
|
||||
env:
|
||||
TENCENT_SECRET_ID: ${{ secrets.TENCENT_SECRET_ID }}
|
||||
TENCENT_SECRET_KEY: ${{ secrets.TENCENT_SECRET_KEY }}
|
||||
COS_BUCKET: ${{ secrets.COS_BUCKET }}
|
||||
COS_REGION: ${{ secrets.COS_REGION }}
|
||||
END_POINT: ${{ secrets.END_POINT }}
|
||||
run: |
|
||||
coscmd config -a $TENCENT_SECRET_ID \
|
||||
-s $TENCENT_SECRET_KEY \
|
||||
-b $COS_BUCKET \
|
||||
-r $COS_REGION
|
||||
|
||||
- env:
|
||||
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
|
||||
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
|
||||
AWS_DEFAULT_REGION: 'us-east-1'
|
||||
VERSION: ${{ github.event.inputs.tags }}
|
||||
run: |
|
||||
bash build/image-manifest.sh && bash build/upload-images.sh .manifest/images.mf
|
||||
@@ -68,10 +81,24 @@ jobs:
|
||||
with:
|
||||
ref: ${{ github.event.inputs.tags }}
|
||||
|
||||
- name: Install coscmd
|
||||
run: pip install coscmd
|
||||
|
||||
- name: Configure coscmd
|
||||
env:
|
||||
TENCENT_SECRET_ID: ${{ secrets.TENCENT_SECRET_ID }}
|
||||
TENCENT_SECRET_KEY: ${{ secrets.TENCENT_SECRET_KEY }}
|
||||
COS_BUCKET: ${{ secrets.COS_BUCKET }}
|
||||
COS_REGION: ${{ secrets.COS_REGION }}
|
||||
END_POINT: ${{ secrets.END_POINT }}
|
||||
run: |
|
||||
coscmd config -a $TENCENT_SECRET_ID \
|
||||
-s $TENCENT_SECRET_KEY \
|
||||
-b $COS_BUCKET \
|
||||
-r $COS_REGION
|
||||
|
||||
|
||||
- env:
|
||||
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
|
||||
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
|
||||
AWS_DEFAULT_REGION: 'us-east-1'
|
||||
VERSION: ${{ github.event.inputs.tags }}
|
||||
run: |
|
||||
export PATH=$PATH:/usr/local/bin:/home/ubuntu/.local/bin
|
||||
@@ -85,11 +112,24 @@ jobs:
|
||||
- name: "Checkout source code"
|
||||
uses: actions/checkout@v3
|
||||
|
||||
- name: Install coscmd
|
||||
run: pip install coscmd
|
||||
|
||||
- name: Configure coscmd
|
||||
env:
|
||||
TENCENT_SECRET_ID: ${{ secrets.TENCENT_SECRET_ID }}
|
||||
TENCENT_SECRET_KEY: ${{ secrets.TENCENT_SECRET_KEY }}
|
||||
COS_BUCKET: ${{ secrets.COS_BUCKET }}
|
||||
COS_REGION: ${{ secrets.COS_REGION }}
|
||||
END_POINT: ${{ secrets.END_POINT }}
|
||||
run: |
|
||||
coscmd config -a $TENCENT_SECRET_ID \
|
||||
-s $TENCENT_SECRET_KEY \
|
||||
-b $COS_BUCKET \
|
||||
-r $COS_REGION
|
||||
|
||||
# test
|
||||
- env:
|
||||
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
|
||||
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
|
||||
AWS_DEFAULT_REGION: "us-east-1"
|
||||
VERSION: ${{ github.event.inputs.tags }}
|
||||
RELEASE_ID: ${{ needs.release-id.outputs.id }}
|
||||
REPO_PATH: '${{ secrets.REPO_PATH }}'
|
||||
@@ -104,11 +144,25 @@ jobs:
|
||||
- name: "Checkout source code"
|
||||
uses: actions/checkout@v3
|
||||
|
||||
- name: Install coscmd
|
||||
run: pip install coscmd
|
||||
|
||||
- name: Configure coscmd
|
||||
env:
|
||||
TENCENT_SECRET_ID: ${{ secrets.TENCENT_SECRET_ID }}
|
||||
TENCENT_SECRET_KEY: ${{ secrets.TENCENT_SECRET_KEY }}
|
||||
COS_BUCKET: ${{ secrets.COS_BUCKET }}
|
||||
COS_REGION: ${{ secrets.COS_REGION }}
|
||||
END_POINT: ${{ secrets.END_POINT }}
|
||||
run: |
|
||||
coscmd config -a $TENCENT_SECRET_ID \
|
||||
-s $TENCENT_SECRET_KEY \
|
||||
-b $COS_BUCKET \
|
||||
-r $COS_REGION
|
||||
|
||||
|
||||
# test
|
||||
- env:
|
||||
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
|
||||
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
|
||||
AWS_DEFAULT_REGION: "us-east-1"
|
||||
VERSION: ${{ github.event.inputs.tags }}
|
||||
RELEASE_ID: ${{ needs.release-id.outputs.id }}
|
||||
REPO_PATH: '${{ secrets.REPO_PATH }}'
|
||||
@@ -131,18 +185,30 @@ jobs:
|
||||
run: |
|
||||
bash build/build.sh ${{ github.event.inputs.tags }} ${{ needs.release-id.outputs.id }}
|
||||
|
||||
- name: Upload to S3
|
||||
env:
|
||||
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
|
||||
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
|
||||
AWS_DEFAULT_REGION: 'us-east-1'
|
||||
- name: Install coscmd
|
||||
run: pip install coscmd
|
||||
|
||||
- name: Configure coscmd
|
||||
env:
|
||||
TENCENT_SECRET_ID: ${{ secrets.TENCENT_SECRET_ID }}
|
||||
TENCENT_SECRET_KEY: ${{ secrets.TENCENT_SECRET_KEY }}
|
||||
COS_BUCKET: ${{ secrets.COS_BUCKET }}
|
||||
COS_REGION: ${{ secrets.COS_REGION }}
|
||||
END_POINT: ${{ secrets.END_POINT }}
|
||||
run: |
|
||||
coscmd config -a $TENCENT_SECRET_ID \
|
||||
-s $TENCENT_SECRET_KEY \
|
||||
-b $COS_BUCKET \
|
||||
-r $COS_REGION
|
||||
|
||||
- name: Upload to COS
|
||||
run: |
|
||||
md5sum install-wizard-v${{ github.event.inputs.tags }}.tar.gz > install-wizard-v${{ github.event.inputs.tags }}.md5sum.txt && \
|
||||
aws s3 cp install-wizard-v${{ github.event.inputs.tags }}.md5sum.txt s3://terminus-os-install${{ secrets.REPO_PATH }}install-wizard-v${{ github.event.inputs.tags }}.md5sum.txt --acl=public-read && \
|
||||
aws s3 cp install-wizard-v${{ github.event.inputs.tags }}.tar.gz s3://terminus-os-install${{ secrets.REPO_PATH }}install-wizard-v${{ github.event.inputs.tags }}.tar.gz --acl=public-read
|
||||
coscmd upload install-wizard-v${{ github.event.inputs.tags }}.md5sum.txt ${{ secrets.REPO_PATH }}install-wizard-v${{ github.event.inputs.tags }}.md5sum.txt && \
|
||||
coscmd upload install-wizard-v${{ github.event.inputs.tags }}.tar.gz ${{ secrets.REPO_PATH }}install-wizard-v${{ github.event.inputs.tags }}.tar.gz
|
||||
|
||||
aws s3 cp install-wizard-v${{ github.event.inputs.tags }}.md5sum.txt s3://terminus-os-install${{ secrets.REPO_PATH }}install-wizard-v${{ github.event.inputs.tags }}.${{ needs.release-id.outputs.id }}.md5sum.txt --acl=public-read && \
|
||||
aws s3 cp install-wizard-v${{ github.event.inputs.tags }}.tar.gz s3://terminus-os-install${{ secrets.REPO_PATH }}install-wizard-v${{ github.event.inputs.tags }}.${{ needs.release-id.outputs.id }}.tar.gz --acl=public-read
|
||||
coscmd upload install-wizard-v${{ github.event.inputs.tags }}.md5sum.txt ${{ secrets.REPO_PATH }}install-wizard-v${{ github.event.inputs.tags }}.${{ needs.release-id.outputs.id }}.md5sum.txt && \
|
||||
coscmd upload install-wizard-v${{ github.event.inputs.tags }}.tar.gz ${{ secrets.REPO_PATH }}install-wizard-v${{ github.event.inputs.tags }}.${{ needs.release-id.outputs.id }}.tar.gz
|
||||
|
||||
release:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
@@ -3,10 +3,10 @@
|
||||
# Olares: An Open-Source Personal Cloud to </br>Reclaim Your Data<!-- omit in toc -->
|
||||
|
||||
[](#)<br/>
|
||||
[](https://github.com/beclab/olares/commits/main)
|
||||
[](https://github.com/beclab/olares/commits/main)
|
||||

|
||||
[](https://github.com/beclab/olares/releases)
|
||||
[](https://github.com/beclab/olares/stargazers)
|
||||
[](https://github.com/beclab/olares/releases)
|
||||
[](https://github.com/beclab/Olares/stargazers)
|
||||
[](https://discord.gg/olares)
|
||||
[](https://github.com/beclab/olares/blob/main/LICENSE)
|
||||
|
||||
@@ -45,7 +45,7 @@ Just as Public clouds offer IaaS, PaaS, and SaaS layers, Olares provides open-so
|
||||
|
||||

|
||||
|
||||
For detailed description of each component, refer to [Olares architecture](https://docs.olares.com/manual/concepts/system-architecture.html).
|
||||
For detailed description of each component, refer to [Olares architecture](https://docs.olares.com/developer/concepts/system-architecture.html).
|
||||
|
||||
> 🔍 **How is Olares different from traditional NAS?**
|
||||
>
|
||||
|
||||
@@ -317,7 +317,7 @@ spec:
|
||||
chown -R 1000:1000 /uploadstemp && \
|
||||
chown -R 1000:1000 /appdata
|
||||
- name: olares-app-init
|
||||
image: beclab/system-frontend:v1.8.10
|
||||
image: beclab/system-frontend:v1.9.9
|
||||
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.85
|
||||
image: beclab/user-service:v0.0.86
|
||||
imagePullPolicy: IfNotPresent
|
||||
ports:
|
||||
- containerPort: 3000
|
||||
|
||||
@@ -415,7 +415,7 @@ export default defineComponent({
|
||||
background-color: $background-1;
|
||||
|
||||
.app_title {
|
||||
font-family: 'Inter';
|
||||
font-family: 'Roboto' !important;
|
||||
font-style: normal;
|
||||
font-weight: 600;
|
||||
font-size: 16px;
|
||||
|
||||
@@ -358,7 +358,7 @@ export default defineComponent({
|
||||
left: 0;
|
||||
|
||||
.app_title {
|
||||
font-family: 'Source Han Sans CN';
|
||||
font-family: 'Roboto' !important;
|
||||
font-style: normal;
|
||||
font-weight: 500;
|
||||
font-size: 16px;
|
||||
|
||||
@@ -202,11 +202,15 @@ if [ "$PREINSTALL" == "1" ]; then
|
||||
fi
|
||||
|
||||
|
||||
echo "configuring storage ..."
|
||||
$sh_c "$INSTALL_OLARES_CLI install storage"
|
||||
if [[ $? -ne 0 ]]; then
|
||||
echo "error: failed to configure storage"
|
||||
exit 1
|
||||
if [[ "$JUICEFS" == "1" ]]; then
|
||||
echo "configuring storage for juicefs ..."
|
||||
$sh_c "$INSTALL_OLARES_CLI install storage"
|
||||
if [[ $? -ne 0 ]]; then
|
||||
echo "error: failed to configure storage"
|
||||
exit 1
|
||||
fi
|
||||
else
|
||||
echo "juicefs is not enabled, skip configuring storage"
|
||||
fi
|
||||
|
||||
|
||||
|
||||
@@ -27,4 +27,5 @@ mkdir redis-5.0.14 && \
|
||||
cp /usr/local/bin/redis* ./redis-5.0.14/
|
||||
|
||||
tar czvf ./redis-5.0.14.tar.gz ./redis-5.0.14/ && \
|
||||
aws s3 cp redis-5.0.14.tar.gz s3://terminus-os-install/redis-5.0.14_${os}_${arch}${SUFFIX}.tar.gz --acl=public-read
|
||||
# aws s3 cp redis-5.0.14.tar.gz s3://terminus-os-install/redis-5.0.14_${os}_${arch}${SUFFIX}.tar.gz --acl=public-read
|
||||
coscmd upload redis-5.0.14.tar.gz /redis-5.0.14_${os}_${arch}${SUFFIX}.tar.gz --acl=public-read
|
||||
|
||||
@@ -6,4 +6,5 @@ set -xe
|
||||
curl -Lo Ubuntu2204.appx https://wslstorestorage.blob.core.windows.net/wslblob/Ubuntu2204-221101.AppxBundle
|
||||
ubuntu2204=$(md5sum Ubuntu2204.appx|awk '{print $1}')
|
||||
|
||||
aws s3 cp Ubuntu2204.appx s3://terminus-os-install/${ubuntu2204} --acl=public-read
|
||||
# aws s3 cp Ubuntu2204.appx s3://terminus-os-install/${ubuntu2204} --acl=public-read
|
||||
coscmd upload Ubuntu2204.appx /${ubuntu2204} --acl=public-read
|
||||
|
||||
@@ -6,9 +6,11 @@ set -xe
|
||||
curl -Lo wsl.2.3.26.0.amd64.msi https://github.com/microsoft/WSL/releases/download/2.3.26/wsl.2.3.26.0.x64.msi
|
||||
wsl_2_3_26=$(md5sum wsl.2.3.26.0.amd64.msi|awk '{print $1}')
|
||||
|
||||
aws s3 cp wsl.2.3.26.0.amd64.msi s3://terminus-os-install/${wsl_2_3_26} --acl=public-read
|
||||
# aws s3 cp wsl.2.3.26.0.amd64.msi s3://terminus-os-install/${wsl_2_3_26} --acl=public-read
|
||||
coscmd upload wsl.2.3.26.0.amd64.msi /${wsl_2_3_26} --acl=public-read
|
||||
|
||||
curl -Lo wsl.2.3.26.0.arm64.msi https://github.com/microsoft/WSL/releases/download/2.3.26/wsl.2.3.26.0.arm64.msi
|
||||
wsl_2_3_26_arm64=$(md5sum wsl.2.3.26.0.arm64.msi|awk '{print $1}')
|
||||
|
||||
aws s3 cp wsl.2.3.26.0.arm64.msi s3://terminus-os-install/arm64/${wsl_2_3_26_arm64} --acl=public-read
|
||||
# aws s3 cp wsl.2.3.26.0.arm64.msi s3://terminus-os-install/arm64/${wsl_2_3_26_arm64} --acl=public-read
|
||||
coscmd upload wsl.2.3.26.0.arm64.msi /arm64/${wsl_2_3_26_arm64} --acl=public-read
|
||||
@@ -31,7 +31,7 @@ while read line; do
|
||||
curl -fsSLI https://cdn.olares.com/$path$name > /dev/null
|
||||
if [ $? -ne 0 ]; then
|
||||
code=$(curl -o /dev/null -fsSLI -w "%{http_code}" https://cdn.olares.com/$path$name)
|
||||
if [ $code -eq 403 ]; then
|
||||
if [[ $code -eq 403 || $code -eq 404 ]]; then
|
||||
|
||||
bash ${BASE_DIR}/download-deps.sh $PLATFORM $line
|
||||
if [ $? -ne 0 ]; then
|
||||
@@ -46,28 +46,25 @@ while read line; do
|
||||
fi
|
||||
|
||||
set -ex
|
||||
aws s3 cp $name s3://terminus-os-install/$path$name --acl=public-read
|
||||
aws s3 cp $name s3://terminus-os-install/backup/$path$backup_file --acl=public-read
|
||||
aws s3 cp $checksum s3://terminus-os-install/$path$checksum --acl=public-read
|
||||
echo "upload $name to s3 completed"
|
||||
# aws s3 cp $name s3://terminus-os-install/$path$name --acl=public-read
|
||||
# aws s3 cp $name s3://terminus-os-install/backup/$path$backup_file --acl=public-read
|
||||
# aws s3 cp $checksum s3://terminus-os-install/$path$checksum --acl=public-read
|
||||
# echo "upload $name to s3 completed"
|
||||
|
||||
coscmd upload ./$name /$path$name
|
||||
coscmd upload ./$name /backup/$path$backup_file
|
||||
coscmd upload ./$checksum /$path$checksum
|
||||
echo "upload $name to cos completed"
|
||||
|
||||
set +ex
|
||||
else
|
||||
if [ $code -ne 200 ]; then
|
||||
echo "failed to check image"
|
||||
echo "failed to check file"
|
||||
exit -1
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
|
||||
# upload to tencent cloud cos
|
||||
# curl -fsSLI https://cdn.joinolares.cn/$path$name > /dev/null
|
||||
# if [ $? -ne 0 ]; then
|
||||
# set -ex
|
||||
# coscmd upload ./$name /$path$name
|
||||
# coscmd upload ./$checksum /$path$checksum
|
||||
# echo "upload $name to cos completed"
|
||||
# set +ex
|
||||
# fi
|
||||
done < components
|
||||
|
||||
popd
|
||||
|
||||
@@ -15,7 +15,7 @@ cat $1|while read image; do
|
||||
curl -fsSLI https://cdn.olares.com/$path$name.tar.gz > /dev/null
|
||||
if [ $? -ne 0 ]; then
|
||||
code=$(curl -o /dev/null -fsSLI -w "%{http_code}" https://cdn.olares.com/$path$name.tar.gz)
|
||||
if [ $code -eq 403 ]; then
|
||||
if [[ $code -eq 403 || $code -eq 404 ]]; then
|
||||
set -ex
|
||||
skopeo copy --insecure-policy docker://$image oci-archive:$name.tar
|
||||
gzip $name.tar
|
||||
@@ -28,11 +28,16 @@ cat $1|while read image; do
|
||||
fi
|
||||
|
||||
echo "start to upload [$name.tar.gz]"
|
||||
aws s3 cp $name.tar.gz s3://terminus-os-install/$path$name.tar.gz --acl=public-read
|
||||
aws s3 cp $name.tar.gz s3://terminus-os-install/backup/$path$backup_file --acl=public-read
|
||||
aws s3 cp $checksum s3://terminus-os-install/$path$checksum --acl=public-read
|
||||
echo "upload $name completed"
|
||||
|
||||
# aws s3 cp $name.tar.gz s3://terminus-os-install/$path$name.tar.gz --acl=public-read
|
||||
# aws s3 cp $name.tar.gz s3://terminus-os-install/backup/$path$backup_file --acl=public-read
|
||||
# aws s3 cp $checksum s3://terminus-os-install/$path$checksum --acl=public-read
|
||||
# echo "upload $name completed"
|
||||
|
||||
coscmd upload ./$name.tar.gz /$path$name.tar.gz
|
||||
coscmd upload ./$name.tar.gz /backup/$path$backup_file
|
||||
coscmd upload ./$checksum /$path$checksum
|
||||
echo "upload $name to cos completed"
|
||||
|
||||
set +ex
|
||||
else
|
||||
if [ $code -ne 200 ]; then
|
||||
@@ -48,7 +53,7 @@ cat $1|while read image; do
|
||||
curl -fsSLI https://cdn.olares.com/$path$checksum > /dev/null
|
||||
if [ $? -ne 0 ]; then
|
||||
code=$(curl -o /dev/null -fsSLI -w "%{http_code}" https://cdn.olares.com/$path$checksum)
|
||||
if [ $code -eq 403 ]; then
|
||||
if [[ $code -eq 403 || $code -eq 404 ]]; then
|
||||
set -ex
|
||||
skopeo copy --insecure-policy docker://$image oci-archive:$name.tar
|
||||
gzip $name.tar
|
||||
@@ -60,10 +65,16 @@ cat $1|while read image; do
|
||||
exit 1
|
||||
fi
|
||||
|
||||
aws s3 cp $name.tar.gz s3://terminus-os-install/$path$name.tar.gz --acl=public-read
|
||||
aws s3 cp $name.tar.gz s3://terminus-os-install/backup/$path$backup_file --acl=public-read
|
||||
aws s3 cp $checksum s3://terminus-os-install/$path$checksum --acl=public-read
|
||||
echo "upload $name completed"
|
||||
# aws s3 cp $name.tar.gz s3://terminus-os-install/$path$name.tar.gz --acl=public-read
|
||||
# aws s3 cp $name.tar.gz s3://terminus-os-install/backup/$path$backup_file --acl=public-read
|
||||
# aws s3 cp $checksum s3://terminus-os-install/$path$checksum --acl=public-read
|
||||
# echo "upload $name completed"
|
||||
|
||||
coscmd upload ./$name.tar.gz /$path$name.tar.gz
|
||||
coscmd upload ./$name.tar.gz /backup/$path$backup_file
|
||||
coscmd upload ./$checksum /$path$checksum
|
||||
echo "upload $name to cos completed"
|
||||
|
||||
set +ex
|
||||
else
|
||||
if [ $code -ne 200 ]; then
|
||||
@@ -77,13 +88,16 @@ cat $1|while read image; do
|
||||
curl -fsSLI https://cdn.olares.com/$path$manifest > /dev/null
|
||||
if [ $? -ne 0 ]; then
|
||||
code=$(curl -o /dev/null -fsSLI -w "%{http_code}" https://cdn.olares.com/$path$manifest)
|
||||
if [ $code -eq 403 ]; then
|
||||
if [[ $code -eq 403 || $code -eq 404 ]]; then
|
||||
set -ex
|
||||
BASE_DIR=$(dirname $(realpath -s $0))
|
||||
python3 $BASE_DIR/get-manifest.py $image -o $manifest
|
||||
|
||||
aws s3 cp $manifest s3://terminus-os-install/$path$manifest --acl=public-read
|
||||
# aws s3 cp $manifest s3://terminus-os-install/$path$manifest --acl=public-read
|
||||
|
||||
coscmd upload $manifest /$path$manifest
|
||||
echo "upload $name manifest completed"
|
||||
|
||||
set +ex
|
||||
else
|
||||
if [ $code -ne 200 ]; then
|
||||
|
||||
121
cli/pkg/amdgpu/module.go
Normal file
121
cli/pkg/amdgpu/module.go
Normal file
@@ -0,0 +1,121 @@
|
||||
package amdgpu
|
||||
|
||||
import (
|
||||
"time"
|
||||
|
||||
"github.com/beclab/Olares/cli/pkg/common"
|
||||
"github.com/beclab/Olares/cli/pkg/core/prepare"
|
||||
"github.com/beclab/Olares/cli/pkg/core/task"
|
||||
)
|
||||
|
||||
// InstallAmdContainerToolkitModule installs AMD container toolkit on supported Ubuntu if ROCm is installed.
|
||||
type InstallAmdContainerToolkitModule struct {
|
||||
common.KubeModule
|
||||
Skip bool // conditional execution based on ROCm detection
|
||||
SkipRocmCheck bool
|
||||
}
|
||||
|
||||
func (m *InstallAmdContainerToolkitModule) IsSkip() bool {
|
||||
return m.Skip
|
||||
}
|
||||
|
||||
func (m *InstallAmdContainerToolkitModule) Init() {
|
||||
m.Name = "InstallAmdContainerToolkit"
|
||||
if m.IsSkip() {
|
||||
return
|
||||
}
|
||||
|
||||
prepareCollection := prepare.PrepareCollection{}
|
||||
if !m.SkipRocmCheck {
|
||||
prepareCollection = append(prepareCollection, new(RocmInstalled))
|
||||
}
|
||||
|
||||
updateAmdSource := &task.RemoteTask{
|
||||
Name: "UpdateAmdContainerToolkitSource",
|
||||
Hosts: m.Runtime.GetHostsByRole(common.Master),
|
||||
Action: new(UpdateAmdContainerToolkitSource),
|
||||
Prepare: &prepareCollection,
|
||||
Parallel: false,
|
||||
Retry: 1,
|
||||
}
|
||||
|
||||
installAmdContainerToolkit := &task.RemoteTask{
|
||||
Name: "InstallAmdContainerToolkit",
|
||||
Hosts: m.Runtime.GetHostsByRole(common.Master),
|
||||
Prepare: &prepareCollection,
|
||||
Action: new(InstallAmdContainerToolkit),
|
||||
Parallel: false,
|
||||
Retry: 1,
|
||||
}
|
||||
|
||||
generateAndValidateCDI := &task.RemoteTask{
|
||||
Name: "GenerateAndValidateAmdCDI",
|
||||
Hosts: m.Runtime.GetHostsByRole(common.Master),
|
||||
Prepare: &prepareCollection,
|
||||
Action: new(GenerateAndValidateAmdCDI),
|
||||
Parallel: false,
|
||||
Retry: 1,
|
||||
}
|
||||
|
||||
m.Tasks = []task.Interface{
|
||||
updateAmdSource,
|
||||
installAmdContainerToolkit,
|
||||
generateAndValidateCDI,
|
||||
}
|
||||
}
|
||||
|
||||
// InstallAmdPluginModule installs AMD GPU device plugin on Kubernetes.
|
||||
type InstallAmdPluginModule struct {
|
||||
common.KubeModule
|
||||
Skip bool // conditional execution based on GPU enablement
|
||||
}
|
||||
|
||||
func (m *InstallAmdPluginModule) IsSkip() bool {
|
||||
return m.Skip
|
||||
}
|
||||
|
||||
func (m *InstallAmdPluginModule) Init() {
|
||||
m.Name = "InstallAmdPlugin"
|
||||
|
||||
// update node with AMD GPU labels
|
||||
updateNode := &task.RemoteTask{
|
||||
Name: "UpdateNodeAmdGPUInfo",
|
||||
Hosts: m.Runtime.GetHostsByRole(common.Master),
|
||||
Prepare: &prepare.PrepareCollection{
|
||||
new(common.OnlyFirstMaster),
|
||||
},
|
||||
Action: new(UpdateNodeAmdGPUInfo),
|
||||
Parallel: false,
|
||||
Retry: 1,
|
||||
}
|
||||
|
||||
installPlugin := &task.RemoteTask{
|
||||
Name: "InstallAmdPlugin",
|
||||
Hosts: m.Runtime.GetHostsByRole(common.Master),
|
||||
Prepare: &prepare.PrepareCollection{
|
||||
new(common.OnlyFirstMaster),
|
||||
},
|
||||
Action: new(InstallAmdPlugin),
|
||||
Parallel: false,
|
||||
Retry: 1,
|
||||
}
|
||||
|
||||
checkGpuState := &task.RemoteTask{
|
||||
Name: "CheckAmdGPUState",
|
||||
Hosts: m.Runtime.GetHostsByRole(common.Master),
|
||||
Prepare: &prepare.PrepareCollection{
|
||||
new(common.OnlyFirstMaster),
|
||||
new(RocmInstalled),
|
||||
},
|
||||
Action: new(CheckAmdGpuStatus),
|
||||
Parallel: false,
|
||||
Retry: 50,
|
||||
Delay: 10 * time.Second,
|
||||
}
|
||||
|
||||
m.Tasks = []task.Interface{
|
||||
updateNode,
|
||||
installPlugin,
|
||||
checkGpuState,
|
||||
}
|
||||
}
|
||||
56
cli/pkg/amdgpu/prepares.go
Normal file
56
cli/pkg/amdgpu/prepares.go
Normal file
@@ -0,0 +1,56 @@
|
||||
package amdgpu
|
||||
|
||||
import (
|
||||
"github.com/beclab/Olares/cli/pkg/bootstrap/precheck"
|
||||
"github.com/beclab/Olares/cli/pkg/common"
|
||||
"github.com/beclab/Olares/cli/pkg/core/connector"
|
||||
"github.com/beclab/Olares/cli/pkg/core/logger"
|
||||
)
|
||||
|
||||
// RocmInstalled checks if AMD ROCm is installed on the system.
|
||||
type RocmInstalled struct {
|
||||
common.KubePrepare
|
||||
}
|
||||
|
||||
func (p *RocmInstalled) PreCheck(runtime connector.Runtime) (bool, error) {
|
||||
rocmV, err := connector.RocmVersion()
|
||||
if err != nil {
|
||||
logger.Debugf("ROCm version check error: %v", err)
|
||||
return false, nil
|
||||
}
|
||||
if rocmV == nil {
|
||||
return false, nil
|
||||
}
|
||||
|
||||
logger.Infof("Detected ROCm version: %s", rocmV.Original())
|
||||
return true, nil
|
||||
}
|
||||
|
||||
// RocmNotInstalled checks if AMD ROCm is NOT installed on the system.
|
||||
type RocmNotInstalled struct {
|
||||
common.KubePrepare
|
||||
RocmInstalled
|
||||
}
|
||||
|
||||
func (p *RocmNotInstalled) PreCheck(runtime connector.Runtime) (bool, error) {
|
||||
installed, err := p.RocmInstalled.PreCheck(runtime)
|
||||
if err != nil {
|
||||
return false, err
|
||||
}
|
||||
return !installed, nil
|
||||
}
|
||||
|
||||
// ContainerdInstalled checks if containerd is installed on the system.
|
||||
type ContainerdInstalled struct {
|
||||
common.KubePrepare
|
||||
}
|
||||
|
||||
func (p *ContainerdInstalled) PreCheck(runtime connector.Runtime) (bool, error) {
|
||||
containerdCheck := precheck.ConflictingContainerdCheck{}
|
||||
if err := containerdCheck.Check(runtime); err != nil {
|
||||
return true, nil
|
||||
}
|
||||
|
||||
logger.Info("containerd is not installed, ignore task")
|
||||
return false, nil
|
||||
}
|
||||
@@ -1,17 +1,20 @@
|
||||
package amdgpu
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"os/exec"
|
||||
"path"
|
||||
"path/filepath"
|
||||
|
||||
"github.com/beclab/Olares/cli/pkg/clientset"
|
||||
"github.com/beclab/Olares/cli/pkg/common"
|
||||
cc "github.com/beclab/Olares/cli/pkg/core/common"
|
||||
"github.com/beclab/Olares/cli/pkg/core/connector"
|
||||
"github.com/beclab/Olares/cli/pkg/core/logger"
|
||||
"github.com/beclab/Olares/cli/pkg/core/task"
|
||||
"github.com/beclab/Olares/cli/pkg/utils"
|
||||
"github.com/beclab/Olares/cli/pkg/core/util"
|
||||
"github.com/beclab/Olares/cli/pkg/gpu"
|
||||
|
||||
"github.com/Masterminds/semver/v3"
|
||||
"github.com/pkg/errors"
|
||||
@@ -26,8 +29,8 @@ func (m *InstallAmdRocmModule) Init() {
|
||||
m.Name = "InstallAMDGPU"
|
||||
|
||||
installAmd := &task.RemoteTask{
|
||||
Name: "InstallAmdRocm",
|
||||
Hosts: m.Runtime.GetHostsByRole(common.Master),
|
||||
Name: "InstallAmdRocm",
|
||||
Hosts: m.Runtime.GetHostsByRole(common.Master),
|
||||
Action: &InstallAmdRocm{
|
||||
// no manifest needed
|
||||
},
|
||||
@@ -51,7 +54,7 @@ func (t *InstallAmdRocm) Execute(runtime connector.Runtime) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
amdGPUExists, err := utils.HasAmdIGPU(runtime)
|
||||
amdGPUExists, err := connector.HasAmdAPUOrGPU(runtime)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
@@ -59,7 +62,7 @@ func (t *InstallAmdRocm) Execute(runtime connector.Runtime) error {
|
||||
if !amdGPUExists {
|
||||
return nil
|
||||
}
|
||||
rocmV, _ := utils.RocmVersion()
|
||||
rocmV, _ := connector.RocmVersion()
|
||||
min := semver.MustParse("7.1.1")
|
||||
if rocmV != nil && rocmV.LessThan(min) {
|
||||
return fmt.Errorf("detected ROCm version %s, which is lower than required %s; please uninstall existing ROCm/AMDGPU components before installation with command: olares-cli amdgpu uninstall", rocmV.Original(), min.Original())
|
||||
@@ -131,3 +134,163 @@ func (t *AmdgpuUninstallAction) Execute(runtime connector.Runtime) error {
|
||||
logger.Warn("Warning: Please reboot your machine after uninstall to fully remove ROCm components.")
|
||||
return nil
|
||||
}
|
||||
|
||||
// UpdateAmdContainerToolkitSource configures the AMD container toolkit APT repository.
|
||||
type UpdateAmdContainerToolkitSource struct {
|
||||
common.KubeAction
|
||||
}
|
||||
|
||||
func (t *UpdateAmdContainerToolkitSource) Execute(runtime connector.Runtime) error {
|
||||
// Install prerequisites
|
||||
if _, err := runtime.GetRunner().SudoCmd("apt update && apt install -y wget gnupg2", false, true); err != nil {
|
||||
return errors.Wrap(errors.WithStack(err), "failed to install prerequisites for AMD container toolkit")
|
||||
}
|
||||
|
||||
if _, err := runtime.GetRunner().SudoCmd("install -d -m 0755 /etc/apt/keyrings", false, true); err != nil {
|
||||
return errors.Wrap(errors.WithStack(err), "failed to create /etc/apt/keyrings directory")
|
||||
}
|
||||
|
||||
cmd := "wget https://repo.radeon.com/rocm/rocm.gpg.key -O - | gpg --dearmor | tee /etc/apt/keyrings/rocm.gpg > /dev/null"
|
||||
if _, err := runtime.GetRunner().SudoCmd(cmd, false, true); err != nil {
|
||||
return errors.Wrap(errors.WithStack(err), "failed to download and install AMD ROCm GPG key")
|
||||
}
|
||||
|
||||
si := runtime.GetSystemInfo()
|
||||
var ubuntuCodename string
|
||||
if si.IsUbuntuVersionEqual(connector.Ubuntu2404) {
|
||||
ubuntuCodename = "noble"
|
||||
} else if si.IsUbuntuVersionEqual(connector.Ubuntu2204) {
|
||||
ubuntuCodename = "jammy"
|
||||
} else {
|
||||
return fmt.Errorf("unsupported Ubuntu version for AMD container toolkit")
|
||||
}
|
||||
|
||||
aptSourceLine := fmt.Sprintf("deb [signed-by=/etc/apt/keyrings/rocm.gpg] https://repo.radeon.com/amd-container-toolkit/apt/ %s main", ubuntuCodename)
|
||||
cmd = fmt.Sprintf("echo '%s' > /etc/apt/sources.list.d/amd-container-toolkit.list", aptSourceLine)
|
||||
if _, err := runtime.GetRunner().SudoCmd(cmd, false, true); err != nil {
|
||||
return errors.Wrap(errors.WithStack(err), "failed to add AMD container toolkit APT source")
|
||||
}
|
||||
|
||||
logger.Infof("AMD container toolkit repository configured successfully")
|
||||
return nil
|
||||
}
|
||||
|
||||
// InstallAmdContainerToolkit installs the AMD container toolkit package.
|
||||
type InstallAmdContainerToolkit struct {
|
||||
common.KubeAction
|
||||
}
|
||||
|
||||
func (t *InstallAmdContainerToolkit) Execute(runtime connector.Runtime) error {
|
||||
logger.Infof("Installing AMD container toolkit...")
|
||||
if _, err := runtime.GetRunner().SudoCmd("apt update && apt install -y amd-container-toolkit", false, true); err != nil {
|
||||
return errors.Wrap(errors.WithStack(err), "failed to install AMD container toolkit")
|
||||
}
|
||||
logger.Infof("AMD container toolkit installed successfully")
|
||||
return nil
|
||||
}
|
||||
|
||||
// GenerateAndValidateAmdCDI generates and validates the AMD CDI spec.
|
||||
type GenerateAndValidateAmdCDI struct {
|
||||
common.KubeAction
|
||||
}
|
||||
|
||||
func (t *GenerateAndValidateAmdCDI) Execute(runtime connector.Runtime) error {
|
||||
// Ensure /etc/cdi directory exists
|
||||
if _, err := runtime.GetRunner().SudoCmd("install -d -m 0755 /etc/cdi", false, true); err != nil {
|
||||
return errors.Wrap(errors.WithStack(err), "failed to create /etc/cdi directory")
|
||||
}
|
||||
|
||||
// Generate CDI spec
|
||||
logger.Infof("Generating AMD CDI spec...")
|
||||
if _, err := runtime.GetRunner().SudoCmd("amd-ctk cdi generate --output=/etc/cdi/amd.json", false, true); err != nil {
|
||||
return errors.Wrap(errors.WithStack(err), "failed to generate AMD CDI spec")
|
||||
}
|
||||
|
||||
// Validate CDI spec
|
||||
logger.Infof("Validating AMD CDI spec...")
|
||||
if _, err := runtime.GetRunner().SudoCmd("amd-ctk cdi validate --path=/etc/cdi/amd.json", false, true); err != nil {
|
||||
return errors.Wrap(errors.WithStack(err), "failed to validate AMD CDI spec")
|
||||
}
|
||||
|
||||
logger.Infof("AMD CDI spec generated and validated successfully")
|
||||
return nil
|
||||
}
|
||||
|
||||
// UpdateNodeAmdGPUInfo updates Kubernetes node labels with AMD GPU information.
|
||||
type UpdateNodeAmdGPUInfo struct {
|
||||
common.KubeAction
|
||||
}
|
||||
|
||||
func (u *UpdateNodeAmdGPUInfo) Execute(runtime connector.Runtime) error {
|
||||
client, err := clientset.NewKubeClient()
|
||||
if err != nil {
|
||||
return errors.Wrap(errors.WithStack(err), "kubeclient create error")
|
||||
}
|
||||
|
||||
// Check if AMD GPU/APU exists
|
||||
amdGPUExists, err := connector.HasAmdAPUOrGPU(runtime)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if !amdGPUExists {
|
||||
logger.Info("AMD GPU/APU is not detected")
|
||||
return nil
|
||||
}
|
||||
|
||||
// Get ROCm version
|
||||
rocmV, err := connector.RocmVersion()
|
||||
if err != nil || rocmV == nil {
|
||||
logger.Info("ROCm is not installed")
|
||||
return nil
|
||||
}
|
||||
|
||||
rocmVersion := rocmV.Original()
|
||||
|
||||
// Determine GPU type (APU vs discrete GPU)
|
||||
gpuType := gpu.AmdGpuCardType
|
||||
if runtime.GetSystemInfo().IsAmdApu() {
|
||||
gpuType = gpu.AmdApuCardType
|
||||
}
|
||||
|
||||
// Use ROCm version as both driver and "cuda" version for AMD
|
||||
return gpu.UpdateNodeGpuLabel(context.Background(), client.Kubernetes(), &rocmVersion, nil, nil, &gpuType)
|
||||
}
|
||||
|
||||
// InstallAmdPlugin installs the AMD GPU device plugin DaemonSet.
|
||||
type InstallAmdPlugin struct {
|
||||
common.KubeAction
|
||||
}
|
||||
|
||||
func (t *InstallAmdPlugin) Execute(runtime connector.Runtime) error {
|
||||
amdPluginPath := path.Join(runtime.GetInstallerDir(), "wizard/config/gpu/nvidia/amdgpu-device-plugin.yaml")
|
||||
_, err := runtime.GetRunner().SudoCmd(fmt.Sprintf("kubectl apply -f %s", amdPluginPath), false, true)
|
||||
if err != nil {
|
||||
return errors.Wrap(errors.WithStack(err), "failed to apply AMD GPU device plugin")
|
||||
}
|
||||
|
||||
logger.Infof("AMD GPU device plugin installed successfully")
|
||||
return nil
|
||||
}
|
||||
|
||||
// CheckAmdGpuStatus checks if the AMD GPU device plugin pod is running.
|
||||
type CheckAmdGpuStatus struct {
|
||||
common.KubeAction
|
||||
}
|
||||
|
||||
func (t *CheckAmdGpuStatus) Execute(runtime connector.Runtime) error {
|
||||
kubectlpath, err := util.GetCommand(common.CommandKubectl)
|
||||
if err != nil {
|
||||
return fmt.Errorf("kubectl not found")
|
||||
}
|
||||
|
||||
// Check AMD device plugin pod status using the label from amdgpu-device-plugin.yaml
|
||||
selector := "name=amdgpu-dp-ds"
|
||||
cmd := fmt.Sprintf("%s get pod -n kube-system -l '%s' -o jsonpath='{.items[*].status.phase}'", kubectlpath, selector)
|
||||
|
||||
rphase, _ := runtime.GetRunner().SudoCmd(cmd, false, false)
|
||||
if rphase == "Running" {
|
||||
logger.Infof("AMD GPU device plugin is running")
|
||||
return nil
|
||||
}
|
||||
return fmt.Errorf("AMD GPU device plugin state is not Running (current: %s)", rphase)
|
||||
}
|
||||
|
||||
@@ -59,7 +59,7 @@ func (t *PatchTask) Execute(runtime connector.Runtime) error {
|
||||
pre_reqs = pre_reqs + " network-manager "
|
||||
}
|
||||
|
||||
pre_reqs += " conntrack socat apache2-utils net-tools make gcc bison flex tree unzip "
|
||||
pre_reqs += " conntrack socat apache2-utils net-tools make gcc bison flex tree unzip lshw"
|
||||
|
||||
var systemInfo = runtime.GetSystemInfo()
|
||||
var platformFamily = systemInfo.GetOsPlatformFamily()
|
||||
|
||||
@@ -338,7 +338,9 @@ func (c *CudaChecker) Name() string {
|
||||
}
|
||||
|
||||
func (c *CudaChecker) Check(runtime connector.Runtime) error {
|
||||
if !runtime.GetSystemInfo().IsLinux() {
|
||||
if !runtime.GetSystemInfo().IsLinux() ||
|
||||
// Skip check on NVIDIA DGX Spark systems, which have their own GPU management
|
||||
runtime.GetSystemInfo().IsGB10Chip() {
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -388,17 +390,17 @@ func (r *RocmChecker) Check(runtime connector.Runtime) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
// detect AMD GPU presence
|
||||
amdGPUExists, err := utils.HasAmdIGPU(runtime)
|
||||
// detect AMD APU/GPU presence
|
||||
amdGPUExists, err := connector.HasAmdAPUOrGPU(runtime)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
// no AMD GPU found, no need to check rocm
|
||||
// no AMD APU/GPU found, no need to check rocm
|
||||
if !amdGPUExists {
|
||||
return nil
|
||||
}
|
||||
|
||||
curV, err := utils.RocmVersion()
|
||||
curV, err := connector.RocmVersion()
|
||||
if err != nil && !os.IsNotExist(err) {
|
||||
return err
|
||||
}
|
||||
|
||||
@@ -210,6 +210,7 @@ func NewArgument() *Argument {
|
||||
arg.IsCloudInstance, _ = strconv.ParseBool(os.Getenv(ENV_TERMINUS_IS_CLOUD_VERSION))
|
||||
arg.IsOlaresInContainer = os.Getenv(ENV_CONTAINER_MODE) == "oic"
|
||||
si.IsOIC = arg.IsOlaresInContainer
|
||||
si.ProductName = arg.GetProductName()
|
||||
|
||||
// Ensure BaseDir is initialized before loading master.conf
|
||||
// so master host config can be loaded from ${base-dir}/master.conf reliably.
|
||||
@@ -415,6 +416,57 @@ func (a *Argument) SetSwapConfig(config SwapConfig) {
|
||||
a.Swappiness = config.Swappiness
|
||||
}
|
||||
|
||||
func (a *Argument) SetMasterHostOverride(config MasterHostConfig) {
|
||||
if config.MasterHost != "" {
|
||||
a.MasterHost = config.MasterHost
|
||||
}
|
||||
if config.MasterNodeName != "" {
|
||||
a.MasterNodeName = config.MasterNodeName
|
||||
}
|
||||
|
||||
// set a dummy name to bypass validity checks
|
||||
// as it will be overridden later when the node name is fetched
|
||||
if a.MasterNodeName == "" {
|
||||
a.MasterNodeName = "master"
|
||||
}
|
||||
if config.MasterSSHPassword != "" {
|
||||
a.MasterSSHPassword = config.MasterSSHPassword
|
||||
}
|
||||
if config.MasterSSHUser != "" {
|
||||
a.MasterSSHUser = config.MasterSSHUser
|
||||
}
|
||||
if config.MasterSSHPort != 0 {
|
||||
a.MasterSSHPort = config.MasterSSHPort
|
||||
}
|
||||
if config.MasterSSHPrivateKeyPath != "" {
|
||||
a.MasterSSHPrivateKeyPath = config.MasterSSHPrivateKeyPath
|
||||
}
|
||||
}
|
||||
|
||||
func (a *Argument) LoadMasterHostConfigIfAny() error {
|
||||
if a.BaseDir == "" {
|
||||
return errors.New("basedir unset")
|
||||
}
|
||||
content, err := os.ReadFile(filepath.Join(a.BaseDir, MasterHostConfigFile))
|
||||
if os.IsNotExist(err) {
|
||||
return nil
|
||||
}
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
return json.Unmarshal(content, a.MasterHostConfig)
|
||||
}
|
||||
|
||||
func (a *Argument) GetProductName() string {
|
||||
data, err := os.ReadFile("/sys/class/dmi/id/product_name")
|
||||
if err != nil {
|
||||
fmt.Printf("\nCannot get product name on this device, %s\n", err)
|
||||
return ""
|
||||
}
|
||||
|
||||
return strings.TrimSpace(string(data))
|
||||
}
|
||||
|
||||
func NewKubeRuntime(arg Argument) (*KubeRuntime, error) {
|
||||
loader := NewLoader(arg)
|
||||
cluster, err := loader.Load()
|
||||
|
||||
@@ -98,4 +98,6 @@ const (
|
||||
|
||||
const (
|
||||
ZfsSnapshotter = "/var/lib/containerd/io.containerd.snapshotter.v1.zfs"
|
||||
|
||||
ENV_GB10_CHIP = "GB10_CHIP" // for building images for NVIDIA GB10 Superchip systems
|
||||
)
|
||||
|
||||
117
cli/pkg/core/connector/amdgpu.go
Normal file
117
cli/pkg/core/connector/amdgpu.go
Normal file
@@ -0,0 +1,117 @@
|
||||
package connector
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"os"
|
||||
"os/exec"
|
||||
"strings"
|
||||
|
||||
"github.com/Masterminds/semver/v3"
|
||||
)
|
||||
|
||||
func hasAmdAPU(cmdExec func(s string) (string, error)) (bool, error) {
|
||||
// Detect by CPU model names that bundle AMD AI NPU/graphics
|
||||
targets := []string{
|
||||
"AMD Ryzen AI Max+ 395",
|
||||
"AMD Ryzen AI Max 390",
|
||||
"AMD Ryzen AI Max 385",
|
||||
"AMD Ryzen AI 9 HX 375",
|
||||
"AMD Ryzen AI 9 HX 370",
|
||||
"AMD Ryzen AI 9 365",
|
||||
}
|
||||
// try lscpu first: extract 'Model name' field
|
||||
out, err := cmdExec("lscpu 2>/dev/null | awk -F': *' '/^Model name/{print $2; exit}' || true")
|
||||
if err != nil {
|
||||
return false, err
|
||||
}
|
||||
if out != "" {
|
||||
lo := strings.ToLower(strings.TrimSpace(out))
|
||||
for _, t := range targets {
|
||||
if strings.Contains(lo, strings.ToLower(t)) {
|
||||
return true, nil
|
||||
}
|
||||
}
|
||||
}
|
||||
// fallback to /proc/cpuinfo
|
||||
out, err = cmdExec("awk -F': *' '/^model name/{print $2; exit}' /proc/cpuinfo 2>/dev/null || true")
|
||||
if err != nil {
|
||||
return false, err
|
||||
}
|
||||
if out != "" {
|
||||
lo := strings.ToLower(strings.TrimSpace(out))
|
||||
for _, t := range targets {
|
||||
if strings.Contains(lo, strings.ToLower(t)) {
|
||||
return true, nil
|
||||
}
|
||||
}
|
||||
}
|
||||
return false, nil
|
||||
}
|
||||
|
||||
func hasAmdAPUOrGPU(cmdExec func(s string) (string, error)) (bool, error) {
|
||||
out, err := cmdExec("lspci -d '1002:' 2>/dev/null | grep 'AMD' || true")
|
||||
if err != nil {
|
||||
return false, err
|
||||
}
|
||||
if out != "" {
|
||||
return true, nil
|
||||
}
|
||||
out, err = cmdExec("lshw -c display -numeric -disable network 2>/dev/null | grep 'vendor: .* \\[1002\\]' || true")
|
||||
if err != nil {
|
||||
return false, err
|
||||
}
|
||||
if out != "" {
|
||||
return true, nil
|
||||
}
|
||||
return false, nil
|
||||
}
|
||||
|
||||
func HasAmdAPU(execRuntime Runtime) (bool, error) {
|
||||
return hasAmdAPU(func(s string) (string, error) {
|
||||
return execRuntime.GetRunner().SudoCmd(s, false, false)
|
||||
})
|
||||
}
|
||||
|
||||
func HasAmdAPULocal() (bool, error) {
|
||||
return hasAmdAPU(func(s string) (string, error) {
|
||||
out, err := exec.Command("sh", "-c", s).Output()
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
return string(out), nil
|
||||
})
|
||||
}
|
||||
|
||||
func HasAmdAPUOrGPULocal() (bool, error) {
|
||||
return hasAmdAPUOrGPU(func(s string) (string, error) {
|
||||
out, err := exec.Command("sh", "-c", s).Output()
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
return string(out), nil
|
||||
})
|
||||
}
|
||||
|
||||
func HasAmdAPUOrGPU(execRuntime Runtime) (bool, error) {
|
||||
return hasAmdAPUOrGPU(func(s string) (string, error) {
|
||||
return execRuntime.GetRunner().SudoCmd(s, false, false)
|
||||
})
|
||||
}
|
||||
|
||||
func RocmVersion() (*semver.Version, error) {
|
||||
const rocmVersionFile = "/opt/rocm/.info/version"
|
||||
data, err := os.ReadFile(rocmVersionFile)
|
||||
if err != nil {
|
||||
// no ROCm installed, nothing to check
|
||||
if os.IsNotExist(err) {
|
||||
return nil, err
|
||||
}
|
||||
return nil, err
|
||||
}
|
||||
curStr := strings.TrimSpace(string(data))
|
||||
cur, err := semver.NewVersion(curStr)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("invalid rocm version: %s", curStr)
|
||||
}
|
||||
return cur, nil
|
||||
}
|
||||
@@ -76,6 +76,10 @@ type Systems interface {
|
||||
IsPveOrPveLxc() bool
|
||||
IsRaspbian() bool
|
||||
IsLinux() bool
|
||||
IsGB10Chip() bool
|
||||
IsAmdApu() bool
|
||||
IsAmdGPU() bool
|
||||
IsAmdGPUOrAPU() bool
|
||||
|
||||
IsUbuntu() bool
|
||||
IsDebian() bool
|
||||
@@ -111,16 +115,18 @@ type Systems interface {
|
||||
}
|
||||
|
||||
type SystemInfo struct {
|
||||
HostInfo *HostInfo `json:"host"`
|
||||
CpuInfo *CpuInfo `json:"cpu"`
|
||||
DiskInfo *DiskInfo `json:"disk"`
|
||||
MemoryInfo *MemoryInfo `json:"memory"`
|
||||
FsInfo *FileSystemInfo `json:"filesystem"`
|
||||
CgroupInfo *CgroupInfo `json:"cgroup,omitempty"`
|
||||
LocalIp string `json:"local_ip"`
|
||||
NatGateway string `json:"nat_gateway"`
|
||||
PkgManager string `json:"pkg_manager"`
|
||||
IsOIC bool `json:"is_oic,omitempty"`
|
||||
HostInfo *HostInfo `json:"host"`
|
||||
CpuInfo *CpuInfo `json:"cpu"`
|
||||
DiskInfo *DiskInfo `json:"disk"`
|
||||
MemoryInfo *MemoryInfo `json:"memory"`
|
||||
FsInfo *FileSystemInfo `json:"filesystem"`
|
||||
CgroupInfo *CgroupInfo `json:"cgroup,omitempty"`
|
||||
LocalIp string `json:"local_ip"`
|
||||
NatGateway string `json:"nat_gateway"`
|
||||
PkgManager string `json:"pkg_manager"`
|
||||
IsOIC bool `json:"is_oic,omitempty"`
|
||||
ProductName string `json:"product_name,omitempty"`
|
||||
HasAmdGPU bool `json:"has_amd_gpu,omitempty"`
|
||||
}
|
||||
|
||||
func (s *SystemInfo) IsSupport() error {
|
||||
@@ -235,6 +241,22 @@ func (s *SystemInfo) IsLinux() bool {
|
||||
return s.HostInfo.OsType == common.Linux
|
||||
}
|
||||
|
||||
func (s *SystemInfo) IsGB10Chip() bool {
|
||||
return s.CpuInfo.IsGB10Chip
|
||||
}
|
||||
|
||||
func (s *SystemInfo) IsAmdApu() bool {
|
||||
return s.CpuInfo.HasAmdAPU
|
||||
}
|
||||
|
||||
func (s *SystemInfo) IsAmdGPU() bool {
|
||||
return s.HasAmdGPU
|
||||
}
|
||||
|
||||
func (s *SystemInfo) IsAmdGPUOrAPU() bool {
|
||||
return s.CpuInfo.HasAmdAPU || s.HasAmdGPU
|
||||
}
|
||||
|
||||
func (s *SystemInfo) IsUbuntu() bool {
|
||||
return s.HostInfo.OsPlatformFamily == common.Ubuntu
|
||||
}
|
||||
@@ -322,6 +344,12 @@ func GetSystemInfo() *SystemInfo {
|
||||
si.MemoryInfo = getMem()
|
||||
si.FsInfo = getFs()
|
||||
|
||||
hasAmdGPU, err := getAmdGPU()
|
||||
if err != nil {
|
||||
panic(errors.Wrap(err, "failed to get amd apu/gpu"))
|
||||
}
|
||||
si.HasAmdGPU = hasAmdGPU
|
||||
|
||||
localIP, err := util.GetLocalIP()
|
||||
if err != nil {
|
||||
panic(errors.Wrap(err, "failed to get local ip"))
|
||||
@@ -437,6 +465,28 @@ type CpuInfo struct {
|
||||
CpuModel string `json:"cpu_model"`
|
||||
CpuLogicalCount int `json:"cpu_logical_count"`
|
||||
CpuPhysicalCount int `json:"cpu_physical_count"`
|
||||
IsGB10Chip bool `json:"is_gb10_chip,omitempty"`
|
||||
HasAmdAPU bool `json:"has_amd_apu,omitempty"`
|
||||
}
|
||||
|
||||
// Not considering the case where AMD GPU and AMD APU coexist.
|
||||
func getAmdGPU() (bool, error) {
|
||||
APUOrGPUExists, err := HasAmdAPUOrGPULocal()
|
||||
if err != nil {
|
||||
fmt.Printf("Error checking AMD APU/GPU: %v\n", err)
|
||||
return false, err
|
||||
}
|
||||
|
||||
hasAmdAPU, err := HasAmdAPULocal()
|
||||
if err != nil {
|
||||
fmt.Printf("Error checking AMD APU: %v\n", err)
|
||||
return false, err
|
||||
}
|
||||
|
||||
if APUOrGPUExists && !hasAmdAPU {
|
||||
return true, nil
|
||||
}
|
||||
return false, nil
|
||||
}
|
||||
|
||||
func getCpu() *CpuInfo {
|
||||
@@ -452,10 +502,36 @@ func getCpu() *CpuInfo {
|
||||
cpuModel = cpuInfo[0].ModelName
|
||||
}
|
||||
|
||||
// check if is GB10 chip
|
||||
isGB10Chip := false
|
||||
|
||||
// In Linux systems, it is recognized via lspci as "NVIDIA Corporation Device 2e12 (rev a1)
|
||||
// or NVIDIA Corporation GB20B [GB10] (rev a1)
|
||||
cmd := exec.Command("sh", "-c", "lspci | grep -i vga | egrep 'GB10|2e12'")
|
||||
output, err := cmd.Output()
|
||||
if err == nil && strings.TrimSpace(string(output)) != "" {
|
||||
isGB10Chip = true
|
||||
} else {
|
||||
fmt.Printf("Error checking GB10 chip: %v\n", err)
|
||||
gb10env := os.Getenv(common.ENV_GB10_CHIP)
|
||||
if gb10env == "1" || strings.EqualFold(gb10env, "true") {
|
||||
isGB10Chip = true
|
||||
}
|
||||
}
|
||||
|
||||
// check if it has amd igpu
|
||||
hasAmdAPU, err := HasAmdAPULocal()
|
||||
if err != nil {
|
||||
fmt.Printf("Error checking AMD iGPU: %v\n", err)
|
||||
hasAmdAPU = false
|
||||
}
|
||||
|
||||
return &CpuInfo{
|
||||
CpuModel: cpuModel,
|
||||
CpuLogicalCount: cpuLogicalCount,
|
||||
CpuPhysicalCount: cpuPhysicalCount,
|
||||
IsGB10Chip: isGB10Chip,
|
||||
HasAmdAPU: hasAmdAPU,
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -27,7 +27,7 @@ var (
|
||||
ETCDService = template.Must(template.New("etcd.service").Parse(
|
||||
dedent.Dedent(`[Unit]
|
||||
Description=etcd
|
||||
After=network.target
|
||||
After=network-online.target
|
||||
StartLimitIntervalSec=0
|
||||
|
||||
[Service]
|
||||
|
||||
@@ -37,6 +37,11 @@ type CudaInstalled struct {
|
||||
}
|
||||
|
||||
func (p *CudaInstalled) PreCheck(runtime connector.Runtime) (bool, error) {
|
||||
if runtime.GetSystemInfo().IsGB10Chip() {
|
||||
logger.Debug("Assume DGX Spark or GB10 OEM system has CUDA installed")
|
||||
return true, nil
|
||||
}
|
||||
|
||||
st, err := utils.GetNvidiaStatus(runtime)
|
||||
if err != nil {
|
||||
return false, err
|
||||
@@ -50,17 +55,15 @@ func (p *CudaInstalled) PreCheck(runtime connector.Runtime) (bool, error) {
|
||||
|
||||
type CudaNotInstalled struct {
|
||||
common.KubePrepare
|
||||
CudaInstalled
|
||||
}
|
||||
|
||||
func (p *CudaNotInstalled) PreCheck(runtime connector.Runtime) (bool, error) {
|
||||
st, err := utils.GetNvidiaStatus(runtime)
|
||||
installed, err := p.CudaInstalled.PreCheck(runtime)
|
||||
if err != nil {
|
||||
return false, err
|
||||
}
|
||||
if st == nil || !st.Installed {
|
||||
return true, nil
|
||||
}
|
||||
return false, nil
|
||||
return !installed, nil
|
||||
}
|
||||
|
||||
type CurrentNodeInK8s struct {
|
||||
|
||||
@@ -325,7 +325,8 @@ func (t *CheckGpuStatus) Execute(runtime connector.Runtime) error {
|
||||
return fmt.Errorf("kubectl not found")
|
||||
}
|
||||
|
||||
cmd := fmt.Sprintf("%s get pod -n kube-system -l 'app.kubernetes.io/component=hami-device-plugin' -o jsonpath='{.items[*].status.phase}'", kubectlpath)
|
||||
selector := "app.kubernetes.io/component=hami-device-plugin"
|
||||
cmd := fmt.Sprintf("%s get pod -n kube-system -l '%s' -o jsonpath='{.items[*].status.phase}'", kubectlpath, selector)
|
||||
|
||||
rphase, _ := runtime.GetRunner().SudoCmd(cmd, false, false)
|
||||
if rphase == "Running" {
|
||||
@@ -363,7 +364,16 @@ func (u *UpdateNodeGPUInfo) Execute(runtime connector.Runtime) error {
|
||||
driverVersion = st.LibraryVersion
|
||||
}
|
||||
|
||||
return UpdateNodeGpuLabel(context.Background(), client.Kubernetes(), &driverVersion, &st.CudaVersion, &supported)
|
||||
// TODO:
|
||||
gpuType := NvidiaCardType
|
||||
switch {
|
||||
case runtime.GetSystemInfo().IsAmdApu():
|
||||
gpuType = AmdApuCardType
|
||||
case runtime.GetSystemInfo().IsGB10Chip():
|
||||
gpuType = GB10ChipType
|
||||
}
|
||||
|
||||
return UpdateNodeGpuLabel(context.Background(), client.Kubernetes(), &driverVersion, &st.CudaVersion, &supported, &gpuType)
|
||||
}
|
||||
|
||||
type RemoveNodeLabels struct {
|
||||
@@ -376,12 +386,12 @@ func (u *RemoveNodeLabels) Execute(runtime connector.Runtime) error {
|
||||
return errors.Wrap(errors.WithStack(err), "kubeclient create error")
|
||||
}
|
||||
|
||||
return UpdateNodeGpuLabel(context.Background(), client.Kubernetes(), nil, nil, nil)
|
||||
return UpdateNodeGpuLabel(context.Background(), client.Kubernetes(), nil, nil, nil, nil)
|
||||
}
|
||||
|
||||
// update k8s node labels gpu.bytetrade.io/driver and gpu.bytetrade.io/cuda.
|
||||
// if labels are not exists, create it.
|
||||
func UpdateNodeGpuLabel(ctx context.Context, client kubernetes.Interface, driver, cuda *string, supported *string) error {
|
||||
func UpdateNodeGpuLabel(ctx context.Context, client kubernetes.Interface, driver, cuda *string, supported *string, gpuType *string) error {
|
||||
// get node name from hostname
|
||||
nodeName, err := os.Hostname()
|
||||
if err != nil {
|
||||
@@ -408,6 +418,7 @@ func UpdateNodeGpuLabel(ctx context.Context, client kubernetes.Interface, driver
|
||||
{GpuDriverLabel, driver},
|
||||
{GpuCudaLabel, cuda},
|
||||
{GpuCudaSupportedLabel, supported},
|
||||
{GpuType, gpuType},
|
||||
} {
|
||||
old, ok := labels[label.key]
|
||||
switch {
|
||||
|
||||
@@ -8,4 +8,13 @@ var (
|
||||
GpuDriverLabel = GpuLabelGroup + "/driver"
|
||||
GpuCudaLabel = GpuLabelGroup + "/cuda"
|
||||
GpuCudaSupportedLabel = GpuLabelGroup + "/cuda-supported"
|
||||
GpuType = GpuLabelGroup + "/type"
|
||||
)
|
||||
|
||||
const (
|
||||
NvidiaCardType = "nvidia" // handling by HAMi
|
||||
AmdGpuCardType = "amd-gpu" //
|
||||
AmdApuCardType = "amd-apu" // AMD APU with integrated GPU , AI Max 395 etc.
|
||||
GB10ChipType = "nvidia-gb10" // NVIDIA GB10 Superchip & unified system memory
|
||||
StrixHaloChipType = "strix-halo" // AMD Strix Halo GPU & unified system memory
|
||||
)
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
package cluster
|
||||
|
||||
import (
|
||||
"github.com/beclab/Olares/cli/pkg/amdgpu"
|
||||
"github.com/beclab/Olares/cli/pkg/common"
|
||||
"github.com/beclab/Olares/cli/pkg/core/module"
|
||||
"github.com/beclab/Olares/cli/pkg/gpu"
|
||||
@@ -58,6 +59,12 @@ func (l *linuxInstallPhaseBuilder) installGpuPlugin() phase {
|
||||
return []module.Module{
|
||||
&gpu.RestartK3sServiceModule{Skip: !(l.runtime.Arg.Kubetype == common.K3s)},
|
||||
&gpu.InstallPluginModule{Skip: skipGpuPlugin},
|
||||
&amdgpu.InstallAmdPluginModule{Skip: func() bool {
|
||||
if l.runtime.GetSystemInfo().IsAmdGPUOrAPU() {
|
||||
return false
|
||||
}
|
||||
return true
|
||||
}()},
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -83,6 +83,13 @@ func (l *linuxPhaseBuilder) build() []module.Module {
|
||||
addModule(gpuModuleBuilder(func() []module.Module {
|
||||
return []module.Module{
|
||||
&amdgpu.InstallAmdRocmModule{},
|
||||
&amdgpu.InstallAmdContainerToolkitModule{Skip: func() bool {
|
||||
if l.runtime.GetSystemInfo().IsAmdGPUOrAPU() {
|
||||
return false
|
||||
}
|
||||
return true
|
||||
}(),
|
||||
},
|
||||
&gpu.InstallDriversModule{
|
||||
ManifestModule: manifest.ManifestModule{
|
||||
Manifest: l.manifestMap,
|
||||
|
||||
@@ -9,7 +9,6 @@ import (
|
||||
"github.com/beclab/Olares/cli/pkg/core/connector"
|
||||
"github.com/beclab/Olares/cli/pkg/core/logger"
|
||||
"github.com/beclab/Olares/cli/pkg/core/task"
|
||||
"github.com/beclab/Olares/cli/pkg/utils"
|
||||
)
|
||||
|
||||
type WelcomeMessage struct {
|
||||
@@ -73,7 +72,7 @@ func (t *WelcomeMessage) Execute(runtime connector.Runtime) error {
|
||||
|
||||
// If AMD GPU on Ubuntu 22.04/24.04, print warning about reboot for ROCm
|
||||
if si := runtime.GetSystemInfo(); si.IsUbuntu() && (si.IsUbuntuVersionEqual(connector.Ubuntu2204) || si.IsUbuntuVersionEqual(connector.Ubuntu2404)) {
|
||||
if hasAmd, _ := utils.HasAmdIGPU(runtime); hasAmd {
|
||||
if hasAmd, _ := connector.HasAmdAPUOrGPU(runtime); hasAmd {
|
||||
logger.Warnf("\x1b[31mWarning: To enable ROCm, please reboot your machine after activation.\x1b[0m")
|
||||
fmt.Println()
|
||||
}
|
||||
|
||||
@@ -7,19 +7,19 @@ import (
|
||||
"github.com/beclab/Olares/cli/pkg/core/task"
|
||||
)
|
||||
|
||||
type upgrader_1_12_5_20260122 struct {
|
||||
type upgrader_1_12_5_20260225 struct {
|
||||
breakingUpgraderBase
|
||||
}
|
||||
|
||||
func (u upgrader_1_12_5_20260122) Version() *semver.Version {
|
||||
return semver.MustParse("1.12.5-20260122")
|
||||
func (u upgrader_1_12_5_20260225) Version() *semver.Version {
|
||||
return semver.MustParse("1.12.5-20260225")
|
||||
}
|
||||
|
||||
func (u upgrader_1_12_5_20260122) UpgradeSystemComponents() []task.Interface {
|
||||
func (u upgrader_1_12_5_20260225) UpgradeSystemComponents() []task.Interface {
|
||||
pre := []task.Interface{
|
||||
&task.LocalTask{
|
||||
Name: "UpgradeL4BFLProxy",
|
||||
Action: &upgradeL4BFLProxy{Tag: "v0.3.10"},
|
||||
Action: &upgradeL4BFLProxy{Tag: "v0.3.11"},
|
||||
Retry: 3,
|
||||
Delay: 5 * time.Second,
|
||||
},
|
||||
@@ -28,5 +28,5 @@ func (u upgrader_1_12_5_20260122) UpgradeSystemComponents() []task.Interface {
|
||||
}
|
||||
|
||||
func init() {
|
||||
registerDailyUpgrader(upgrader_1_12_5_20260122{})
|
||||
registerDailyUpgrader(upgrader_1_12_5_20260225{})
|
||||
}
|
||||
@@ -380,7 +380,7 @@ func (a *upgradeGPUDriverIfNeeded) Execute(runtime connector.Runtime) error {
|
||||
if err != nil {
|
||||
return errors.Wrap(errors.WithStack(err), "kubeclient create error")
|
||||
}
|
||||
err = gpu.UpdateNodeGpuLabel(context.Background(), client.Kubernetes(), &targetDriverVersionStr, ptr.To(common.CurrentVerifiedCudaVersion), ptr.To("true"))
|
||||
err = gpu.UpdateNodeGpuLabel(context.Background(), client.Kubernetes(), &targetDriverVersionStr, ptr.To(common.CurrentVerifiedCudaVersion), ptr.To("true"), ptr.To(gpu.NvidiaCardType))
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
@@ -1,67 +0,0 @@
|
||||
package utils
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"os"
|
||||
"strings"
|
||||
|
||||
"github.com/Masterminds/semver/v3"
|
||||
"github.com/beclab/Olares/cli/pkg/core/connector"
|
||||
)
|
||||
|
||||
func HasAmdIGPU(execRuntime connector.Runtime) (bool, error) {
|
||||
// Detect by CPU model names that bundle AMD AI NPU/graphics
|
||||
targets := []string{
|
||||
"AMD Ryzen AI Max+ 395",
|
||||
"AMD Ryzen AI Max 390",
|
||||
"AMD Ryzen AI Max 385",
|
||||
"AMD Ryzen AI 9 HX 375",
|
||||
"AMD Ryzen AI 9 HX 370",
|
||||
"AMD Ryzen AI 9 365",
|
||||
}
|
||||
// try lscpu first: extract 'Model name' field
|
||||
out, err := execRuntime.GetRunner().SudoCmd("lscpu 2>/dev/null | awk -F': *' '/^Model name/{print $2; exit}' || true", false, false)
|
||||
if err != nil {
|
||||
return false, err
|
||||
}
|
||||
if out != "" {
|
||||
lo := strings.ToLower(strings.TrimSpace(out))
|
||||
for _, t := range targets {
|
||||
if strings.Contains(lo, strings.ToLower(t)) {
|
||||
return true, nil
|
||||
}
|
||||
}
|
||||
}
|
||||
// fallback to /proc/cpuinfo
|
||||
out, err = execRuntime.GetRunner().SudoCmd("awk -F': *' '/^model name/{print $2; exit}' /proc/cpuinfo 2>/dev/null || true", false, false)
|
||||
if err != nil {
|
||||
return false, err
|
||||
}
|
||||
if out != "" {
|
||||
lo := strings.ToLower(strings.TrimSpace(out))
|
||||
for _, t := range targets {
|
||||
if strings.Contains(lo, strings.ToLower(t)) {
|
||||
return true, nil
|
||||
}
|
||||
}
|
||||
}
|
||||
return false, nil
|
||||
}
|
||||
|
||||
func RocmVersion() (*semver.Version, error) {
|
||||
const rocmVersionFile = "/opt/rocm/.info/version"
|
||||
data, err := os.ReadFile(rocmVersionFile)
|
||||
if err != nil {
|
||||
// no ROCm installed, nothing to check
|
||||
if os.IsNotExist(err) {
|
||||
return nil, err
|
||||
}
|
||||
return nil, err
|
||||
}
|
||||
curStr := strings.TrimSpace(string(data))
|
||||
cur, err := semver.NewVersion(curStr)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("invalid rocm version: %s", curStr)
|
||||
}
|
||||
return cur, nil
|
||||
}
|
||||
@@ -11,6 +11,13 @@ func AssertPodReady(pod *corev1.Pod) error {
|
||||
return fmt.Errorf("pod is nil")
|
||||
}
|
||||
|
||||
// simply ignore finished pod
|
||||
// it can be seen as just an execution record, not a running pod
|
||||
// and the deployment will create a new replica
|
||||
if pod.Status.Phase == corev1.PodSucceeded || pod.Status.Phase == corev1.PodFailed {
|
||||
return nil
|
||||
}
|
||||
|
||||
podKey := fmt.Sprintf("%s/%s", pod.Namespace, pod.Name)
|
||||
if pod.DeletionTimestamp != nil {
|
||||
return fmt.Errorf("pod %s is terminating", podKey)
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
project_name: olaresd
|
||||
builds:
|
||||
- env:
|
||||
- CGO_ENABLED=0
|
||||
- CGO_ENABLED=1
|
||||
# - CC=aarch64-linux-gnu-gcc
|
||||
# - CXX=aarch64-linux-gnu-g++
|
||||
main: ./cmd/terminusd/main.go
|
||||
@@ -17,6 +17,12 @@ builds:
|
||||
goamd64: v1
|
||||
env:
|
||||
- CGO_ENABLED=1
|
||||
- goarch: arm64
|
||||
goos: linux
|
||||
env:
|
||||
- CGO_ENABLED=1
|
||||
- CC=aarch64-linux-gnu-gcc
|
||||
- CXX=aarch64-linux-gnu-g++
|
||||
tags:
|
||||
containers_image_openpgp
|
||||
ldflags:
|
||||
|
||||
@@ -20,6 +20,9 @@ build: fmt vet ;$(info $(M)...Begin to build terminusd.) @
|
||||
build-linux: fmt vet ;$(info $(M)...Begin to build terminusd (linux version).) @
|
||||
CGO_ENABLED=1 GOOS=linux GOARCH=amd64 go build -o bin/olaresd cmd/terminusd/main.go
|
||||
|
||||
build-arm: fmt vet ;$(info $(M)...Begin to build terminusd (linux version).) @
|
||||
CGO_ENABLED=1 GOOS=linux GOARCH=arm64 go build -o bin/olaresd cmd/terminusd/main.go
|
||||
|
||||
build-linux-in-docker:
|
||||
docker run -it --platform linux/amd64 --rm \
|
||||
-v $(current_dir):/olaresd \
|
||||
@@ -27,3 +30,11 @@ build-linux-in-docker:
|
||||
-e DEBIAN_FRONTEND=noninteractive \
|
||||
golang:1.24.11 \
|
||||
sh -c "apt-get -y update; apt-get -y install libudev-dev libpcap-dev; make build-linux"
|
||||
|
||||
build-arm-in-docker:
|
||||
docker run -it --platform linux/arm64 --rm \
|
||||
-v $(current_dir):/olaresd \
|
||||
-w /olaresd \
|
||||
-e DEBIAN_FRONTEND=noninteractive \
|
||||
golang:1.24.11 \
|
||||
sh -c "apt-get -y update; apt-get -y install libudev-dev libpcap-dev; make build-arm"
|
||||
|
||||
@@ -31,7 +31,7 @@ require (
|
||||
github.com/jaypipes/ghw v0.13.0
|
||||
github.com/jochenvg/go-udev v0.0.0-20171110120927-d6b62d56d37b
|
||||
github.com/joho/godotenv v1.5.1
|
||||
github.com/klauspost/cpuid/v2 v2.2.8
|
||||
github.com/klauspost/cpuid/v2 v2.3.0
|
||||
github.com/labstack/echo/v4 v4.0.0-00010101000000-000000000000
|
||||
github.com/libp2p/go-netroute v0.2.2
|
||||
github.com/mackerelio/go-osstat v0.2.5
|
||||
|
||||
@@ -205,8 +205,8 @@ github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI
|
||||
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
|
||||
github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo=
|
||||
github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ=
|
||||
github.com/klauspost/cpuid/v2 v2.2.8 h1:+StwCXwm9PdpiEkPyzBXIy+M9KUb4ODm0Zarf1kS5BM=
|
||||
github.com/klauspost/cpuid/v2 v2.2.8/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws=
|
||||
github.com/klauspost/cpuid/v2 v2.3.0 h1:S4CRMLnYUhGeDFDqkGriYKdfoFlDnMtqTiI/sFzhA9Y=
|
||||
github.com/klauspost/cpuid/v2 v2.3.0/go.mod h1:hqwkgyIinND0mEev00jJYCxPNVRVXFQeu1XKlok6oO0=
|
||||
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
|
||||
github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
|
||||
github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=
|
||||
@@ -471,7 +471,6 @@ golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBc
|
||||
golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.38.0 h1:3yZWxaJjBmCWXqhN1qh02AkOnCQ1poK6oF+a7xWL6Gc=
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
//go:build !(linux && amd64)
|
||||
// +build !linux !amd64
|
||||
//go:build !linux
|
||||
// +build !linux
|
||||
|
||||
package intranet
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
//go:build linux && amd64
|
||||
// +build linux,amd64
|
||||
//go:build linux
|
||||
// +build linux
|
||||
|
||||
package intranet
|
||||
|
||||
|
||||
@@ -43,11 +43,12 @@ type state struct {
|
||||
Disk string `json:"disk"`
|
||||
|
||||
// network info
|
||||
WikiConnected bool `json:"wifiConnected"`
|
||||
WifiSSID *string `json:"wifiSSID,omitempty"`
|
||||
WiredConnected bool `json:"wiredConnected"`
|
||||
HostIP string `json:"hostIp"`
|
||||
ExternalIP string `json:"externalIp"`
|
||||
WikiConnected bool `json:"wifiConnected"`
|
||||
WifiSSID *string `json:"wifiSSID,omitempty"`
|
||||
WiredConnected bool `json:"wiredConnected"`
|
||||
HostIP string `json:"hostIp"`
|
||||
ExternalIP string `json:"externalIp"`
|
||||
ExternalIPProbeTime time.Time `json:"-"`
|
||||
|
||||
// installing / uninstalling / upgrading state
|
||||
InstallingState ProcessingState `json:"installingState"`
|
||||
@@ -255,7 +256,10 @@ func CheckCurrentStatus(ctx context.Context) error {
|
||||
}
|
||||
|
||||
CurrentState.HostIP = hostIp
|
||||
CurrentState.ExternalIP = nets.GetMyExternalIPAddr()
|
||||
if time.Since(CurrentState.ExternalIPProbeTime) > 1*time.Minute {
|
||||
CurrentState.ExternalIP = nets.GetMyExternalIPAddr()
|
||||
CurrentState.ExternalIPProbeTime = time.Now()
|
||||
}
|
||||
|
||||
// get olares state
|
||||
|
||||
|
||||
@@ -4,14 +4,17 @@ import (
|
||||
"crypto/tls"
|
||||
"encoding/json"
|
||||
"errors"
|
||||
"io/ioutil"
|
||||
"io"
|
||||
"net"
|
||||
"net/http"
|
||||
"net/netip"
|
||||
"net/url"
|
||||
"os"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"github.com/beclab/Olares/daemon/pkg/commands"
|
||||
"github.com/gofiber/fiber/v2/log"
|
||||
"github.com/libp2p/go-netroute"
|
||||
pkg_errors "github.com/pkg/errors"
|
||||
"github.com/txn2/txeh"
|
||||
@@ -267,15 +270,7 @@ func GetHostIpFromHostsFile(domain string) (string, error) {
|
||||
return ip, nil
|
||||
}
|
||||
|
||||
// GetMyExternalIPAddr get my network outgoing ip address
|
||||
func GetMyExternalIPAddr() string {
|
||||
sites := map[string]string{
|
||||
"httpbin": "https://httpbin.org/ip",
|
||||
"ifconfigme": "https://ifconfig.me/all.json",
|
||||
"externalip": "https://myexternalip.com/json",
|
||||
"joinolares": "https://myip.joinolares.cn/ip",
|
||||
}
|
||||
|
||||
type httpBin struct {
|
||||
Origin string `json:"origin"`
|
||||
}
|
||||
@@ -295,80 +290,80 @@ func GetMyExternalIPAddr() string {
|
||||
IP string `json:"ip"`
|
||||
}
|
||||
|
||||
var unmarshalFuncs = map[string]func(v []byte) string{
|
||||
"httpbin": func(v []byte) string {
|
||||
var hb httpBin
|
||||
if err := json.Unmarshal(v, &hb); err == nil && hb.Origin != "" {
|
||||
return hb.Origin
|
||||
}
|
||||
return ""
|
||||
},
|
||||
"ifconfigme": func(v []byte) string {
|
||||
var ifMe ifconfigMe
|
||||
if err := json.Unmarshal(v, &ifMe); err == nil && ifMe.IPAddr != "" {
|
||||
return ifMe.IPAddr
|
||||
}
|
||||
return ""
|
||||
},
|
||||
"externalip": func(v []byte) string {
|
||||
var extip externalIP
|
||||
if err := json.Unmarshal(v, &extip); err == nil && extip.IP != "" {
|
||||
return extip.IP
|
||||
}
|
||||
return ""
|
||||
},
|
||||
"joinolares": func(v []byte) string {
|
||||
return strings.TrimSpace(string(v))
|
||||
},
|
||||
type siteConfig struct {
|
||||
url string
|
||||
unmarshalFunc func(v []byte) string
|
||||
}
|
||||
|
||||
ch := make(chan any, len(sites))
|
||||
|
||||
for site := range sites {
|
||||
go func(name string) {
|
||||
http.DefaultTransport.(*http.Transport).TLSClientConfig = &tls.Config{InsecureSkipVerify: true}
|
||||
c := http.Client{Timeout: 5 * time.Second}
|
||||
resp, err := c.Get(sites[name])
|
||||
if err != nil {
|
||||
ch <- err
|
||||
return
|
||||
}
|
||||
defer resp.Body.Close()
|
||||
respBytes, err := ioutil.ReadAll(resp.Body)
|
||||
if err != nil {
|
||||
ch <- err
|
||||
return
|
||||
}
|
||||
|
||||
ip := unmarshalFuncs[name](respBytes)
|
||||
//println(name, site, ip)
|
||||
ch <- ip
|
||||
}(site)
|
||||
externalIPServiceURL, err := url.JoinPath(commands.OLARES_REMOTE_SERVICE, "/myip/ip")
|
||||
if err != nil {
|
||||
klog.Error("failed to parse external IP service URL, ", err)
|
||||
return ""
|
||||
}
|
||||
|
||||
tr := time.NewTimer(time.Duration(5*len(sites)+3) * time.Second)
|
||||
|
||||
LOOP:
|
||||
for i := 0; i < len(sites); i++ {
|
||||
select {
|
||||
case r, ok := <-ch:
|
||||
if !ok {
|
||||
continue
|
||||
}
|
||||
|
||||
switch v := r.(type) {
|
||||
case string:
|
||||
ip := net.ParseIP(v)
|
||||
if ip != nil && ip.To4() != nil && !ip.IsLoopback() && !ip.IsMulticast() {
|
||||
return v
|
||||
sites := []siteConfig{
|
||||
{
|
||||
url: externalIPServiceURL,
|
||||
unmarshalFunc: func(v []byte) string {
|
||||
return strings.TrimSpace(string(v))
|
||||
},
|
||||
},
|
||||
{
|
||||
url: "https://httpbin.org/ip",
|
||||
unmarshalFunc: func(v []byte) string {
|
||||
var hb httpBin
|
||||
if err := json.Unmarshal(v, &hb); err == nil && hb.Origin != "" {
|
||||
return hb.Origin
|
||||
}
|
||||
case error:
|
||||
klog.Warningf("got an error, %v", v)
|
||||
}
|
||||
case <-tr.C:
|
||||
tr.Stop()
|
||||
klog.Warning("timed out")
|
||||
break LOOP
|
||||
return ""
|
||||
},
|
||||
},
|
||||
{
|
||||
url: "https://ifconfig.me/all.json",
|
||||
unmarshalFunc: func(v []byte) string {
|
||||
var ifMe ifconfigMe
|
||||
if err := json.Unmarshal(v, &ifMe); err == nil && ifMe.IPAddr != "" {
|
||||
return ifMe.IPAddr
|
||||
}
|
||||
return ""
|
||||
},
|
||||
},
|
||||
{
|
||||
url: "https://myexternalip.com/json",
|
||||
unmarshalFunc: func(v []byte) string {
|
||||
var extip externalIP
|
||||
if err := json.Unmarshal(v, &extip); err == nil && extip.IP != "" {
|
||||
return extip.IP
|
||||
}
|
||||
return ""
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
client := http.Client{
|
||||
Timeout: 3 * time.Second,
|
||||
Transport: &http.Transport{
|
||||
TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
|
||||
},
|
||||
}
|
||||
for _, site := range sites {
|
||||
resp, err := client.Get(site.url)
|
||||
if err != nil {
|
||||
log.Warnf("failed to get external ip from %s, %v", site.url, err)
|
||||
continue
|
||||
}
|
||||
|
||||
respBytes, readErr := io.ReadAll(resp.Body)
|
||||
resp.Body.Close()
|
||||
if readErr != nil {
|
||||
log.Warnf("failed to read response from %s, %v", site.url, readErr)
|
||||
continue
|
||||
}
|
||||
|
||||
ipStr := site.unmarshalFunc(respBytes)
|
||||
ip := net.ParseIP(ipStr)
|
||||
if ip != nil && ip.To4() != nil && !ip.IsLoopback() && !ip.IsMulticast() {
|
||||
return ipStr
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -5,6 +5,7 @@ package utils
|
||||
|
||||
import (
|
||||
"context"
|
||||
"encoding/json"
|
||||
"errors"
|
||||
"fmt"
|
||||
"net"
|
||||
@@ -42,7 +43,7 @@ func detectdStorageDevices(ctx context.Context, bus string) (usbDevs []storageDe
|
||||
for _, d := range ds {
|
||||
if d.Properties()["ID_BUS"] == bus {
|
||||
usbs = append(usbs, d)
|
||||
} else if d.Properties()["ID_BUS"] == "ata" &&
|
||||
} else if (d.Properties()["ID_BUS"] == "ata" || d.Properties()["ID_BUS"] == "scsi") &&
|
||||
d.Properties()["ID_USB_TYPE"] == "disk" &&
|
||||
bus == "usb" {
|
||||
usbs = append(usbs, d)
|
||||
@@ -97,14 +98,18 @@ func detectdStorageDevices(ctx context.Context, bus string) (usbDevs []storageDe
|
||||
|
||||
idSerial := device.Properties()["ID_SERIAL"]
|
||||
idSerialShort := device.Properties()["ID_SERIAL_SHORT"]
|
||||
idUsbSerial := device.Properties()["ID_USB_SERIAL"]
|
||||
idUsbSerialShort := device.Properties()["ID_USB_SERIAL_SHORT"]
|
||||
partUUID := device.Properties()["ID_PART_ENTRY_UUID"]
|
||||
|
||||
usbDevs = append(usbDevs, storageDevice{
|
||||
DevPath: devPath,
|
||||
Vender: vender,
|
||||
IDSerial: idSerial,
|
||||
IDSerialShort: idSerialShort,
|
||||
PartitionUUID: partUUID,
|
||||
DevPath: devPath,
|
||||
Vender: vender,
|
||||
IDSerial: idSerial,
|
||||
IDSerialShort: idSerialShort,
|
||||
IDUsbSerial: idUsbSerial,
|
||||
IDUsbSerialShort: idUsbSerialShort,
|
||||
PartitionUUID: partUUID,
|
||||
})
|
||||
}
|
||||
|
||||
@@ -199,7 +204,10 @@ func MountedHddPath(ctx context.Context) ([]string, error) {
|
||||
|
||||
func FilterBySerial(serial string) func(dev storageDevice) bool {
|
||||
return func(dev storageDevice) bool {
|
||||
return strings.HasSuffix(serial, dev.IDSerial) || strings.HasSuffix(serial, dev.IDSerialShort)
|
||||
return strings.HasSuffix(serial, dev.IDSerial) ||
|
||||
strings.HasSuffix(serial, dev.IDSerialShort) ||
|
||||
strings.HasSuffix(serial, dev.IDUsbSerial) ||
|
||||
strings.HasSuffix(serial, dev.IDUsbSerialShort)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -270,7 +278,17 @@ func MountUsbDevice(ctx context.Context, mountBaseDir string, dev []storageDevic
|
||||
continue
|
||||
}
|
||||
|
||||
if err = mounter.Mount(d.DevPath, mkMountDir, "", []string{"uid=1000", "gid=1000"}); err != nil {
|
||||
options := []string{}
|
||||
fsType, err := getFsTypeOfDevice(ctx, d.DevPath)
|
||||
if err != nil {
|
||||
klog.Warning("get fs type of device error, ", err, ", ", d.DevPath)
|
||||
} else {
|
||||
if strings.Contains(fsType, "FAT") || strings.Contains(fsType, "NTFS") {
|
||||
options = append(options, "uid=1000", "gid=1000")
|
||||
}
|
||||
}
|
||||
|
||||
if err = mounter.Mount(d.DevPath, mkMountDir, "", options); err != nil {
|
||||
klog.Warning("mount usb error, ", err, ", ", d.DevPath, ", ", mkMountDir)
|
||||
// clear the empty mount dir
|
||||
// do not use remove all, only remove the mount point path, assume it's an empty dir
|
||||
@@ -685,3 +703,35 @@ func isDeviceExists(devicePath string) bool {
|
||||
_, err := os.Stat(devicePath)
|
||||
return !os.IsNotExist(err)
|
||||
}
|
||||
|
||||
func getFsTypeOfDevice(ctx context.Context, devicePath string) (string, error) {
|
||||
// output format
|
||||
// {
|
||||
// "blockdevices": [
|
||||
// {
|
||||
// "fstype": "ext4"
|
||||
// }
|
||||
// ]
|
||||
// }
|
||||
cmd := exec.CommandContext(ctx, "lsblk", "-f", devicePath, "-o", "fstype", "-J")
|
||||
output, err := cmd.CombinedOutput()
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
var result struct {
|
||||
BlockDevices []struct {
|
||||
FsType string `json:"fstype"`
|
||||
} `json:"blockdevices"`
|
||||
}
|
||||
|
||||
if err := json.Unmarshal(output, &result); err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
if len(result.BlockDevices) == 0 {
|
||||
return "", fmt.Errorf("no block devices found for %s", devicePath)
|
||||
}
|
||||
|
||||
return result.BlockDevices[0].FsType, nil
|
||||
}
|
||||
|
||||
@@ -3,11 +3,13 @@ package utils
|
||||
import "strings"
|
||||
|
||||
type storageDevice struct {
|
||||
DevPath string
|
||||
Vender string
|
||||
IDSerial string
|
||||
IDSerialShort string
|
||||
PartitionUUID string
|
||||
DevPath string
|
||||
Vender string
|
||||
IDSerial string
|
||||
IDSerialShort string
|
||||
IDUsbSerial string
|
||||
IDUsbSerialShort string
|
||||
PartitionUUID string
|
||||
}
|
||||
|
||||
type mountedPath struct {
|
||||
|
||||
476
docs/.vitepress/developer.en.ts
Normal file
476
docs/.vitepress/developer.en.ts
Normal file
@@ -0,0 +1,476 @@
|
||||
import { defineConfig, type DefaultTheme } from "vitepress";
|
||||
|
||||
export const developerSidebar: DefaultTheme.Sidebar = {
|
||||
"/developer/": [
|
||||
{
|
||||
text: "Concepts",
|
||||
link: "/developer/concepts/",
|
||||
items: [
|
||||
{ text: "Olares architecture", link: "/developer/concepts/system-architecture" },
|
||||
{
|
||||
text: "Olares ID",
|
||||
link: "/developer/concepts/olares-id",
|
||||
collapsed: true,
|
||||
items: [
|
||||
{
|
||||
text: "Decentralized ID",
|
||||
link: "/developer/concepts/did",
|
||||
},
|
||||
{
|
||||
text: "Blockchain Registry",
|
||||
link: "/developer/concepts/registry",
|
||||
},
|
||||
{
|
||||
text: "Verifiable Credential",
|
||||
link: "/developer/concepts/vc",
|
||||
},
|
||||
{
|
||||
text: "Autonomous Reputation",
|
||||
link: "/developer/concepts/reputation",
|
||||
},
|
||||
// {
|
||||
// text: "Self-Sovereign Network",
|
||||
// link: "/developer/concepts/self-sovereign-network",
|
||||
// },
|
||||
{
|
||||
text: "Identity Wallet",
|
||||
link: "/developer/concepts/wallet",
|
||||
},
|
||||
],
|
||||
},
|
||||
{ text: "Account", link: "/developer/concepts/account" },
|
||||
{ text: "Application", link: "/developer/concepts/application" },
|
||||
{ text: "Network", link: "/developer/concepts/network" },
|
||||
{ text: "Data", link: "/developer/concepts/data" },
|
||||
{ text: "Secrets", link: "/developer/concepts/secrets" },
|
||||
],
|
||||
},
|
||||
{
|
||||
text: "Installation deep-dive",
|
||||
link: "/developer/install/",
|
||||
items: [
|
||||
{
|
||||
text: "Installation architecture",
|
||||
link: "/developer/install/installation-overview",
|
||||
},
|
||||
{
|
||||
text: "Installation process",
|
||||
link: "/developer/install/installation-process",
|
||||
},
|
||||
{
|
||||
text: "Olares Home",
|
||||
link: "/developer/install/olares-home",
|
||||
},
|
||||
{
|
||||
text: "Environment variables",
|
||||
link: "/developer/install/environment-variables",
|
||||
},
|
||||
{
|
||||
text: "Olares CLI",
|
||||
link: "/developer/install/cli/olares-cli",
|
||||
collapsed: true,
|
||||
items: [
|
||||
{ text: "Access Olares terminal", link: "/developer/reference/access-olares-terminal" },
|
||||
{
|
||||
text: "backups",
|
||||
link: "/developer/install/cli/backups",
|
||||
collapsed: true,
|
||||
items: [
|
||||
{ text: "backup", link: "/developer/install/cli/backups-backup" },
|
||||
{ text: "download", link: "/developer/install/cli/backups-download" },
|
||||
{ text: "region", link: "/developer/install/cli/backups-region" },
|
||||
{ text: "restore", link: "/developer/install/cli/backups-restore" },
|
||||
{ text: "snapshots", link: "/developer/install/cli/backups-snapshots" },
|
||||
],
|
||||
},
|
||||
{ text: "change-ip", link: "/developer/install/cli/change-ip" },
|
||||
{ text: "disk", link: "/developer/install/cli/disk" },
|
||||
{ text: "download", link: "/developer/install/cli/download" },
|
||||
{ text: "gpu", link: "/developer/install/cli/gpu" },
|
||||
{ text: "info", link: "/developer/install/cli/info" },
|
||||
{ text: "install", link: "/developer/install/cli/install" },
|
||||
{ text: "logs", link: "/developer/install/cli/logs" },
|
||||
{ text: "node", link: "/developer/install/cli/node" },
|
||||
{ text: "osinfo", link: "/developer/install/cli/osinfo" },
|
||||
{ text: "precheck", link: "/developer/install/cli/precheck" },
|
||||
{ text: "prepare", link: "/developer/install/cli/prepare" },
|
||||
{ text: "release", link: "/developer/install/cli/release" },
|
||||
{ text: "start", link: "/developer/install/cli/start" },
|
||||
{ text: "stop", link: "/developer/install/cli/stop" },
|
||||
{ text: "uninstall", link: "/developer/install/cli/uninstall" },
|
||||
{ text: "upgrade", link: "/developer/install/cli/upgrade" },
|
||||
{
|
||||
text: "user",
|
||||
link: "/developer/install/cli/user",
|
||||
collapsed: true,
|
||||
items: [
|
||||
{ text: "activate", link: "/developer/install/cli/user-activate" },
|
||||
{ text: "create", link: "/developer/install/cli/user-create" },
|
||||
{ text: "delete", link: "/developer/install/cli/user-delete" },
|
||||
{ text: "get", link: "/developer/install/cli/user-get" },
|
||||
{ text: "list", link: "/developer/install/cli/user-list" },
|
||||
{ text: "reset-password", link: "/developer/install/cli/user-reset-password" },
|
||||
],
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
text: "Olares versioning",
|
||||
link: "/developer/install/versioning",
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
text: "Develop Olares apps",
|
||||
link: "/developer/develop/",
|
||||
items: [
|
||||
{
|
||||
text: "Develop with Studio",
|
||||
collapsed: true,
|
||||
link: "/developer/develop/tutorial/",
|
||||
items: [
|
||||
{
|
||||
text: "Deploy an app",
|
||||
link: "/developer/develop/tutorial/deploy",
|
||||
},
|
||||
{
|
||||
text: "Develop in a dev container",
|
||||
link: "/developer/develop/tutorial/develop",
|
||||
},
|
||||
{
|
||||
text: "Package and upload",
|
||||
link: "/developer/develop/tutorial/package-upload",
|
||||
},
|
||||
{
|
||||
text: "Add app assets",
|
||||
link: "/developer/develop/tutorial/assets",
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
text: "Application package",
|
||||
collapsed: true,
|
||||
items: [
|
||||
{
|
||||
text: "Application chart",
|
||||
link: "/developer/develop/package/chart",
|
||||
},
|
||||
{
|
||||
text: "OlaresManifest",
|
||||
link: "/developer/develop/package/manifest",
|
||||
},
|
||||
/*{
|
||||
text: "Recommendation",
|
||||
link: "/developer/develop/package/recommend",
|
||||
},*/
|
||||
{
|
||||
text: "Helm extension",
|
||||
link: "/developer/develop/package/extension",
|
||||
},
|
||||
],
|
||||
},
|
||||
// {
|
||||
// text: "Advanced",
|
||||
// collapsed: true,
|
||||
// items: [
|
||||
// {
|
||||
// text: "terminus-info",
|
||||
// link: "/developer/develop/advanced/terminus-info",
|
||||
// },
|
||||
// {
|
||||
// text: "Service provider",
|
||||
// link: "/developer/develop/advanced/provider",
|
||||
// },
|
||||
// {
|
||||
// text: "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",
|
||||
// },
|
||||
// {
|
||||
// text: "Market",
|
||||
// link: "/developer/develop/advanced/market",
|
||||
// },
|
||||
// {
|
||||
// text: "Websocket",
|
||||
// link: "/developer/develop/advanced/websocket",
|
||||
// },
|
||||
// {
|
||||
// text: "File upload",
|
||||
// link: "/developer/develop/advanced/file-upload",
|
||||
// },
|
||||
// {
|
||||
// text: "Secret",
|
||||
// link: "/developer/develop/advanced/secret",
|
||||
// },
|
||||
// {
|
||||
// text: "Kubesphere",
|
||||
// link: "/developer/develop/advanced/kubesphere",
|
||||
// },
|
||||
// ],
|
||||
// },
|
||||
{
|
||||
text: "Middleware",
|
||||
link: "/developer/develop/mw-overview",
|
||||
collapsed: true,
|
||||
items: [
|
||||
{
|
||||
text: "Elasticsearch",
|
||||
collapsed: true,
|
||||
items :[
|
||||
{
|
||||
text: "Integrate with Elasticsearch",
|
||||
link: "/developer/develop/mw-integrate-with-es", },
|
||||
{
|
||||
text: "View Elasticsearch data",
|
||||
link: "/developer/develop/mw-view-es-data",
|
||||
},
|
||||
]
|
||||
},
|
||||
{
|
||||
text: "Grafana",
|
||||
link :"/developer/develop/mw-view-grafana-data",
|
||||
},
|
||||
{
|
||||
text: "MariaDB",
|
||||
collapsed: true,
|
||||
items :[
|
||||
{
|
||||
text: "Integrate with MariaDB",
|
||||
link: "/developer/develop/mw-integrate-with-mariadb", },
|
||||
{
|
||||
text: "View MariaDB data",
|
||||
link: "/developer/develop/mw-view-mariadb-data",
|
||||
},
|
||||
]
|
||||
},
|
||||
{
|
||||
text: "MinIO",
|
||||
collapsed: true,
|
||||
items :[
|
||||
{
|
||||
text: "Integrate with MinIO",
|
||||
link: "/developer/develop/mw-integrate-with-minio", },
|
||||
{
|
||||
text: "View MinIO data",
|
||||
link: "/developer/develop/mw-view-minio-data",
|
||||
},
|
||||
]
|
||||
},
|
||||
{
|
||||
text: "MongoDB",
|
||||
collapsed: true,
|
||||
items :[
|
||||
{
|
||||
text: "Integrate with MongoDB",
|
||||
link: "/developer/develop/mw-integrate-with-mongodb", },
|
||||
{
|
||||
text: "View MongoDB data",
|
||||
link: "/developer/develop/mw-view-mongodb-data",
|
||||
},
|
||||
]
|
||||
},
|
||||
{
|
||||
text: "MySQL",
|
||||
collapsed: true,
|
||||
items :[
|
||||
{
|
||||
text: "Integrate with MySQL",
|
||||
link: "/developer/develop/mw-integrate-with-mysql", },
|
||||
{
|
||||
text: "View MySQL data",
|
||||
link: "/developer/develop/mw-view-mysql-data",
|
||||
},
|
||||
]
|
||||
},
|
||||
{
|
||||
text: "NATS",
|
||||
link :"/developer/develop/mw-view-nats-data",
|
||||
},
|
||||
{
|
||||
text: "OpenTelemetry",
|
||||
link :"/developer/develop/mw-view-otel-data",
|
||||
},
|
||||
{
|
||||
text: "PostgreSQL",
|
||||
collapsed: true,
|
||||
items :[
|
||||
{
|
||||
text: "Integrate with PostgreSQL",
|
||||
link: "/developer/develop/mw-integrate-with-pg", },
|
||||
{
|
||||
text: "View PostgreSQL data",
|
||||
link: "/developer/develop/mw-view-pg-data",
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
text: "RabbitMQ",
|
||||
collapsed: true,
|
||||
items :[
|
||||
{
|
||||
text: "Integrate with RabbitMQ",
|
||||
link: "/developer/develop/mw-integrate-with-rabbitmq", },
|
||||
{
|
||||
text: "View RabbitMQ data",
|
||||
link: "/developer/develop/mw-view-rabbitmq-data",
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
text: "Redis",
|
||||
collapsed: true,
|
||||
items :[
|
||||
{
|
||||
text: "Integrate with Redis",
|
||||
link: "/developer/develop/mw-integrate-with-redis", },
|
||||
{
|
||||
text: "View Redis data",
|
||||
link: "/developer/develop/mw-view-redis-data",
|
||||
}
|
||||
]
|
||||
},
|
||||
]
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
text: "Distribute Olares apps",
|
||||
link: "/developer/develop/distribute-index",
|
||||
items: [
|
||||
{
|
||||
text: "Summit apps",
|
||||
link: "/developer/develop/submit-apps",
|
||||
},
|
||||
{
|
||||
text: "Manage app lifecycle",
|
||||
link: "/developer/develop/manage-apps",
|
||||
},
|
||||
{
|
||||
text: "Promote your apps",
|
||||
link:"/developer/develop/promote-apps"
|
||||
},
|
||||
{
|
||||
text: "Publish paid apps",
|
||||
link: "/developer/develop/paid-apps",
|
||||
},
|
||||
|
||||
],
|
||||
},
|
||||
{
|
||||
text: "Contribute to Olares",
|
||||
items: [
|
||||
{
|
||||
text: "Develop system app",
|
||||
collapsed: true,
|
||||
items: [
|
||||
{
|
||||
text: "Overview",
|
||||
link: "/developer/contribute/system-app/overview",
|
||||
},
|
||||
{
|
||||
text: "Configure deployment",
|
||||
link: "/developer/contribute/system-app/deployment",
|
||||
},
|
||||
{
|
||||
text: "Configure permissions",
|
||||
link: "/developer/contribute/system-app/olares-manifest",
|
||||
},
|
||||
{
|
||||
text: "Install",
|
||||
link: "/developer/contribute/system-app/install",
|
||||
},
|
||||
{
|
||||
text: "Other",
|
||||
link: "/developer/contribute/system-app/other",
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
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",
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
}
|
||||
492
docs/.vitepress/developer.zh.ts
Normal file
492
docs/.vitepress/developer.zh.ts
Normal file
@@ -0,0 +1,492 @@
|
||||
import { defineConfig, type DefaultTheme } from "vitepress";
|
||||
|
||||
export const developerSidebar: DefaultTheme.Sidebar = {
|
||||
"/zh/developer/": [
|
||||
{
|
||||
text: "概念",
|
||||
link: "/zh/developer/concepts/",
|
||||
items: [
|
||||
{ text: "系统架构", link: "/zh/developer/concepts/system-architecture" },
|
||||
{
|
||||
text: "Olares ID",
|
||||
link: "/zh/developer/concepts/olares-id",
|
||||
collapsed: true,
|
||||
items: [
|
||||
{
|
||||
text: "去中心化标识符",
|
||||
link: "/zh/developer/concepts/did",
|
||||
},
|
||||
{
|
||||
text: "DID Registry",
|
||||
link: "/zh/developer/concepts/registry",
|
||||
},
|
||||
{
|
||||
text: "可验证凭证",
|
||||
link: "/zh/developer/concepts/vc",
|
||||
},
|
||||
{
|
||||
text: "自治声誉",
|
||||
link: "/zh/developer/concepts/reputation",
|
||||
},
|
||||
// {
|
||||
// text: "主权网络",
|
||||
// link: "/zh/developer/concepts/self-sovereign-network",
|
||||
// },
|
||||
{
|
||||
text: "身份钱包",
|
||||
link: "/zh/developer/concepts/wallet",
|
||||
},
|
||||
],
|
||||
},
|
||||
{ text: "账户", link: "/zh/developer/concepts/account" },
|
||||
{ text: "应用", link: "/zh/developer/concepts/application" },
|
||||
{ text: "网络", link: "/zh/developer/concepts/network" },
|
||||
{ text: "数据", link: "/zh/developer/concepts/data" },
|
||||
{ text: "密钥", link: "/zh/developer/concepts/secrets" },
|
||||
],
|
||||
},
|
||||
{
|
||||
text: "Olares 安装详解",
|
||||
link: "/zh/developer/install/",
|
||||
items: [
|
||||
{
|
||||
text: "安装概述",
|
||||
link: "/zh/developer/install/installation-overview",
|
||||
},
|
||||
{
|
||||
text: "安装流程",
|
||||
link: "/zh/developer/install/installation-process",
|
||||
},
|
||||
{
|
||||
text: "Olares Home",
|
||||
link: "/zh/developer/install/olares-home",
|
||||
},
|
||||
{
|
||||
text: "环境变量",
|
||||
link: "/zh/developer/install/environment-variables",
|
||||
},
|
||||
{
|
||||
text: "Olares CLI",
|
||||
link: "/zh/developer/install/cli/olares-cli",
|
||||
collapsed: true,
|
||||
items: [
|
||||
{
|
||||
text: "backups",
|
||||
link: "/zh/developer/install/cli/backups",
|
||||
collapsed: true,
|
||||
items: [
|
||||
{ text: "backup", link: "/zh/developer/install/cli/backups-backup" },
|
||||
{ text: "download", link: "/zh/developer/install/cli/backups-download" },
|
||||
{ text: "region", link: "/zh/developer/install/cli/backups-region" },
|
||||
{ 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: "disk", link: "/zh/developer/install/cli/disk" },
|
||||
{ text: "download", link: "/zh/developer/install/cli/download" },
|
||||
{ text: "gpu", link: "/zh/developer/install/cli/gpu" },
|
||||
{ text: "info", link: "/zh/developer/install/cli/info" },
|
||||
{ text: "install", link: "/zh/developer/install/cli/install" },
|
||||
{ text: "logs", link: "/zh/developer/install/cli/logs" },
|
||||
{ text: "node", link: "/zh/developer/install/cli/node" },
|
||||
{ text: "osinfo", link: "/zh/developer/install/cli/osinfo" },
|
||||
{ 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: "upgrade", link: "/zh/developer/install/cli/upgrade" },
|
||||
{
|
||||
text: "user",
|
||||
link: "/zh/developer/install/cli/user",
|
||||
collapsed: true,
|
||||
items: [
|
||||
{ text: "activate", link: "/zh/developer/install/cli/user-activate" },
|
||||
{ text: "create", link: "/zh/developer/install/cli/user-create" },
|
||||
{ text: "delete", link: "/zh/developer/install/cli/user-delete" },
|
||||
{ text: "get", link: "/zh/developer/install/cli/user-get" },
|
||||
{ text: "list", link: "/zh/developer/install/cli/user-list" },
|
||||
{ text: "reset-password", link: "/zh/developer/install/cli/user-reset-password" },
|
||||
],
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
text: "版本说明",
|
||||
link: "/zh/developer/install/versioning",
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
text: "开发 Olares 应用",
|
||||
link: "/zh/developer/develop/",
|
||||
items: [
|
||||
{
|
||||
text: "使用 Studio 开发",
|
||||
collapsed: true,
|
||||
link: "/zh/developer/develop/tutorial/",
|
||||
items: [
|
||||
{
|
||||
text: "部署应用",
|
||||
link: "/zh/developer/develop/tutorial/deploy",
|
||||
},
|
||||
{
|
||||
text: "使用开发容器",
|
||||
link: "/zh/developer/develop/tutorial/develop",
|
||||
},
|
||||
{
|
||||
text: "打包与上传",
|
||||
link: "/zh/developer/develop/tutorial/package-upload",
|
||||
},
|
||||
{
|
||||
text: "添加应用素材",
|
||||
link: "/zh/developer/develop/tutorial/assets",
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
text: "应用包管理",
|
||||
collapsed: true,
|
||||
items: [
|
||||
{
|
||||
text: "应用 Chart 包",
|
||||
link: "/zh/developer/develop/package/chart",
|
||||
},
|
||||
{
|
||||
text: "OlaresManifest",
|
||||
link: "/zh/developer/develop/package/manifest",
|
||||
},
|
||||
/*{
|
||||
text: "推荐算法",
|
||||
link: "/zh/developer/develop/package/recommend",
|
||||
},*/
|
||||
{
|
||||
text: "Helm 扩展",
|
||||
link: "/zh/developer/develop/package/extension",
|
||||
},
|
||||
],
|
||||
},
|
||||
// {
|
||||
// text: "进阶",
|
||||
// collapsed: true,
|
||||
// items: [
|
||||
// {
|
||||
// text: "terminus-info",
|
||||
// link: "/zh/developer/develop/advanced/terminus-info",
|
||||
// },
|
||||
// {
|
||||
// text: "Service Provider",
|
||||
// link: "/zh/developer/develop/advanced/provider",
|
||||
// },
|
||||
// {
|
||||
// text: "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",
|
||||
// },
|
||||
// {
|
||||
// text: "应用市场",
|
||||
// link: "/zh/developer/develop/advanced/market",
|
||||
// },
|
||||
// {
|
||||
// text: "Analytic",
|
||||
// link: "/zh/developer/develop/advanced/analytic",
|
||||
// },
|
||||
// {
|
||||
// text: "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",
|
||||
// },
|
||||
// {
|
||||
// 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: "中间件",
|
||||
link: "/zh/developer/develop/mw-overview",
|
||||
collapsed: true,
|
||||
items: [
|
||||
{
|
||||
text: "Elasticsearch",
|
||||
collapsed: true,
|
||||
items :[
|
||||
{
|
||||
text: "集成 Elasticsearch",
|
||||
link: "zh/developer/develop/mw-integrate-with-es", },
|
||||
{
|
||||
text: "查看 Elasticsearch 数据",
|
||||
link: "zh/developer/develop/mw-view-es-data",
|
||||
},
|
||||
]
|
||||
},
|
||||
{
|
||||
text: "Grafana",
|
||||
link: "zh/developer/develop/mw-view-grafana-data",
|
||||
},
|
||||
{
|
||||
text: "MariaDB",
|
||||
collapsed: true,
|
||||
items :[
|
||||
{
|
||||
text: "集成 MariaDB",
|
||||
link: "zh/developer/develop/mw-integrate-with-mariadb", },
|
||||
{
|
||||
text: "查看 MariaDB 数据",
|
||||
link: "zh/developer/develop/mw-view-mariadb-data",
|
||||
},
|
||||
]
|
||||
},
|
||||
{
|
||||
text: "MinIO",
|
||||
collapsed: true,
|
||||
items :[
|
||||
{
|
||||
text: "集成 MinIO",
|
||||
link: "zh/developer/develop/mw-integrate-with-minio", },
|
||||
{
|
||||
text: "查看 MinIO 数据",
|
||||
link: "zh/developer/develop/mw-view-minio-data",
|
||||
},
|
||||
]
|
||||
},
|
||||
{
|
||||
text: "MongoDB",
|
||||
collapsed: true,
|
||||
items :[
|
||||
{
|
||||
text: "集成 MongoDB",
|
||||
link: "zh/developer/develop/mw-integrate-with-mongodb", },
|
||||
{
|
||||
text: "查看 MongoDB 数据",
|
||||
link: "zh/developer/develop/mw-view-mongodb-data",
|
||||
},
|
||||
]
|
||||
},
|
||||
{
|
||||
text: "MySQL",
|
||||
collapsed: true,
|
||||
items :[
|
||||
{
|
||||
text: "集成 MySQL",
|
||||
link: "zh/developer/develop/mw-integrate-with-mysql", },
|
||||
{
|
||||
text: "查看 MySQL 数据",
|
||||
link: "zh/developer/develop/mw-view-mysql-data",
|
||||
},
|
||||
]
|
||||
},
|
||||
{
|
||||
text: "NATS",
|
||||
link :"zh/developer/develop/mw-view-nats-data",
|
||||
},
|
||||
{
|
||||
text: "OpenTelemetry",
|
||||
link :"zh/developer/develop/mw-view-otel-data",
|
||||
},
|
||||
{
|
||||
text: "PostgreSQL",
|
||||
collapsed: true,
|
||||
items :[
|
||||
{
|
||||
text: "集成 PostgreSQL",
|
||||
link: "zh/developer/develop/mw-integrate-with-pg", },
|
||||
{
|
||||
text: "查看 PostgreSQL 数据",
|
||||
link: "zh/developer/develop/mw-view-pg-data",
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
text: "RabbitMQ",
|
||||
collapsed: true,
|
||||
items :[
|
||||
{
|
||||
text: "集成 RabbitMQ",
|
||||
link: "zh/developer/develop/mw-integrate-with-rabbitmq", },
|
||||
{
|
||||
text: "查看 RabbitMQ 数据",
|
||||
link: "zh/developer/develop/mw-view-rabbitmq-data",
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
text: "Redis",
|
||||
collapsed: true,
|
||||
items :[
|
||||
{
|
||||
text: "集成 Redis",
|
||||
link: "zh/developer/develop/mw-integrate-with-redis", },
|
||||
{
|
||||
text: "查看 Redis 数据",
|
||||
link: "zh/developer/develop/mw-view-redis-data",
|
||||
},
|
||||
]
|
||||
},
|
||||
]
|
||||
},
|
||||
|
||||
],
|
||||
},
|
||||
{
|
||||
text: "分发 Olares 应用",
|
||||
link: "/zh/developer/develop/distribute-index",
|
||||
items: [
|
||||
{
|
||||
text: "提交应用",
|
||||
link: "/zh/developer/develop/submit-apps",
|
||||
},
|
||||
{
|
||||
text: "管理应用",
|
||||
link: "/zh/developer/develop/manage-apps",
|
||||
},
|
||||
{
|
||||
text: "推广应用",
|
||||
link:"/zh/developer/develop/promote-apps"
|
||||
},
|
||||
{
|
||||
text: "发布付费应用",
|
||||
link: "/zh/developer/develop/paid-apps",
|
||||
},
|
||||
|
||||
],
|
||||
},
|
||||
{
|
||||
text: "参与贡献",
|
||||
items: [
|
||||
{
|
||||
text: "开发系统应用",
|
||||
collapsed: true,
|
||||
items: [
|
||||
{
|
||||
text: "概述",
|
||||
link: "/zh/developer/contribute/system-app/overview",
|
||||
},
|
||||
{
|
||||
text: "应用部署配置",
|
||||
link: "/zh/developer/contribute/system-app/deployment",
|
||||
},
|
||||
{
|
||||
text: "Olares 权限配置",
|
||||
link: "/zh/developer/contribute/system-app/olares-manifest",
|
||||
},
|
||||
{
|
||||
text: "安装",
|
||||
link: "/zh/developer/contribute/system-app/install",
|
||||
},
|
||||
{
|
||||
text: "其他",
|
||||
link: "/zh/developer/contribute/system-app/other",
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
text: "开发协议",
|
||||
collapsed: true,
|
||||
items: [
|
||||
{
|
||||
text: "合约",
|
||||
link: "/zh/developer/contribute/olares-id/contract/contract",
|
||||
collapsed: true,
|
||||
items: [
|
||||
{
|
||||
text: "架构",
|
||||
link: "/zh/developer/contribute/olares-id/contract/architecture",
|
||||
},
|
||||
{
|
||||
text: "DID",
|
||||
collapsed: true,
|
||||
items: [
|
||||
{
|
||||
text: "设计",
|
||||
link: "/zh/developer/contribute/olares-id/contract/did/design",
|
||||
},
|
||||
{
|
||||
text: "官方 Tagger",
|
||||
link: "/zh/developer/contribute/olares-id/contract/did/official-taggers",
|
||||
},
|
||||
{
|
||||
text: "发布历史",
|
||||
link: "/zh/developer/contribute/olares-id/contract/did/release-history",
|
||||
},
|
||||
{
|
||||
text: "FAQ",
|
||||
link: "/zh/developer/contribute/olares-id/contract/did/faq",
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
text: "声誉",
|
||||
link: "/zh/developer/contribute/olares-id/contract/contract-reputation",
|
||||
},
|
||||
{
|
||||
text: "管理",
|
||||
collapsed: true,
|
||||
items: [
|
||||
{
|
||||
text: "合约",
|
||||
link: "/zh/developer/contribute/olares-id/contract/manage/contract",
|
||||
},
|
||||
{
|
||||
text: "SDK",
|
||||
link: "/zh/developer/contribute/olares-id/contract/manage/sdk",
|
||||
},
|
||||
{
|
||||
text: "环境",
|
||||
link: "/zh/developer/contribute/olares-id/contract/manage/environment",
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
text: "可验证凭证(VC)",
|
||||
link: "/zh/developer/contribute/olares-id/verifiable-credential/overview",
|
||||
collapsed: true,
|
||||
items: [
|
||||
{
|
||||
text: "发行方",
|
||||
link: "/zh/developer/contribute/olares-id/verifiable-credential/issuer",
|
||||
},
|
||||
{
|
||||
text: "验证方",
|
||||
link: "/zh/developer/contribute/olares-id/verifiable-credential/verifer",
|
||||
},
|
||||
{
|
||||
text: "Olares 案例",
|
||||
link: "/zh/developer/contribute/olares-id/verifiable-credential/olares",
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
}
|
||||
@@ -1,7 +1,9 @@
|
||||
import { defineConfig, type DefaultTheme } from "vitepress";
|
||||
import { oneSidebar } from './one.en.ts';
|
||||
import { useCaseSidebar } from './usecase.en.ts';
|
||||
import { developerSidebar } from './developer.en.ts';
|
||||
const side = {
|
||||
"/manual/": [
|
||||
"/manual/": [
|
||||
{
|
||||
text: "What is Olares",
|
||||
link: "/manual/overview",
|
||||
@@ -28,10 +30,21 @@ const side = {
|
||||
// text: "Request support",
|
||||
// link: "/manual/help/request-technical-support",
|
||||
// },
|
||||
// {
|
||||
// text: "Troubleshooting",
|
||||
// link: "/manual/help/troubleshooting",
|
||||
// },
|
||||
|
||||
],
|
||||
},
|
||||
{
|
||||
text: "Troubleshooting",
|
||||
collapsed: true,
|
||||
items: [
|
||||
{
|
||||
text: "Insufficient memory or memory not freed",
|
||||
link: "/manual/help/ts-free-memory",
|
||||
},
|
||||
{
|
||||
text: "Missing apps in Market",
|
||||
link: "/manual/help/ts-missing-apps",
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
@@ -330,7 +343,7 @@ const side = {
|
||||
collapsed: true,
|
||||
items: [
|
||||
{
|
||||
text: "Change revere proxy",
|
||||
text: "Change reverse proxy",
|
||||
link: "/manual/olares/settings/change-frp",
|
||||
},
|
||||
{
|
||||
@@ -350,7 +363,7 @@ const side = {
|
||||
{ text: "Restore", link: "/manual/olares/settings/restore" },
|
||||
],
|
||||
},
|
||||
{ text: "Developer resources", link: "/manual/olares/settings/developer" },
|
||||
{ text: "Advanced settings", link: "/manual/olares/settings/developer" },
|
||||
]
|
||||
},
|
||||
{ text: "Dashboard", link: "/manual/olares/resources-usage" },
|
||||
@@ -403,12 +416,12 @@ const side = {
|
||||
},
|
||||
{
|
||||
text: "Olares Space",
|
||||
link: "/space/",
|
||||
link: "/manual/space/",
|
||||
collapsed: true,
|
||||
items: [
|
||||
{
|
||||
text: "Manage accounts",
|
||||
link: "/space/manage-accounts",
|
||||
link: "/manual/space/manage-accounts",
|
||||
},
|
||||
{
|
||||
text: "Host Olares",
|
||||
@@ -416,11 +429,11 @@ const side = {
|
||||
items: [
|
||||
{
|
||||
text: "Create Olares",
|
||||
link: "/space/create-olares",
|
||||
link: "/manual/space/create-olares",
|
||||
},
|
||||
{
|
||||
text: "Manage Olares",
|
||||
link: "/space/manage-olares",
|
||||
link: "/manual/space/manage-olares",
|
||||
},
|
||||
],
|
||||
},
|
||||
@@ -430,19 +443,19 @@ const side = {
|
||||
items: [
|
||||
{
|
||||
text: "Set up a custom domain",
|
||||
link: "/space/host-domain",
|
||||
link: "/manual/space/host-domain",
|
||||
},
|
||||
{
|
||||
text: "Manage a domain",
|
||||
link: "/space/manage-domain",
|
||||
link: "/manual/space/manage-domain",
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
text: "Back up and restore",
|
||||
link: "/space/backup-restore",
|
||||
link: "/manual/space/backup-restore",
|
||||
},
|
||||
{ text: "Billing", link: "/space/billing" },
|
||||
{ text: "Billing", link: "/manual/space/billing" },
|
||||
],
|
||||
},
|
||||
{
|
||||
@@ -478,575 +491,6 @@ const side = {
|
||||
},
|
||||
{ text: "Glossary", link: "/manual/glossary" },
|
||||
],
|
||||
"/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",
|
||||
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",
|
||||
},
|
||||
{
|
||||
text: "Stirling PDF",
|
||||
link: "/use-cases/stirling-pdf",
|
||||
},
|
||||
{
|
||||
text: "PDFMathTranslate",
|
||||
link: "/use-cases/pdfmathtranslate",
|
||||
},
|
||||
{
|
||||
text: "LobeChat",
|
||||
link: "/use-cases/lobechat",
|
||||
},
|
||||
{
|
||||
text: "OpenClaw",
|
||||
link: "/use-cases/openclaw",
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
"/developer/": [
|
||||
{
|
||||
text: "Concepts",
|
||||
link: "/developer/concepts/",
|
||||
items: [
|
||||
{ text: "Olares architecture", link: "/developer/concepts/system-architecture" },
|
||||
{
|
||||
text: "Olares ID",
|
||||
link: "/developer/concepts/olares-id",
|
||||
collapsed: true,
|
||||
items: [
|
||||
{
|
||||
text: "Decentralized ID",
|
||||
link: "/developer/concepts/did",
|
||||
},
|
||||
{
|
||||
text: "Blockchain Registry",
|
||||
link: "/developer/concepts/registry",
|
||||
},
|
||||
{
|
||||
text: "Verifiable Credential",
|
||||
link: "/developer/concepts/vc",
|
||||
},
|
||||
{
|
||||
text: "Autonomous Reputation",
|
||||
link: "/developer/concepts/reputation",
|
||||
},
|
||||
// {
|
||||
// text: "Self-Sovereign Network",
|
||||
// link: "/developer/concepts/self-sovereign-network",
|
||||
// },
|
||||
{
|
||||
text: "Identity Wallet",
|
||||
link: "/developer/concepts/wallet",
|
||||
},
|
||||
],
|
||||
},
|
||||
{ text: "Account", link: "/developer/concepts/account" },
|
||||
{ text: "Application", link: "/developer/concepts/application" },
|
||||
{ text: "Network", link: "/developer/concepts/network" },
|
||||
{ text: "Data", link: "/developer/concepts/data" },
|
||||
{ text: "Secrets", link: "/developer/concepts/secrets" },
|
||||
],
|
||||
},
|
||||
{
|
||||
text: "Installation deep-dive",
|
||||
link: "/developer/install/",
|
||||
items: [
|
||||
{
|
||||
text: "Installation architecture",
|
||||
link: "/developer/install/installation-overview",
|
||||
},
|
||||
{
|
||||
text: "Installation process",
|
||||
link: "/developer/install/installation-process",
|
||||
},
|
||||
{
|
||||
text: "Olares Home",
|
||||
link: "/developer/install/olares-home",
|
||||
},
|
||||
{
|
||||
text: "Environment variables",
|
||||
link: "/developer/install/environment-variables",
|
||||
},
|
||||
{
|
||||
text: "Olares CLI",
|
||||
link: "/developer/install/cli/olares-cli",
|
||||
collapsed: true,
|
||||
items: [
|
||||
{ text: "Access Olares terminal", link: "/developer/reference/access-olares-terminal" },
|
||||
{
|
||||
text: "backups",
|
||||
link: "/developer/install/cli/backups",
|
||||
collapsed: true,
|
||||
items: [
|
||||
{ text: "backup", link: "/developer/install/cli/backups-backup" },
|
||||
{ text: "download", link: "/developer/install/cli/backups-download" },
|
||||
{ text: "region", link: "/developer/install/cli/backups-region" },
|
||||
{ text: "restore", link: "/developer/install/cli/backups-restore" },
|
||||
{ text: "snapshots", link: "/developer/install/cli/backups-snapshots" },
|
||||
],
|
||||
},
|
||||
{ text: "change-ip", link: "/developer/install/cli/change-ip" },
|
||||
{ text: "disk", link: "/developer/install/cli/disk" },
|
||||
{ text: "download", link: "/developer/install/cli/download" },
|
||||
{ text: "gpu", link: "/developer/install/cli/gpu" },
|
||||
{ text: "info", link: "/developer/install/cli/info" },
|
||||
{ text: "install", link: "/developer/install/cli/install" },
|
||||
{ text: "logs", link: "/developer/install/cli/logs" },
|
||||
{ text: "node", link: "/developer/install/cli/node" },
|
||||
{ text: "osinfo", link: "/developer/install/cli/osinfo" },
|
||||
{ text: "precheck", link: "/developer/install/cli/precheck" },
|
||||
{ text: "prepare", link: "/developer/install/cli/prepare" },
|
||||
{ text: "release", link: "/developer/install/cli/release" },
|
||||
{ text: "start", link: "/developer/install/cli/start" },
|
||||
{ text: "stop", link: "/developer/install/cli/stop" },
|
||||
{ text: "uninstall", link: "/developer/install/cli/uninstall" },
|
||||
{ text: "upgrade", link: "/developer/install/cli/upgrade" },
|
||||
{
|
||||
text: "user",
|
||||
link: "/developer/install/cli/user",
|
||||
collapsed: true,
|
||||
items: [
|
||||
{ text: "activate", link: "/developer/install/cli/user-activate" },
|
||||
{ text: "create", link: "/developer/install/cli/user-create" },
|
||||
{ text: "delete", link: "/developer/install/cli/user-delete" },
|
||||
{ text: "get", link: "/developer/install/cli/user-get" },
|
||||
{ text: "list", link: "/developer/install/cli/user-list" },
|
||||
{ text: "reset-password", link: "/developer/install/cli/user-reset-password" },
|
||||
],
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
text: "Olares versioning",
|
||||
link: "/developer/install/versioning",
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
text: "Develop Olares apps",
|
||||
link: "/developer/develop/",
|
||||
items: [
|
||||
{
|
||||
text: "Develop with Studio",
|
||||
collapsed: true,
|
||||
link: "/developer/develop/tutorial/",
|
||||
items: [
|
||||
{
|
||||
text: "Deploy an app",
|
||||
link: "/developer/develop/tutorial/deploy",
|
||||
},
|
||||
{
|
||||
text: "Develop in a dev container",
|
||||
link: "/developer/develop/tutorial/develop",
|
||||
},
|
||||
{
|
||||
text: "Package and upload",
|
||||
link: "/developer/develop/tutorial/package-upload",
|
||||
},
|
||||
{
|
||||
text: "Add app assets",
|
||||
link: "/developer/develop/tutorial/assets",
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
text: "Application package",
|
||||
collapsed: true,
|
||||
items: [
|
||||
{
|
||||
text: "Application chart",
|
||||
link: "/developer/develop/package/chart",
|
||||
},
|
||||
{
|
||||
text: "OlaresManifest",
|
||||
link: "/developer/develop/package/manifest",
|
||||
},
|
||||
/*{
|
||||
text: "Recommendation",
|
||||
link: "/developer/develop/package/recommend",
|
||||
},*/
|
||||
{
|
||||
text: "Helm extension",
|
||||
link: "/developer/develop/package/extension",
|
||||
},
|
||||
],
|
||||
},
|
||||
// {
|
||||
// text: "Advanced",
|
||||
// collapsed: true,
|
||||
// items: [
|
||||
// {
|
||||
// text: "terminus-info",
|
||||
// link: "/developer/develop/advanced/terminus-info",
|
||||
// },
|
||||
// {
|
||||
// text: "Service provider",
|
||||
// link: "/developer/develop/advanced/provider",
|
||||
// },
|
||||
// {
|
||||
// text: "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",
|
||||
// },
|
||||
// {
|
||||
// text: "Market",
|
||||
// link: "/developer/develop/advanced/market",
|
||||
// },
|
||||
// {
|
||||
// text: "Websocket",
|
||||
// link: "/developer/develop/advanced/websocket",
|
||||
// },
|
||||
// {
|
||||
// text: "File upload",
|
||||
// link: "/developer/develop/advanced/file-upload",
|
||||
// },
|
||||
// {
|
||||
// text: "Secret",
|
||||
// link: "/developer/develop/advanced/secret",
|
||||
// },
|
||||
// {
|
||||
// text: "Kubesphere",
|
||||
// link: "/developer/develop/advanced/kubesphere",
|
||||
// },
|
||||
// ],
|
||||
// },
|
||||
{
|
||||
text: "Middleware",
|
||||
link: "/developer/develop/mw-overview",
|
||||
collapsed: true,
|
||||
items: [
|
||||
{
|
||||
text: "Elasticsearch",
|
||||
collapsed: true,
|
||||
items :[
|
||||
{
|
||||
text: "Integrate with Elasticsearch",
|
||||
link: "/developer/develop/mw-integrate-with-es", },
|
||||
{
|
||||
text: "View Elasticsearch data",
|
||||
link: "/developer/develop/mw-view-es-data",
|
||||
},
|
||||
]
|
||||
},
|
||||
{
|
||||
text: "Grafana",
|
||||
link :"/developer/develop/mw-view-grafana-data",
|
||||
},
|
||||
{
|
||||
text: "MariaDB",
|
||||
collapsed: true,
|
||||
items :[
|
||||
{
|
||||
text: "Integrate with MariaDB",
|
||||
link: "/developer/develop/mw-integrate-with-mariadb", },
|
||||
{
|
||||
text: "View MariaDB data",
|
||||
link: "/developer/develop/mw-view-mariadb-data",
|
||||
},
|
||||
]
|
||||
},
|
||||
{
|
||||
text: "MinIO",
|
||||
collapsed: true,
|
||||
items :[
|
||||
{
|
||||
text: "Integrate with MinIO",
|
||||
link: "/developer/develop/mw-integrate-with-minio", },
|
||||
{
|
||||
text: "View MinIO data",
|
||||
link: "/developer/develop/mw-view-minio-data",
|
||||
},
|
||||
]
|
||||
},
|
||||
{
|
||||
text: "MongoDB",
|
||||
collapsed: true,
|
||||
items :[
|
||||
{
|
||||
text: "Integrate with MongoDB",
|
||||
link: "/developer/develop/mw-integrate-with-mongodb", },
|
||||
{
|
||||
text: "View MongoDB data",
|
||||
link: "/developer/develop/mw-view-mongodb-data",
|
||||
},
|
||||
]
|
||||
},
|
||||
{
|
||||
text: "MySQL",
|
||||
collapsed: true,
|
||||
items :[
|
||||
{
|
||||
text: "Integrate with MySQL",
|
||||
link: "/developer/develop/mw-integrate-with-mysql", },
|
||||
{
|
||||
text: "View MySQL data",
|
||||
link: "/developer/develop/mw-view-mysql-data",
|
||||
},
|
||||
]
|
||||
},
|
||||
{
|
||||
text: "NATS",
|
||||
link :"/developer/develop/mw-view-nats-data",
|
||||
},
|
||||
{
|
||||
text: "OpenTelemetry",
|
||||
link :"/developer/develop/mw-view-otel-data",
|
||||
},
|
||||
{
|
||||
text: "PostgreSQL",
|
||||
collapsed: true,
|
||||
items :[
|
||||
{
|
||||
text: "Integrate with PostgreSQL",
|
||||
link: "/developer/develop/mw-integrate-with-pg", },
|
||||
{
|
||||
text: "View PostgreSQL data",
|
||||
link: "/developer/develop/mw-view-pg-data",
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
text: "RabbitMQ",
|
||||
collapsed: true,
|
||||
items :[
|
||||
{
|
||||
text: "Integrate with RabbitMQ",
|
||||
link: "/developer/develop/mw-integrate-with-rabbitmq", },
|
||||
{
|
||||
text: "View RabbitMQ data",
|
||||
link: "/developer/develop/mw-view-rabbitmq-data",
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
text: "Redis",
|
||||
collapsed: true,
|
||||
items :[
|
||||
{
|
||||
text: "Integrate with Redis",
|
||||
link: "/developer/develop/mw-integrate-with-redis", },
|
||||
{
|
||||
text: "View Redis data",
|
||||
link: "/developer/develop/mw-view-redis-data",
|
||||
}
|
||||
]
|
||||
},
|
||||
]
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
text: "Distribute Olares apps",
|
||||
link: "/developer/develop/distribute-index",
|
||||
items: [
|
||||
{
|
||||
text: "Summit apps",
|
||||
link: "/developer/develop/submit-apps",
|
||||
},
|
||||
{
|
||||
text: "Manage app lifecycle",
|
||||
link: "/developer/develop/manage-apps",
|
||||
},
|
||||
{
|
||||
text: "Promote your apps",
|
||||
link:"/developer/develop/promote-apps"
|
||||
},
|
||||
{
|
||||
text: "Publish paid apps",
|
||||
link: "/developer/develop/paid-apps",
|
||||
},
|
||||
|
||||
],
|
||||
},
|
||||
{
|
||||
text: "Contribute to Olares",
|
||||
items: [
|
||||
{
|
||||
text: "Develop system app",
|
||||
collapsed: true,
|
||||
items: [
|
||||
{
|
||||
text: "Overview",
|
||||
link: "/developer/contribute/system-app/overview",
|
||||
},
|
||||
{
|
||||
text: "Configure deployment",
|
||||
link: "/developer/contribute/system-app/deployment",
|
||||
},
|
||||
{
|
||||
text: "Configure permissions",
|
||||
link: "/developer/contribute/system-app/olares-manifest",
|
||||
},
|
||||
{
|
||||
text: "Install",
|
||||
link: "/developer/contribute/system-app/install",
|
||||
},
|
||||
{
|
||||
text: "Other",
|
||||
link: "/developer/contribute/system-app/other",
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
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",
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
};
|
||||
|
||||
export const en = defineConfig({
|
||||
@@ -1065,6 +509,8 @@ export const en = defineConfig({
|
||||
sidebar: {
|
||||
...side,
|
||||
...oneSidebar,
|
||||
...useCaseSidebar,
|
||||
...developerSidebar,
|
||||
},
|
||||
},
|
||||
});
|
||||
@@ -24,9 +24,13 @@ export const oneSidebar: DefaultTheme.Sidebar = {
|
||||
link: "/one/first-boot",
|
||||
},
|
||||
{
|
||||
text: "Access Olares securely",
|
||||
text: "Access Olares via VPN",
|
||||
link: "/one/access-olares-via-vpn",
|
||||
},
|
||||
{
|
||||
text: "Access Olares via .local domain",
|
||||
link: "/one/access-olares-via-local-domain",
|
||||
},
|
||||
{
|
||||
text: "Redeem membership",
|
||||
link: "/one/redeem-membership",
|
||||
@@ -197,15 +201,11 @@ export const oneSidebar: DefaultTheme.Sidebar = {
|
||||
}
|
||||
,
|
||||
{
|
||||
text: "Install NVIDIA driver",
|
||||
text: "Install drivers on Windows",
|
||||
link: "/one/install-nvidia-driver",
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
text: "Create a bootable USB",
|
||||
link: "/one/create-drive",
|
||||
},
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -216,14 +216,28 @@ export const oneSidebar: DefaultTheme.Sidebar = {
|
||||
link: "/one/update",
|
||||
},
|
||||
{
|
||||
text: "Back up & restore",
|
||||
text: "Back up & restore data",
|
||||
link: "/one/backup-resotre",
|
||||
},
|
||||
{
|
||||
text: "Factory reset",
|
||||
link: "/one/factory-reset",
|
||||
text: "Restore Olares One",
|
||||
collapsed: true,
|
||||
items: [
|
||||
{
|
||||
text: "Factory reset",
|
||||
link: "/one/factory-reset",
|
||||
},
|
||||
{
|
||||
text: "Restore BIOS defaults",
|
||||
link: "/one/factory-reset-in-bios",
|
||||
},
|
||||
{
|
||||
text: "Reinstall Olares OS",
|
||||
link: "/one/create-drive",
|
||||
},
|
||||
],
|
||||
},
|
||||
]
|
||||
},
|
||||
],
|
||||
}
|
||||
}
|
||||
|
||||
@@ -24,11 +24,15 @@ export const oneSidebar: DefaultTheme.Sidebar = {
|
||||
link: "/zh/one/first-boot",
|
||||
},
|
||||
{
|
||||
text: "Access Olares securely",
|
||||
text: "Access Olares via VPN",
|
||||
link: "/zh/one/access-olares-via-vpn",
|
||||
},
|
||||
{
|
||||
text: "Redeem Olares Space membership",
|
||||
text: "Access Olares via .local domain",
|
||||
link: "/zh/one/access-olares-via-local-domain",
|
||||
},
|
||||
{
|
||||
text: "Redeem membership",
|
||||
link: "/zh/one/redeem-membership",
|
||||
},
|
||||
]
|
||||
@@ -165,7 +169,7 @@ export const oneSidebar: DefaultTheme.Sidebar = {
|
||||
},
|
||||
{
|
||||
text: "Connect two Olares One",
|
||||
link: "/zh/one/connect-two-olares-one"
|
||||
link: "/zh/one/connect-two-olares-one",
|
||||
// items:
|
||||
// [
|
||||
// {
|
||||
@@ -192,20 +196,16 @@ export const oneSidebar: DefaultTheme.Sidebar = {
|
||||
link: "/zh/one/dual-boot-dual-drive",
|
||||
},
|
||||
{
|
||||
text: "Dual-drive setup",
|
||||
text: "Single-drive setup",
|
||||
link: "/zh/one/dual-boot-single-drive",
|
||||
}
|
||||
,
|
||||
{
|
||||
text: "Install NVIDIA driver",
|
||||
text: "Install drivers on Windows",
|
||||
link: "/zh/one/install-nvidia-driver",
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
text: "Create a bootable USB",
|
||||
link: "/zh/one/create-drive",
|
||||
},
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -216,14 +216,28 @@ export const oneSidebar: DefaultTheme.Sidebar = {
|
||||
link: "/zh/one/update",
|
||||
},
|
||||
{
|
||||
text: "Back up & restore",
|
||||
text: "Back up & restore data",
|
||||
link: "/zh/one/backup-resotre",
|
||||
},
|
||||
{
|
||||
text: "Factory reset",
|
||||
link: "/zh/one/factory-reset",
|
||||
text: "Restore Olares One",
|
||||
collapsed: true,
|
||||
items: [
|
||||
{
|
||||
text: "Factory reset",
|
||||
link: "/zh/one/factory-reset",
|
||||
},
|
||||
{
|
||||
text: "Restore BIOS defaults",
|
||||
link: "/zh/one/factory-reset-in-bios",
|
||||
},
|
||||
{
|
||||
text: "Reinstall Olares OS",
|
||||
link: "/zh/one/create-drive",
|
||||
},
|
||||
],
|
||||
},
|
||||
]
|
||||
},
|
||||
],
|
||||
}
|
||||
}
|
||||
|
||||
101
docs/.vitepress/usecase.en.ts
Normal file
101
docs/.vitepress/usecase.en.ts
Normal file
@@ -0,0 +1,101 @@
|
||||
import { defineConfig, type DefaultTheme } from "vitepress";
|
||||
|
||||
export const useCaseSidebar: DefaultTheme.Sidebar = {
|
||||
"/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",
|
||||
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",
|
||||
},
|
||||
{
|
||||
text: "Stirling PDF",
|
||||
link: "/use-cases/stirling-pdf",
|
||||
},
|
||||
{
|
||||
text: "PDFMathTranslate",
|
||||
link: "/use-cases/pdfmathtranslate",
|
||||
},
|
||||
{
|
||||
text: "LobeChat",
|
||||
link: "/use-cases/lobechat",
|
||||
},
|
||||
{
|
||||
text: "OpenClaw",
|
||||
link: "/use-cases/openclaw",
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
}
|
||||
69
docs/.vitepress/usecase.zh.ts
Normal file
69
docs/.vitepress/usecase.zh.ts
Normal file
@@ -0,0 +1,69 @@
|
||||
import { defineConfig, type DefaultTheme } from "vitepress";
|
||||
|
||||
export const useCaseSidebar: DefaultTheme.Sidebar = {
|
||||
"/zh/use-cases/": [
|
||||
{
|
||||
text: "应用示例",
|
||||
link: "/zh/use-cases/",
|
||||
items: [
|
||||
{
|
||||
text: "Stable Diffusion",
|
||||
link: "/zh/use-cases/stable-diffusion",
|
||||
},
|
||||
{
|
||||
text: "ComfyUI",
|
||||
link: "/zh/use-cases/comfyui",
|
||||
collapsed: true,
|
||||
items: [
|
||||
{
|
||||
text: "Manage ComfyUI",
|
||||
link: "/zh/use-cases/comfyui-launcher",
|
||||
},
|
||||
{
|
||||
text: "Use ComfyUI for Krita",
|
||||
link: "/zh/use-cases/comfyui-for-krita",
|
||||
},
|
||||
]
|
||||
},
|
||||
{
|
||||
text: "Ollama",
|
||||
link: "/zh/use-cases/ollama",
|
||||
},
|
||||
{
|
||||
text: "Open WebUI",
|
||||
link: "/zh/use-cases/openwebui",
|
||||
},
|
||||
{
|
||||
text: "Perplexica",
|
||||
link: "/zh/use-cases/perplexica",
|
||||
},
|
||||
{
|
||||
text: "Dify",
|
||||
link: "/zh/use-cases/dify",
|
||||
},
|
||||
{
|
||||
text: "Jellyfin",
|
||||
link: "/zh/use-cases/stream-media",
|
||||
},
|
||||
{
|
||||
text: "Steam",
|
||||
collapsed: true,
|
||||
items: [
|
||||
{
|
||||
text: "在 Olares 本机游玩",
|
||||
link: "/zh/use-cases/play-games-directly",
|
||||
},
|
||||
{
|
||||
text: "串流到其他设备",
|
||||
link: "/zh/use-cases/stream-game",
|
||||
}
|
||||
]
|
||||
},
|
||||
// {
|
||||
// text: "Redroid",
|
||||
// link: "/zh/use-cases/host-cloud-android",
|
||||
// },
|
||||
],
|
||||
},
|
||||
],
|
||||
}
|
||||
@@ -1,5 +1,7 @@
|
||||
import { defineConfig, type DefaultTheme } from "vitepress";
|
||||
import { oneSidebar } from './one.zh.ts';
|
||||
import { useCaseSidebar } from './usecase.zh.ts';
|
||||
import { developerSidebar } from './developer.zh.ts';
|
||||
const side = {
|
||||
"/zh/manual/": [
|
||||
{
|
||||
@@ -28,10 +30,20 @@ const side = {
|
||||
// text: "技术支持",
|
||||
// link: "/zh/manual/help/request-technical-support",
|
||||
// },
|
||||
// {
|
||||
// text: "Troubleshooting Guide",
|
||||
// link: "/zh/manual/help/troubleshooting-guide",
|
||||
// },
|
||||
],
|
||||
},
|
||||
{
|
||||
text: "故障排查",
|
||||
collapsed: true,
|
||||
items: [
|
||||
{
|
||||
text: "内存不足或没有释放",
|
||||
link: "/zh/manual/help/ts-free-memory",
|
||||
},
|
||||
{
|
||||
text: "应用市场应用缺失",
|
||||
link: "/zh/manual/help/ts-missing-apps",
|
||||
}
|
||||
],
|
||||
},
|
||||
],
|
||||
@@ -346,7 +358,7 @@ const side = {
|
||||
{ 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" },
|
||||
@@ -399,12 +411,12 @@ const side = {
|
||||
},
|
||||
{
|
||||
text: "Olares Space",
|
||||
link: "/zh/space/",
|
||||
link: "/zh/manual/space/index",
|
||||
collapsed: true,
|
||||
items: [
|
||||
{
|
||||
text: "管理账号",
|
||||
link: "/zh/space/manage-accounts",
|
||||
link: "/zh/manual/space/manage-accounts",
|
||||
},
|
||||
{
|
||||
text: "托管 Olares",
|
||||
@@ -412,11 +424,11 @@ const side = {
|
||||
items: [
|
||||
{
|
||||
text: "创建 Olares",
|
||||
link: "/zh/space/create-olares",
|
||||
link: "/zh/manual/space/create-olares",
|
||||
},
|
||||
{
|
||||
text: "管理 Olares",
|
||||
link: "/zh/space/manage-olares",
|
||||
link: "/zh/manual/space/manage-olares",
|
||||
},
|
||||
],
|
||||
},
|
||||
@@ -426,19 +438,19 @@ const side = {
|
||||
items: [
|
||||
{
|
||||
text: "设置自定义域名",
|
||||
link: "/zh/space/host-domain",
|
||||
link: "/zh/manual/space/host-domain",
|
||||
},
|
||||
{
|
||||
text: "管理域名",
|
||||
link: "/zh/space/manage-domain",
|
||||
link: "/zh/manual/space/manage-domain",
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
text: "备份与恢复",
|
||||
link: "/zh/space/backup-restore",
|
||||
link: "/zh/manual/space/backup-restore",
|
||||
},
|
||||
{ text: "计费", link: "/zh/space/billing" },
|
||||
{ text: "计费", link: "/zh/manual/space/billing" },
|
||||
],
|
||||
},
|
||||
{
|
||||
@@ -472,566 +484,12 @@ const side = {
|
||||
},
|
||||
{
|
||||
text: "本地访问 Olares",
|
||||
link: "/manual/best-practices/local-access",
|
||||
link: "/zh/manual/best-practices/local-access",
|
||||
},
|
||||
],
|
||||
},
|
||||
{ text: "术语", link: "/zh/manual/glossary" },
|
||||
],
|
||||
|
||||
"/zh/use-cases/": [
|
||||
{
|
||||
text: "应用示例",
|
||||
link: "/zh/use-cases/",
|
||||
items: [
|
||||
{
|
||||
text: "Stable Diffusion",
|
||||
link: "/zh/use-cases/stable-diffusion",
|
||||
},
|
||||
{
|
||||
text: "ComfyUI",
|
||||
link: "/zh/use-cases/comfyui",
|
||||
collapsed: true,
|
||||
items: [
|
||||
{
|
||||
text: "Manage ComfyUI",
|
||||
link: "/zh/use-cases/comfyui-launcher",
|
||||
},
|
||||
{
|
||||
text: "Use ComfyUI for Krita",
|
||||
link: "/zh/use-cases/comfyui-for-krita",
|
||||
},
|
||||
]
|
||||
},
|
||||
{
|
||||
text: "Ollama",
|
||||
link: "/zh/use-cases/ollama",
|
||||
},
|
||||
{
|
||||
text: "Open WebUI",
|
||||
link: "/zh/use-cases/openwebui",
|
||||
},
|
||||
{
|
||||
text: "Perplexica",
|
||||
link: "/zh/use-cases/perplexica",
|
||||
},
|
||||
{
|
||||
text: "Dify",
|
||||
link: "/zh/use-cases/dify",
|
||||
},
|
||||
{
|
||||
text: "Jellyfin",
|
||||
link: "/zh/use-cases/stream-media",
|
||||
},
|
||||
{
|
||||
text: "Steam",
|
||||
collapsed: true,
|
||||
items: [
|
||||
{
|
||||
text: "在 Olares 本机游玩",
|
||||
link: "/zh/use-cases/play-games-directly",
|
||||
},
|
||||
{
|
||||
text: "串流到其他设备",
|
||||
link: "/zh/use-cases/stream-game",
|
||||
}
|
||||
]
|
||||
},
|
||||
// {
|
||||
// text: "Redroid",
|
||||
// link: "/zh/use-cases/host-cloud-android",
|
||||
// },
|
||||
],
|
||||
},
|
||||
],
|
||||
"/zh/developer/": [
|
||||
{
|
||||
text: "概念",
|
||||
link: "/zh/developer/concepts/",
|
||||
items: [
|
||||
{ text: "系统架构", link: "/zh/developer/concepts/system-architecture" },
|
||||
{
|
||||
text: "Olares ID",
|
||||
link: "/zh/developer/concepts/olares-id",
|
||||
collapsed: true,
|
||||
items: [
|
||||
{
|
||||
text: "去中心化标识符",
|
||||
link: "/zh/developer/concepts/did",
|
||||
},
|
||||
{
|
||||
text: "DID Registry",
|
||||
link: "/zh/developer/concepts/registry",
|
||||
},
|
||||
{
|
||||
text: "可验证凭证",
|
||||
link: "/zh/developer/concepts/vc",
|
||||
},
|
||||
{
|
||||
text: "自治声誉",
|
||||
link: "/zh/developer/concepts/reputation",
|
||||
},
|
||||
// {
|
||||
// text: "主权网络",
|
||||
// link: "/zh/developer/concepts/self-sovereign-network",
|
||||
// },
|
||||
{
|
||||
text: "身份钱包",
|
||||
link: "/zh/developer/concepts/wallet",
|
||||
},
|
||||
],
|
||||
},
|
||||
{ text: "账户", link: "/zh/developer/concepts/account" },
|
||||
{ text: "应用", link: "/zh/developer/concepts/application" },
|
||||
{ text: "网络", link: "/zh/developer/concepts/network" },
|
||||
{ text: "数据", link: "/zh/developer/concepts/data" },
|
||||
{ text: "密钥", link: "/zh/developer/concepts/secrets" },
|
||||
],
|
||||
},
|
||||
{
|
||||
text: "Olares 安装详解",
|
||||
link: "/zh/developer/install/",
|
||||
items: [
|
||||
{
|
||||
text: "安装概述",
|
||||
link: "/zh/developer/install/installation-overview",
|
||||
},
|
||||
{
|
||||
text: "安装流程",
|
||||
link: "/zh/developer/install/installation-process",
|
||||
},
|
||||
{
|
||||
text: "Olares Home",
|
||||
link: "/zh/developer/install/olares-home",
|
||||
},
|
||||
{
|
||||
text: "环境变量",
|
||||
link: "/zh/developer/install/environment-variables",
|
||||
},
|
||||
{
|
||||
text: "Olares CLI",
|
||||
link: "/zh/developer/install/cli/olares-cli",
|
||||
collapsed: true,
|
||||
items: [
|
||||
{
|
||||
text: "backups",
|
||||
link: "/zh/developer/install/cli/backups",
|
||||
collapsed: true,
|
||||
items: [
|
||||
{ text: "backup", link: "/zh/developer/install/cli/backups-backup" },
|
||||
{ text: "download", link: "/zh/developer/install/cli/backups-download" },
|
||||
{ text: "region", link: "/zh/developer/install/cli/backups-region" },
|
||||
{ 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: "disk", link: "/zh/developer/install/cli/disk" },
|
||||
{ text: "download", link: "/zh/developer/install/cli/download" },
|
||||
{ text: "gpu", link: "/zh/developer/install/cli/gpu" },
|
||||
{ text: "info", link: "/zh/developer/install/cli/info" },
|
||||
{ text: "install", link: "/zh/developer/install/cli/install" },
|
||||
{ text: "logs", link: "/zh/developer/install/cli/logs" },
|
||||
{ text: "node", link: "/zh/developer/install/cli/node" },
|
||||
{ text: "osinfo", link: "/zh/developer/install/cli/osinfo" },
|
||||
{ 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: "upgrade", link: "/zh/developer/install/cli/upgrade" },
|
||||
{
|
||||
text: "user",
|
||||
link: "/zh/developer/install/cli/user",
|
||||
collapsed: true,
|
||||
items: [
|
||||
{ text: "activate", link: "/zh/developer/install/cli/user-activate" },
|
||||
{ text: "create", link: "/zh/developer/install/cli/user-create" },
|
||||
{ text: "delete", link: "/zh/developer/install/cli/user-delete" },
|
||||
{ text: "get", link: "/zh/developer/install/cli/user-get" },
|
||||
{ text: "list", link: "/zh/developer/install/cli/user-list" },
|
||||
{ text: "reset-password", link: "/zh/developer/install/cli/user-reset-password" },
|
||||
],
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
text: "版本说明",
|
||||
link: "/zh/developer/install/versioning",
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
text: "开发 Olares 应用",
|
||||
link: "/zh/developer/develop/",
|
||||
items: [
|
||||
{
|
||||
text: "使用 Studio 开发",
|
||||
collapsed: true,
|
||||
link: "/zh/developer/develop/tutorial/",
|
||||
items: [
|
||||
{
|
||||
text: "部署应用",
|
||||
link: "/zh/developer/develop/tutorial/deploy",
|
||||
},
|
||||
{
|
||||
text: "使用开发容器",
|
||||
link: "/zh/developer/develop/tutorial/develop",
|
||||
},
|
||||
{
|
||||
text: "打包与上传",
|
||||
link: "/zh/developer/develop/tutorial/package-upload",
|
||||
},
|
||||
{
|
||||
text: "添加应用素材",
|
||||
link: "/zh/developer/develop/tutorial/assets",
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
text: "应用包管理",
|
||||
collapsed: true,
|
||||
items: [
|
||||
{
|
||||
text: "应用 Chart 包",
|
||||
link: "/zh/developer/develop/package/chart",
|
||||
},
|
||||
{
|
||||
text: "OlaresManifest",
|
||||
link: "/zh/developer/develop/package/manifest",
|
||||
},
|
||||
/*{
|
||||
text: "推荐算法",
|
||||
link: "/zh/developer/develop/package/recommend",
|
||||
},*/
|
||||
{
|
||||
text: "Helm 扩展",
|
||||
link: "/zh/developer/develop/package/extension",
|
||||
},
|
||||
],
|
||||
},
|
||||
// {
|
||||
// text: "进阶",
|
||||
// collapsed: true,
|
||||
// items: [
|
||||
// {
|
||||
// text: "terminus-info",
|
||||
// link: "/zh/developer/develop/advanced/terminus-info",
|
||||
// },
|
||||
// {
|
||||
// text: "Service Provider",
|
||||
// link: "/zh/developer/develop/advanced/provider",
|
||||
// },
|
||||
// {
|
||||
// text: "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",
|
||||
// },
|
||||
// {
|
||||
// text: "应用市场",
|
||||
// link: "/zh/developer/develop/advanced/market",
|
||||
// },
|
||||
// {
|
||||
// text: "Analytic",
|
||||
// link: "/zh/developer/develop/advanced/analytic",
|
||||
// },
|
||||
// {
|
||||
// text: "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",
|
||||
// },
|
||||
// {
|
||||
// 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: "中间件",
|
||||
link: "/zh/developer/develop/mw-overview",
|
||||
collapsed: true,
|
||||
items: [
|
||||
{
|
||||
text: "Elasticsearch",
|
||||
collapsed: true,
|
||||
items :[
|
||||
{
|
||||
text: "集成 Elasticsearch",
|
||||
link: "zh/developer/develop/mw-integrate-with-es", },
|
||||
{
|
||||
text: "查看 Elasticsearch 数据",
|
||||
link: "zh/developer/develop/mw-view-es-data",
|
||||
},
|
||||
]
|
||||
},
|
||||
{
|
||||
text: "Grafana",
|
||||
link: "zh/developer/develop/mw-view-grafana-data",
|
||||
},
|
||||
{
|
||||
text: "MariaDB",
|
||||
collapsed: true,
|
||||
items :[
|
||||
{
|
||||
text: "集成 MariaDB",
|
||||
link: "zh/developer/develop/mw-integrate-with-mariadb", },
|
||||
{
|
||||
text: "查看 MariaDB 数据",
|
||||
link: "zh/developer/develop/mw-view-mariadb-data",
|
||||
},
|
||||
]
|
||||
},
|
||||
{
|
||||
text: "MinIO",
|
||||
collapsed: true,
|
||||
items :[
|
||||
{
|
||||
text: "集成 MinIO",
|
||||
link: "zh/developer/develop/mw-integrate-with-minio", },
|
||||
{
|
||||
text: "查看 MinIO 数据",
|
||||
link: "zh/developer/develop/mw-view-minio-data",
|
||||
},
|
||||
]
|
||||
},
|
||||
{
|
||||
text: "MongoDB",
|
||||
collapsed: true,
|
||||
items :[
|
||||
{
|
||||
text: "集成 MongoDB",
|
||||
link: "zh/developer/develop/mw-integrate-with-mongodb", },
|
||||
{
|
||||
text: "查看 MongoDB 数据",
|
||||
link: "zh/developer/develop/mw-view-mongodb-data",
|
||||
},
|
||||
]
|
||||
},
|
||||
{
|
||||
text: "MySQL",
|
||||
collapsed: true,
|
||||
items :[
|
||||
{
|
||||
text: "集成 MySQL",
|
||||
link: "zh/developer/develop/mw-integrate-with-mysql", },
|
||||
{
|
||||
text: "查看 MySQL 数据",
|
||||
link: "zh/developer/develop/mw-view-mysql-data",
|
||||
},
|
||||
]
|
||||
},
|
||||
{
|
||||
text: "NATS",
|
||||
link :"zh/developer/develop/mw-view-nats-data",
|
||||
},
|
||||
{
|
||||
text: "OpenTelemetry",
|
||||
link :"zh/developer/develop/mw-view-otel-data",
|
||||
},
|
||||
{
|
||||
text: "PostgreSQL",
|
||||
collapsed: true,
|
||||
items :[
|
||||
{
|
||||
text: "集成 PostgreSQL",
|
||||
link: "zh/developer/develop/mw-integrate-with-pg", },
|
||||
{
|
||||
text: "查看 PostgreSQL 数据",
|
||||
link: "zh/developer/develop/mw-view-pg-data",
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
text: "RabbitMQ",
|
||||
collapsed: true,
|
||||
items :[
|
||||
{
|
||||
text: "集成 RabbitMQ",
|
||||
link: "zh/developer/develop/mw-integrate-with-rabbitmq", },
|
||||
{
|
||||
text: "查看 RabbitMQ 数据",
|
||||
link: "zh/developer/develop/mw-view-rabbitmq-data",
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
text: "Redis",
|
||||
collapsed: true,
|
||||
items :[
|
||||
{
|
||||
text: "集成 Redis",
|
||||
link: "zh/developer/develop/mw-integrate-with-redis", },
|
||||
{
|
||||
text: "查看 Redis 数据",
|
||||
link: "zh/developer/develop/mw-view-redis-data",
|
||||
},
|
||||
]
|
||||
},
|
||||
]
|
||||
},
|
||||
|
||||
],
|
||||
},
|
||||
{
|
||||
text: "分发 Olares 应用",
|
||||
link: "/zh/developer/develop/distribute-index",
|
||||
items: [
|
||||
{
|
||||
text: "提交应用",
|
||||
link: "/zh/developer/develop/submit-apps",
|
||||
},
|
||||
{
|
||||
text: "管理应用",
|
||||
link: "/zh/developer/develop/manage-apps",
|
||||
},
|
||||
{
|
||||
text: "推广应用",
|
||||
link:"/zh/developer/develop/promote-apps"
|
||||
},
|
||||
{
|
||||
text: "发布付费应用",
|
||||
link: "/zh/developer/develop/paid-apps",
|
||||
},
|
||||
|
||||
],
|
||||
},
|
||||
{
|
||||
text: "参与贡献",
|
||||
items: [
|
||||
{
|
||||
text: "开发系统应用",
|
||||
collapsed: true,
|
||||
items: [
|
||||
{
|
||||
text: "概述",
|
||||
link: "/zh/developer/contribute/system-app/overview",
|
||||
},
|
||||
{
|
||||
text: "应用部署配置",
|
||||
link: "/zh/developer/contribute/system-app/deployment",
|
||||
},
|
||||
{
|
||||
text: "Olares 权限配置",
|
||||
link: "/zh/developer/contribute/system-app/olares-manifest",
|
||||
},
|
||||
{
|
||||
text: "安装",
|
||||
link: "/zh/developer/contribute/system-app/install",
|
||||
},
|
||||
{
|
||||
text: "其他",
|
||||
link: "/zh/developer/contribute/system-app/other",
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
text: "开发协议",
|
||||
collapsed: true,
|
||||
items: [
|
||||
{
|
||||
text: "合约",
|
||||
link: "/zh/developer/contribute/olares-id/contract/contract",
|
||||
collapsed: true,
|
||||
items: [
|
||||
{
|
||||
text: "架构",
|
||||
link: "/zh/developer/contribute/olares-id/contract/architecture",
|
||||
},
|
||||
{
|
||||
text: "DID",
|
||||
collapsed: true,
|
||||
items: [
|
||||
{
|
||||
text: "设计",
|
||||
link: "/zh/developer/contribute/olares-id/contract/did/design",
|
||||
},
|
||||
{
|
||||
text: "官方 Tagger",
|
||||
link: "/zh/developer/contribute/olares-id/contract/did/official-taggers",
|
||||
},
|
||||
{
|
||||
text: "发布历史",
|
||||
link: "/zh/developer/contribute/olares-id/contract/did/release-history",
|
||||
},
|
||||
{
|
||||
text: "FAQ",
|
||||
link: "/zh/developer/contribute/olares-id/contract/did/faq",
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
text: "声誉",
|
||||
link: "/zh/developer/contribute/olares-id/contract/contract-reputation",
|
||||
},
|
||||
{
|
||||
text: "管理",
|
||||
collapsed: true,
|
||||
items: [
|
||||
{
|
||||
text: "合约",
|
||||
link: "/zh/developer/contribute/olares-id/contract/manage/contract",
|
||||
},
|
||||
{
|
||||
text: "SDK",
|
||||
link: "/zh/developer/contribute/olares-id/contract/manage/sdk",
|
||||
},
|
||||
{
|
||||
text: "环境",
|
||||
link: "/zh/developer/contribute/olares-id/contract/manage/environment",
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
text: "可验证凭证(VC)",
|
||||
link: "/zh/developer/contribute/olares-id/verifiable-credential/overview",
|
||||
collapsed: true,
|
||||
items: [
|
||||
{
|
||||
text: "发行方",
|
||||
link: "/zh/developer/contribute/olares-id/verifiable-credential/issuer",
|
||||
},
|
||||
{
|
||||
text: "验证方",
|
||||
link: "/zh/developer/contribute/olares-id/verifiable-credential/verifer",
|
||||
},
|
||||
{
|
||||
text: "Olares 案例",
|
||||
link: "/zh/developer/contribute/olares-id/verifiable-credential/olares",
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
};
|
||||
|
||||
export const zh = defineConfig({
|
||||
@@ -1050,6 +508,8 @@ export const zh = defineConfig({
|
||||
sidebar: {
|
||||
...side,
|
||||
...oneSidebar,
|
||||
...useCaseSidebar,
|
||||
...developerSidebar,
|
||||
},
|
||||
},
|
||||
});
|
||||
@@ -89,15 +89,9 @@ Key characteristics of shared applications include:
|
||||
* **Centralized management**: Only administrators can install the core service of a shared application. Administrators are responsible for installing, configuring, and hosting the app's service, resources, and runtime environment within the cluster.
|
||||
* **Easy identification**: In Olares Market, shared applications are typically marked with a "Shared" label for easy identification.
|
||||
* **Flexible access**: The method for accessing a shared application depends on the app's form:
|
||||
* **Headless backend service**: For shared applications that typically run as a background service without a graphical UI (e.g., Ollama), users need to install a **reference application** to call the service. For example, users within the cluster can access the Ollama service via Open WebUI or LobeChat.
|
||||
* **Headless backend service**: For shared applications that typically run as a background service without a graphical UI (e.g., Ollama), no dedicated reference application is required. The service exposes standard APIs and shared entrances that can be directly consumed by any compatible third‑party client such as LobeChat and Open WebUI. Users install the client and point it to the shared app’s API endpoint found in the Olares **Settings** > **Applications** > **Entrances**.
|
||||
* **Complete application with built-in UI**: For shared applications that include a complete user interface and backend service themselves (e.g., ComfyUI Shared or Dify Shared), administrators and other users in the cluster can obtain the service access point by directly installing the shared application itself.
|
||||
|
||||
### Reference applications
|
||||
|
||||
Reference applications are applications that have been granted access to specific shared applications within Olares. They typically provide a user-friendly interface, allowing users to easily access the APIs or services exposed by the shared applications.
|
||||
|
||||
For example, Open WebUI, LobeChat, and n8n are reference applications for Ollama. Dify Shared is the reference application of itself.
|
||||
|
||||
### Dependencies
|
||||
|
||||
Dependencies are prerequisite applications that must be present for certain applications to function properly. Before installing an application with dependencies, users must ensure all required dependencies are already installed in the cluster.
|
||||
|
||||
@@ -3,6 +3,7 @@ outline: [2,3]
|
||||
description: Learn the different methods to access Olares services locally for improved speed and offline capability.
|
||||
---
|
||||
# Access Olares services locally
|
||||
|
||||
Olares is designed to provide seamless access to your self-hosted services anytime, anywhere.
|
||||
|
||||
However, accessing your devices locally provides several advantages:
|
||||
@@ -11,7 +12,6 @@ However, accessing your devices locally provides several advantages:
|
||||
- **Offline independence**: Access your data and apps even when your internet service is unavailable.
|
||||
|
||||
## Objectives
|
||||
|
||||
By the end of this tutorial, you will learn how to:
|
||||
|
||||
- Establish a secure, high-speed local connection using the LarePass VPN.
|
||||
@@ -34,74 +34,48 @@ There are four ways to establish a local connection:
|
||||
## Method 1: Enable LarePass VPN
|
||||
The LarePass VPN is designed to secure your connection while optimizing performance. When enabled, LarePass detects if you are on the same network as your device and switches to **Intranet** mode.
|
||||
|
||||
:::tip Always enable VPN for remote access
|
||||
Keep LarePass VPN enabled. It automatically prioritizes the fastest available route to ensure you always get the best speed possible without manual switching.
|
||||
:::
|
||||
:::info iOS and macOS setup
|
||||
On iOS or macOS, you may be prompted to add a VPN Configuration to your system settings the first time you enable the feature. Allow this to complete the setup.
|
||||
:::
|
||||
<!--@include: ../../reusables/larepass-vpn.md{19,24}-->
|
||||
|
||||
Enable the LarePass VPN directly on the device you are currently using to access Olares.
|
||||
|
||||
<tabs>
|
||||
<template #On-LarePass-mobile-client>
|
||||
|
||||
1. Open the LarePass app, and go to **Settings**.
|
||||
2. In the **My Olares** card, toggle on the VPN switch.
|
||||
|
||||

|
||||
</template>
|
||||
<template #On-LarePass-desktop-client>
|
||||
|
||||
1. Open the LarePass app, and click your avatar in the top-left corner to open the user menu.
|
||||
2. Toggle on the switch for **VPN connection**.
|
||||
|
||||

|
||||
</template>
|
||||
</tabs>
|
||||
|
||||
Once enabled, check the status indicator in LarePass to verify the connection type:
|
||||
|
||||
| Status | Description |
|
||||
|:-------------|:---------------------------------------------------------|
|
||||
| **Intranet** | Direct connection via your local LAN IP. Fastest speeds. |
|
||||
| **P2P** | Direct encrypted tunnel between devices. High speed. |
|
||||
| **DERP** | Routed via a secure relay server. Used as a fallback. |
|
||||
<!--@include: ../../reusables/larepass-vpn.md{26,50}-->
|
||||
|
||||
## Method 2: Use `.local` domain
|
||||
If you prefer not to install additional apps, you can access services using the `.local` domain. There are two domain formats available depending on your operating system.
|
||||
|
||||
:::info Use HTTP protocol
|
||||
The `.local` domain does not support HTTPS. You must explicitly use `http://` at the beginning of the URL.
|
||||
:::
|
||||
If you prefer not to install additional apps, you can access services using the `.local` domain. There are two domain formats available depending on your operating system.
|
||||
|
||||
### Single-level domain (All operating systems)
|
||||
:::warning Supported for community apps only
|
||||
Olares system apps such as Desktop and Files do not support this URL format and will not load correctly.
|
||||
:::
|
||||
This format uses a single-level domain by connecting the entrance ID and the username with hyphens (`-`).
|
||||
- **Default URL**:
|
||||
```plain
|
||||
https://<entrance_id>.<username>.olares.com
|
||||
```
|
||||
- **Local-access URL**:
|
||||
```plain
|
||||
http://<entrance_id>-<username>-olares.local
|
||||
```
|
||||
|
||||
### Multi-level domain (macOS and iOS only)
|
||||
Apple devices support local service discovery via [Bonjour](https://developer.apple.com/bonjour/) (zero‑configuration networking), which can resolve multi‑label domains under `.local` on macOS and iOS. This allows a local URL format that mirrors the remote address.
|
||||
**Standard URL**
|
||||
```plain
|
||||
https://<entrance_id>.<username>.olares.com
|
||||
```
|
||||
**Local URL**
|
||||
```plain
|
||||
http://<entrance_id>-<username>-olares.local
|
||||
```
|
||||
|
||||
### Multi-level domain
|
||||
|
||||
The multi-level format below matches the structure of your standard Olares URL. Use it as shown.
|
||||
|
||||
<!--@include: ../../reusables/local-domain.md{7,23}-->
|
||||
|
||||
- **Default URL**:
|
||||
```plain
|
||||
https://<entrance_id>.<username>.olares.com
|
||||
```
|
||||
- **Local-access URL**:
|
||||
```plain
|
||||
http://<entrance_id>.<username>.olares.local
|
||||
```
|
||||

|
||||
|
||||
#### macOS and iOS
|
||||
Apple devices support local service discovery via [Bonjour](https://developer.apple.com/bonjour/) (zero‑configuration networking), which can resolve multi‑label domains under `.local` on macOS and iOS.
|
||||
|
||||
Therefore, no extra setup is needed. You can directly use local URL in your browser.
|
||||
|
||||
#### Windows
|
||||
|
||||
<!--@include: ../../reusables/local-domain.md{26,40}-->
|
||||
|
||||
## Method 3: Configure local DNS
|
||||
For a seamless experience where standard URLs resolve to your local IP address automatically, you can configure your network DNS. This configuration ensures consistent access across all devices on the network without requiring individual client setup.
|
||||
|
||||
@@ -212,39 +186,7 @@ If the IP address starts with `192.168`, it indicates successful configuration.
|
||||
|
||||
|
||||
## FAQs
|
||||
### Why doesn't LarePass VPN work on my Mac anymore?
|
||||
If you successfully enabled the VPN previously, but it has stopped working, you might need to reset the system extension.
|
||||
:::info
|
||||
Depending on your macOS version, the UI might look slightly different.
|
||||
:::
|
||||
1. Open **System Settings**, search for "Extension", and select **Login Items & Extensions**.
|
||||
2. Scroll to the **Network Extensions** section and click the info icon (ⓘ) to view loaded extensions.
|
||||
3. Find LarePass, click the three dots (...), and select **Delete Extension**.
|
||||
4. Confirm the uninstallation.
|
||||
5. Restart your Mac and re-enable the VPN in the LarePass desktop client.
|
||||
|
||||
### Why can't I enable LarePass VPN on Windows?
|
||||
Third-party antivirus software might mistakenly flag the LarePass desktop client as suspicious, preventing it from launching the VPN service.
|
||||
<!--@include: ../../reusables/larepass-vpn.md{50,75}-->
|
||||
|
||||
If prompted by your antivirus when opening LarePass for the first time, allow the application to continue.
|
||||
|
||||
If the VPN still fails to enable:
|
||||
1. Open your security software and check if LarePass was blocked.
|
||||
2. Add the main LarePass executable to the allowlist or exclusions of your antivirus.
|
||||
3. Restart LarePass and enable the VPN.
|
||||
|
||||
### Why the `.local` domain does not work in Chrome (macOS)?
|
||||
Chrome may fail to access local URLs if macOS blocks local network permissions.
|
||||
To enable access:
|
||||
1. Open Apple menu and go to **System Settings**.
|
||||
2. Go to **Privacy & Security** > **Local Network**.
|
||||
3. Find Google Chrome and Google Chrome Helper in the list and enable the toggles.
|
||||
{width=400}
|
||||
|
||||
4. Restart Chrome and try accessing the local URL again.
|
||||
|
||||
### Why does the application fail to load in an iFrame when using a `.local` domain on Chrome (macOS)?
|
||||
Chrome might default to HTTPS when using local domains, and you might see a "connection not secure" warning.
|
||||

|
||||
|
||||
To address this, explicitly add the HTTP protocol (`http://`) to the beginning of the URL. This tells Chrome it's a local, non-encrypted connection, which is expected on your home network.
|
||||
<!--@include: ../../reusables/local-domain.md{42,75}-->
|
||||
@@ -5,7 +5,7 @@ description: Step-by-step guide to setting up a custom domain for your Olares en
|
||||
|
||||
# Set up a custom domain for your Olares
|
||||
|
||||
By default, when you create an account in LarePass, you get an Olares ID with the `olares.com` domain. This means you access your Olares services through URLs like `desktop.{your-username}.olares.com`. While this default setup saves you from common network and domain configuration hassles, you might want use your own domain instead, especially in these common scenarios:
|
||||
By default, when you create an account in LarePass, you get an Olares ID with the `olares.com` domain. This means you access your Olares services through URLs like `desktop.{your-username}.olares.com`. While this default setup saves you from common network and domain configuration hassles, you might want to use your own domain instead, especially in these common scenarios:
|
||||
|
||||
- **As an organization**: Use a company domain similar to your organizational email address for all team members, for example, `employee@company.com`.
|
||||
- **As an individual**: Use your personal domain for a more personalized experience.
|
||||
@@ -38,7 +38,7 @@ The table below outlines the steps involved in setting up a custom domain and wh
|
||||
|
||||
Ensure you have:
|
||||
- A registered domain name from a domain registrar.
|
||||
- A Gmail or G-Suit account. Currently, only these two formats are supported for organization domain membership.
|
||||
- A Gmail or G-Suite account. Currently, only these two formats are supported for organization domain membership.
|
||||
- LarePass app installed on your phone.<br>
|
||||
LarePass will be used later to sign in to Olares Space, and to bind your custom domain to Olares ID.
|
||||
|
||||
@@ -50,31 +50,33 @@ A DID (Decentralized Identifier) is a temporary account state before you get you
|
||||
|
||||
2. Tap **Create an account** to trigger a DID creation.
|
||||
|
||||

|
||||

|
||||
|
||||
This gets you an Olares account in the DID stage.
|
||||
This gets you an Olares account in the DID stage, which displays as "No Olares ID bound".
|
||||
|
||||

|
||||

|
||||
|
||||
3. Tap the Olares account in the DID stage that you just created.
|
||||
|
||||
## Step 2: Add your domain to Olares Space
|
||||
Add and verify your own domain in Olares Space before binding it.
|
||||
|
||||
1. In your browser, access Olares Space at https://space.olares.com/.
|
||||
2. In LarePass app, tap the scan button in the top-right corner, and scan the QR code on the login page to log in to Olares Space.
|
||||
2. In LarePass app, tap the scan icon in the top-right corner, and scan the QR code on the login page to log in to Olares Space.
|
||||
|
||||

|
||||

|
||||
|
||||
3. In Olares Space, go to **Domain Management** > **Domain Name Setup**, enter your domain and click **Confirm**.
|
||||
|
||||

|
||||

|
||||
|
||||
4. Verify your TXT record for your domain. This verifies your ownership of the domain.
|
||||
4. Add and verify a TXT record to prove ownership of the domain.
|
||||
|
||||
a. Click **Guide** in the **Action** column.
|
||||
|
||||
b. Follow the on-screen instructions to add a TXT record to your DNS provider configuration.
|
||||
|
||||

|
||||

|
||||
|
||||
Once verified, the domain setup status will update automatically to **Await NS Record for Your Domain**.
|
||||
5. Verify the Name Server (NS) Record for your domain. This delegates the DNS resolution for your domain to Olares's Cloudflare.
|
||||
@@ -85,7 +87,7 @@ Add and verify your own domain in Olares Space before binding it.
|
||||
|
||||
Once verified, the domain status will update to **Awaiting the application for the domain's Verifiable Credential**.
|
||||
|
||||

|
||||

|
||||
|
||||
:::tip
|
||||
- TXT verification typically completes within 30 minutes. NS record verification may take up to 2 hours. If the whole process exceeds 3 hours, check with your DNS provider.
|
||||
@@ -95,7 +97,7 @@ Add and verify your own domain in Olares Space before binding it.
|
||||
|
||||
Once TXT and NS records are verified, your domain is successfully added to Olares Space.
|
||||
|
||||
## Step 3: Create an org for the domain
|
||||
## Step 3: Create an organization for the domain
|
||||
|
||||
This step creates an organization for the domain. Specifically, it binds your domain to an organization in Olares and requests the Verifiable Credential (VC) for the domain.
|
||||
|
||||
@@ -106,10 +108,12 @@ A Verifiable Credential is a digital format proof that verifies certain attribut
|
||||
1. Create a new organization in LarePass app.
|
||||
|
||||
a. On the account creation page, tap <i class="material-symbols-outlined">display_settings</i> in the top-right corner to go to the **Advanced account creation** page.
|
||||

|
||||
|
||||
b. Go to **Organization Olares ID** > **Create a new organization**. The organization for your domain will automatically show in the list.
|
||||

|
||||
|
||||

|
||||

|
||||
|
||||
c. Tap the organization name to apply for the VC. When it's done, you will see your domain name for confirmation.
|
||||
|
||||
@@ -119,9 +123,9 @@ A Verifiable Credential is a digital format proof that verifies certain attribut
|
||||
|
||||
2. On Olares Space, navigate to the **Domain management** page. The domain setup status should change to **Awaiting rule configuration**.
|
||||
|
||||
So far, you have successfully bound your custom domain with an organization, and is set for configuring the domain rules in Olares Space.
|
||||
So far, you have successfully bound your custom domain to an organization, and you are set to configure the domain rules in Olares Space.
|
||||
|
||||
## Step 4: Add new member
|
||||
## Step 4: Add a new member
|
||||
|
||||
The domain rules specify how you add the members for the organization. Only members in the organization can apply for Olares ID under the organization domain (or, your custom domain). To configure domain rules:
|
||||
|
||||
@@ -129,7 +133,7 @@ The domain rules specify how you add the members for the organization. Only memb
|
||||
2. Under **Domain Invitation Rule**, select **Specified email address**, and click **Save**.
|
||||
:::tip Invitation rules
|
||||
Two types of rules are available:
|
||||
- **Fixed email suffix**: Suitable for large teams who share the same corporation email domain (e.g., `@company.com`). Any email matching the specified suffix is valid to apply for Olares ID under the organization. Currently, only single suffix is supported. Must follow G-Suite format.
|
||||
- **Fixed email suffix**: Suitable for large teams that share the same corporate email domain (e.g., `@company.com`). Any email matching the specified suffix can apply for an Olares ID under the organization. Only a single suffix is supported and must follow the G-Suite format.
|
||||
- **Specified email address**: Allows you to add members by specifying their email addresses. This option is recommended if you do not have a corporate email domain and only need to invite a small number of members to your organization. Both Gmail and G-Suite accounts are supported.
|
||||
:::
|
||||
|
||||
@@ -137,10 +141,10 @@ The domain rules specify how you add the members for the organization. Only memb
|
||||
|
||||

|
||||
|
||||
4. Click **Submit** to finalize the member addition. Repeat step 3 and step 4 if you want to add multiple users
|
||||
4. Click **Submit** to finalize the member addition. Repeat steps 3 and 4 to add more users.
|
||||
|
||||
:::tip Maintain member list
|
||||
For organization admin, you can manage your organization's member list anytime through the **Domain management** page.
|
||||
As an organization admin, you can manage your organization's member list at any time from the **Domain Management** page.
|
||||
:::
|
||||
|
||||
## Step 5: Create an Olares ID with the custom domain
|
||||
@@ -156,9 +160,9 @@ To use the domain, apply for an Olares ID under the organization.
|
||||
|
||||
b. Log in with the Gmail account you added in the previous step and grant access for VC.
|
||||
|
||||

|
||||

|
||||
|
||||
After successful authorization, an Olares ID with the custom domain, `justtest1953@xxxx.cloud`, is successfully created.
|
||||
After successful authorization, an Olares ID with your custom domain (for example, `justtest1953@xxxx.cloud`) is created.
|
||||
|
||||
## Step 6: Install and activate Olares
|
||||
Almost there! Now you are all set to install and activate Olares with your Olares ID.
|
||||
@@ -168,7 +172,7 @@ Almost there! Now you are all set to install and activate Olares with your Olare
|
||||
|
||||
1. In the terminal, run the following script to start the installation:
|
||||
|
||||
```bash {1,2}
|
||||
```bash
|
||||
curl -sSfL https://olares.sh | bash -
|
||||
```
|
||||
|
||||
@@ -189,7 +193,7 @@ Almost there! Now you are all set to install and activate Olares with your Olare
|
||||
2024-12-17T21:00:58.086+0800 Password: 2uO5PZ2X
|
||||
```
|
||||
|
||||
3. Open the Olares activation wizard in your browser using the given URL, and follow the on-screen instructions to complete the activation.
|
||||
4. Open the Olares activation wizard in your browser using the given URL, and follow the on-screen instructions to complete the activation.
|
||||
|
||||
See [Install Olares](../get-started/install-olares.md) for more detailed steps.
|
||||
|
||||
@@ -202,46 +206,66 @@ Before proceeding with the following steps, ensure that your Windows environment
|
||||
If the setup is incomplete, the installation script will not work as expected. For detailed instructions, refer to the dedicated [installation guide for Windows](../get-started/install-windows-script.md).
|
||||
:::
|
||||
|
||||
1. Click https://windows.olares.sh to download the installation script `publicInstall.latest.ps1`.
|
||||
1. Click https://windows.olares.sh to download the installation script `publicInstaller.latest.ps1`.
|
||||
|
||||
2. Open `publicInstall.latest.ps1` with Notepad, and add the environment variables to the beginning:
|
||||
2. Run the installation script.
|
||||
|
||||
```bash {1,2}
|
||||
$env:TERMINUS_OS_DOMAINNAME = "xxxx.cloud"
|
||||
$env:TERMINUS_OS_USERNAME= "justtest1953"
|
||||
$env:WSL_UTF8 = 1
|
||||
$OutputEncoding = [System.Text.Encoding]::UTF8
|
||||
$currentPath = Get-Location
|
||||
$architecture = $env:PROCESSOR_ARCHITECTURE
|
||||
$downloadCdnUrlFromEnv = $env:DOWNLOAD_CDN_URL
|
||||
$version = "1.11.1"
|
||||
$downloadUrl = "https://dc3p1870nn3cj.cloudfront.net"
|
||||
```
|
||||
- `$env:TERMINUS_OS_DOMAINNAME=xxxx.cloud`: Specify your custom domain. Replace `xxxx.cloud` with the actual one.
|
||||
- `$env:TERMINUS_OS_USERNAME=justtest1953`: Specify the prefix of your Olares ID. Replace `justtest1953` with the actual one.
|
||||
|
||||
3. Execute the script.
|
||||
|
||||
a. Open PowerShell as administrator, then navigate to the folder where the script is located. For example, if the script is in the `Downloads` folder, run the following command:
|
||||
a. Launch PowerShell as an administrator and navigate to the folder where you downloaded the script. For example, if the script is in your `Downloads` folder, enter:
|
||||
```powershell
|
||||
# Replace <YourUsername> with your actual Windows username
|
||||
cd C:\Users\<YourUsername>\Downloads
|
||||
```
|
||||
|
||||
b. Once in the correct folder, run the following command:
|
||||
b. Run the script:
|
||||
|
||||
```powershell
|
||||
.\publicInstall.latest.ps1
|
||||
.\publicInstaller.latest.ps1
|
||||
```
|
||||
|
||||
4. When prompted with security warning, type `R` and press **Enter** to run the script once. The installation process for Olares will start.
|
||||
3. When you see the security warning, type `R` and press **Enter** to run the script once. The Olares installation will start.
|
||||
|
||||
```powershell
|
||||
Security warning
|
||||
Run only scripts that you trust. While scripts from the internet can be useful, this script can potentially harm your computer. If you trust this script, use the Unblock-File cmdlet to allow the script to run without this warning message. Do you want to run
|
||||
publicInstall.latest.ps1?
|
||||
publicInstaller.latest.ps1?
|
||||
[D] Do not run [R] Run once [S] Suspend [?] Help (default is "D"):
|
||||
```
|
||||
|
||||
5. Wait for the installation to finish. Depending on your network, the process can take 20-30 minutes. When the installation completes, you will see the wizard URL and login credentials:
|
||||
4. When prompted to choose the drive for the WSL Ubuntu distro, enter the letter of a drive with at least 80 GB free space.
|
||||
|
||||
```powershell{8}
|
||||
Installing Olares will create a WSL Ubuntu Distro and occupy at least 80 GB of disk space.
|
||||
Please select the drive where you want to install it.
|
||||
|
||||
Available drives and free space:
|
||||
C:\ Free Disk: 391.07 GB
|
||||
D:\ Free Disk: 281.32 GB
|
||||
|
||||
Please enter the drive letter (e.g., C):
|
||||
```
|
||||
|
||||
5. When prompted to set up firewall rules, type `yes` to configure them automatically, or `no` to skip. If you skip, you must either [disable Windows Defender Firewall](../get-started/install-windows-script.md#how-to-disable-windows-defender-firewall) or [add the TCP inbound rules manually](../get-started/install-windows-script.md#how-to-manually-set-firewall-rules).
|
||||
|
||||
```powershell{2}
|
||||
Accessing Olares requires setting up firewall rules, specifically adding TCP inbound rules for ports 80, 443, and 30180.
|
||||
Do you want to set up the firewall rules? (yes/no):
|
||||
```
|
||||
|
||||
6. When prompted to confirm the Windows (NAT gateway) IP address, type **Y** to confirm or **R** to re-enter.
|
||||
|
||||
```powershell
|
||||
The NAT gateway (the Windows host)'s IP is 192.168.50.136. Confirm [Y] or Re-enter [R]?
|
||||
```
|
||||
|
||||
::: tip Obtain the IPv4 address of Windows
|
||||
You can get the IPv4 address in advance by running `ipconfig` in the Windows command line.
|
||||
:::
|
||||
|
||||
7. When prompted for domain and Olares ID, enter your custom domain and the Olares ID prefix you created earlier separately. For example, if your Olares ID is `justtest1953@xxxx.cloud`, enter `xxxx.cloud` for the domain and `justtest1953` for the Olares ID.
|
||||
|
||||

|
||||
|
||||
8. Wait for the installation to finish. Depending on your network, this can take 10–30 minutes. When it completes, the wizard URL and login credentials will be shown:
|
||||
|
||||
```bash
|
||||
2024-12-17T21:00:58.086+0800 Olares is running at:
|
||||
@@ -254,7 +278,9 @@ If the setup is incomplete, the installation script will not work as expected. F
|
||||
2024-12-17T21:00:58.086+0800 Password: 2uO5PZ2X
|
||||
```
|
||||
|
||||
6. Open the Olares activation wizard in your browser using the given URL, and follow the on-screen instructions to complete the activation.
|
||||
9. Open the Olares activation wizard in your browser using the URL shown, and follow the on-screen instructions to complete the activation.
|
||||
|
||||
For more details and troubleshooting, see the [installation guide for Windows](../get-started/install-windows-script.md).
|
||||
|
||||
</template>
|
||||
</tabs>
|
||||
|
||||
@@ -67,25 +67,26 @@ A GPU is not required to install Olares, but is necessary for AI applications.
|
||||
```
|
||||
|
||||
## Install Olares
|
||||
1. Click https://windows.olares.sh to download the installation script `publicInstall.latest.ps1`.
|
||||
1. Click https://windows.olares.sh to download the installation script `publicInstaller.latest.ps1`.
|
||||
|
||||
2. Execute the script.
|
||||
|
||||
a. Open PowerShell as administrator, then navigate to the folder where the script is located. For example, if the script is in the `Downloads` folder, run the following command:
|
||||
2. Run the installation script.
|
||||
|
||||
a. Launch PowerShell as an administrator and navigate to the folder where you downloaded the script. For example, if the script is in your `Downloads` folder, enter:
|
||||
```powershell
|
||||
# Replace <YourUsername> with your actual Windows username
|
||||
cd C:\Users\<YourUsername>\Downloads
|
||||
```
|
||||
|
||||
b. Once in the correct folder, run the following command:
|
||||
|
||||
b. In the appropriate directory, execute the script with:
|
||||
```powershell
|
||||
.\publicInstall.latest.ps1
|
||||
.\publicInstaller.latest.ps1
|
||||
```
|
||||
|
||||
:::warning Administrator privileges required
|
||||
Running PowerShell without administrator privileges will cause the installation to fail. See [How to make sure I am using PowerShell as administrator](#how-to-make-sure-i-am-using-powershell-as-administrator).
|
||||
:::
|
||||
|
||||
3. When prompted with security warning, type `R` and press **Enter** to run the script once. The installation process for Olares will start.
|
||||
3. When you see the security warning, type `R` and press **Enter** to run the script once. The installation process for Olares will start.
|
||||
|
||||
```powershell{4}
|
||||
Security warning
|
||||
@@ -94,7 +95,7 @@ A GPU is not required to install Olares, but is necessary for AI applications.
|
||||
[D] Do not run [R] Run once [S] Suspend [?] Help (default is "D"):
|
||||
```
|
||||
|
||||
4. When prompted to select the drive to store the WSL Ubuntu distro, type the drive letter of an available disk. Ensure the selected drive has at least **80 GB** of free space.
|
||||
4. When prompted to select the drive to store the WSL Ubuntu distro, type the drive letter of an available disk. Ensure the selected drive has at least 80 GB of free space.
|
||||
```powershell{8}
|
||||
Installing Olares will create a WSL Ubuntu Distro and occupy at least 80 GB of disk space.
|
||||
Please select the drive where you want to install it.
|
||||
|
||||
@@ -1,81 +1,48 @@
|
||||
---
|
||||
outline: [2,3]
|
||||
description: Learn how to access your Olares services securely using the LarePass VPN.
|
||||
description: Learn how to access your Olares services securely using LarePass VPN or the .local domain.
|
||||
---
|
||||
# Access Olares services securely using LarePass VPN
|
||||
# Access Olares services securely
|
||||
|
||||
Typically, you access Olares services through a browser using a URL like `https://desktop.<username>.olares.com`. This way, you can reach your services from any device at any time.
|
||||
Typically, you access Olares services through a browser using a URL like `https://desktop.<username>.olares.com`. This way, you can reach your services from any device at any time. You can access Olares securely from your home network or from elsewhere.
|
||||
|
||||
While this address works from anywhere, it's recommended to enable the LarePass VPN to ensure your connection is always secure and efficient. The client automatically detects your network environment and selects the best connection method:
|
||||
- **At home**: It establishes a direct **Intranet** connection to allow faster file transfers on your local network.
|
||||
- **From remote**: It switches to a secure encrypted tunnel to ensure you remain connected safely when accessing remotely.
|
||||
- [Using LarePass VPN](#using-larepass-vpn): Use this whether you are on your home network or away.
|
||||
- [Using the .local domain](#using-the-local-domain): Use this only when your client device and Olares are on the same LAN.
|
||||
|
||||
## Download LarePass
|
||||
To use the secure VPN connection, the LarePass client must be installed on the device you are using.
|
||||
- **Mobile**: Use the LarePass app installed during the Olares ID creation process.
|
||||
- **Desktop**: Download and install the LarePass desktop client.
|
||||
## Using LarePass VPN
|
||||
|
||||
1. Visit <AppLinkGlobal />.
|
||||
2. Download the version compatible with your operating system.
|
||||
It is recommended to enable the LarePass VPN to ensure your connection is always secure and efficient. The client automatically detects your network environment and selects the best connection method:
|
||||
|
||||
## Enable LarePass VPN
|
||||
Once installed, enable the VPN directly on the device you are using to access Olares.
|
||||
- **At home**: It establishes a direct Intranet connection to allow faster file transfers on your local network.
|
||||
- **From remote**: It switches to a secure encrypted tunnel so you remain connected safely when accessing remotely.
|
||||
|
||||
:::tip Always enable VPN for remote access
|
||||
Keep LarePass VPN enabled. It automatically prioritizes the fastest available route to ensure you always get the best speed possible without manual switching.
|
||||
:::
|
||||
:::info iOS and macOS setup
|
||||
On iOS or macOS, you may be prompted to add a VPN Configuration to your system settings the first time you enable the feature. Allow this to complete the setup.
|
||||
:::
|
||||
<!--@include: ../../reusables/larepass-vpn.md{19,24}-->
|
||||
|
||||
<tabs>
|
||||
<template #On-LarePass-mobile-client>
|
||||
Enable the LarePass VPN directly on the device you are currently using to access Olares.
|
||||
|
||||
1. Open the LarePass app and go to **Settings**.
|
||||
2. In the **My Olares** card, toggle on the VPN switch.
|
||||
<!--@include: ../../reusables/larepass-vpn.md{26,50}-->
|
||||
|
||||

|
||||
</template>
|
||||
<template #On-LarePass-desktop-client>
|
||||
## Using the .local domain
|
||||
|
||||
1. Open the LarePass app and click your avatar in the top-left corner to open the user menu.
|
||||
2. Toggle on the switch for **VPN connection**.
|
||||
Use the `.local` domain when your device and Olares are on the same LAN.
|
||||
|
||||

|
||||
</template>
|
||||
</tabs>
|
||||
### URL format
|
||||
|
||||
## Verify the connection type
|
||||
Once enabled, check the status indicator in LarePass to verify the connection type:
|
||||
<!--@include: ../../reusables/local-domain.md{7,23}-->
|
||||
|
||||
| Status | Description |
|
||||
|:-------------|:---------------------------------------------------------|
|
||||
| **Intranet** | Direct connection via your local LAN IP. Fastest speeds. |
|
||||
| **P2P** | Direct encrypted tunnel between devices. High speed. |
|
||||
| **DERP** | Routed via a secure relay server. Used as a fallback. |
|
||||
### macOS
|
||||
|
||||
## FAQs
|
||||
### Why doesn't LarePass VPN work on my Mac anymore?
|
||||
If you successfully enabled the VPN previously, but it has stopped working, you might need to reset the system extension.
|
||||
:::info
|
||||
Depending on your macOS version, the UI might look slightly different.
|
||||
:::
|
||||
1. Open **System Settings**, search for "Extension", and select **Login Items & Extensions**.
|
||||
2. Scroll to the **Network Extensions** section and click the info icon (ⓘ) to view loaded extensions.
|
||||
3. Find LarePass, click the three dots (...), and select **Delete Extension**.
|
||||
4. Confirm the uninstallation.
|
||||
5. Restart your Mac and re-enable the VPN in the LarePass desktop client.
|
||||
No setup is needed. Use the local URL in your browser (for example, `http://desktop.<username>.olares.local`).
|
||||
|
||||
### Why can't I enable LarePass VPN on Windows?
|
||||
Third-party antivirus software might mistakenly flag the LarePass desktop client as suspicious, preventing it from launching the VPN service.
|
||||
### Windows
|
||||
<!--@include: ../../reusables/local-domain.md{26,40}-->
|
||||
|
||||
If prompted by your antivirus when opening LarePass for the first time, allow the application to continue.
|
||||
### FAQs
|
||||
|
||||
If the VPN still fails to enable:
|
||||
1. Open your security software and check if LarePass was blocked.
|
||||
2. Add the main LarePass executable to the allowlist or exclusions of your antivirus.
|
||||
3. Restart LarePass and enable the VPN.
|
||||
<!--@include: ../../reusables/larepass-vpn.md{50,75}-->
|
||||
|
||||
<!--@include: ../../reusables/local-domain.md{42,75}-->
|
||||
|
||||
## Learn more
|
||||
- [Access Olares locally](../best-practices/local-access.md): Explore detailed instructions for all available local network connection methods.
|
||||
- [Network](../../developer/concepts/network.md): Learn about the different entry points in Olares.
|
||||
- [Network](../../developer/concepts/network.md): Learn about the different entry points in Olares.
|
||||
|
||||
80
docs/manual/help/ts-free-memory.md
Normal file
80
docs/manual/help/ts-free-memory.md
Normal file
@@ -0,0 +1,80 @@
|
||||
---
|
||||
outline: [2, 3]
|
||||
description: Troubleshoot memory not freeing after stopping apps.
|
||||
---
|
||||
|
||||
# Memory insufficient or not freed after stopping an app
|
||||
|
||||
Use this guide when you stop an app (for example in Settings) but system memory is not freed, or when installation or restore fails because of insufficient memory.
|
||||
|
||||
## Condition
|
||||
- Market reports that there is not enough memory to install or restore an app.
|
||||
- You stop an application manually in Settings, but memory usage does not drop.
|
||||
|
||||
## Cause
|
||||
|
||||
In Olares, some applications (for example Ollama and many LLM apps) are deployed as [shared applications](../../developer/concepts/application.md#shared-application). They provide centralized resources or services to all users in the cluster.
|
||||
|
||||
Resource use for these apps is mainly on the server side. In Olares OS 1.12.4 and earlier, stopping a shared app from Settings only stops its user-facing client. The system-side service is not stopped by default, so the memory it uses is not released.
|
||||
|
||||
## Solution: Free memory via Market
|
||||
|
||||
To free memory, stop apps and their server side from Market instead of only from Settings, then verify in Dashboard and Control Hub as needed.
|
||||
|
||||
:::info
|
||||
This guide applies when you have admin privileges and the system currently does not have sub-accounts created.
|
||||
:::
|
||||
### Step 1: Check current memory in Dashboard
|
||||
|
||||
Open Dashboard and check current memory usage.
|
||||
|
||||

|
||||
|
||||
### Step 2: Check the app's memory requirements in Market
|
||||
|
||||
In Market, open the app you want to install or resume and check its memory requirements. If the sum of used and required memory is greater than about 90% of total memory, installation or restore might fail.
|
||||
|
||||

|
||||
|
||||
### Step 3: Identify apps using the most memory in Dashboard
|
||||
|
||||
1. Back to Dashboard and navigate to the **Applications** section.
|
||||
2. At the top right, use the sorting option to sort apps by memory usage.
|
||||
3. Review the list to see which applications are consuming the most memory. Note apps you can close or temporarily stop to free up memory for your new app.
|
||||
|
||||

|
||||
|
||||
### Step 4: Stop apps from Market
|
||||
|
||||
Stopping from Market allows you to stop the shared server and release its memory.
|
||||
|
||||
1. Open Market and go to **My Olares**.
|
||||
2. Find the app you want to stop, click <i class="material-symbols-outlined">keyboard_arrow_down</i> next to the app's operation button and select **Stop**.
|
||||

|
||||
|
||||
3. If a dialog appears when you stop the app, check **Also stops the shared server (affects all users)**.
|
||||
|
||||

|
||||
|
||||
:::tip Uninstalling a shared app
|
||||
If you are uninstalling a shared app, check **Also uninstall the shared server (affects all users)** so the server side is fully removed.
|
||||
:::
|
||||
|
||||
### Step 5: Verify that memory has been released
|
||||
|
||||
After stopping apps, wait about 5 minutes, then reopen the Dashboard to review current memory usage.
|
||||
|
||||
If you notice that most memory-intensive apps are no longer listed at the top, but total memory usage remains high:
|
||||
|
||||
1. Open Control Hub and navigate to the **Namespaces** section.
|
||||
2. Click the **Memory usage** column to sort namespaces by memory consumption.
|
||||
3. Look for any namespaces with a name ending in `server-shared`. This indicates the server side of a shared app is still be running and holding onto memory.
|
||||
|
||||
|
||||

|
||||
|
||||
4. For any shared app that is still holding memory:
|
||||
|
||||
a. Go to **Market** > **My Olares**, resume the app, then stop it.
|
||||
|
||||
b. In the stop dialog, check **Also stops the shared server (affects all users)** so the server is fully stopped and memory is released.
|
||||
33
docs/manual/help/ts-missing-apps.md
Normal file
33
docs/manual/help/ts-missing-apps.md
Normal file
@@ -0,0 +1,33 @@
|
||||
---
|
||||
outline: [2, 3]
|
||||
description: Troubleshoot when apps from the Market website are missing on your device.
|
||||
---
|
||||
|
||||
# Missing apps in Market
|
||||
|
||||
Use this guide when an app listed on the official Market website is missing from the Market on your device and the issue persists after your device has been running for more than 2 hours.
|
||||
|
||||
## Condition
|
||||
|
||||
- Some apps listed on the official [Olares Market website](https://market.olares.com) are missing from the Market on your device.
|
||||
- Your device has been running for more than 2 hours and the apps are still missing.
|
||||
|
||||
## Cause
|
||||
|
||||
The system might not have finished downloading the full app list during your initial setup. Restarting the chart repository and Market deployments can refresh the app catalog.
|
||||
|
||||
## Solution
|
||||
|
||||
Restart the chart repository and Market services from Control Hub, then wait for them to come back up and refresh the Market app.
|
||||
|
||||
1. Open Control Hub and go to **Browse** > **System** > **os-framework**.
|
||||
2. In the **Deployments** list, find **chartrepo-deployment**, and then click **Restart**. Wait until its status turns to **Running**.
|
||||
|
||||

|
||||
|
||||
3. In the same list, find **market-deployment**, and then click **Restart**. Wait until its status turns to **Running**.
|
||||
|
||||

|
||||
|
||||
4. Wait 2 to 3 minutes for the services to initialize.
|
||||
5. Refresh the Market app.
|
||||
@@ -65,13 +65,38 @@ Upon completion, you will receive an Organization Olares ID.
|
||||
</template>
|
||||
</Tabs>
|
||||
|
||||
## Import an existing account
|
||||
## Import an account
|
||||
|
||||
You can also set up an account by importing an existing Olares ID:
|
||||
You can import an existing Olares ID to LarePass using its 12-word mnemonic phrase to access your Olares services on a new device or another LarePass client.
|
||||
|
||||
:::tip Back up mnemonic phrase
|
||||
You must have already [backed up the mnemonic phrase](back-up-mnemonics.md) for the Olares ID to import.
|
||||
Make sure you have already [backed up the mnemonic phrase](back-up-mnemonics.md) for the Olares ID to import.
|
||||
:::
|
||||
|
||||
1. In LarePass app, tap **Import an account**.
|
||||
2. Enter the 12-word mnemonic phrase to import your Olares ID.
|
||||
<Tabs>
|
||||
<template #iOS-&-Android>
|
||||
|
||||
1. Open the LarePass app.
|
||||
2. Tap your profile avatar.
|
||||
3. On the Switch account page, tap **Add a new account** at the bottom.
|
||||
4. Tap **Import an account**.
|
||||
5. Enter the 12-word mnemonic phrase for your Olares ID.
|
||||
|
||||
</template>
|
||||
<template #macOS-&-Windows>
|
||||
|
||||
1. Open the LarePass desktop client.
|
||||
2. Click your profile avatar.
|
||||
3. Click **Switch account**.
|
||||
4. Click **Add a new account** at the bottom.
|
||||
5. Enter the 12-word mnemonic phrase for your Olares ID.
|
||||
|
||||
</template>
|
||||
<template #Chrome-extension>
|
||||
|
||||
1. Open the LarePass extension in Chrome.
|
||||
2. Click the options icon above your profile avatar.
|
||||
3. Click **Add a new account**.
|
||||
4. Enter the 12-word mnemonic phrase for your Olares ID.
|
||||
</template>
|
||||
</Tabs>
|
||||
@@ -9,37 +9,46 @@ LarePass is the official cross-platform client software for Olares. It acts as a
|
||||
|
||||

|
||||
|
||||
|
||||
## Key features
|
||||
- Account and identity management
|
||||
- Secure file access and sync
|
||||
- Device and network management
|
||||
- Password and secret management
|
||||
- Knowledge collection
|
||||
|
||||
### Account & identity management
|
||||
Create and manage your Olares ID, connect integrations with other services, and back up your credentials securely.
|
||||
- [Create an Olares ID](create-account.md)
|
||||
- [Back up mnemonics](back-up-mnemonics.md)
|
||||
- [Set or reset local password](back-up-mnemonics.md#set-up-local-password)
|
||||
- [Manage integrations](integrations.md)
|
||||
## Download LarePass
|
||||
|
||||
### Secure file access & sync
|
||||
- [Manage files with LarePass](manage-files.md)
|
||||
### iOS
|
||||
Visit the [App Store product page](https://apps.apple.com/us/app/larepass/id6448082605) to download LarePass.
|
||||
|
||||
### Device & network management
|
||||
Activate and manage Olares devices, and securely connect to Olares via LarePass VPN.
|
||||
- [Activate your Olares device](activate-olares.md)
|
||||
- [Upgrade Olares](manage-olares.md#upgrade-olares)
|
||||
- [Log in to Olares with 2FA](activate-olares.md#two-factor-verification-with-larepass)
|
||||
- [Manage Olares](manage-olares.md)
|
||||
- [Switch networks](manage-olares.md#switch-from-wired-to-wireless-network)
|
||||
- [Enable VPN for remote access](private-network.md)
|
||||
### Android
|
||||
Visit the [Google Play product page](https://play.google.com/store/apps/details?id=com.terminus.termipass), or download the latest APK directly from the [LarePass website](https://www.olares.com/larepass).
|
||||
|
||||
### Password & secret management
|
||||
Use Vault to autofill credentials, store passwords, and generate 2FA codes across devices.
|
||||
- [Autofill passwords](/manual/larepass/autofill.md)
|
||||
- [Generate 2FA codes](/manual/larepass/two-factor-verification.md)
|
||||
### macOS & Windows
|
||||
Download the latest desktop client from the [LarePass website](https://www.olares.com/larepass).
|
||||
|
||||
### Knowledge collection
|
||||
Use LarePass to collect web content and follow RSS feeds.
|
||||
- [Collect content via LarePass extension](manage-knowledge.md#collect-content-via-the-larepass-extension)
|
||||
- [Subscribe to RSS feeds](manage-knowledge.md#subscribe-to-rss-feeds)
|
||||
### Chrome extension
|
||||
|
||||
The LarePass extension allows you to collect content and manage passwords directly from your browser. It currently supports Google Chrome only and must be installed manually.
|
||||
|
||||
:::warning Keep the extension folder
|
||||
Your browser loads the extension from the folder you select. If you delete, move, or rename that folder, the extension will stop working.
|
||||
Extract the ZIP file to a permanent location, such as a folder under your user directory, rather than a temporary directory.
|
||||
:::
|
||||
|
||||
1. Visit the [LarePass website](https://www.olares.com/larepass) and download the extension ZIP file.
|
||||
2. Extract the ZIP file to a permanent folder on your computer.
|
||||
3. In Chrome, go to `chrome://extensions/`.
|
||||
4. Enable **Developer mode** in the top-right corner.
|
||||
5. Click **Load unpacked** and select the extracted extension folder.
|
||||
|
||||
:::tip Quick access
|
||||
After installation, click the puzzle icon in your browser toolbar and pin the LarePass extension for one-click access.
|
||||
:::
|
||||
|
||||
## Set up account
|
||||
- On mobile devices, you can [create an Olares ID](/manual/larepass/create-account.md#create-an-olares-id) directly in the app.
|
||||
- On the desktop client or Chrome extension, you must [import an Olares account](/manual/larepass/create-account.md#import-an-account).
|
||||
|
||||
## Feature comparison
|
||||
|
||||
@@ -180,39 +189,3 @@ Use LarePass to collect web content and follow RSS feeds.
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
|
||||
## Download and install LarePass
|
||||
|
||||
Get the latest version for your device at the [LarePass website](https://www.olares.com/larepass).
|
||||
|
||||
### Install the LarePass browser extension
|
||||
|
||||
<tabs>
|
||||
<template #Install-from-Chrome-Web-Store>
|
||||
|
||||
1. Search for **LarePass** in the [Chrome Web Store](https://chrome.google.com/webstore).
|
||||
2. Open the details page and click **Add to Chrome**.
|
||||
3. Log into the LarePass extension by importing your Olares ID:
|
||||
- Open the LarePass extension, and click **Import an account**.
|
||||
- Enter the mnemonics for your Olares ID.
|
||||
- Enter your Olares password to complete login.
|
||||
|
||||
</template>
|
||||
|
||||
<template #Install-offline>
|
||||
|
||||
1. Visit [https://www.olares.com/larepass](https://www.olares.com/larepass) and download the extension ZIP file.
|
||||
2. Go to `chrome://extensions/` in your browser.
|
||||
3. Enable **Developer mode** in the top-right corner.
|
||||
4. Click **Load unpacked** and select the extracted LarePass extension folder.
|
||||
5. Log in:
|
||||
- Open the LarePass extension, and click **Import an account**.
|
||||
- Enter the mnemonics for your Olares ID.
|
||||
- Enter your Olares password to complete login.
|
||||
</template>
|
||||
</tabs>
|
||||
|
||||
:::tip Quick access
|
||||
After installation, pin the LarePass extension from Chrome’s extension menu for one-click access.
|
||||
:::
|
||||
|
||||
@@ -1,53 +1,53 @@
|
||||
# Get familiar with Desktop
|
||||
|
||||
The Desktop application serves as the primary interface for user interaction with the Olares system. It offers an intuitive and efficient way to manage and utilize both built-in system applications and those you install.
|
||||
Desktop is the primary interface for interacting with Olares. From here, you can open and manage built-in system apps as well as the apps you install.
|
||||
|
||||
## Desktop concepts
|
||||
## Desktop basics
|
||||
|
||||
![Desktp[]](/images/manual/olares/desktop.png)
|
||||

|
||||
|
||||
### Dock & Launchpad
|
||||
### Dock
|
||||
|
||||
* **Dock:** An application quick-launch bar located on the side of the screen.
|
||||
* **Launchpad:** Accessed by clicking the "Launchpad" icon on the Dock, it displays all installed applications.
|
||||
The Dock is an application quick-launch bar on the left side of the screen. Use it to open frequently used apps and access key Desktop features.
|
||||
|
||||
### Launchpad
|
||||
|
||||
Launchpad shows all installed applications. Click the Launchpad icon in the Dock to open it.
|
||||
|
||||
### Application windows
|
||||
|
||||
* Applications open in "window" mode by default.
|
||||
* Windows support standard operations: dragging, resizing, minimizing, maximizing, and closing.
|
||||
* **Search:** Enables quick application launching, file searching, and more.
|
||||
By default, applications open in window mode as an embedded page within Desktop. You can manage windows like you would on a standard computer:
|
||||
|
||||
## Use the Launchpad
|
||||
- Drag the title bar to move the window.
|
||||
- Drag the window edges to resize it.
|
||||
- Minimize, maximize, or close the window.
|
||||
- Click <i class="material-symbols-outlined">open_in_new</i> to open the app in a new browser tab.
|
||||
|
||||
From the Launchpad, you can:
|
||||
:::info
|
||||
Some applications only support opening in a browser tab.
|
||||
:::
|
||||
|
||||
* View all installed applications.
|
||||
* Click an application icon to open it.
|
||||
* Drag icons to reorder them within the Launchpad.
|
||||
* Drag an icon to the Dock for quick access.
|
||||
### Search and notifications
|
||||
|
||||
- **Search**: Quickly launch applications and find supported content across Olares.
|
||||
- **Notifications**: Click the notification icon to view system and application notifications.
|
||||
|
||||
## Use Launchpad
|
||||
|
||||
From Launchpad, you can:
|
||||
|
||||
- View all installed applications.
|
||||
- Click an application icon to open it.
|
||||
- Drag icons to reorder them within Launchpad.
|
||||
- Drag an icon to the Dock for quick access.
|
||||
|
||||
### Uninstall applications
|
||||
|
||||
1. Press and hold an application icon to enter the editing mode.
|
||||
2. If an "X" appears in the top-right corner of the application icon, click it to delete the application.
|
||||
1. Press and hold an application icon to enter editing mode.
|
||||
2. If a <i class="material-symbols-outlined">close_small</i> icon appears in the top-left corner of the app icon, click it to uninstall the application.
|
||||
|
||||
::: tip Note
|
||||
Built-in system applications such as Files, Market, and Profile cannot be uninstalled.
|
||||
:::
|
||||
|
||||
### Control application windows
|
||||
|
||||
You can access applications via two modes.
|
||||
|
||||
By default, applications open in "window" mode, which is an iframe page embedded within the desktop. You can manipulate these windows much like standard computer windows:
|
||||
|
||||
* Drag the title bar to move the window.
|
||||
* Drag the window's edges to resize it.
|
||||
* Minimize, maximize, or close the window.
|
||||
* Click the <i class="material-symbols-outlined">open_in_new</i> button to open the application in a new browser tab.
|
||||
|
||||
::: tip Note
|
||||
Some applications only support opening in a tabbed view.
|
||||
:::info
|
||||
Built-in system applications such as Files, Market, and Settings cannot be uninstalled.
|
||||
:::
|
||||
|
||||
## Search within Olares
|
||||
|
||||
@@ -12,13 +12,12 @@ This guide helps users understand how to install, update, and uninstall applicat
|
||||
## Before you begin
|
||||
Before you start, it is recommended to familiarize yourself with a few concepts for Olares applications:
|
||||
|
||||
| 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. [](../../../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. |
|
||||
| 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#shared-applications) | A special category of community applications on Olares designed<br/> to provide unified, shared resources or services to all users within<br/> an Olares cluster. <br/><br/>Shared applications expose standard APIs or shared entrances that<br/> can be directly invoked by any application in the cluster. |
|
||||
| [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
|
||||
|
||||
@@ -60,8 +59,8 @@ You can switch market sources to speed up browsing, searching, and downloading,
|
||||
|
||||
1. Open **Market**, and navigate to **My Olares** > **Settings** from the left sidebar.
|
||||
2. Under **Market sources**, click **Add source** to add a new app source. The current official sources include:
|
||||
* Global: `https://appstore-server-prod.bttcdn.com`
|
||||
* China: `https://appstore-china-server-prod.api.jointerminus.cn`
|
||||
* Global: `https://api.olares.com/market`
|
||||
* China: `https://api.olares.cn/market`
|
||||
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.
|
||||
|
||||
@@ -76,32 +75,36 @@ 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**.
|
||||
4. (Optional) To cancel the installation, click <i class="material-symbols-outlined">close_small</i> on the right of the button.
|
||||
5. Once finished, the button will change to **Open**.
|
||||
|
||||
:::tip
|
||||
To cancel an installation, hover over the operation button and click **Cancel** when it appears.
|
||||
:::
|
||||
### Install shared applications
|
||||
|
||||
### Install shared and reference applications
|
||||
|
||||
To ensure a shared service is running and accessible within the cluster, follow this general installation process based on the type of Shared App:
|
||||
To ensure a shared service is running and accessible within the cluster, follow the installation process based on the type of shared application:
|
||||
|
||||
* **Headless backend service**:
|
||||
This type of shared applications typically require third-party reference applications to access its service. Take Ollama for example:
|
||||
1. The administrator installs the shared application first. This makes the core service available in the cluster.
|
||||
|
||||
2. Members (including the administrator) install the corresponding reference application (e.g., Open WebUI or LobeChat) to access the Ollama service.
|
||||
|
||||
* **Complete application with built-in UI**:
|
||||
This type of shared applications can provide service to itself. Typical examples are Dify Shared and ComfyUI Shared.
|
||||
This type of shared application provides API services and does not include a graphical user interface. No dedicated reference application is required. Any client that supports the corresponding API can directly invoke the service. Take Ollama as an example:
|
||||
|
||||
1. The administrator installs Ollama first. Once installed, the shared service starts within the cluster and exposes a standard API endpoint.
|
||||
|
||||
1. The administrator installs the shared application first. This not only launches the shared service for the cluster, but also installs the client-side interface as the reference application.
|
||||
2. Cluster members access the shared service:
|
||||
|
||||
a. Retrieve the access address of Ollama in Olares **Settings** > **Applications** > **Ollama** > **Shared entrances**.
|
||||
|
||||
b. Install a third-party client that supports the Ollama API, such as LobeChat or Open WebUI, and enter the access address in the client's configuration settings.
|
||||
|
||||
* **Applications with built-in UI**:
|
||||
|
||||
This type of shared applications include both a backend service and a Web UI. They can provide services to users independently. Typical examples are Dify Shared and ComfyUI Shared.
|
||||
|
||||
1. The administrator installs the shared application first. This not only launches the shared service for the cluster, but also installs the client-side interface as the access point.
|
||||
|
||||
::: tip ComfyUI Launcher
|
||||
ComfyUI Shared contains a web launcher component to facilitate the management of related services and resources. The administrator needs to configure and start the service from the ComfyUI Launcher.
|
||||
:::
|
||||
|
||||
2. Other members in the cluster install the same application. For these users, only the access point to the shared application is installed.
|
||||
2. Cluster members install the same application. For these users, only the access point to the shared application is installed.
|
||||
|
||||
### Install custom applications
|
||||
|
||||
@@ -133,21 +136,45 @@ To update an application from Market:
|
||||
|
||||
## Uninstall applications
|
||||
|
||||
### Uninstall from Market
|
||||
Uninstall an application from Market or LaunchPad.
|
||||
|
||||
To uninstall an application from Market:
|
||||
<tabs>
|
||||
<template #Uninstall-from-Market>
|
||||
|
||||
1. Open Market from Dock or Launchpad.
|
||||
2. In the left sidebar, navigate to the **My Olares** section. Use the source tabs to filter and find your installed applications.
|
||||
3. Click <i class="material-symbols-outlined">keyboard_arrow_down</i> next to the application's operation button, and select **Uninstall**.
|
||||
4. In the **Uninstall** window, select the removal option as needed:
|
||||
|
||||
### Uninstall from Launchpad
|
||||
- **Also remove all local data**
|
||||
|
||||
You can also uninstall an application from LaunchPad:
|
||||
- If you select this option, app data (in the Data directory) and cache data (in the Cache directory) will be permanently deleted and cannot be recovered.
|
||||
- If you do not select this option, app data (in the Data directory) will be retained and can be restored upon re-installation, while cache data (in the Cache directory) will be permanently deleted and cannot be recovered.
|
||||
- **Also uninstall the shared server (affects all users)**
|
||||
|
||||
- If this is a shared application, select this option to remove it for all users in the cluster.
|
||||
- If you have uninstalled the user-facing app before removing the share app, you must re-install the user-facing app first, and then uninstall the shared application.
|
||||
|
||||
5. Click **Confirm**.
|
||||
</template>
|
||||
<template #Uninstall-from-Launchpad>
|
||||
|
||||
1. In Olares, click the Launchpad icon in the Dock to display all installed apps.
|
||||
2. Click and hold the app icon until all the apps begin to jiggle.
|
||||
3. Click <i class="material-symbols-outlined">cancel</i> on the app icon to uninstall it.
|
||||
3. In the **Uninstall** window, select the removal option as needed:
|
||||
|
||||
- **Also remove all local data**
|
||||
|
||||
- If you select this option, app data (in the Data directory) and cache data (in the Cache directory) will be permanently deleted and cannot be recovered.
|
||||
- If you do not select this option, app data (in the Data directory) will be retained and can be restored upon re-installation, while cache data (in the Cache directory) will be permanently deleted and cannot be recovered.
|
||||
- **Also uninstall the shared server (affects all users)**
|
||||
|
||||
- If this is a shared application, select this option to remove it for all users in the cluster.
|
||||
- If you have uninstalled the user-facing app before removing the share app, you must re-install the user-facing app first, and then uninstall the shared application.
|
||||
|
||||
4. Click **Confirm**.
|
||||
</template>
|
||||
</tabs>
|
||||
|
||||
## View app operation logs
|
||||
|
||||
@@ -166,23 +193,19 @@ If you can't install an application, it might be due to:
|
||||
* **Insufficient system resources**: Try freeing up system resources, or increasing your resource quota.
|
||||
* **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.
|
||||
* **Shared service dependency** (for Olares members): The application requires a shared service to be running in the cluster. Contact your admin to install the shared application first before you can install it.
|
||||
|
||||
### 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?
|
||||
### 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?
|
||||
### Why can't I resume my application?
|
||||
|
||||
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:
|
||||
Therefore, when you try to resume the application, you might encounter the following messages, and you need to stop other applications to free up resources.
|
||||
|
||||
| Error message | Description |
|
||||
| :--- | :--- |
|
||||
@@ -190,11 +213,46 @@ Therefore, when you try to resume the application, you might encounter the follo
|
||||
| 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?
|
||||
### 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**.
|
||||
3. Stop each application by clicking the app and clicking **Stop**.
|
||||
4. After resources are freed, go back to your target application and click **Resume** again.
|
||||
|
||||
### How to free up resources from unused apps?
|
||||
|
||||
If certain applications are not in use and you want to free up the system resources they are using, you can stop them from Market or Settings.
|
||||
|
||||
<tabs>
|
||||
<template #Stop-apps-from-Market>
|
||||
|
||||
1. Open Market from Dock or Launchpad.
|
||||
2. In the left sidebar, click **My Olares**. Use the source tabs to filter and find the app you want to stop.
|
||||
3. Click <i class="material-symbols-outlined">keyboard_arrow_down</i> next to the application's operation button, and then select **Stop**.
|
||||
</template>
|
||||
<template #Stop-apps-from-Settings>
|
||||
|
||||
1. Go to **Settings** > **Application**.
|
||||
2. Click the target application you want to stop from the list.
|
||||
3. Click <i class="material-symbols-outlined">toggle_on</i>.
|
||||
|
||||
</template>
|
||||
</tabs>
|
||||
|
||||
#### Free up shared application resources
|
||||
|
||||
To fully release resources for shared applications such as Ollama, the system-side service must be stopped. This action can only be performed by an administrator.
|
||||
|
||||
When the admin stops a shared application, the **Also uninstall the shared server (affects all users)** checkbox appears:
|
||||
- To fully release the resources, this checkbox must be selected.
|
||||
- Once selected, the service is disabled for the entire cluster, and other users will no longer be able to use the application.
|
||||
- This checkbox only appears in multi-user clusters. In a single-user scenario, the system automatically stops both the user-facing application and the system-side service by default.
|
||||
|
||||
:::info Notes for Olares V1.12.4 and earlier
|
||||
In Olares 1.12.4 and earlier versions, to fully release resources, you must use Market:
|
||||
- Stop the app in Market and ensure that the **Also uninstall the shared server (affects all users)** option is selected.
|
||||
- If the user-facing application has already been stopped through Settings, you must first resume it in Market, and then stop the shared application while ensuring the **Also uninstall the shared server (affects all users)** option is selected.
|
||||
:::
|
||||
|
||||
@@ -1,88 +1,110 @@
|
||||
---
|
||||
description: Learn how to manage repositories, view downloaded images, and export system logs for troubleshooting.
|
||||
outline: [2, 3]
|
||||
description: Learn how to manage repositories, view downloaded images, export system logs, and configure system-level environment variables.
|
||||
head:
|
||||
- - meta
|
||||
- name: keywords
|
||||
content: Olares OS, advanced settings, repo management, image management, system logs, system-level environment variables
|
||||
---
|
||||
|
||||
# Developer resources
|
||||
# Advanced settings
|
||||
|
||||
The **Developer** page in Olares **Settings** is designed for developers and advanced users to manage core system resources and diagnose issues. Key functions include:
|
||||
The **Advanced** page in **Settings** is designed for developers and advanced users to manage core system resources and diagnose issues.
|
||||
|
||||
* **Repository Management**
|
||||
* **Image Management**
|
||||
* **Export System Logs**
|
||||
* **Set System Environment Variables**
|
||||
## Manage repositories
|
||||
|
||||
## Repository management
|
||||
The **Repository management** page allows you to view the source repositories that Olares uses to download system images and software packages. You can also configure mirror endpoints to optimize download speeds and stability.
|
||||
|
||||
**Repository management** is where you maintain the source repositories for Olares to download essential system images and other software packages. You can view existing repositories, add new ones, and manage endpoints to optimize Olares' package retrieval performance.
|
||||
### View repositories
|
||||
|
||||
On the repository list page, you can view the name of the repository, number of related images, and image size for each repository.
|
||||
1. Go to **Settings** > **Advanced** > **Repository management**.
|
||||
2. In the repository list, you can view the name of the repository, number of related images, and image size for each repository.
|
||||
|
||||

|
||||
{width=65%}
|
||||
|
||||
### Add a new repository
|
||||
### Manage repository mirrors
|
||||
|
||||
Follow these steps to add a new repository:
|
||||
Manage mirror endpoints for repositories to improve access speed and stability.
|
||||
|
||||
1. Navigate to **Settings** > **Developer** > **Repository management**.
|
||||
2. Click the **+ Add repository** button in the top-right corner.
|
||||
3. In the pop-up dialog, fill in the following information:
|
||||
* **Repository Name**: Enter a unique name for the repository, such as `docker.io` or `quay.io`.
|
||||
* **Starting endpoint**: Enter the initial URL for the repository.
|
||||
4. Click **Confirm** to complete the addition.
|
||||
1. On the **Repository management** page, find the target repo, and then click <i class="material-symbols-outlined">chevron_forward</i> in the **Action** column.
|
||||
2. On the **Mirror management** page, you can perform the following actions:
|
||||
|
||||
### Manage repository endpoints
|
||||
{width=68%}
|
||||
|
||||
- To re-order the mirror endpoints, click <i class="material-symbols-outlined">keyboard_control_key</i> or <i class="material-symbols-outlined">keyboard_arrow_down</i>. Olares prioritizes endpoints higher on the list.
|
||||
- To delete an endpoint you no longer need, click <i class="material-symbols-outlined">delete</i>.
|
||||
- To add a new mirror endpoint, click **Add mirror**, enter the mirror URL, and then click **Confirm**.
|
||||
|
||||
You can reorder a repository's access endpoints to optimize its access speed and stability.
|
||||
## Manage images
|
||||
|
||||

|
||||
The **Image management** page provides a comprehensive view of all downloaded and cached application and software package images on your Olares system. You can filter or search to quickly find specific images.
|
||||
|
||||
1. On the **Repository management** page, click the <i class="material-symbols-outlined">table_edit</i> button to the right of the target repository.
|
||||
2. On the **Endpoint management** page, you can:
|
||||
* **Reorder**: Use the up and down arrows to sort the endpoints. Olares will prioritize the endpoints higher on the list.
|
||||
* **Delete**: Click the <i class="material-symbols-outlined">delete</i> button to delete an endpoint you no longer need.
|
||||
|
||||
## Image management
|
||||
|
||||
The **Image Management** page provides a comprehensive view of all downloaded and cached application and software package images on your Olares system.
|
||||
|
||||
|
||||

|
||||
{width=65%}
|
||||
|
||||
## Export system logs
|
||||
|
||||
Logs record the operational status of various system components. When troubleshooting Olares issues, system logs can provide crucial diagnostic information. To download system logs:
|
||||
System logs record the operational status of various system components and provide crucial diagnostic information for troubleshooting.
|
||||
|
||||
1. Navigate to **Settings** > **Developer** > **Logs**.
|
||||
2. Click **Collect** to generate the log file. The log will automatically be saved to the `/Home/pod_logs` directory.
|
||||
3. Click **Open** to open the logs directory in a new window.
|
||||
To export system logs:
|
||||
1. Go to **Settings** > **Advanced** > **Logs**.
|
||||
2. Click **Collect** to generate the log file. The log is automatically saved to the `/Home/pod_logs` directory.
|
||||
3. Click **Open** to open the logs directory in a new window.
|
||||
|
||||

|
||||
{width=65%}
|
||||
|
||||
4. Right-click the generated log file and select **Download** to save it to your local machine.
|
||||
|
||||
{width=70%}
|
||||
Once downloaded, you can attach the log file to a GitHub feedback post and share it with the Olares team to help them locate the issue faster.
|
||||
:::tip
|
||||
You can attach this log file to a GitHub issue to help the Olares team locate and resolve your problem faster.
|
||||
:::
|
||||
|
||||
## Set system environment variables
|
||||
|
||||
Starting from Olares version 1.12.2, Olares supports system environment variables declared by applications. This allows users to configure common settings for applications at the system level, eliminating the need to modify each application individually. Typical categories are:
|
||||
Starting from Olares version 1.12.2, you can configure system-level environment variables for applications. This allows you to apply common settings globally without having to configure them for each application individually.
|
||||
|
||||
- User information, for example, `OLARES_USER_USERNAME`.
|
||||
- SMTP services, for example, `OLARES_USER_SMTP_PORT`.
|
||||
- Image/proxy settings, for example, `OLARES_SYSTEM_CDN_SERVICE`.
|
||||
- Third-party service API-KEYs, for example, `OLARES_USER_CUSTOM_OPENAI_APIKEY`, and `OLARES_USER_HUGGINGFACE_TOKEN`.
|
||||
The variables are divided into two main categories:
|
||||
|
||||
:::tip Note
|
||||
- You cannot add or delete system environment variables, nor can you modify their attributes.
|
||||
- When installing and activating Olares, the system automatically sets some environment variables based on your Olares ID to ensure optimal performance and connectivity.
|
||||
:::
|
||||
| Category | Description | Permissions |
|
||||
|:-------- |:----------- |:----------- |
|
||||
| System config | Predefined variables required<br> for core system operations. <br><br>Example: `OLARES_SYSTEM_CDN_SERVICE` | You cannot delete them. The system locks and grays out some variables to ensure stability, but you can edit the values of others. |
|
||||
| User information | Custom or predefined user-level<br> variables, such as third-party API keys.<br><br>Example: `OLARES_USER_CUSTOM_OPENAI_APIKEY`| You can add, edit, and delete them. The system automatically applies the `OLARES_USER_` prefix to any custom keys you create. |
|
||||
|
||||
To manually adjust system environment variables, follow these steps:
|
||||
To manage environment variables:
|
||||
|
||||

|
||||
1. Go to **Settings** > **Advanced** > **System environment variables**.
|
||||
|
||||
1. From the Olares desktop, navigate to **Settings > Developer > System Environment Variables**.
|
||||
2. Find the variable you want to modify in the list.
|
||||
3. Click the <i class="material-symbols-outlined">edit_square</i> icon and enter the variable's value in the pop-up dialog. Variables that are grayed out cannot be modified.
|
||||
4. Click **Confirm** to save your changes.
|
||||
{width=65%}
|
||||
|
||||
2. To add a new custom variable:
|
||||
|
||||
a. Click **Add environment variables**.
|
||||
|
||||
b. In the **Key** field, enter your custom key name which is appended to the `OLARES_USER_` prefix.
|
||||
|
||||
c. In the **Value** field, fill in the value.
|
||||
|
||||
d. From the **Type** list, select the data type.
|
||||
|
||||
e. Provide an optional description.
|
||||
|
||||
f. Click **Save**.
|
||||
|
||||
g. Click **Apply** at the bottom of **System environment varuables**.
|
||||
|
||||
3. To modify a variable:
|
||||
|
||||
a. Find the target variable from the list, and then click <i class="material-symbols-outlined">edit_square</i>. Variables without this icon are locked and cannot be changed.
|
||||
|
||||
b. In the **Edit environment variable** window, update the variable's value.
|
||||
|
||||
c. Click **Confirm** to save your changes.
|
||||
|
||||
d. Click **Apply** at the bottom of **System environment varuables**.
|
||||
|
||||
4. To delete a variable:
|
||||
|
||||
a. Locate a user-level variable and click <i class="material-symbols-outlined">delete</i>.
|
||||
|
||||
b. Click **Confirm**.
|
||||
|
||||
c. Click **Apply** at the bottom of **System environment varuables**.
|
||||
|
||||
@@ -7,17 +7,15 @@ description: Configure and manage Olares with Settings, your central hub for per
|
||||
The Settings application in Olares provides a clean, intuitive interface for configuring and managing your system. It serves as the central hub for personalizing your experience, securing your environment, integrating services, and more.
|
||||
|
||||
Settings is organized into the following sections:
|
||||
|
||||
- Manage security – Manage login devices and system security settings.
|
||||
- Manage accounts – Create and manage users within your Olares cluster.
|
||||
- Manage applications – Monitor and configure application status and behavior.
|
||||
- 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.
|
||||
|
||||
|
||||
|
||||
- **Users**: Manage user accounts within your Olares system.
|
||||
- **Appearance**: Personalize your system by setting the language, theme, and background wallpaper.
|
||||
- **Applications**: Configure application entrances, customize app domains, and manage app environment variables.
|
||||
- **Integration**: Centralize external connections, including cloud storages, website cookies, and SMB network credentials.
|
||||
- **VPN**: Configure secure remote access to your Olares device.
|
||||
- **Network**: Manage network routing by changing the reverse proxy and setting up the hosts file.
|
||||
- **GPU**: Allocate and monitor GPU resources for hardware-accelerated tasks.
|
||||
- **Video**: Configure system-level video playback and transcoding preferences.
|
||||
- **Search**: Set up indexing rules to optimize your global file search experience.
|
||||
- **Backup**: Create and manage backup tasks to safeguard your system data.
|
||||
- **Restore**: Recover your system data from previous backups.
|
||||
- **Advanced**: Manage repositories, view downloaded images, export system logs, and configure system-level environment variables.
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
---
|
||||
outline: [2, 3]
|
||||
description: Connect Olares with different services and manage cookies for web access and subscriptions — all from Integrations in Settings.
|
||||
description: Centralize third-party service connections, SMB network storage credentials, and website cookies in Olares. Extend file storage capabilities and ensure smooth access to subscriptions and automated tasks.
|
||||
---
|
||||
|
||||
# Manage integrations in Settings
|
||||
@@ -9,6 +9,7 @@ The **Integrations** section in **Settings** centralizes all services and authen
|
||||
|
||||
- **Connect services** – Link cloud storage services such as **Olares Space**, **AWS S3**, and **Tencent Cloud COS** to extend Olares’ storage capabilities.
|
||||
- **Manage cookies** – Store, import, and delete website cookies to support Olares’ access to subscription-based or restricted content.
|
||||
- **Manage SMB accounts** – Store and manage usernames and passwords for SMB network shares, making it easier to reference them when mounting SMB shares in Files.
|
||||
|
||||
## View and manage connected services
|
||||
|
||||
@@ -65,14 +66,22 @@ When a cookie expires, the system will highlight it in red.
|
||||
Expired or missing cookies may cause some subscription or web automation tasks to fail. It’s recommended to check and update cookies periodically.
|
||||
:::
|
||||
|
||||
## Manage SMB accounts
|
||||
|
||||
SMB account management allows you to centrally store usernames and passwords for accessing SMB network shares. You can view, add, or delete accounts here for easy reference when mounting SMB shares in Files.
|
||||
|
||||
1. To view SMB accounts, go to **Settings** > **Integration** > **SMB account management**. All saved SMB accounts are listed.
|
||||
2. To add an SMB account:
|
||||
|
||||
a. In **SMB account management**, click **Add account**.
|
||||
|
||||
b. In the **Add account** window, enter the username and password required to access the SMB share.
|
||||
|
||||
c. Click **Confirm**. The information is saved and displayed as a new record in the SMB account list.
|
||||
|
||||
3. To delete an account, click <i class="material-symbols-outlined">delete</i> on the right of the account record, and then click **Confirm**. The account and its credentials are removed.
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
:::tip Use SMB accounts to mount shares
|
||||
- SMB credentials are stored locally and are not uploaded to the cloud. It is recommended to periodically check and update saved credentials to keep them in sync with the server.
|
||||
- Saved SMB accounts do not automatically mount shared folders, and you cannot select them directly in Files. To mount an SMB share, manually enter the server address along with the username and password saved here in Files. For more information, see [Mount SMB shares](../files/mount-SMB.md).
|
||||
:::
|
||||
|
||||
@@ -15,9 +15,10 @@ To unlock the full potential of Wise, it is recommended to install the following
|
||||
|
||||
- **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.
|
||||
- **Twitter/X plugin**: Use it to save posts and download attached files from Twitter/X into Wise.
|
||||
|
||||
:::tip
|
||||
Wise works without these apps, but in-browser subscription and media download will be unavailable until you install them.
|
||||
Wise works without these apps, but some features require them, such as in-browser subscriptions, media downloads, and Twitter/X link recognition and saving.
|
||||
:::
|
||||
|
||||
## Build your library
|
||||
@@ -40,6 +41,10 @@ Import files directly from your computer, including PDFs, EPUBs, audio, video, a
|
||||
|
||||
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.
|
||||
:::tip
|
||||
You can also drag and drop files into the Wise interface.
|
||||
:::
|
||||
3. In the Upload files window, select the destination folder, then click **Confirm**.
|
||||
|
||||
#### Add items via link
|
||||
|
||||
@@ -52,11 +57,16 @@ If a link requires login or other access control, Wise may need cookies to fetch
|
||||
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.
|
||||
|
||||
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**.
|
||||
Wise analyzes the link and lists all the available actions:
|
||||
- **Save to library**: The content will be saved as an item in your library and added to **Inbox**. Twitter/X posts are supported when the Twitter/X plugin is installed.
|
||||
- **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).
|
||||
{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 file**: If Wise detects downloadable media (such as audio, video, or attached files in Twitter/X posts), this option will appear. Select the file you want to download to save it for offline access.
|
||||
:::tip Install helper services
|
||||
Some downloads require helper services:
|
||||
- [YT-DLP](https://market.olares.com/app/market.olares/ytdlp) is commonly used to download audio or video from supported pages when downloadable media is available.
|
||||
- [Twitter/X plugin](https://market.olares.com/app/market.olares/twitter) is required to download attached files from Twitter/X posts.
|
||||
:::
|
||||
{width=300}
|
||||
|
||||
Newly saved items will appear under their content type.
|
||||
@@ -72,22 +82,23 @@ You can also save content to Wise directly from your browser using the [LarePass
|
||||
|
||||
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
|
||||
### Monitor and manage file tasks
|
||||
|
||||
When you add new audio or video content, Wise automatically creates download tasks and save media files to Olares. This:
|
||||
Wise tracks background transfer tasks in two lists:
|
||||
|
||||
- Ensures your media is available offline.
|
||||
- Protects your library if the original source is removed.
|
||||
- Makes it faster to open and play items.
|
||||
- **Download list**: Created when you add downloadable media. Wise downloads the files to Olares so you can access them offline.
|
||||
- **Upload list**: Created when you upload local files into Wise. Wise tracks the upload progress and results.
|
||||
|
||||
To manage all download tasks:
|
||||
To manage transfer 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.
|
||||
1. Go to **<i class="material-symbols-outlined">settings</i> Settings** > **Download list** or **Upload list**.
|
||||
2. Use the tabs to filter tasks:
|
||||
- Download list tabs: **All**, **Downloading**, **Completed**, **Failed**
|
||||
- Upload list tabs: **All**, **Uploading**, **Completed**, **Failed**.
|
||||
3. Review the task list and status.
|
||||
4. You can:
|
||||
- Click <i class="material-symbols-outlined">folder_open</i> to locate the transferred file in Files.
|
||||
- Click <i class="material-symbols-outlined">do_not_disturb_on</i> to remove it from the list.
|
||||
|
||||
## Use reading tools
|
||||
|
||||
|
||||
@@ -5,9 +5,9 @@ description: Manage cookies for Wise so it can access protected websites and fee
|
||||
|
||||
# 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.
|
||||
Some websites require you to log in to access their content. To allow Wise to fetch content from these protected sources, you may need to upload cookies so Wise can authenticate its requests.
|
||||
|
||||
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 allows Wise to authenticate access, ensuring that features like **Save to library**, **Subscribe to RSS feed** and **Download file** work securely on restricted sites.
|
||||
|
||||
This guide explains how to manage cookies in Olares for Wise.
|
||||
|
||||
|
||||
51
docs/manual/space/backup-restore.md
Normal file
51
docs/manual/space/backup-restore.md
Normal file
@@ -0,0 +1,51 @@
|
||||
---
|
||||
description: Protect your Olares instances with cloud backup and restore features. Handle snapshots, perform restore operations, and manage storage quotas in Olares Space.
|
||||
---
|
||||
:::warning Documentation does not match current experience
|
||||
We are currently updating this documentation to match the latest experience on the Olares Space platform. If there are differences, follow the actual platform.
|
||||
:::
|
||||
# Back up and restore
|
||||
|
||||
Olares Space is the official solution to back up snapshots for your Olares instances. You can restore an Olares to its most recent state whenever needed. This section provides instructions for managing backups and restores in Olares Space.
|
||||
|
||||
## View backup list
|
||||
|
||||
The backup task list shows information for each backup task, including:
|
||||
|
||||
- Initial creation time
|
||||
- Most recent snapshot time
|
||||
- Overall storage usage
|
||||
|
||||

|
||||
|
||||
Click **View Details** on a task to see its detail page. The detail page shows the storage usage since the task was created and a list of all successful snapshots.
|
||||
|
||||
:::info
|
||||
Currently, only restoring from the most recent snapshot is supported.
|
||||
:::
|
||||
|
||||
## Restore backup to the Olares Space
|
||||
|
||||

|
||||
|
||||
Restoring a snapshot to the cloud is similar to setting up a new cloud-based Olares.
|
||||
|
||||
1. Set up relevant details.
|
||||
|
||||
a. Select the cloud service provider and their data center location.
|
||||
|
||||
b. Choose the hardware configuration for the instance.
|
||||
|
||||
c. Confirm the snapshot details and enter the backup password.
|
||||
|
||||
2. Understand charges for storage and bandwidth. <br>Each instance includes a certain amount of free traffic. Any usage exceeding the quota will incur charges. For more information, see [Billing](billing.md).
|
||||
|
||||
3. Confirm the order and complete the payment. After that, the Olares begins to install.
|
||||
|
||||
:::info
|
||||
During the installation process, Olares will verify the backup password. If it is incorrect, you'll be asked to re-enter the correct one. If you forget the backup password, the restoration process won't be able to continue. In this case, please return your instance and try restoring again.
|
||||
:::
|
||||
|
||||
:::info
|
||||
To avoid conflicts or other unforeseeable problem, you must return the existing Olares that uses the same name before restoring to a cloud-based Olares.
|
||||
:::
|
||||
66
docs/manual/space/billing.md
Normal file
66
docs/manual/space/billing.md
Normal file
@@ -0,0 +1,66 @@
|
||||
---
|
||||
description: Understand Olares Space billing system with service charges and payment workflows. Learn about cloud hosting fees, usage based pricing, and promotional credit applications.
|
||||
---
|
||||
:::warning Documentation does not match current experience
|
||||
We are currently updating this documentation to match the latest experience on the Olares Space platform. If there are differences, follow the actual platform.
|
||||
:::
|
||||
# Billing
|
||||
|
||||
Olares partners with Stripe for secure payment processing. Your invoices and receipts will be sent via email, allowing you to keep records for analysis. If you have any questions during the payment process, please contact support.
|
||||
|
||||
## The scope of billing
|
||||
|
||||
The following services or products are billed:
|
||||
|
||||
- **Hosted Olares**: Prepaid product required for setting up an Olares on a cloud provider like AWS or GCS. Pricing varies depends on the provider you choose.
|
||||
- **Host instance traffic**: Postpaid charges for external traffic generated by cloud hosting out of assigned regions.
|
||||
- **Worker instance**: Adding a Worker node to a hosted Olares also incurs monthly charges. Charges will be combined to the monthly bill.
|
||||
- **Cloud storage**: Postpaid product storing system data via JuiceFS. Billed based on usage at the end of the billing cycle.
|
||||
- **Cloud backup/restore**: Backs up host data to public storage. Billed based on usage at the end of the billing cycle.
|
||||
- **Cloudflare tunnel (FRP) traffic**: Postpaid for traffic incurred by self-hosted Olares when services are accessed via public links.
|
||||
- **GPU unit**: Prepaid for GPU-related services. Charges are deducted from prepaid units based on usage.
|
||||
|
||||
|
||||
### Bill generation and payment scenarios
|
||||
|
||||
The following actions generate bills:
|
||||
|
||||
- **Creating an Olares in the cloud**: An invoice is generated immediately after you select a cloud provider and configuration. Payment is required for installation to begin.
|
||||
- **Adding/Removing workers**: Bills are generated for adding workers based on the remaining time in the billing period. Similarly, refunds are calculated when removing workers.
|
||||
- **Restoring a snapshot**: Equivalent to creating a new Olares, with monthly charges applied.
|
||||
- **Destroying an Olares**: Fees are settled up to the destruction date. Refunds are processed as applicable.
|
||||
|
||||
The monthly bill updated once per month. It includes the base subscription fees as well as any additional charges incurred during the month, such as adding a Worker, or extra traffic and storage fees.
|
||||
|
||||
## How fees are deducted monthly
|
||||
|
||||
Olares operates on a monthly billing cycle:
|
||||
- **Automatic deduction**: Your first payment will authorize automatic deductions, with the first payment method set as default. You can disable auto-deductions from the control panel if you prefer to pay manually, but make sure to settle your bills on time to avoid service interruption.
|
||||
- **Payment validity period**: For each purchase, you'll receive a bill valid for 24 hours.
|
||||
|
||||
|
||||
## Use promotional credits or coupons
|
||||
|
||||
We distribute trial credits or coupons through promotions.
|
||||
|
||||
- Once you have received trial credits, you can view them in **Billing** > **Balance History**, and apply directly to specific products when you pay.
|
||||
- Once you receive a promotional coupon codes, you can redeem them in **Billing** > **Coupons**. It could be a discount to your plans, plan subscriptions, Olares memberships, and more.
|
||||
|
||||
:::info
|
||||
Trial credits or coupons are non-refundable. If you request a refund, the system will only refund your actual payment.
|
||||
:::
|
||||
|
||||
## FAQs
|
||||
|
||||
### Will I be charged if someone accesses the WordPress site deployed on Olares?
|
||||
|
||||
Yes, charges will occur from both Cloudflare for the traffic going through Cloudflare FRP tunnel. It mainly helps to hide the real IP of Olares and provides security protection against Distributed Denial of Service (DDoS) and other threats. If you host Olares on the cloud, traffic fee from your chosen vendor will apply.
|
||||
|
||||
|
||||
### What happens if my bill is less than $1?
|
||||
|
||||
If your total bill is under $1, it won't trigger a card charge. Instead, this amount will be added to your balance and rolled into the next bill.
|
||||
|
||||
### How do I resolve a negative balance?
|
||||
|
||||
A negative balance doesn't always mean you owe money. If you have a negative balance, check the **Billing** > **Balance** section for details. Pay any outstanding amounts to avoid service interruptions.
|
||||
89
docs/manual/space/create-olares.md
Normal file
89
docs/manual/space/create-olares.md
Normal file
@@ -0,0 +1,89 @@
|
||||
---
|
||||
outline: [2, 3]
|
||||
description: Set up your cloud based Olares instance in Olares Space. Configure system resources, monitor installation progress, and activate your instance with proper credentials.
|
||||
---
|
||||
:::warning Documentation does not match current experience
|
||||
We are currently updating this documentation to match the latest experience on the Olares Space platform. If there are differences, follow the actual platform.
|
||||
:::
|
||||
# Create a cloud-based Olares
|
||||
|
||||
Cloud-based Olares offer a convenient deployment option, enabling you to set up an Olares environment without managing hardware directly.
|
||||
This section provides a step-by-step guide to creating and managing your cloud-based Olares.
|
||||
|
||||
:::info
|
||||
- The **Host Service** is currently in an invite-only beta phase. To access the cloud-based Olares, contact us for an invitation.
|
||||
- If you are looking for information about setting up a self-hosted Olares, refer to the [Getting Started Guide](../get-started/index.md).
|
||||
:::
|
||||
|
||||
## Prerequisites
|
||||
|
||||
Ensure you get an Olares ID to log in to Olares Space and activate the Olares instance.
|
||||
|
||||
## Create an Olares
|
||||
|
||||
1. Log in to [Olares Space](https://space.olares.com/) by scanning the QR code using LarePass.
|
||||
2. Navigate to the **Cluster** page and select the second option to start creating.
|
||||
|
||||

|
||||
3. Configure the environment for installation as below:
|
||||
- **Select Cloud Provider**: Choose a cloud service provider and the data center location closest to your users or workloads.
|
||||
- **Hardware Configuration**: Select the instance's CPU, RAM, and storage resources.
|
||||
- **Olares Version & Kubernetes Setup**: Choose the appropriate version of Olares and the Kubernetes/K3S solution to be installed.
|
||||
|
||||
:::info
|
||||
If you intend to host large language models (LLMs), select the **Alibaba Cloud Hong Kong** region. Currently, it is the only region that offers instances with shared GPU services.
|
||||
:::
|
||||
|
||||
4. Review the fees for storage and traffic.
|
||||
|
||||

|
||||
|
||||
:::info
|
||||
Each instance comes with a set amount of free storage and bandwidth. If your usage exceeds these quotas, additional fees will apply based on your cloud provider's pricing.
|
||||
:::
|
||||
5. Review your order details, including instance configuration, selected options, and fees.
|
||||
6. Complete the payment to initiate the installation process.
|
||||
|
||||
## Monitor installation
|
||||
|
||||
The creation and installation of your cloud-based Olares typically take around 10 minutes. During this time, you can monitor the progress and logs in real-time.
|
||||
|
||||
### System statuses
|
||||
|
||||
The installation follows several key stages, represented by different statuses:
|
||||
|
||||
| Status | Description |
|
||||
|------------------------|-------------------------------------------------------------------------------|
|
||||
| **Unpaid** | Instance created but pending payment. Can be canceled. |
|
||||
| **Fetching** | Payment confirmed. System is creating resources. |
|
||||
| **Queuing** | Resource creation request has been submitted. |
|
||||
| **Pending** | Resources created. Waiting for OS installation. |
|
||||
| **Installing** | OS installation is in progress. |
|
||||
| **Restoring** | OS restoration is in progress from backup. |
|
||||
| **Restore_error** | Restoration failed because of incorrect snapshot password. |
|
||||
| **Restarting** | System is restarting. |
|
||||
| **Stopping** | System is shutting down. |
|
||||
| **Starting** | System is starting up. |
|
||||
| **Running** | System is operating normally. You can restart, stop, or destroy the instance. |
|
||||
| **Stopped** | System is not running. You can restart or destroy the instance. |
|
||||
| **Errored** | System encountered an error during resource creation or installation. |
|
||||
| **Destroying** | Instance is being destroyed. |
|
||||
| **Destroyed** | Instance has been destroyed. |
|
||||
| **Canceled** | Instance is terminated due to cancellation or payment issues. |
|
||||
| **Pending Activation** | System is waiting for activation. Will start after activations. |
|
||||
|
||||
### Real-time logs
|
||||
|
||||
Click **Log** to view detailed logs and monitor the installation process in real time.
|
||||
|
||||
## Activate Olares
|
||||
|
||||
When the installation enters the **Pending Activation** state, activate Olares:
|
||||
|
||||
1. Click **Activation**. A pop-up window will display Olares ID, one-time password, and a wizard URL.
|
||||
|
||||

|
||||
|
||||
2. Access the wizard URL in your browser, and use the one-time password to log into Olares for the first time.
|
||||
3. Change the Olares password via LarePass when prompted.
|
||||
4. Follow the on-screen instructions to finish the rest of activation process.
|
||||
85
docs/manual/space/host-domain.md
Normal file
85
docs/manual/space/host-domain.md
Normal file
@@ -0,0 +1,85 @@
|
||||
---
|
||||
outline: [2, 3]
|
||||
description: Set up custom domains in Olares Space with domain verification and DNS configuration. Create organizational Olares IDs and manage domain settings for your team.
|
||||
---
|
||||
:::warning Documentation does not match current experience
|
||||
We are currently updating this documentation to match the latest experience on the Olares Space platform. If there are differences, follow the actual platform.
|
||||
:::
|
||||
# Set up a custom domain
|
||||
|
||||
Whether you're an organizational user wanting employees to use a company-specific domain for login, or you simply wish to use a domain that you own, Olares Space allows you to set up a custom domain for easy access.
|
||||
|
||||
This guide walks you through adding your own domain for your Olares system on Olares Space.
|
||||
|
||||
## Prerequisites
|
||||
|
||||
:::info
|
||||
A new domain can only be bound if the account is in the DID stage. If the account has already been bound with an Olares ID, it means that the account is already associated with a Domain.
|
||||
:::
|
||||
|
||||
Before creating and configuring your own domain, make sure that:
|
||||
|
||||
- **DID account status**: Ensure your account is in DID status (i.e., not yet bound to an Olares ID).
|
||||
|
||||
- **Domain Name**: Ensure you have a domain name registered through a domain registrar. The domain should not already be bound to another account in Olares Space.
|
||||
|
||||
- **LarePass app**: Make sure the LarePass app is installed on your phone, as it is required for Verifiable Credential and domain management tasks.
|
||||
|
||||
- **Access to the DNS settings of your domain**: This is for configuring the TXT record and NS record.
|
||||
|
||||
## Add your domain
|
||||
|
||||
When you have everything ready, take the steps below to add your domain in Olares Space.
|
||||
|
||||
1. In the Olares Space console, navigate to **Domain** > **Domain Name Setup**, and enter your custom domain as instructed.
|
||||
|
||||

|
||||
|
||||
2. Add a TXT record for your domain to confirm your domain ownership. The system will verify your configuration. Once verified, the domain setup status will update automatically to **Await NS Record for Your Domain**.
|
||||
|
||||

|
||||
|
||||
3. Add NS records to allow Olares Space to configure DNS for your domain.
|
||||
|
||||

|
||||
|
||||
The system will verify your configuration. Once verified, the domain status will update to **Awaiting the application for the domain's Verifiable Credential**.
|
||||
:::tip Note
|
||||
Once verification is successful, do not modify the NS record. Doing so will cause the custom domain resolution to fail, making it inaccessible.
|
||||
:::
|
||||
|
||||

|
||||
|
||||
4. Launch your LarePass app, and navigate to **Organization Olares ID** > **Create an Organization**. You should see your domain listed.
|
||||
|
||||
5. Click on the domain name to store the domain name on blockchain. When it's done, the domain setup status should change to **Awaiting rule configuration** on Olares Space.
|
||||
|
||||
So far you have successfully associated your domain with your DID. You can now continue to [set the email invitation rule](manage-domain.md#set-email-invitation-rules) and create an organization Olares ID using the domain.
|
||||
|
||||
## Create an Org Olares ID
|
||||
|
||||
Now that your organization has a verified domain name, you or other members you invite can create an Olares ID using this domain.
|
||||
|
||||

|
||||
|
||||
1. In the LarePass app, navigate to **Organization Olares ID** > **Join an existing organization**.
|
||||
2. Enter your organization's domain name and click **Continue**. Recheck whether your domain name has been verified and configured if an error occurs.
|
||||
3. Bind the VC via your email accounts. Currently, only Gmail and Google Workspace email are supported.
|
||||
|
||||
Upon completion, you will receive an Organization Olares ID. Now you can go ahead to [Activate Olares](../get-started/activate-olares).
|
||||
|
||||
## Domain status and processing
|
||||
|
||||
After submitting a domain name, several steps are necessary to validate the entered domain.
|
||||
|
||||
The table below explains different domain statuses and the corresponding actions required:
|
||||
|
||||
| Status | Action Required |
|
||||
|-----------------------------------------------------------------|---------------------------------------------------------------|
|
||||
| Awaiting TXT record configuration | Add a TXT record |
|
||||
| Awaiting NS record configuration | Add NS records |
|
||||
| Awaiting the application for the domain's Verifiable Credential | Complete blockchain domain application on mobile |
|
||||
| Awaiting submission of the domain's Verifiable Presentation | Complete blockchain domain application on mobile |
|
||||
| Awaiting rule configuration | Set up email invitation rules for organization members |
|
||||
| Binding | Wait for binding with Olares, you can access the details page |
|
||||
| Allocated | Bound to Olares, you can access the details page |
|
||||
23
docs/manual/space/index.md
Normal file
23
docs/manual/space/index.md
Normal file
@@ -0,0 +1,23 @@
|
||||
---
|
||||
description: Discover Olares Space platform for managed cloud hosting of Olares instances. Explore infrastructure services, host services, account management, and billing features for efficient cloud deployment.
|
||||
---
|
||||
# Olares Space overview
|
||||
|
||||
Olares Space is the fully managed offering of Olares on public clouds. It provides two categories of services:
|
||||
|
||||
- **Infrastructure service** – Manages data backup, custom domain configuration, reverse proxy, and shared GPU resources.
|
||||
- **Host service** – Hosts and manage Olares instances on public cloud platforms.
|
||||
|
||||
Olares Space account is associated with your Olares IDs or DIDs. You can log in to Olares Space by scanning QR code using LarePass.
|
||||
|
||||
This section walks you through usages of Olares Space, covering:
|
||||
|
||||
- [Log in to/off Olares Space](manage-accounts.md)
|
||||
- [Host Olares](create-olares.md)
|
||||
- [Manage Olares](manage-olares.md)
|
||||
- [Host custom domains](host-domain.md)
|
||||
- [Manage organization domains](manage-domain.md)
|
||||
- [Back up & Restore Olares](backup-restore.md)
|
||||
- [Usage and Billing](billing.md)
|
||||
|
||||
|
||||
51
docs/manual/space/manage-accounts.md
Normal file
51
docs/manual/space/manage-accounts.md
Normal file
@@ -0,0 +1,51 @@
|
||||
---
|
||||
description: Learn how to access and manage Olares Space accounts using LarePass authentication.
|
||||
---
|
||||
:::warning Documentation does not match current experience
|
||||
We are currently updating this documentation to match the latest experience on the Olares Space platform. If there are differences, follow the actual platform.
|
||||
:::
|
||||
# Manage accounts in Olares Space
|
||||
|
||||
This guide walks you through common account operations with Olares Space, including logging in, managing multiple accounts, and logging out.
|
||||
|
||||
## Log in to Olares Space
|
||||
|
||||
Olares Space uses a decentralized ID (DID) or Olares ID for authentication. Make sure you already have obtained your credentials on your LarePass.
|
||||
|
||||
1. In the LarePass app, select the DID or Olares ID you wish to use to log in.
|
||||
2. Open https://space.olares.com/ in your browser.
|
||||
3. Scan the QR code using LarePass.
|
||||
|
||||
:::info
|
||||
The features and services available on Olares Space vary depending on whether you use a DID or Olares ID for login.
|
||||
- **Logging in with a DID** allows you to set your own domain since no domain is associated to the account. However, you must bind the DID to an Olares ID before you can activate an Olares device.
|
||||
- **Logging in with an Olares ID** enables you to create an Olares, provided the name isn't already linked to another Olares device. However, you cannot use your custom domain since your Olares ID already corresponds to a unique domain.
|
||||
:::
|
||||
|
||||
|
||||
## Log out
|
||||
|
||||
To log out of your account:
|
||||
|
||||
1. Click your avatar in the top-right corner.
|
||||
2. Select **Log Out**.
|
||||
|
||||
Alternatively, you can:
|
||||
|
||||
1. Choose **Switch Account** from the menu.
|
||||
2. Click <i class="material-symbols-outlined">logout</i> next to any listed account.
|
||||
|
||||
|
||||
## Manage multiple accounts
|
||||
|
||||
Each Olares ID is linked to only one Olares. With multi-account management in Olares Space, you can switch between accounts effortlessly — perfect for managing multiple Olares IDs and instances.
|
||||
|
||||
To add an account:
|
||||
|
||||
1. Click your avatar in the top-right corner.
|
||||
2. In the pop-up menu, select **Import Account**.
|
||||
3. Launch LarePass, and scan the QR code to log in.
|
||||
|
||||
Once you've added multiple accounts, switch between them using the **Switch Account** option in the menu. If the account is logged out, you'll be redirected to the QR code login page.
|
||||
|
||||
|
||||
43
docs/manual/space/manage-domain.md
Normal file
43
docs/manual/space/manage-domain.md
Normal file
@@ -0,0 +1,43 @@
|
||||
---
|
||||
outline: [2, 3]
|
||||
description: Configure domain settings in Olares Space with email invitation rules and member management. Administrate organizational Olares IDs for seamless team collaboration.
|
||||
---
|
||||
:::warning Documentation does not match current experience
|
||||
We are currently updating this documentation to match the latest experience on the Olares Space platform. If there are differences, follow the actual platform.
|
||||
:::
|
||||
# Manage your domain
|
||||
|
||||
You must [add a domain](host-domain.md#add-your-domain) before managing it. Once your domain is set up, you can configure email invitation rules for organization members and invite them to create their own organizational **Olares ID** via email.
|
||||
|
||||
## Set email invitation rules
|
||||
|
||||
Most companies use a standard domain suffix for their team members' emails, like `A@myteam.com` for person A or `B@myteam.com` for person B. However, sometimes, team members might use emails in different domains. To accommodate these scenarios, Olares provides two types of rules for adding organization members' emails:
|
||||
|
||||

|
||||
|
||||
- **Fixed email suffix**: Use this option when all team members share the same email domain. Enter your organization's domain suffix (example: @company.com). Any email matching this suffix can be associated with your organization's Olares ID.
|
||||
|
||||
- **Specified email address**: Use this option if your organization doesn't have a corporate email suffix. You need to manually add the email address for each member of the organization.
|
||||
|
||||
:::info
|
||||
- Currently, only Gmail is supported for both rule types.
|
||||
- Emails that have been used to create organizational Olares IDs will appear in the member list and cannot be deleted.
|
||||
- Emails that are manually added and have not been used to create the Olares ID appear as "unbound" and can be removed.
|
||||
:::
|
||||
|
||||
## Manage members
|
||||
|
||||
After setting email rules, you can add or remove members under your organization.
|
||||
|
||||

|
||||
|
||||
### Add a member
|
||||
|
||||
To add a member:
|
||||
|
||||
1. On the domain management page, add members to the organization by entering their email address.
|
||||
2. Notify the corresponding users to use their email addresses to [create an organizational Olares ID](host-domain.md#create-an-org-olares-id).
|
||||
|
||||
### Remove a member
|
||||
|
||||
You can remove email addresses that haven't been used to create an Olares ID. Once an email address is associated with an organization's Olares ID, it cannot be removed.
|
||||
54
docs/manual/space/manage-olares.md
Normal file
54
docs/manual/space/manage-olares.md
Normal file
@@ -0,0 +1,54 @@
|
||||
---
|
||||
outline: [2, 3]
|
||||
description: Control your Olares instances through system monitoring, worker node management, and shared GPU solutions. Track storage usage, traffic consumption and maintain instance health.
|
||||
---
|
||||
:::warning Documentation does not match current experience
|
||||
We are currently updating this documentation to match the latest experience on the Olares Space platform. If there are differences, follow the actual platform.
|
||||
:::
|
||||
# Manage Olares
|
||||
|
||||
This page covers Olares management tasks in Olares Space, including monitoring system data, adding worker nodes, and managing cloud services.
|
||||
|
||||
## View system status
|
||||
|
||||
You can monitor the system status of Olares through **Olares Space**:
|
||||
|
||||
1. In your LarePass app, go to **Settings** > **Integration**.
|
||||
2. Click <i class="material-symbols-outlined">add</i> in the top right corner and link your Olares Space account to the Olares device. This authorizes Olares Space's access to your system data.
|
||||
3. Log into [**Olares Space**](https://space.olares.com/).
|
||||
4. On the **Olares** page, view **Storage usage** and **Traffic consumption** in the system panel.
|
||||
|
||||

|
||||
|
||||
:::info
|
||||
For self-hosted Olares users, it's important to monitor **Traffic statistics** for intranet penetration services, and **Storage usage** for backup services. These services may incur charges based on usage.
|
||||
:::
|
||||
|
||||
## Add worker nodes
|
||||
|
||||
For cloud Olares users, you can improve performance by adding worker nodes:
|
||||
|
||||
1. Click <i class="material-symbols-outlined">more_horiz</i> in the upper right corner, and select **Add Worker**.
|
||||
2. On the guide page, choose your preferred hardware configuration.
|
||||
3. Review the fees for storage and traffic.
|
||||
4. Confirm your order and submit.
|
||||
|
||||
## Return Olares
|
||||
|
||||
If you no longer need your Olares service, you can return the instance by following these steps:
|
||||
|
||||
1. Click <i class="material-symbols-outlined">more_horiz</i> in the upper right corner.
|
||||
2. Select **Destroy Olares**.
|
||||
3. Confirm the action and settle your usage:
|
||||
- If you are eligible for a refund, the amount will be credited back to your account balance.
|
||||
- If additional payment is required, please confirm and settle the payment.
|
||||
|
||||
## Shared GPU solution
|
||||
|
||||
Currently, we do not offer cloud instances that include GPUs. However, for users who need GPU capabilities, we provide a shared GPU solution via rCuda. This solution is ideal for applications like Stable Diffusion, costing approximately $0.02 per image.
|
||||
|
||||
:::info
|
||||
For Large Language Models (LLMs), the shared GPU solution is still under development and may require further enhancements.
|
||||
:::
|
||||
|
||||
If you need GPU support, please reach us on [Discord](https://discord.gg/olares).
|
||||
41
docs/one/access-olares-via-local-domain.md
Normal file
41
docs/one/access-olares-via-local-domain.md
Normal file
@@ -0,0 +1,41 @@
|
||||
---
|
||||
outline: [2, 3]
|
||||
description: Learn how to access your Olares services on the same network using the `.local` domain.
|
||||
head:
|
||||
- - meta
|
||||
- name: keywords
|
||||
content: Olares, .local domain, local access
|
||||
---
|
||||
|
||||
# Access Olares via .local domain
|
||||
|
||||
When your computer or phone is on the same local network as Olares One, you can use a `.local` domain to reach your Olares services so traffic stays on your LAN.
|
||||
|
||||
## Prerequisites
|
||||
|
||||
**Hardware**
|
||||
- Olares One is set up and connected to your network.
|
||||
- A client device (computer or phone) on the same network as Olares One.
|
||||
|
||||
**LarePass** (Required for Windows)
|
||||
- The LarePass desktop client is installed on your Windows device.
|
||||
- You have imported your Olares ID on the LarePass desktop client.
|
||||
|
||||
## URL format
|
||||
|
||||
<!--@include: ../reusables/local-domain.md{10,23}-->
|
||||
|
||||
## macOS
|
||||
|
||||
No setup is needed. Use the local URL in your browser (for example, `http://desktop.<username>.olares.local`).
|
||||
|
||||
## Windows
|
||||
|
||||
<!--@include: ../reusables/local-domain.md{26,40}-->
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
<!--@include: ../reusables/local-domain.md{42,75}-->
|
||||
|
||||
## Learn more
|
||||
- [Access Olares services locally](../manual/best-practices/local-access.md): DNS configuration, hosts file, and other local access methods.
|
||||
@@ -21,75 +21,17 @@ While this address works from anywhere, it's recommended to enable the LarePass
|
||||
- A client device (computer or mobile phone) with internet access.
|
||||
|
||||
## Step 1: Download LarePass
|
||||
To use the secure VPN connection, the LarePass client must be installed on the device you are using to access Olares.
|
||||
|
||||
- **Mobile**: Use the LarePass app installed during the Olares ID creation process.
|
||||
- **Desktop**: Download and install the LarePass desktop client.
|
||||
|
||||
1. Visit <AppLinkGlobal />.
|
||||
2. Download the version compatible with your operating system.
|
||||
3. Install the application and log in with your Olares ID.
|
||||
<!--@include: ../reusables/larepass-vpn.md{7,16}-->
|
||||
|
||||
## Step 2: Enable LarePass VPN
|
||||
Once installed, enable the VPN directly on the device.
|
||||
|
||||
:::tip Always enable VPN for remote access
|
||||
Keep LarePass VPN enabled. It automatically prioritizes the fastest available route to ensure you always get the best speed possible without manual switching.
|
||||
:::
|
||||
:::info iOS and macOS setup
|
||||
On iOS or macOS, you may be prompted to add a VPN Configuration to your system settings the first time you enable the feature. Allow this to complete the setup.
|
||||
:::
|
||||
|
||||
<tabs>
|
||||
<template #On-LarePass-mobile-client>
|
||||
|
||||
1. Open the LarePass app and go to **Settings**.
|
||||
2. In the **My Olares** card, toggle on the VPN switch.
|
||||
|
||||

|
||||
</template>
|
||||
<template #On-LarePass-desktop-client>
|
||||
|
||||
1. Open the LarePass app and click your avatar in the top-left corner to open the user menu.
|
||||
2. Toggle on the switch for **VPN connection**.
|
||||
|
||||

|
||||
</template>
|
||||
</tabs>
|
||||
<!--@include: ../reusables/larepass-vpn.md{18,41}-->
|
||||
|
||||
## Step 3: Verify the connection type
|
||||
Once enabled, check the status indicator in LarePass to confirm how you are connected:
|
||||
|
||||
| Status | Description |
|
||||
|:-------------|:---------------------------------------------------------|
|
||||
| **Intranet** | Direct connection via your local LAN IP. Fastest speeds. |
|
||||
| **P2P** | Direct encrypted tunnel between devices. High speed. |
|
||||
| **DERP** | Routed via a secure relay server. Used as a fallback. |
|
||||
<!--@include: ../reusables/larepass-vpn.md{42,49}-->
|
||||
|
||||
## Troubleshooting
|
||||
### Why doesn't LarePass VPN work on my Mac anymore?
|
||||
If the VPN was working previously but has stopped, you might need to reset the system extension.
|
||||
|
||||
:::info
|
||||
Depending on your macOS version, the UI might look slightly different.
|
||||
:::
|
||||
1. Open System Settings, search for "Extension", and select **Login Items & Extensions**.
|
||||
2. Scroll to the **Network Extensions** section and click the info icon (ⓘ) to view loaded extensions.
|
||||
3. Find LarePass, click the three dots (...), and select **Delete Extension**.
|
||||
4. Restart your Mac.
|
||||
5. Open the LarePass desktop client and re-enable the VPN.
|
||||
|
||||
### Why can't I enable LarePass VPN on Windows?
|
||||
Third-party antivirus software may mistakenly flag the LarePass client, blocking the VPN service.
|
||||
|
||||
If prompted by your antivirus when opening LarePass for the first time, allow the application to continue.
|
||||
|
||||
If the VPN still fails to enable:
|
||||
1. Check your antivirus software to see if LarePass was blocked.
|
||||
2. Add the main LarePass executable to the allowlist or exclusions of your antivirus.
|
||||
3. Restart LarePass and try enabling the VPN again.
|
||||
|
||||
## Learn more
|
||||
- [Access Olares locally](../manual/best-practices/local-access.md): Explore detailed instructions for all available local network connection methods.
|
||||
- [Access Olares terminal](access-terminal-ssh.md): Learn how to connect to the host shell using SSH or the Control Hub web terminal.
|
||||
- [Network](../developer/concepts/network.md): Learn about the different entry points in Olares.
|
||||
<!--@include: ../reusables/larepass-vpn.md{50,74}-->
|
||||
@@ -17,14 +17,6 @@ You can connect to the host shell using one of the following methods:
|
||||
- **Control Hub Terminal** is a web-based interface for direct root access. It is recommended for quick tasks.
|
||||
- **Secure Shell (SSH)** is the standard protocol for remote management and complex operations.
|
||||
|
||||
## Before you begin
|
||||
|
||||
- The default username and password for Olares One are both `olares`.
|
||||
:::warning Reset default SSH password
|
||||
Even if you primarily use the Control Hub terminal, you must reset this password immediately in **Settings > My hardware** to secure your device against unauthorized access.
|
||||
:::
|
||||
- SSH access grants powerful control over the system. Ensure you keep your credentials secure.
|
||||
|
||||
## Prerequisites
|
||||
**Hardware**
|
||||
- Your Olares One is set up and connected to a network.
|
||||
@@ -33,9 +25,6 @@ You can connect to the host shell using one of the following methods:
|
||||
**Experience**
|
||||
- Basic familiarity with terminal commands and the command-line interface (CLI).
|
||||
|
||||
**LarePass** (Required for remote access)
|
||||
- The LarePass app is installed on your device. This is required only if you plan to connect via SSH from a remote location outside your local network.
|
||||
|
||||
## Method 1: Access via Control Hub
|
||||
For quick access without configuring SSH clients, you can use the web-based terminal built directly into Control Hub.
|
||||
|
||||
@@ -53,7 +42,7 @@ The Control Hub terminal runs as `root` by default. You do not need to use `sudo
|
||||
|
||||
SSH establishes a secure session over the network, allowing you to use command-line operations for Olares One on your current device.
|
||||
|
||||
### Get IP address of Olares One
|
||||
### Step 1: Get IP address of Olares One
|
||||
To connect via SSH, you first need to find the internal IP address of your Olares One.
|
||||
|
||||
1. Open the LarePass app, and go to **Settings** > **System** to navigate to the **Olares management** page.
|
||||
@@ -67,43 +56,20 @@ You can check the IP using the `ifconfig` command in the Control Hub terminal.
|
||||
|
||||
Look for your active connection, typically named `enp3s0` (wired) or `wlo1` (wireless). The IP address follows `inet`.
|
||||
:::
|
||||
### Connect via SSH (local network)
|
||||
If your computer and the Olares One are on the same Wi-Fi or LAN:
|
||||
|
||||
### Step 2: Check SSH password in Vault
|
||||
|
||||
<!--@include: ./reusables-reset-ssh.md{7,16}-->
|
||||
|
||||
### Step 3: Connect via SSH
|
||||
|
||||
1. Open a terminal on your computer.
|
||||
2. Run the `ssh` command using Olares One's local IP address:
|
||||
```bash
|
||||
ssh <username>@<host_ip_address>
|
||||
# The default username for Olares One is olares.
|
||||
ssh olares@<host_ip_address>
|
||||
```
|
||||
For example:
|
||||
3. Enter the password when prompted.
|
||||
|
||||
```bash
|
||||
ssh olares@192.168.31.155
|
||||
```
|
||||
3. Enter the host password when prompted.
|
||||
|
||||
### Connect via SSH (remote access)
|
||||
If you are away from home, you can use LarePass VPN to bridge the connection securely.
|
||||
|
||||
#### Allow SSH access via VPN
|
||||
For security, SSH access via VPN is disabled by default. You must enable it once.
|
||||
1. On Olares, open the Settings app.
|
||||
2. Navigate to **VPN**.
|
||||
3. Toggle on **Allow SSH via VPN**.
|
||||
|
||||
#### Enable LarePass VPN
|
||||
1. Open the LarePass desktop client on your computer.
|
||||
2. Click your avatar in the top-left corner and toggle on **VPN connection**.
|
||||

|
||||
|
||||
3. Open a terminal on your computer.
|
||||
4. Run the `ssh` command using Olares One's local IP address. LarePass handles the routing automatically.
|
||||
```bash
|
||||
ssh <username>@<host_ip_address>
|
||||
```
|
||||
For example:
|
||||
|
||||
```bash
|
||||
ssh olares@192.168.31.155
|
||||
```
|
||||
5. Enter the host password when prompted.
|
||||
## Reset SSH password
|
||||
<!--@include: ./reusables-reset-ssh.md{19,}-->
|
||||
|
||||
@@ -1,68 +1,84 @@
|
||||
---
|
||||
outline: [2, 3]
|
||||
description: Learn how to create a bootable USB installer for Olares OS using balenaEtcher.
|
||||
description: Reinstall Olares OS on Olares One using a bootable USB drive to restore the device to a clean initial state.
|
||||
head:
|
||||
- - meta
|
||||
- name: keywords
|
||||
content: Olares, Olares One, install Olares, bootable USB, ISO, balenaEtcher
|
||||
content: Olares One, reinstall, Olares OS, bootable USB, installation USB
|
||||
---
|
||||
|
||||
# Create a bootable USB drive <Badge type="tip" text="15 min"/>
|
||||
# Reinstall Olares OS using bootable USB <Badge type="tip" text="15 min"/>
|
||||
|
||||
To reinstall or recover Olares OS on your Olares One, you must create a bootable USB installation drive. This drive allows you to reset the device to its factory state.
|
||||
Reinstalling Olares OS returns your Olares One to a clean initial state. You can do this using the bootable USB drive included with Olares One.
|
||||
|
||||
:::warning Data loss warning
|
||||
This process will erase all data on your USB drive. If you have important files on the drive, back them up before proceeding.
|
||||
:::
|
||||
:::warning Image compatibility
|
||||
Olares One requires a specific system image designed for its hardware. If you install the generic self-hosted ISO, Olares One will fail to boot.
|
||||
:::warning Data loss
|
||||
This will permanently delete all accounts, settings, and data on the device. This action cannot be undone.
|
||||
:::
|
||||
|
||||
## Prerequisites
|
||||
- USB flash drive: A drive with 8 GB or higher capacity.
|
||||
:::info
|
||||
Ensure that your USB drive is empty or backed up. The flashing process re-formats the drive, which means existing data on it will be permanently deleted.
|
||||
:::
|
||||
- Computer: A Windows, macOS, or Linux computer to perform the setup.
|
||||
- Internet connection: Stable network for downloading the image file and related software.
|
||||
**Hardware**<br>
|
||||
- The bootable USB drive that came with Olares One.
|
||||
:::tip Don't have the USB drive?
|
||||
Download the [Olares One ISO](https://cdn.olares.com/one/v1.12.4-amd64.iso), which is device-specific and different from the standard Olares ISO, and flash it to a USB drive (8 GB or larger) using a tool such as [Balena Etcher](https://etcher.balena.io/).
|
||||
:::
|
||||
- A monitor and keyboard connected to Olares One.
|
||||
|
||||
## Step 1. Download Olares image
|
||||
## Step 1: Boot from the USB drive
|
||||
|
||||
Get the official installation file for the Olares operating system.
|
||||
1. Insert the bootable USB drive into Olares One.
|
||||
2. Power on Olares One or restart it if it is already running.
|
||||
3. When the Olares logo appears, immediately press the **Delete** key repeatedly to enter **BIOS setup**.
|
||||

|
||||
|
||||
1. Click [Download Olares ISO](https://cdn.olares.com/one/olares.iso).
|
||||
2. The latest image file `olares.iso` is automatically downloaded to your computer.
|
||||
4. Navigate to the **Boot** tab, set **Boot Option #1** to the USB drive, and then press **Enter**.
|
||||

|
||||
|
||||
## Step 2. Install flashing tool
|
||||
5. Press **F10**, then select **Yes** to save and exit.
|
||||

|
||||
|
||||
It is recommended to use balenaEtcher for this task because it is free, easy to use, and works on all major operating systems.
|
||||
|
||||
1. Go to the [balenaEtcher website](https://etcher.balena.io/).
|
||||
2. Download and install the version appropriate for your computer (Windows, macOS, or Linux).
|
||||
Olares One will restart and boot into the Olares installer interface.
|
||||
|
||||
## Step 3. Flash the drive
|
||||
## Step 2: Install Olares to disk
|
||||
|
||||
Use balenaEtcher to turn your USB stick into a bootable installer.
|
||||
1. From the installer interface, select **Install Olares to Hard Disk** and press **Enter**.
|
||||

|
||||
|
||||
1. Insert your USB flash drive into the computer.
|
||||
2. Open balenaEtcher.
|
||||
3. Follow the steps on the screen:
|
||||
2. When prompted for the installation target, the installer shows a list of available disks. Type `/dev/` followed by the disk name (e.g. `nvme0n1`) from that list and press **Enter**.
|
||||

|
||||
|
||||
a. Click **Flash from file** and select the Olares ISO file you downloaded.
|
||||
For example, to install to `nvme0n1`, enter:
|
||||
```bash
|
||||
/dev/nvme0n1
|
||||
```
|
||||
|
||||
b. Click **Select target** and select your USB drive.
|
||||
3. When you see prompts about NVIDIA GPU drivers, press **Enter** to accept the default.
|
||||

|
||||
|
||||
c. Click **Flash!** to start writing the installer to the USB drive.
|
||||
4. When you see the message below, the reinstallation is complete:
|
||||
```bash
|
||||
Installation completed successfully!
|
||||
```
|
||||
|
||||

|
||||
5. Remove the USB drive, then press **Ctrl + Alt + Delete** to restart.
|
||||
|
||||
4. When the flashing process is completed, the USB drive is ready to use, and you can safely eject it.
|
||||
## Step 3: Verify the installation
|
||||
|
||||
## Next steps
|
||||
After the reboot, the system starts in a clean factory state and shows a text-based Ubuntu login prompt.
|
||||
|
||||
You can now insert the bootable USB drive into Olares One or other target hardware to begin the installation.
|
||||
1. Log in with the default credentials:
|
||||
- **Username**: `olares`
|
||||
- **Password**: `olares`
|
||||

|
||||
|
||||
## Resources
|
||||
2. (Optional) Run the following command to verify the installation:
|
||||
```bash
|
||||
sudo olares-check
|
||||
```
|
||||
Example output:
|
||||

|
||||
|
||||
- [Install Olares via ISO](../manual/get-started/install-linux-iso.md)
|
||||
- [Install Olares](../manual/get-started/install-olares.md)
|
||||
- [Installation FAQs](../manual/help/installation.md)
|
||||
|
||||
## Step 4: Complete activation via LarePass
|
||||
|
||||
You can then activate Olares One again via LarePass. For detailed instructions, see [First boot](first-boot.md).
|
||||
@@ -21,15 +21,16 @@ This dual-drive configuration physically isolates the systems. This ensures Olar
|
||||
|
||||
## Step 1: Boot into BIOS
|
||||
1. Insert the Windows USB boot drive into a USB port on Olares One.
|
||||
2. Power on Olares One or restart if it is already running.
|
||||
3. Immediately press and hold the **Delete** key repeatedly until the BIOS setup screen appears.
|
||||
2. Power on Olares One or restart it if it is already running.
|
||||
3. When the Olares logo appears, immediately press the **Delete** key repeatedly to enter **BIOS setup**.
|
||||

|
||||
|
||||
## Step 2: Boot from USB
|
||||
|
||||
1. Navigate to the **Boot** tab using the arrow keys on your keyboard.
|
||||
2. Locate **Boot Option #1** or **Boot Override** and select your USB flash drive.
|
||||
3. Press **Enter** to boot from the USB drive immediately.
|
||||
4. The system will restart and load the Windows installation interface.
|
||||
2. Set **Boot Option #1** to your Windows USB flash drive, and press **Enter**.
|
||||
3. Press **F10**, then select **Yes** to save and exit BIOS.
|
||||
4. The system restarts and boots from the USB drive into the Windows installation interface.
|
||||
|
||||
## Step 3: Install Windows
|
||||
1. Follow the on-screen prompts to begin the Windows installation.
|
||||
@@ -49,16 +50,16 @@ Because the operating systems are on separate physical drives, you switch betwee
|
||||
|
||||
### Switch to Olares OS
|
||||
1. Restart Olares One.
|
||||
2. Press **Delete** repeatedly to enter BIOS.
|
||||
2. Press the **Delete** key repeatedly to enter **BIOS setup**.
|
||||
3. Go to the **Boot** tab.
|
||||
4. Set **Boot Option #1** to the SSD containing Olares OS.
|
||||
5. Press **F4** to confirm.
|
||||
5. Press **F10** to save and exit BIOS.
|
||||
|
||||
### Switch to Windows
|
||||
1. Restart Olares One.
|
||||
2. Press **Delete** repeatedly to enter BIOS.
|
||||
2. Press the **Delete** key repeatedly to enter **BIOS setup**.
|
||||
3. Set **Boot Option #1** to the secondary SSD containing Windows.
|
||||
4. Press **F4** to confirm.
|
||||
4. Press **F10** to save and exit BIOS.
|
||||
|
||||
## Resources
|
||||
- [Install NVIDIA drivers on Windows](install-nvidia-driver.md)
|
||||
|
||||
@@ -34,11 +34,13 @@ Partitioning a drive carries a risk of data loss. If you have important data on
|
||||
|
||||
## Step 1: Install Windows
|
||||
1. Insert the Windows USB boot drive into a USB port on Olares One.
|
||||
2. Power on Olares One or restart if it is already running.
|
||||
3. Immediately press and hold the **Delete** key repeatedly until the BIOS setup screen appears.
|
||||
2. Power on Olares One or restart it if it is already running.
|
||||
3. When the Olares logo appears, immediately press the **Delete** key repeatedly to enter **BIOS setup**.
|
||||

|
||||
|
||||
4. Navigate to the **Boot** tab using the arrow keys on your keyboard.
|
||||
5. Locate **Boot Option #1** or **Boot Override** and select your USB flash drive.
|
||||
6. Press **Enter** to boot from the USB drive immediately.
|
||||
5. Set **Boot Option #1** to your Windows USB flash drive, and press **Enter**.
|
||||
6. Press **F10**, then select **Yes** to save and exit BIOS. The system restarts and boots from the USB drive into the Windows installation interface.
|
||||
7. Follow the on-screen prompts to begin the Windows installation.
|
||||
8. When the installation finishes and the system restarts, unplug the Windows USB drive.
|
||||
|
||||
@@ -59,13 +61,14 @@ The system will boot into Windows automatically.
|
||||
Olares OS runs on top of a Linux kernel. You will install Ubuntu to serve as the host system.
|
||||
|
||||
1. Insert the Ubuntu USB drive and restart Olares One.
|
||||
2. Press **Delete** repeatedly to enter BIOS, then select the USB drive as the boot device.
|
||||
3. Follow the installer prompts until you reach the **Installation type** screen.
|
||||
4. Select **Install Ubuntu alongside Windows Boot Manager**.
|
||||
2. When the Olares logo appears, press the **Delete** key repeatedly to enter **BIOS setup**.
|
||||
3. Navigate to the **Boot** tab, set **Boot Option #1** to your Ubuntu USB flash drive, and then press **Enter**.
|
||||
4. Press **F10**, then select **Yes** to save and exit BIOS. The system restarts and boots from the USB drive into the Ubuntu installer.
|
||||
5. Follow the installer prompts until you reach the **Installation type** screen.
|
||||
:::tip
|
||||
If this option does not appear, select the manual installation option to manually assign the unallocated space to Ubuntu.
|
||||
:::
|
||||
5. When the installation finishes and the system restarts, unplug the Ubuntu USB drive.
|
||||
6. When the installation finishes and the system restarts, unplug the Ubuntu USB drive.
|
||||
|
||||
The system will boot into Ubuntu automatically.
|
||||
|
||||
@@ -120,17 +123,17 @@ After setup is complete, the LarePass app returns to the home screen, and the br
|
||||
You switch between Windows and Olares using the BIOS boot priority.
|
||||
### Switch to Olares OS
|
||||
1. Restart Olares One.
|
||||
2. Press **Delete** repeatedly to enter BIOS.
|
||||
2. Press the **Delete** key repeatedly to enter **BIOS setup**.
|
||||
3. Go to the **Boot** tab.
|
||||
4. Set **Boot Override** to Ubuntu.
|
||||
5. Press **F4** to confirm.
|
||||
5. Press **F10** to save and exit BIOS.
|
||||
|
||||
### Switch to Windows
|
||||
1. Restart Olares One.
|
||||
2. Press **Delete** repeatedly to enter BIOS.
|
||||
2. Press the **Delete** key repeatedly to enter **BIOS setup**.
|
||||
3. Go to the **Boot** tab.
|
||||
4. Set **Boot Override** to Windows.
|
||||
5. Press **F4** to confirm.
|
||||
5. Press **F10** to save and exit BIOS.
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
|
||||
39
docs/one/factory-reset-in-bios.md
Normal file
39
docs/one/factory-reset-in-bios.md
Normal file
@@ -0,0 +1,39 @@
|
||||
---
|
||||
outline: [2, 3]
|
||||
description: Learn how to restore BIOS defaults on Olares One to return the device to its initial setup state.
|
||||
head:
|
||||
- - meta
|
||||
- name: keywords
|
||||
content: Olares One, BIOS defaults, restore, BIOS setup
|
||||
---
|
||||
# Restore BIOS defaults <Badge type="tip" text="10 min" />
|
||||
|
||||
Restoring BIOS defaults resets the firmware configuration and returns your Olares One to its initial setup state. If you have a monitor and keyboard connected, you can perform this directly in BIOS.
|
||||
|
||||
:::warning Data loss
|
||||
This will permanently delete all accounts, settings, and data on the device. This action cannot be undone.
|
||||
:::
|
||||
|
||||
## Prerequisites
|
||||
**Hardware**<br>
|
||||
- A wired keyboard connected to your Olares One.
|
||||
- A monitor connected to your Olares One.
|
||||
|
||||
## Step 1: Load optimized defaults in BIOS
|
||||
|
||||
1. Power on Olares One or restart it if it is already running.
|
||||
2. When the Olares logo appears, immediately press the **Delete** key repeatedly to enter **BIOS setup**.
|
||||

|
||||
|
||||
3. Press **F9**, then select **Yes** to restore factory settings.
|
||||

|
||||
|
||||
4. Press **F10**, then select **Yes** to save and exit. The device restarts automatically.
|
||||

|
||||
|
||||
Once finished, Olares One reboots into the initial setup phase.
|
||||
|
||||
## Step 2: Complete activation via LarePass
|
||||
|
||||
You can then activate Olares One again via LarePass. For detailed instructions, see [First boot](first-boot.md).
|
||||
|
||||
@@ -1,28 +1,22 @@
|
||||
---
|
||||
outline: [2, 3]
|
||||
description: Learn how to restore your Olares One to factory settings using LarePass.
|
||||
description: Learn how to factory reset your Olares One using LarePass.
|
||||
head:
|
||||
- - meta
|
||||
- name: keywords
|
||||
content: Factory reset, Olares One
|
||||
content: factory reset, Olares One, LarePass
|
||||
---
|
||||
# Reset to factory settings <Badge type="tip" text="10 min" />
|
||||
# Factory reset via LarePass <Badge type="tip" text="10 min" />
|
||||
|
||||
Resetting to factory settings returns your Olares One to the initial setup state.
|
||||
If you have already activated Olares One and want to return it to the factory state, you can perform a reset in LarePass.
|
||||
|
||||
:::warning Data loss
|
||||
This will permanently delete all accounts, settings, and data on the device. This action cannot be undone.
|
||||
:::
|
||||
|
||||
## Learning objectives
|
||||
|
||||
By the end of this tutorial, you will learn how to:
|
||||
- Perform a factory reset from LarePass.
|
||||
- Complete the required confirmation and local password verification.
|
||||
|
||||
## Prerequisites
|
||||
|
||||
Before starting, ensure that:
|
||||
**Hardware**<br>
|
||||
- Olares One is powered on.
|
||||
- Your phone and Olares One are on the same network.
|
||||
- You are signed in to LarePass as an administrator.
|
||||
@@ -30,15 +24,17 @@ Before starting, ensure that:
|
||||
## Reset Olares One to factory settings
|
||||
|
||||
1. Open LarePass on your phone and go to **Settings**.
|
||||
2. In the **My Olares** card, tap **System** to enter the **Olares management** page.
|
||||
2. In the **My Olares** card, tap **System** to open the **Olares management** page.
|
||||
3. Tap **Restore to factory settings**.
|
||||
4. Review the risk prompt, then tap **Restore to factory settings** to continue.
|
||||
4. Review the risk prompt carefully, then tap **Restore to factory settings** to continue.
|
||||

|
||||
|
||||
5. Enter your local LarePass lock screen password and tap **Confirm**.
|
||||
5. Enter your local LarePass lock-screen password and tap **Confirm**.
|
||||

|
||||
|
||||
If you have not set a local password, you will be prompted to set one first.
|
||||
6. Wait for the reset process to complete.
|
||||
|
||||
Once finished, Olares One reboots into the initial setup phase. You will be redirected to the activation flow, where you can scan the local network to reinstall or reactivate Olares.
|
||||
Once finished, Olares One reboots into the initial setup phase. You are redirected to the activation flow, where you can scan the local network to reactivate Olares.
|
||||
|
||||
For detailed instructions, see [First boot](first-boot.md).
|
||||
@@ -89,21 +89,17 @@ Your Olares ID is secured by a unique 12-word mnemonic phrase. This phrase is th
|
||||
4. Enter the local password as prompted.
|
||||
5. Write the 12 words onto the **Recovery Sheet**, and then store the sheet in a secure, offline location.
|
||||
|
||||
### Reset SSH password
|
||||
|
||||
<!--@include: ./reusables-reset-ssh.md{7,16}-->
|
||||
|
||||
For instructions on how to SSH into Olares One, see [Connect to Olares One via SSH](access-terminal-ssh.md).
|
||||
|
||||
### Access Olares services securely
|
||||
For secure remote access without complex network configuration, it is recommended to enable the LarePass VPN.
|
||||
|
||||
See [Access Olares services securely using LarePass VPN](access-olares-via-vpn.md).
|
||||
|
||||
### Reset SSH password
|
||||
If you plan to connect to your Olares One via terminal (SSH), you must update the default SSH password.
|
||||
|
||||
1. Open Olares Settings, on the **My hardware** page, click **Reset SSH password**.
|
||||
2. In the dialog, enter a new SSH password that meets all strength requirements, then click **OK**.
|
||||
3. Open the LarePass app and scan the QR code shown on the screen.
|
||||
4. Click **Confirm** on LarePass to finish.
|
||||
|
||||
For details, see [Connect to Olares One via SSH](access-terminal-ssh.md).
|
||||
|
||||
### Explore
|
||||
Olares OS comes with pre-installed system apps. You can also browse the **Market** to download additional applications that best suit your needs.
|
||||
|
||||
|
||||
@@ -1,44 +1,78 @@
|
||||
---
|
||||
outline: [2, 3]
|
||||
description: Learn how to identify your NVIDIA GPU model and install the correct driver for optimal Windows performance.
|
||||
description: Learn how to download and use the all-in-one driver package provided by Olares to install all necessary Windows drivers, including the NVIDIA graphics driver.
|
||||
head:
|
||||
- - meta
|
||||
- name: keywords
|
||||
content: Olares, Olares One, NVIDIA drivers, GPU, graphics card,Windows
|
||||
content: Olares, Olares One, Windows drivers, NVIDIA graphics driver, GPU
|
||||
---
|
||||
|
||||
# Install NVIDIA drivers on Windows <Badge type="tip" text="10 min"/>
|
||||
# Install drivers on Windows <Badge type="tip" text="15 min"/>
|
||||
|
||||
Installing the official drivers ensures the best graphics performance and stability when running Windows in your dual-boot setup.
|
||||
To ensure optimal performance and system stability when running Windows on your Olares One, Olares provides a tested all-in-one driver package. This package contains all the necessary drivers for your device, such as audio, network, and NVIDIA graphics drivers.
|
||||
|
||||
This guide walks you through identifying your specific graphics card model and installing the correct driver.
|
||||
This guide walks you through downloading and installing the all-in-one driver package.
|
||||
|
||||
## Learning objectives
|
||||
|
||||
- Identify the model of your NVIDIA graphics card.
|
||||
- Download the correct driver from the official NVIDIA website.
|
||||
- Install the graphics driver.
|
||||
- Download and install all system drivers using the driver package.
|
||||
|
||||
## Before you begin
|
||||
|
||||
- Connect to internet: The driver file is large (often 500 MB+), so a stable connection is required.
|
||||
- Close applications: Save your work and close any graphic-intensive programs like games or photo editors before starting the installation. The screen might temporarily turn black or blink during the update, which can cause open applications to crash or lose unsaved data.
|
||||
:::info About NVIDIA graphics driver update
|
||||
This all-in-one package includes a stable, fully tested NVIDIA graphics driver specifically optimized for Olares One. To ensure system stability, avoid downloading and installing standalone graphics drivers directly from the official NVIDIA website, because that might introduce compatibility issues.
|
||||
:::
|
||||
|
||||
## Prerequisites
|
||||
- **Administrator access**: You need admin rights to install system drivers.
|
||||
- **Internet connection**: The driver file is large (about 3.5 GB), so a stable connection is required.
|
||||
- **Close applications**: Save your work and close any graphic-intensive programs like games or photo editors before starting the installation. The screen might temporarily turn black or blink during the update, which can cause open applications to crash or lose unsaved data.
|
||||
- **Windows version**: For the best stability and driver compatibility, Windows 11 version 24H2 is recommended.
|
||||
|
||||
- Administrator access: You need admin rights to install system drivers.
|
||||
- Windows OS: You must be currently booted into the Windows operating system.
|
||||
## Step 1: Download and extract the driver package
|
||||
|
||||
## Step 1: Identify your graphics card model
|
||||
1. Download the [driver package](http://cdn.olares.com/common/AGBOX_B1_DVT_driver251125.zip).
|
||||
|
||||
Before downloading a driver, you need to know exactly which graphics card model you have. Olares One features an NVIDIA-based graphics card, so you can identify the model directly in the device settings.
|
||||
:::tip Browser security warning
|
||||
Because the download links use a standard HTTP connection rather than HTTPS, your web browser might flag or block it as an insecure download. If this happens, select **Keep** or **Allow** in your browser's download manager to continue the download.
|
||||
:::
|
||||
|
||||
1. Open Olares Settings.
|
||||
2. Click **GPU** and you can find the specific model name "GeForce RTX 5090".
|
||||
:::info Download time
|
||||
The driver package is large. Depending on your internet connection speed, the download might take a while to complete.
|
||||
:::
|
||||
|
||||
{width=70%}
|
||||
2. Locate the downloaded `.zip` file on your computer.
|
||||
3. Right-click the file and select **Extract All**.
|
||||
4. Open the extracted folder and verify that the files, including the `driver_install` application, are present.
|
||||
|
||||
## Step 2: Download the driver
|
||||
```text
|
||||
Extracted_Folder/
|
||||
├── driver/
|
||||
├── uwp/
|
||||
├── driver_install
|
||||
└── uwp_install
|
||||
```
|
||||
|
||||
## Step 2: Install the drivers
|
||||
|
||||
1. In the extracted folder, locate the file `driver_install`, and then double-click it.
|
||||
2. The system will automatically open a command prompt window and begin installing the driver. This process is fully automated.
|
||||
|
||||

|
||||
|
||||
:::tip Screen flickering
|
||||
Your screen might turn black or blink for a few seconds during installation. This is normal behavior as the system switches to the new driver.
|
||||
:::
|
||||
|
||||
3. When the driver is successfully installed, your device restarts automatically.
|
||||
4. After the system reboots and you log back in to Windows, a command prompt window appears. Follow the on-screen instructions and press any key until the window closes. This indicates that the installation is completely finished.
|
||||
|
||||

|
||||
|
||||
<!--## (Optional) Install the NVIDIA graphics driver
|
||||
|
||||
If you need the latest features, bug fixes, or specific optimizations, you can download and install the newest official graphics driver directly from NVIDIA.
|
||||
|
||||
### Step 1: Download the driver
|
||||
|
||||
1. Go to the official [NVIDIA Drivers Download](https://www.nvidia.com/en-us/drivers/) page.
|
||||
|
||||
@@ -67,7 +101,7 @@ Before downloading a driver, you need to know exactly which graphics card model
|
||||
|
||||

|
||||
|
||||
## Step 3: Install the driver
|
||||
### Step 2: Install the driver
|
||||
|
||||
1. Double-click the downloaded `.exe` file to start the installer.
|
||||
|
||||
@@ -101,13 +135,4 @@ Before downloading a driver, you need to know exactly which graphics card model
|
||||
|
||||
{width=65%}
|
||||
|
||||
6. Restart your computer to complete the setup.
|
||||
|
||||
## Next steps
|
||||
|
||||
Now your Windows environment is ready, you can proceed to configure your system for the Olares installation.
|
||||
|
||||
## Resources
|
||||
|
||||
- [Install Olares](../manual/get-started/install-olares.md)
|
||||
- [Olares installation and activation FAQs](../manual/help/installation.md)
|
||||
6. Restart Windows to complete the setup.-->
|
||||
|
||||
27
docs/one/reusables-reset-ssh.md
Normal file
27
docs/one/reusables-reset-ssh.md
Normal file
@@ -0,0 +1,27 @@
|
||||
---
|
||||
search: false
|
||||
---
|
||||
## Reset SSH password
|
||||
|
||||
### Reset upon activation
|
||||
Right after you activate Olares, you will be prompted to reset the SSH password on the LarePass app. The password is automatically generated and saved to your Vault.
|
||||
|
||||
To view the saved password in Vault:
|
||||
|
||||
1. Tap **Vault** in the LarePass app. When prompted, enter your local password to unlock.
|
||||
2. In the top-left corner, tap **Authenticator** to open the side navigation, then tap **All vaults** to display all saved items.
|
||||

|
||||
|
||||
3. Find the item with the <span class="material-symbols-outlined">terminal</span> icon and tap it to reveal the password.
|
||||

|
||||
|
||||
### Reset in Olares Settings
|
||||
If you prefer to use an SSH password instead of the automatically generated one, you can manually reset the password in Settings.
|
||||
|
||||
1. Open Settings. On the **My Olares** page, select **My hardware**.
|
||||
2. Select **Reset SSH login password** at the bottom.
|
||||
{width=70%}
|
||||
|
||||
3. In the dialog, enter a new SSH password that meets all strength requirements, then click **OK**.
|
||||
4. Open the LarePass app and scan the QR code shown on the screen.
|
||||
5. Click **Confirm** on LarePass to finish.
|
||||
@@ -14,7 +14,7 @@ Equipped by an NVDIA 5090 mobile GPU, with the Steam Headless app, Olares One tr
|
||||
## Learning objectives
|
||||
- Set up Steam Headless on your Olares One.
|
||||
- Configure the Sunshine streaming service.
|
||||
- Pair your device via Moonlight and stream games locally or remotely.
|
||||
- Pair your Olares One via Moonlight and stream games locally or remotely.
|
||||
|
||||
## Prerequisites
|
||||
**Hardware** <br>
|
||||
@@ -61,16 +61,22 @@ If Steam installation or update fails due to network issues, go to the top-left
|
||||
## Step 3: Pair Sunshine with Moonlight
|
||||
Steam Headless uses Sunshine to stream video. You must pair it with the Moonlight app on your playing device.
|
||||
|
||||
### 1. Access the Sunshine console
|
||||
### Access the Sunshine console
|
||||
|
||||
You need to access the Sunshine Web UI running on your Olares One to enter a pairing PIN.
|
||||
|
||||
1. Copy the URL of your current Steam Headless browser tab.
|
||||
2. Open a new browser tab and modify the URL to access port `47990`. The address varies depending on your network.
|
||||
- **Same network**: Use `http` and your `.local` address. For example:
|
||||
- **Same network**: Use HTTPS with your `.local` address. Either
|
||||
format works (dots or hyphens in the hostname):
|
||||
|
||||
:::info Sunshine and .local
|
||||
Use HTTPS (not HTTP) with your `.local` address for this app.
|
||||
:::
|
||||
|
||||
```plain
|
||||
http://139ebc4f0.<your Olares ID>.olares.local:47990
|
||||
https://139ebc4f0.<your Olares ID>.olares.local:47990
|
||||
https://139ebc4f0-<your Olares ID>-olares.local:47990
|
||||
```
|
||||
|
||||
- **Different network (via VPN)**: Enable LarePass VPN on your device, then append `:47990`. For example:
|
||||
@@ -108,7 +114,7 @@ If it doesn't appear, or if you are connecting over different networks, follow t
|
||||
2. Enter the PIN displayed in Moonlight and give your device a name.
|
||||

|
||||
|
||||
3. Click **Send**.
|
||||
3. Click **Send**.
|
||||
4. Upon success, you will see a confirmation message, and the lock icon in Moonlight will disappear.
|
||||

|
||||
|
||||
@@ -132,6 +138,12 @@ The following steps demonstrate local streaming.
|
||||
|
||||
## FAQs
|
||||
|
||||
### Why can't I access the Sunshine Web UI using the `.local` address?
|
||||
|
||||
For most Olares services, you use HTTP with `.local` addresses. Sunshine is an exception and requires HTTPS to secure local communication. If you use `http://` with your `.local` URL, the Sunshine page will not load.
|
||||
|
||||
Use `https://` in your browser's address bar (for example, `https://139ebc4f0.<your Olares ID>.olares.local:47990`).
|
||||
|
||||
### Why isn't the game displaying in full screen?
|
||||
|
||||
This may be caused by resolution settings. Try adjusting the resolution:
|
||||
@@ -155,7 +167,7 @@ After finishing, exit Steam Big Picture mode to release system resources on Olar
|
||||
|
||||
You can check the downloaded games in the Files app. By default, games are saved in:
|
||||
|
||||
```
|
||||
```plain
|
||||
/Cache/olares/steam-headless/c0/.steam/steam/steamapps/common
|
||||
```
|
||||
|
||||
@@ -185,10 +197,11 @@ To fix it, simply restart Steam Headless in Olares and try pairing again:
|
||||
|
||||
You can change your Sunshine credentials directly from the Sunshine web console.
|
||||
|
||||
1. Open Sunshine in your browser using your local address, for example: `http://139ebc4f0.<your Olares ID>.olares.local:47990`.
|
||||
1. Open Sunshine in your browser using your local address, for example: `https://139ebc4f0.<your Olares ID>.olares.local:47990`.
|
||||
2. Log in with your current username and password.
|
||||
3. Go to the **Change Password** tab.
|
||||

|
||||
|
||||
4. Enter a new password (and username if desired), then click **Save**.
|
||||
|
||||
## Resources
|
||||
|
||||
@@ -59,12 +59,12 @@ If you frequently save videos while browsing, the [LarePass extension](https://w
|
||||
|
||||
When you save a video to the library, Wise creates a record immediately, and the file download runs in the background.
|
||||
|
||||
1. In Wise, click <i class="material-symbols-outlined">settings</i> in the bottom-left menu bar, then select **Transmission**.
|
||||
2. In the Download tab, check the list of 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.
|
||||
1. In Wise, click <i class="material-symbols-outlined">settings</i> in the bottom-left menu bar, then select **Download list**.
|
||||
2. Use the tabs to filter tasks: **All**, **Downloading**, **Completed**, **Failed**.
|
||||
3. Review the task list and status.
|
||||
4. You can:
|
||||
- Click <i class="material-symbols-outlined">folder_open</i> to locate the transferred file in Files.
|
||||
- Click <i class="material-symbols-outlined">do_not_disturb_on</i> to remove it from the list.
|
||||
|
||||
Once the download is complete, you can play the video directly inside Wise even without an internet connection.
|
||||
|
||||
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 51 KiB |
BIN
docs/public/images/manual/help/ts-missing-apps-restart-chart.png
Normal file
BIN
docs/public/images/manual/help/ts-missing-apps-restart-chart.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 170 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 152 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 141 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 121 KiB |
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user