Compare commits
303 Commits
v4.8.23-fi
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
| f22c22a635 | |||
|
|
59b7c608fd | ||
|
|
9fb5d05865 | ||
|
|
b974574157 | ||
|
|
5a5367d30b | ||
|
|
8ed35ffe7e | ||
|
|
0f866fc552 | ||
|
|
05c7ba4483 | ||
|
|
fa80ce3a77 | ||
|
|
830358aa72 | ||
|
|
02b214b3ec | ||
|
|
a171c7b11c | ||
|
|
802de11363 | ||
|
|
b4ecfb0b79 | ||
|
|
331b851a78 | ||
|
|
50d235c42a | ||
|
|
9838593451 | ||
|
|
c25cd48e72 | ||
|
|
874300a56a | ||
|
|
1dea2b71b4 | ||
|
|
a8673344b1 | ||
|
|
9709ae7a4f | ||
|
|
fae76e887a | ||
|
|
9af92d1eae | ||
|
|
6a6719e93d | ||
|
|
50481f4ca8 | ||
|
|
88bd3aaa9e | ||
|
|
dd3c251603 | ||
|
|
aa55f059d4 | ||
|
|
89c9a02650 | ||
|
|
0f3bfa280a | ||
|
|
593ebfd269 | ||
|
|
f6dc2204f5 | ||
|
|
d44c338059 | ||
|
|
1dac2b70ec | ||
|
|
9fef3e15fb | ||
|
|
2d2d0fffe9 | ||
|
|
c6e0b5a1e7 | ||
|
|
932aa28a1f | ||
|
|
9c59bc2c17 | ||
|
|
e145f63554 | ||
|
|
554b2ca8dc | ||
|
|
4e83840c14 | ||
|
|
a6c80684d1 | ||
|
|
a4db03a3b7 | ||
|
|
cba8f773fe | ||
|
|
bd93f28d6f | ||
|
|
2063cb6314 | ||
|
|
12acaf491c | ||
|
|
3688842cc7 | ||
|
|
398d131bac | ||
|
|
d5f188a1a4 | ||
|
|
1edca309c4 | ||
|
|
1470c37ef1 | ||
|
|
bdb1221d94 | ||
|
|
cac4b1d435 | ||
|
|
0ef3d40296 | ||
|
|
3cc6b8a17a | ||
|
|
681ec30c38 | ||
|
|
24cd1c98dc | ||
|
|
eaceabcc43 | ||
|
|
a7f9411dca | ||
|
|
657fa32217 | ||
|
|
12d6948ba7 | ||
|
|
83d54d046d | ||
|
|
c75f154728 | ||
|
|
96e7dd581e | ||
|
|
2d3117c5da | ||
|
|
5361674a2c | ||
|
|
ef537f391c | ||
|
|
367ee517ec | ||
|
|
39cf001358 | ||
|
|
7b9f935119 | ||
|
|
a6fbfac96f | ||
|
|
864eff47c7 | ||
|
|
fdd4e9edbd | ||
|
|
683ab6c17d | ||
|
|
9f21add7b5 | ||
|
|
4b8db293ce | ||
|
|
5e3ec4d6f3 | ||
|
|
360a2ec392 | ||
|
|
b0297d2915 | ||
|
|
5023da4489 | ||
|
|
26e320b0df | ||
|
|
14ad6aef41 | ||
|
|
d2a32c363d | ||
|
|
e0b85ca4c2 | ||
|
|
3a911c5130 | ||
|
|
433e7ed911 | ||
|
|
293c0cdb40 | ||
|
|
ca8adbbf95 | ||
|
|
d91b2ae303 | ||
|
|
3313bf933c | ||
|
|
bf14506603 | ||
|
|
cc01aa4ab8 | ||
|
|
d6fed3d23a | ||
|
|
1d2026786e | ||
|
|
659b8b1106 | ||
|
|
5357aa402b | ||
|
|
9923a402d9 | ||
|
|
6763ac60d5 | ||
|
|
f0a25ff964 | ||
|
|
7d63b6bae8 | ||
|
|
229c8acdb9 | ||
|
|
1465999c46 | ||
|
|
0720bbe4da | ||
|
|
a669a60fe6 | ||
|
|
25dc8984be | ||
|
|
2a54be4d91 | ||
|
|
5c93545016 | ||
|
|
27614e9e8b | ||
|
|
2dd5cf6d1f | ||
|
|
6c61812e7a | ||
|
|
9f8b6dbc5f | ||
|
|
d8fe9806e6 | ||
|
|
9cd6d2e81f | ||
|
|
f789af51f5 | ||
|
|
4edd72b7e6 | ||
|
|
7e19628315 | ||
|
|
4ac2a2f43e | ||
|
|
61aa91b3aa | ||
|
|
d9a4a5f3e7 | ||
|
|
a18d34e40a | ||
|
|
b4aeaf10ae | ||
|
|
d71f4cee19 | ||
|
|
6ed06936a4 | ||
|
|
8d9125b0ee | ||
|
|
8f8d4c4190 | ||
|
|
5208890c7f | ||
|
|
22fc7dddfb | ||
|
|
cdbc1d5590 | ||
|
|
ab059d105c | ||
|
|
ccd1fd680a | ||
|
|
5542eadb2d | ||
|
|
703a7cfd78 | ||
|
|
66405d43e6 | ||
|
|
3196470e11 | ||
|
|
853a75c9bc | ||
|
|
4fad9c6025 | ||
|
|
c2fd5f5f5a | ||
|
|
8fa9ec4c13 | ||
|
|
952412f648 | ||
|
|
ab799e13cd | ||
|
|
ba422b73b3 | ||
|
|
c7c79b400a | ||
|
|
47f674666b | ||
|
|
0c9e56c1ee | ||
|
|
97a6c6749a | ||
|
|
565b3e4319 | ||
|
|
efad4c101f | ||
|
|
bed68718e8 | ||
|
|
7a9cf4ce9e | ||
|
|
b943d05d5a | ||
|
|
2af3cd83f2 | ||
|
|
ea74c669ee | ||
|
|
38597d8f04 | ||
|
|
88ed019717 | ||
|
|
16a22bc76a | ||
|
|
b51a87f5b7 | ||
|
|
bc1ca66b66 | ||
|
|
c9e12bb608 | ||
|
|
4e7fa29087 | ||
|
|
ec3bcfa124 | ||
|
|
199f454b6b | ||
|
|
80f41dd2a9 | ||
|
|
4343eecaaf | ||
|
|
c02864facc | ||
|
|
e4629a5c8c | ||
|
|
2dc3cb75fe | ||
|
|
431390fe42 | ||
|
|
1f5709eda6 | ||
|
|
86988e31d9 | ||
|
|
675e8ccedb | ||
|
|
9dfafb13bf | ||
|
|
f642c9603b | ||
|
|
5839325f77 | ||
|
|
73c997f7c5 | ||
|
|
ff92dced98 | ||
|
|
7a0747947c | ||
|
|
5ad383bc6e | ||
|
|
c85b719384 | ||
|
|
aeedc2fada | ||
|
|
be34b69f9b | ||
|
|
944774ec5f | ||
|
|
5b21b4b674 | ||
|
|
b0f0afabd2 | ||
|
|
d9aea53d13 | ||
|
|
73db92e4ad | ||
|
|
267cc5702c | ||
|
|
540f321fc9 | ||
|
|
a37c75159f | ||
|
|
0ed99d8c9a | ||
|
|
2d3ae7f944 | ||
|
|
565a966d19 | ||
|
|
8323c2d27e | ||
|
|
4f86a0591c | ||
|
|
14895bbcfd | ||
|
|
ccf9f5be2e | ||
|
|
e5b986b4de | ||
|
|
cf119a9f0f | ||
|
|
05b3062204 | ||
|
|
fed04f0b5d | ||
|
|
96aabdf579 | ||
|
|
e9f75c7e66 | ||
|
|
8b29aae238 | ||
|
|
8999dc5b8c | ||
|
|
17b20270e1 | ||
|
|
9d97b60561 | ||
|
|
f483832749 | ||
|
|
0778508908 | ||
|
|
f3a069bc80 | ||
|
|
2ebb2ccc9c | ||
|
|
484b87478c | ||
|
|
a17623d4ea | ||
|
|
dd2f7bdcfd | ||
|
|
4871a6980f | ||
|
|
64fb09146f | ||
|
|
1fdf947a13 | ||
|
|
ff64a3c039 | ||
|
|
37b4a1919b | ||
|
|
826a53dcb6 | ||
|
|
5a47af6fff | ||
|
|
6ea57e4609 | ||
|
|
2fcf421672 | ||
|
|
a680b565ea | ||
|
|
e812ad6e84 | ||
|
|
222ff0d49a | ||
|
|
2c73e9dc12 | ||
|
|
9918133426 | ||
|
|
8eec8566db | ||
|
|
6a4eada85b | ||
|
|
652ec45bbd | ||
|
|
6fee39873d | ||
|
|
87e90c37bd | ||
|
|
73451dbc64 | ||
|
|
077350e651 | ||
|
|
d52700c645 | ||
|
|
ec30d79286 | ||
|
|
cb29076e5b | ||
|
|
29a10c1389 | ||
|
|
28877373ac | ||
|
|
4538f2a9d4 | ||
|
|
fc23db745c | ||
|
|
8a68de6471 | ||
|
|
1c4e0c66d5 | ||
|
|
6dcdd540b9 | ||
|
|
48233c7d55 | ||
|
|
f3ef56998d | ||
|
|
7e7269b2ba | ||
|
|
606e9505c0 | ||
|
|
1db39e8907 | ||
|
|
7f13eb4642 | ||
|
|
9a1fff74fd | ||
|
|
de87639fce | ||
|
|
f9cecfd49a | ||
|
|
70563d2bcb | ||
|
|
4ca99a6361 | ||
|
|
8f70e436cf | ||
|
|
e75d81d05a | ||
|
|
56793114d8 | ||
|
|
a7b09461be | ||
|
|
cd2cb3f6ea | ||
|
|
56f77b58c9 | ||
|
|
1d697f97d7 | ||
|
|
bb30ca4859 | ||
|
|
139e934345 | ||
|
|
bf69aa6e3d | ||
|
|
3a730a23cb | ||
|
|
75cb46796a | ||
|
|
effdb5884b | ||
|
|
9523ba92f3 | ||
|
|
2f522aff90 | ||
|
|
0dccfd176d | ||
|
|
867e8acf27 | ||
|
|
36da8c862f | ||
|
|
b50cf49cc7 | ||
|
|
2270e149eb | ||
|
|
4957bdcba1 | ||
|
|
bca5cf738a | ||
|
|
c35bb5841c | ||
|
|
6e045093b1 | ||
|
|
a1b114e426 | ||
|
|
54fde7630c | ||
|
|
467c408ad7 | ||
|
|
c005a94454 | ||
|
|
c8a35822d6 | ||
|
|
d05259dedd | ||
|
|
8980664b8a | ||
|
|
43f30b3790 | ||
|
|
3ddbb37612 | ||
|
|
7c419a26b3 | ||
|
|
e131465d25 | ||
|
|
a345e56508 | ||
|
|
32ce032995 | ||
|
|
0bc075aa4e | ||
|
|
3e3f2165db | ||
|
|
e1aa068858 | ||
|
|
e98d6f1d30 | ||
|
|
54eb5c0547 | ||
|
|
adf5377ebe | ||
|
|
08b6f594df | ||
|
|
90d13ee3df | ||
|
|
5c718abd50 |
25
.eslintignore
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
# 构建输出目录
|
||||||
|
dist/
|
||||||
|
build/
|
||||||
|
.next/
|
||||||
|
out/
|
||||||
|
|
||||||
|
# 依赖目录
|
||||||
|
node_modules/
|
||||||
|
|
||||||
|
# 缓存和生成文件
|
||||||
|
coverage/
|
||||||
|
.coverage/
|
||||||
|
.nyc_output/
|
||||||
|
*.log
|
||||||
|
|
||||||
|
# 其他不需要检查的文件
|
||||||
|
*.min.js
|
||||||
|
*.config.js
|
||||||
|
vitest.config.mts
|
||||||
|
|
||||||
|
# 特定目录
|
||||||
|
bin/
|
||||||
|
scripts/
|
||||||
|
deploy/
|
||||||
|
docSite/
|
||||||
17
.eslintrc.json
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
{
|
||||||
|
"root": true,
|
||||||
|
"parser": "@typescript-eslint/parser",
|
||||||
|
"plugins": ["@typescript-eslint"],
|
||||||
|
"extends": ["next/core-web-vitals"],
|
||||||
|
"rules": {
|
||||||
|
"react-hooks/rules-of-hooks": 0,
|
||||||
|
"@typescript-eslint/consistent-type-imports": [
|
||||||
|
"error",
|
||||||
|
{
|
||||||
|
"prefer": "type-imports",
|
||||||
|
"disallowTypeAnnotations": false
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"ignorePatterns": ["node_modules/", "dist/", "build/", "coverage/"]
|
||||||
|
}
|
||||||
@ -1,4 +1,4 @@
|
|||||||
yangchuansheng/fastgpt-imgs:
|
yangchuansheng/fastgpt-imgs:
|
||||||
- source: docSite/assets/imgs/
|
- source: docSite/assets/imgs/
|
||||||
dest: imgs/
|
dest: imgs/
|
||||||
deleteOrphaned: true
|
deleteOrphaned: true
|
||||||
30
.github/gh-bot.yml
vendored
@ -1,30 +0,0 @@
|
|||||||
version: v1
|
|
||||||
debug: true
|
|
||||||
action:
|
|
||||||
printConfig: false
|
|
||||||
release:
|
|
||||||
retry: 15s
|
|
||||||
actionName: Release
|
|
||||||
allowOps:
|
|
||||||
- cuisongliu
|
|
||||||
bot:
|
|
||||||
prefix: /
|
|
||||||
spe: _
|
|
||||||
allowOps:
|
|
||||||
- sealos-ci-robot
|
|
||||||
- sealos-release-robot
|
|
||||||
email: sealos-ci-robot@sealos.io
|
|
||||||
username: sealos-ci-robot
|
|
||||||
repo:
|
|
||||||
org: false
|
|
||||||
|
|
||||||
message:
|
|
||||||
success: |
|
|
||||||
🤖 says: Hooray! The action {{.Body}} has been completed successfully. 🎉
|
|
||||||
format_error: |
|
|
||||||
🤖 says: ‼️ There is a formatting issue with the action, kindly verify the action's format.
|
|
||||||
permission_error: |
|
|
||||||
🤖 says: ‼️ The action doesn't have permission to trigger.
|
|
||||||
release_error: |
|
|
||||||
🤖 says: ‼️ Release action failed.
|
|
||||||
Error details: {{.Error}}
|
|
||||||
@ -1,4 +1,4 @@
|
|||||||
name: Deploy doc image to vercel
|
name: Deploy doc image to cf
|
||||||
|
|
||||||
on:
|
on:
|
||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
@ -7,8 +7,6 @@ on:
|
|||||||
- 'docSite/**'
|
- 'docSite/**'
|
||||||
branches:
|
branches:
|
||||||
- 'main'
|
- 'main'
|
||||||
tags:
|
|
||||||
- 'v*.*.*'
|
|
||||||
|
|
||||||
# A workflow run is made up of one or more jobs that can run sequentially or in parallel
|
# A workflow run is made up of one or more jobs that can run sequentially or in parallel
|
||||||
jobs:
|
jobs:
|
||||||
@ -20,7 +18,12 @@ jobs:
|
|||||||
url: ${{ steps.vercel-action.outputs.preview-url }}
|
url: ${{ steps.vercel-action.outputs.preview-url }}
|
||||||
|
|
||||||
# The type of runner that the job will run on
|
# The type of runner that the job will run on
|
||||||
runs-on: ubuntu-22.04
|
runs-on: ubuntu-24.04
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
contents: write
|
||||||
|
concurrency:
|
||||||
|
group: ${{ github.workflow }}-${{ github.ref }}
|
||||||
|
|
||||||
# Job outputs
|
# Job outputs
|
||||||
outputs:
|
outputs:
|
||||||
@ -60,20 +63,9 @@ jobs:
|
|||||||
- name: Build
|
- name: Build
|
||||||
run: cd docSite && hugo mod get -u github.com/colinwilson/lotusdocs@6d0568e && hugo -v --minify
|
run: cd docSite && hugo mod get -u github.com/colinwilson/lotusdocs@6d0568e && hugo -v --minify
|
||||||
|
|
||||||
# Step 5 - Push our generated site to Vercel
|
|
||||||
- name: Deploy to Vercel
|
|
||||||
uses: amondnet/vercel-action@v25
|
|
||||||
id: vercel-action
|
|
||||||
with:
|
|
||||||
vercel-token: ${{ secrets.VERCEL_TOKEN }} # Required
|
|
||||||
vercel-org-id: ${{ secrets.VERCEL_ORG_ID }} #Required
|
|
||||||
vercel-project-id: ${{ secrets.VERCEL_PROJECT_ID }} #Required
|
|
||||||
github-comment: false
|
|
||||||
vercel-args: '--prod --local-config ../vercel.json' # Optional
|
|
||||||
working-directory: docSite/public
|
|
||||||
|
|
||||||
- name: Deploy to GitHub Pages
|
- name: Deploy to GitHub Pages
|
||||||
uses: peaceiris/actions-gh-pages@v3
|
uses: peaceiris/actions-gh-pages@v4
|
||||||
|
if: github.ref == 'refs/heads/main'
|
||||||
with:
|
with:
|
||||||
github_token: ${{ secrets.GH_PAT }}
|
github_token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
publish_dir: docSite/public
|
publish_dir: docSite/public
|
||||||
23
.github/workflows/docs-deploy-kubeconfig.yml
vendored
@ -6,12 +6,17 @@ on:
|
|||||||
- 'docSite/**'
|
- 'docSite/**'
|
||||||
branches:
|
branches:
|
||||||
- 'main'
|
- 'main'
|
||||||
tags:
|
|
||||||
- 'v*.*.*'
|
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build-fastgpt-docs-images:
|
build-fastgpt-docs-images:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
packages: write
|
||||||
|
attestations: write
|
||||||
|
id-token: write
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v4
|
||||||
@ -29,7 +34,6 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
# list of Docker images to use as base name for tags
|
# list of Docker images to use as base name for tags
|
||||||
images: |
|
images: |
|
||||||
${{ secrets.DOCKER_HUB_NAME }}/fastgpt-docs
|
|
||||||
ghcr.io/${{ github.repository_owner }}/fastgpt-docs
|
ghcr.io/${{ github.repository_owner }}/fastgpt-docs
|
||||||
registry.cn-hangzhou.aliyuncs.com/${{ secrets.ALI_HUB_USERNAME }}/fastgpt-docs
|
registry.cn-hangzhou.aliyuncs.com/${{ secrets.ALI_HUB_USERNAME }}/fastgpt-docs
|
||||||
tags: |
|
tags: |
|
||||||
@ -42,18 +46,12 @@ jobs:
|
|||||||
- name: Set up Docker Buildx
|
- name: Set up Docker Buildx
|
||||||
uses: docker/setup-buildx-action@v3
|
uses: docker/setup-buildx-action@v3
|
||||||
|
|
||||||
- name: Login to DockerHub
|
|
||||||
uses: docker/login-action@v3
|
|
||||||
with:
|
|
||||||
username: ${{ secrets.DOCKER_HUB_NAME }}
|
|
||||||
password: ${{ secrets.DOCKER_HUB_PASSWORD }}
|
|
||||||
|
|
||||||
- name: Login to ghcr.io
|
- name: Login to ghcr.io
|
||||||
uses: docker/login-action@v3
|
uses: docker/login-action@v3
|
||||||
with:
|
with:
|
||||||
registry: ghcr.io
|
registry: ghcr.io
|
||||||
username: ${{ github.repository_owner }}
|
username: ${{ github.actor }}
|
||||||
password: ${{ secrets.GH_PAT }}
|
password: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
|
||||||
- name: Login to Aliyun
|
- name: Login to Aliyun
|
||||||
uses: docker/login-action@v3
|
uses: docker/login-action@v3
|
||||||
@ -72,9 +70,10 @@ jobs:
|
|||||||
labels: ${{ steps.meta.outputs.labels }}
|
labels: ${{ steps.meta.outputs.labels }}
|
||||||
outputs:
|
outputs:
|
||||||
tags: ${{ steps.datetime.outputs.datetime }}
|
tags: ${{ steps.datetime.outputs.datetime }}
|
||||||
|
|
||||||
update-docs-image:
|
update-docs-image:
|
||||||
needs: build-fastgpt-docs-images
|
needs: build-fastgpt-docs-images
|
||||||
runs-on: ubuntu-20.04
|
runs-on: ubuntu-24.04
|
||||||
if: github.repository == 'labring/FastGPT'
|
if: github.repository == 'labring/FastGPT'
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout code
|
- name: Checkout code
|
||||||
|
|||||||
79
.github/workflows/docs-preview.yml
vendored
@ -4,21 +4,25 @@ on:
|
|||||||
pull_request_target:
|
pull_request_target:
|
||||||
paths:
|
paths:
|
||||||
- 'docSite/**'
|
- 'docSite/**'
|
||||||
branches:
|
|
||||||
- 'main'
|
|
||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
|
|
||||||
# A workflow run is made up of one or more jobs that can run sequentially or in parallel
|
# A workflow run is made up of one or more jobs that can run sequentially or in parallel
|
||||||
jobs:
|
jobs:
|
||||||
# This workflow contains jobs "deploy-production"
|
# This workflow contains jobs "deploy-production"
|
||||||
deploy-preview:
|
deploy-preview:
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
packages: write
|
||||||
|
attestations: write
|
||||||
|
id-token: write
|
||||||
|
pull-requests: write
|
||||||
# The environment this job references
|
# The environment this job references
|
||||||
environment:
|
environment:
|
||||||
name: Preview
|
name: Preview
|
||||||
url: ${{ steps.vercel-action.outputs.preview-url }}
|
url: ${{ steps.vercel-action.outputs.preview-url }}
|
||||||
|
|
||||||
# The type of runner that the job will run on
|
# The type of runner that the job will run on
|
||||||
runs-on: ubuntu-22.04
|
runs-on: ubuntu-24.04
|
||||||
|
|
||||||
# Job outputs
|
# Job outputs
|
||||||
outputs:
|
outputs:
|
||||||
@ -34,6 +38,7 @@ jobs:
|
|||||||
repository: ${{ github.event.pull_request.head.repo.full_name }}
|
repository: ${{ github.event.pull_request.head.repo.full_name }}
|
||||||
submodules: recursive # Fetch submodules
|
submodules: recursive # Fetch submodules
|
||||||
fetch-depth: 0 # Fetch all history for .GitInfo and .Lastmod
|
fetch-depth: 0 # Fetch all history for .GitInfo and .Lastmod
|
||||||
|
token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
|
||||||
# Step 2 Detect changes to Docs Content
|
# Step 2 Detect changes to Docs Content
|
||||||
- name: Detect changes in doc content
|
- name: Detect changes in doc content
|
||||||
@ -45,10 +50,6 @@ jobs:
|
|||||||
- 'docSite/content/docs/**'
|
- 'docSite/content/docs/**'
|
||||||
base: main
|
base: main
|
||||||
|
|
||||||
- name: Add cdn for images
|
|
||||||
run: |
|
|
||||||
sed -i "s#\](/imgs/#\](https://cdn.jsdelivr.net/gh/yangchuansheng/fastgpt-imgs@main/imgs/#g" $(grep -rl "\](/imgs/" docSite/content/zh-cn/docs)
|
|
||||||
|
|
||||||
# Step 3 - Install Hugo (specific version)
|
# Step 3 - Install Hugo (specific version)
|
||||||
- name: Install Hugo
|
- name: Install Hugo
|
||||||
uses: peaceiris/actions-hugo@v2
|
uses: peaceiris/actions-hugo@v2
|
||||||
@ -60,39 +61,35 @@ jobs:
|
|||||||
- name: Build
|
- name: Build
|
||||||
run: cd docSite && hugo mod get -u github.com/colinwilson/lotusdocs@6d0568e && hugo -v --minify
|
run: cd docSite && hugo mod get -u github.com/colinwilson/lotusdocs@6d0568e && hugo -v --minify
|
||||||
|
|
||||||
# Step 5 - Push our generated site to Vercel
|
# Step 5 - Push our generated site to Cloudflare
|
||||||
- name: Deploy to Vercel
|
- name: Deploy to Cloudflare Pages
|
||||||
uses: amondnet/vercel-action@v25
|
id: deploy
|
||||||
id: vercel-action
|
uses: cloudflare/wrangler-action@v3
|
||||||
with:
|
with:
|
||||||
vercel-token: ${{ secrets.VERCEL_TOKEN }} # Required
|
apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }}
|
||||||
vercel-org-id: ${{ secrets.VERCEL_ORG_ID }} #Required
|
accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}
|
||||||
vercel-project-id: ${{ secrets.VERCEL_PROJECT_ID }} #Required
|
command: pages deploy ./docSite/public --project-name=fastgpt-doc
|
||||||
github-comment: false
|
packageManager: npm
|
||||||
vercel-args: '--local-config ../vercel.json' # Optional
|
|
||||||
working-directory: docSite/public
|
- name: Create deployment status comment
|
||||||
alias-domains: | #Optional
|
if: always()
|
||||||
fastgpt-staging.vercel.app
|
|
||||||
docsOutput:
|
|
||||||
needs: [deploy-preview]
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v3
|
|
||||||
with:
|
|
||||||
ref: ${{ github.event.pull_request.head.ref }}
|
|
||||||
repository: ${{ github.event.pull_request.head.repo.full_name }}
|
|
||||||
- name: Write md
|
|
||||||
run: |
|
|
||||||
echo "# 🤖 Generated by deploy action" > report.md
|
|
||||||
echo "[👀 Visit Preview](${{ needs.deploy-preview.outputs.url }})" >> report.md
|
|
||||||
cat report.md
|
|
||||||
- name: Gh Rebot for Sealos
|
|
||||||
uses: labring/gh-rebot@v0.0.6
|
|
||||||
if: ${{ (github.event_name == 'pull_request_target') }}
|
|
||||||
with:
|
|
||||||
version: v0.0.6
|
|
||||||
env:
|
env:
|
||||||
GH_TOKEN: '${{ secrets.GH_PAT }}'
|
JOB_STATUS: ${{ job.status }}
|
||||||
SEALOS_TYPE: 'pr_comment'
|
PREVIEW_URL: ${{ steps.deploy.outputs.deployment-url }}
|
||||||
SEALOS_FILENAME: 'report.md'
|
uses: actions/github-script@v6
|
||||||
SEALOS_REPLACE_TAG: 'DEFAULT_REPLACE_DEPLOY'
|
with:
|
||||||
|
token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
script: |
|
||||||
|
const success = process.env.JOB_STATUS === 'success';
|
||||||
|
const deploymentUrl = `${process.env.PREVIEW_URL}`;
|
||||||
|
const status = success ? '✅ Success' : '❌ Failed';
|
||||||
|
console.log(process.env.JOB_STATUS);
|
||||||
|
|
||||||
|
const commentBody = `**Deployment Status: ${status}**
|
||||||
|
${success ? `🔗 Preview URL: ${deploymentUrl}` : ''}`;
|
||||||
|
|
||||||
|
await github.rest.issues.createComment({
|
||||||
|
...context.repo,
|
||||||
|
issue_number: context.payload.pull_request.number,
|
||||||
|
body: commentBody
|
||||||
|
});
|
||||||
|
|||||||
13
.github/workflows/docs-sync_imgs.yml
vendored
@ -1,6 +1,6 @@
|
|||||||
name: Sync images
|
name: Sync images
|
||||||
on:
|
on:
|
||||||
pull_request_target:
|
pull_request:
|
||||||
branches:
|
branches:
|
||||||
- main
|
- main
|
||||||
paths:
|
paths:
|
||||||
@ -15,13 +15,6 @@ jobs:
|
|||||||
sync:
|
sync:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
|
||||||
uses: actions/checkout@v3
|
|
||||||
if: ${{ (github.event_name == 'pull_request_target') }}
|
|
||||||
with:
|
|
||||||
ref: ${{ github.event.pull_request.head.ref }}
|
|
||||||
repository: ${{ github.event.pull_request.head.repo.full_name }}
|
|
||||||
|
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v3
|
uses: actions/checkout@v3
|
||||||
|
|
||||||
@ -29,7 +22,7 @@ jobs:
|
|||||||
uses: BetaHuhn/repo-file-sync-action@v1.21.0
|
uses: BetaHuhn/repo-file-sync-action@v1.21.0
|
||||||
with:
|
with:
|
||||||
GH_PAT: ${{ secrets.IMG_GH_PAT }}
|
GH_PAT: ${{ secrets.IMG_GH_PAT }}
|
||||||
CONFIG_PATH: .github/sync_imgs.yml
|
CONFIG_PATH: .github/doc-sync-image.yml
|
||||||
ORIGINAL_MESSAGE: true
|
ORIGINAL_MESSAGE: true
|
||||||
SKIP_PR: true
|
SKIP_PR: true
|
||||||
COMMIT_EACH_FILE: false
|
COMMIT_EACH_FILE: false
|
||||||
|
|||||||
@ -9,7 +9,12 @@ on:
|
|||||||
- 'main'
|
- 'main'
|
||||||
jobs:
|
jobs:
|
||||||
build-fastgpt-images:
|
build-fastgpt-images:
|
||||||
runs-on: ubuntu-20.04
|
permissions:
|
||||||
|
packages: write
|
||||||
|
contents: read
|
||||||
|
attestations: write
|
||||||
|
id-token: write
|
||||||
|
runs-on: ubuntu-24.04
|
||||||
if: github.repository != 'labring/FastGPT'
|
if: github.repository != 'labring/FastGPT'
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
@ -32,7 +37,7 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
registry: ghcr.io
|
registry: ghcr.io
|
||||||
username: ${{ github.repository_owner }}
|
username: ${{ github.repository_owner }}
|
||||||
password: ${{ secrets.GH_PAT }}
|
password: ${{ secrets.GITHUB_TOKEN }}
|
||||||
- name: Set DOCKER_REPO_TAGGED based on branch or tag
|
- name: Set DOCKER_REPO_TAGGED based on branch or tag
|
||||||
run: |
|
run: |
|
||||||
echo "DOCKER_REPO_TAGGED=ghcr.io/${{ github.repository_owner }}/fastgpt:latest" >> $GITHUB_ENV
|
echo "DOCKER_REPO_TAGGED=ghcr.io/${{ github.repository_owner }}/fastgpt:latest" >> $GITHUB_ENV
|
||||||
|
|||||||
303
.github/workflows/fastgpt-build-image.yml
vendored
@ -1,258 +1,171 @@
|
|||||||
name: Build FastGPT images
|
name: Build FastGPT images
|
||||||
|
|
||||||
on:
|
on:
|
||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
push:
|
push:
|
||||||
paths:
|
paths:
|
||||||
- 'projects/app/**'
|
- "projects/app/**"
|
||||||
- 'packages/**'
|
- "packages/**"
|
||||||
tags:
|
tags:
|
||||||
- 'v*'
|
- "v*"
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build-fastgpt-images:
|
build-fastgpt-images:
|
||||||
runs-on: ubuntu-20.04
|
permissions:
|
||||||
|
packages: write
|
||||||
|
contents: read
|
||||||
|
attestations: write
|
||||||
|
id-token: write
|
||||||
|
strategy:
|
||||||
|
matrix:
|
||||||
|
sub_routes:
|
||||||
|
- repo: fastgpt
|
||||||
|
base_url: ""
|
||||||
|
- repo: fastgpt-sub-route
|
||||||
|
base_url: "/fastai"
|
||||||
|
- repo: fastgpt-sub-route-gchat
|
||||||
|
base_url: "/gchat"
|
||||||
|
archs:
|
||||||
|
- arch: amd64
|
||||||
|
- arch: arm64
|
||||||
|
runs-on: ubuntu-24.04-arm
|
||||||
|
runs-on: ${{ matrix.archs.runs-on || 'ubuntu-24.04' }}
|
||||||
steps:
|
steps:
|
||||||
# install env
|
# install env
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v3
|
uses: actions/checkout@v4
|
||||||
with:
|
with:
|
||||||
fetch-depth: 1
|
fetch-depth: 1
|
||||||
- name: Install Dependencies
|
|
||||||
run: |
|
|
||||||
sudo apt update && sudo apt install -y nodejs npm
|
|
||||||
- name: Set up QEMU (optional)
|
|
||||||
uses: docker/setup-qemu-action@v2
|
|
||||||
- name: Set up Docker Buildx
|
- name: Set up Docker Buildx
|
||||||
uses: docker/setup-buildx-action@v2
|
uses: docker/setup-buildx-action@v3
|
||||||
with:
|
with:
|
||||||
driver-opts: network=host
|
driver-opts: network=host
|
||||||
|
|
||||||
- name: Cache Docker layers
|
- name: Cache Docker layers
|
||||||
uses: actions/cache@v2
|
uses: actions/cache@v4
|
||||||
with:
|
with:
|
||||||
path: /tmp/.buildx-cache
|
path: /tmp/.buildx-cache
|
||||||
key: ${{ runner.os }}-buildx-${{ github.sha }}
|
key: ${{ runner.os }}-${{ matrix.sub_routes.repo }}-buildx-${{ github.sha }}
|
||||||
restore-keys: |
|
restore-keys: |
|
||||||
${{ runner.os }}-buildx-
|
${{ runner.os }}-${{ matrix.sub_routes.repo }}-buildx-
|
||||||
|
|
||||||
# login docker
|
# login docker
|
||||||
- name: Login to GitHub Container Registry
|
- name: Login to GitHub Container Registry
|
||||||
uses: docker/login-action@v2
|
uses: docker/login-action@v3
|
||||||
with:
|
with:
|
||||||
registry: ghcr.io
|
registry: ghcr.io
|
||||||
username: ${{ github.repository_owner }}
|
username: ${{ github.repository_owner }}
|
||||||
password: ${{ secrets.GH_PAT }}
|
password: ${{ secrets.GITHUB_TOKEN }}
|
||||||
- name: Login to Ali Hub
|
- name: Login to Ali Hub
|
||||||
uses: docker/login-action@v2
|
uses: docker/login-action@v3
|
||||||
with:
|
with:
|
||||||
registry: registry.cn-hangzhou.aliyuncs.com
|
registry: registry.cn-hangzhou.aliyuncs.com
|
||||||
username: ${{ secrets.ALI_HUB_USERNAME }}
|
username: ${{ secrets.ALI_HUB_USERNAME }}
|
||||||
password: ${{ secrets.ALI_HUB_PASSWORD }}
|
password: ${{ secrets.ALI_HUB_PASSWORD }}
|
||||||
- name: Login to Docker Hub
|
- name: Login to Docker Hub
|
||||||
uses: docker/login-action@v2
|
uses: docker/login-action@v3
|
||||||
with:
|
with:
|
||||||
username: ${{ secrets.DOCKER_HUB_NAME }}
|
username: ${{ secrets.DOCKER_HUB_NAME }}
|
||||||
password: ${{ secrets.DOCKER_HUB_PASSWORD }}
|
password: ${{ secrets.DOCKER_HUB_PASSWORD }}
|
||||||
|
|
||||||
# Set tag
|
- name: Build for ${{ matrix.archs.arch }}
|
||||||
- name: Set image name and tag
|
id: build
|
||||||
run: |
|
uses: docker/build-push-action@v6
|
||||||
if [[ "${{ github.ref_name }}" == "main" ]]; then
|
with:
|
||||||
echo "Git_Tag=ghcr.io/${{ github.repository_owner }}/fastgpt:latest" >> $GITHUB_ENV
|
context: .
|
||||||
echo "Git_Latest=ghcr.io/${{ github.repository_owner }}/fastgpt:latest" >> $GITHUB_ENV
|
file: projects/app/Dockerfile
|
||||||
echo "Ali_Tag=${{ secrets.ALI_IMAGE_NAME }}/fastgpt:latest" >> $GITHUB_ENV
|
platforms: linux/${{ matrix.archs.arch }}
|
||||||
echo "Ali_Latest=${{ secrets.ALI_IMAGE_NAME }}/fastgpt:latest" >> $GITHUB_ENV
|
build-args: |
|
||||||
echo "Docker_Hub_Tag=${{ secrets.DOCKER_IMAGE_NAME }}/fastgpt:latest" >> $GITHUB_ENV
|
${{ matrix.sub_routes.base_url && format('base_url={0}', matrix.sub_routes.base_url) || '' }}
|
||||||
echo "Docker_Hub_Latest=${{ secrets.DOCKER_IMAGE_NAME }}/fastgpt:latest" >> $GITHUB_ENV
|
labels: |
|
||||||
else
|
org.opencontainers.image.source=https://github.com/${{ github.repository }}
|
||||||
echo "Git_Tag=ghcr.io/${{ github.repository_owner }}/fastgpt:${{ github.ref_name }}" >> $GITHUB_ENV
|
org.opencontainers.image.description=${{ matrix.sub_routes.repo }} image
|
||||||
echo "Git_Latest=ghcr.io/${{ github.repository_owner }}/fastgpt:latest" >> $GITHUB_ENV
|
outputs: type=image,"name=ghcr.io/${{ github.repository_owner }}/${{ matrix.sub_routes.repo }},${{ secrets.ALI_IMAGE_NAME }}/${{ matrix.sub_routes.repo }},${{ secrets.DOCKER_IMAGE_NAME }}/${{ matrix.sub_routes.repo }}",push-by-digest=true,push=true
|
||||||
echo "Ali_Tag=${{ secrets.ALI_IMAGE_NAME }}/fastgpt:${{ github.ref_name }}" >> $GITHUB_ENV
|
cache-from: type=local,src=/tmp/.buildx-cache
|
||||||
echo "Ali_Latest=${{ secrets.ALI_IMAGE_NAME }}/fastgpt:latest" >> $GITHUB_ENV
|
cache-to: type=local,dest=/tmp/.buildx-cache
|
||||||
echo "Docker_Hub_Tag=${{ secrets.DOCKER_IMAGE_NAME }}/fastgpt:${{ github.ref_name }}" >> $GITHUB_ENV
|
|
||||||
echo "Docker_Hub_Latest=${{ secrets.DOCKER_IMAGE_NAME }}/fastgpt:latest" >> $GITHUB_ENV
|
|
||||||
fi
|
|
||||||
|
|
||||||
- name: Build and publish image for main branch or tag push event
|
- name: Export digest
|
||||||
env:
|
|
||||||
DOCKER_REPO_TAGGED: ${{ env.DOCKER_REPO_TAGGED }}
|
|
||||||
run: |
|
run: |
|
||||||
docker buildx build \
|
mkdir -p ${{ runner.temp }}/digests/${{ matrix.sub_routes.repo }}
|
||||||
-f projects/app/Dockerfile \
|
digest="${{ steps.build.outputs.digest }}"
|
||||||
--platform linux/amd64,linux/arm64 \
|
touch "${{ runner.temp }}/digests/${{ matrix.sub_routes.repo }}/${digest#sha256:}"
|
||||||
--label "org.opencontainers.image.source=https://github.com/${{ github.repository_owner }}/FastGPT" \
|
|
||||||
--label "org.opencontainers.image.description=fastgpt image" \
|
- name: Upload digest
|
||||||
--push \
|
uses: actions/upload-artifact@v4
|
||||||
--cache-from=type=local,src=/tmp/.buildx-cache \
|
with:
|
||||||
--cache-to=type=local,dest=/tmp/.buildx-cache \
|
name: digests-${{ matrix.sub_routes.repo }}-${{ github.sha }}-${{ matrix.archs.arch }}
|
||||||
-t ${Git_Tag} \
|
path: ${{ runner.temp }}/digests/${{ matrix.sub_routes.repo }}/*
|
||||||
-t ${Git_Latest} \
|
if-no-files-found: error
|
||||||
-t ${Ali_Tag} \
|
retention-days: 1
|
||||||
-t ${Ali_Latest} \
|
|
||||||
-t ${Docker_Hub_Tag} \
|
release-fastgpt-images:
|
||||||
-t ${Docker_Hub_Latest} \
|
permissions:
|
||||||
.
|
packages: write
|
||||||
build-fastgpt-images-sub-route:
|
contents: read
|
||||||
runs-on: ubuntu-20.04
|
attestations: write
|
||||||
|
id-token: write
|
||||||
|
needs: build-fastgpt-images
|
||||||
|
strategy:
|
||||||
|
matrix:
|
||||||
|
sub_routes:
|
||||||
|
- repo: fastgpt
|
||||||
|
- repo: fastgpt-sub-route
|
||||||
|
- repo: fastgpt-sub-route-gchat
|
||||||
|
runs-on: ubuntu-24.04
|
||||||
steps:
|
steps:
|
||||||
# install env
|
|
||||||
- name: Checkout
|
|
||||||
uses: actions/checkout@v3
|
|
||||||
with:
|
|
||||||
fetch-depth: 1
|
|
||||||
- name: Install Dependencies
|
|
||||||
run: |
|
|
||||||
sudo apt update && sudo apt install -y nodejs npm
|
|
||||||
- name: Set up QEMU (optional)
|
|
||||||
uses: docker/setup-qemu-action@v2
|
|
||||||
- name: Set up Docker Buildx
|
|
||||||
uses: docker/setup-buildx-action@v2
|
|
||||||
with:
|
|
||||||
driver-opts: network=host
|
|
||||||
- name: Cache Docker layers
|
|
||||||
uses: actions/cache@v2
|
|
||||||
with:
|
|
||||||
path: /tmp/.buildx-cache
|
|
||||||
key: ${{ runner.os }}-buildx-${{ github.sha }}
|
|
||||||
restore-keys: |
|
|
||||||
${{ runner.os }}-buildx-
|
|
||||||
|
|
||||||
# login docker
|
|
||||||
- name: Login to GitHub Container Registry
|
- name: Login to GitHub Container Registry
|
||||||
uses: docker/login-action@v2
|
uses: docker/login-action@v3
|
||||||
with:
|
with:
|
||||||
registry: ghcr.io
|
registry: ghcr.io
|
||||||
username: ${{ github.repository_owner }}
|
username: ${{ github.repository_owner }}
|
||||||
password: ${{ secrets.GH_PAT }}
|
password: ${{ secrets.GITHUB_TOKEN }}
|
||||||
- name: Login to Ali Hub
|
- name: Login to Ali Hub
|
||||||
uses: docker/login-action@v2
|
uses: docker/login-action@v3
|
||||||
with:
|
with:
|
||||||
registry: registry.cn-hangzhou.aliyuncs.com
|
registry: registry.cn-hangzhou.aliyuncs.com
|
||||||
username: ${{ secrets.ALI_HUB_USERNAME }}
|
username: ${{ secrets.ALI_HUB_USERNAME }}
|
||||||
password: ${{ secrets.ALI_HUB_PASSWORD }}
|
password: ${{ secrets.ALI_HUB_PASSWORD }}
|
||||||
- name: Login to Docker Hub
|
- name: Login to Docker Hub
|
||||||
uses: docker/login-action@v2
|
uses: docker/login-action@v3
|
||||||
with:
|
with:
|
||||||
username: ${{ secrets.DOCKER_HUB_NAME }}
|
username: ${{ secrets.DOCKER_HUB_NAME }}
|
||||||
password: ${{ secrets.DOCKER_HUB_PASSWORD }}
|
password: ${{ secrets.DOCKER_HUB_PASSWORD }}
|
||||||
|
|
||||||
# Set tag
|
- name: Download digests
|
||||||
- name: Set image name and tag
|
uses: actions/download-artifact@v4
|
||||||
run: |
|
|
||||||
if [[ "${{ github.ref_name }}" == "main" ]]; then
|
|
||||||
echo "Git_Tag=ghcr.io/${{ github.repository_owner }}/fastgpt-sub-route:latest" >> $GITHUB_ENV
|
|
||||||
echo "Git_Latest=ghcr.io/${{ github.repository_owner }}/fastgpt-sub-route:latest" >> $GITHUB_ENV
|
|
||||||
echo "Ali_Tag=${{ secrets.ALI_IMAGE_NAME }}/fastgpt-sub-route:latest" >> $GITHUB_ENV
|
|
||||||
echo "Ali_Latest=${{ secrets.ALI_IMAGE_NAME }}/fastgpt-sub-route:latest" >> $GITHUB_ENV
|
|
||||||
echo "Docker_Hub_Tag=${{ secrets.DOCKER_IMAGE_NAME }}/fastgpt-sub-route:latest" >> $GITHUB_ENV
|
|
||||||
echo "Docker_Hub_Latest=${{ secrets.DOCKER_IMAGE_NAME }}/fastgpt-sub-route:latest" >> $GITHUB_ENV
|
|
||||||
else
|
|
||||||
echo "Git_Tag=ghcr.io/${{ github.repository_owner }}/fastgpt-sub-route:${{ github.ref_name }}" >> $GITHUB_ENV
|
|
||||||
echo "Git_Latest=ghcr.io/${{ github.repository_owner }}/fastgpt-sub-route:latest" >> $GITHUB_ENV
|
|
||||||
echo "Ali_Tag=${{ secrets.ALI_IMAGE_NAME }}/fastgpt-sub-route:${{ github.ref_name }}" >> $GITHUB_ENV
|
|
||||||
echo "Ali_Latest=${{ secrets.ALI_IMAGE_NAME }}/fastgpt-sub-route:latest" >> $GITHUB_ENV
|
|
||||||
echo "Docker_Hub_Tag=${{ secrets.DOCKER_IMAGE_NAME }}/fastgpt-sub-route:${{ github.ref_name }}" >> $GITHUB_ENV
|
|
||||||
echo "Docker_Hub_Latest=${{ secrets.DOCKER_IMAGE_NAME }}/fastgpt-sub-route:latest" >> $GITHUB_ENV
|
|
||||||
fi
|
|
||||||
|
|
||||||
- name: Build and publish image for main branch or tag push event
|
|
||||||
env:
|
|
||||||
DOCKER_REPO_TAGGED: ${{ env.DOCKER_REPO_TAGGED }}
|
|
||||||
run: |
|
|
||||||
docker buildx build \
|
|
||||||
-f projects/app/Dockerfile \
|
|
||||||
--platform linux/amd64,linux/arm64 \
|
|
||||||
--build-arg base_url=/fastai \
|
|
||||||
--label "org.opencontainers.image.source=https://github.com/${{ github.repository_owner }}/FastGPT" \
|
|
||||||
--label "org.opencontainers.image.description=fastgpt image" \
|
|
||||||
--push \
|
|
||||||
--cache-from=type=local,src=/tmp/.buildx-cache \
|
|
||||||
--cache-to=type=local,dest=/tmp/.buildx-cache \
|
|
||||||
-t ${Git_Tag} \
|
|
||||||
-t ${Git_Latest} \
|
|
||||||
-t ${Ali_Tag} \
|
|
||||||
-t ${Ali_Latest} \
|
|
||||||
-t ${Docker_Hub_Tag} \
|
|
||||||
-t ${Docker_Hub_Latest} \
|
|
||||||
.
|
|
||||||
build-fastgpt-images-sub-route-gchat:
|
|
||||||
runs-on: ubuntu-20.04
|
|
||||||
steps:
|
|
||||||
# install env
|
|
||||||
- name: Checkout
|
|
||||||
uses: actions/checkout@v3
|
|
||||||
with:
|
with:
|
||||||
fetch-depth: 1
|
path: ${{ runner.temp }}/digests
|
||||||
- name: Install Dependencies
|
pattern: digests-${{ matrix.sub_routes.repo }}-${{ github.sha }}-*
|
||||||
run: |
|
merge-multiple: true
|
||||||
sudo apt update && sudo apt install -y nodejs npm
|
|
||||||
- name: Set up QEMU (optional)
|
|
||||||
uses: docker/setup-qemu-action@v2
|
|
||||||
- name: Set up Docker Buildx
|
- name: Set up Docker Buildx
|
||||||
uses: docker/setup-buildx-action@v2
|
uses: docker/setup-buildx-action@v3
|
||||||
with:
|
|
||||||
driver-opts: network=host
|
|
||||||
- name: Cache Docker layers
|
|
||||||
uses: actions/cache@v2
|
|
||||||
with:
|
|
||||||
path: /tmp/.buildx-cache
|
|
||||||
key: ${{ runner.os }}-buildx-${{ github.sha }}
|
|
||||||
restore-keys: |
|
|
||||||
${{ runner.os }}-buildx-
|
|
||||||
|
|
||||||
# login docker
|
|
||||||
- name: Login to GitHub Container Registry
|
|
||||||
uses: docker/login-action@v2
|
|
||||||
with:
|
|
||||||
registry: ghcr.io
|
|
||||||
username: ${{ github.repository_owner }}
|
|
||||||
password: ${{ secrets.GH_PAT }}
|
|
||||||
- name: Login to Ali Hub
|
|
||||||
uses: docker/login-action@v2
|
|
||||||
with:
|
|
||||||
registry: registry.cn-hangzhou.aliyuncs.com
|
|
||||||
username: ${{ secrets.ALI_HUB_USERNAME }}
|
|
||||||
password: ${{ secrets.ALI_HUB_PASSWORD }}
|
|
||||||
- name: Login to Docker Hub
|
|
||||||
uses: docker/login-action@v2
|
|
||||||
with:
|
|
||||||
username: ${{ secrets.DOCKER_HUB_NAME }}
|
|
||||||
password: ${{ secrets.DOCKER_HUB_PASSWORD }}
|
|
||||||
|
|
||||||
# Set tag
|
|
||||||
- name: Set image name and tag
|
- name: Set image name and tag
|
||||||
run: |
|
run: |
|
||||||
if [[ "${{ github.ref_name }}" == "main" ]]; then
|
if [[ "${{ github.ref_name }}" == "main" ]]; then
|
||||||
echo "Git_Tag=ghcr.io/${{ github.repository_owner }}/fastgpt-sub-route-gchat:latest" >> $GITHUB_ENV
|
echo "Git_Tag=ghcr.io/${{ github.repository_owner }}/${{ matrix.sub_routes.repo }}:latest" >> $GITHUB_ENV
|
||||||
echo "Git_Latest=ghcr.io/${{ github.repository_owner }}/fastgpt-sub-route-gchat:latest" >> $GITHUB_ENV
|
echo "Git_Latest=ghcr.io/${{ github.repository_owner }}/${{ matrix.sub_routes.repo }}:latest" >> $GITHUB_ENV
|
||||||
echo "Ali_Tag=${{ secrets.ALI_IMAGE_NAME }}/fastgpt-sub-route-gchat:latest" >> $GITHUB_ENV
|
echo "Ali_Tag=${{ secrets.ALI_IMAGE_NAME }}/${{ matrix.sub_routes.repo }}:latest" >> $GITHUB_ENV
|
||||||
echo "Ali_Latest=${{ secrets.ALI_IMAGE_NAME }}/fastgpt-sub-route-gchat:latest" >> $GITHUB_ENV
|
echo "Ali_Latest=${{ secrets.ALI_IMAGE_NAME }}/${{ matrix.sub_routes.repo }}:latest" >> $GITHUB_ENV
|
||||||
echo "Docker_Hub_Tag=${{ secrets.DOCKER_IMAGE_NAME }}/fastgpt-sub-route-gchat:latest" >> $GITHUB_ENV
|
echo "Docker_Hub_Tag=${{ secrets.DOCKER_IMAGE_NAME }}/${{ matrix.sub_routes.repo }}:latest" >> $GITHUB_ENV
|
||||||
echo "Docker_Hub_Latest=${{ secrets.DOCKER_IMAGE_NAME }}/fastgpt-sub-route-gchat:latest" >> $GITHUB_ENV
|
echo "Docker_Hub_Latest=${{ secrets.DOCKER_IMAGE_NAME }}/${{ matrix.sub_routes.repo }}:latest" >> $GITHUB_ENV
|
||||||
else
|
else
|
||||||
echo "Git_Tag=ghcr.io/${{ github.repository_owner }}/fastgpt-sub-route-gchat:${{ github.ref_name }}" >> $GITHUB_ENV
|
echo "Git_Tag=ghcr.io/${{ github.repository_owner }}/${{ matrix.sub_routes.repo }}:${{ github.ref_name }}" >> $GITHUB_ENV
|
||||||
echo "Git_Latest=ghcr.io/${{ github.repository_owner }}/fastgpt-sub-route-gchat:latest" >> $GITHUB_ENV
|
echo "Git_Latest=ghcr.io/${{ github.repository_owner }}/${{ matrix.sub_routes.repo }}:latest" >> $GITHUB_ENV
|
||||||
echo "Ali_Tag=${{ secrets.ALI_IMAGE_NAME }}/fastgpt-sub-route-gchat:${{ github.ref_name }}" >> $GITHUB_ENV
|
echo "Ali_Tag=${{ secrets.ALI_IMAGE_NAME }}/${{ matrix.sub_routes.repo }}:${{ github.ref_name }}" >> $GITHUB_ENV
|
||||||
echo "Ali_Latest=${{ secrets.ALI_IMAGE_NAME }}/fastgpt-sub-route-gchat:latest" >> $GITHUB_ENV
|
echo "Ali_Latest=${{ secrets.ALI_IMAGE_NAME }}/${{ matrix.sub_routes.repo }}:latest" >> $GITHUB_ENV
|
||||||
echo "Docker_Hub_Tag=${{ secrets.DOCKER_IMAGE_NAME }}/fastgpt-sub-route-gchat:${{ github.ref_name }}" >> $GITHUB_ENV
|
echo "Docker_Hub_Tag=${{ secrets.DOCKER_IMAGE_NAME }}/${{ matrix.sub_routes.repo }}:${{ github.ref_name }}" >> $GITHUB_ENV
|
||||||
echo "Docker_Hub_Latest=${{ secrets.DOCKER_IMAGE_NAME }}/fastgpt-sub-route-gchat:latest" >> $GITHUB_ENV
|
echo "Docker_Hub_Latest=${{ secrets.DOCKER_IMAGE_NAME }}/${{ matrix.sub_routes.repo }}:latest" >> $GITHUB_ENV
|
||||||
fi
|
fi
|
||||||
|
|
||||||
- name: Build and publish image for main branch or tag push event
|
- name: Create manifest list and push
|
||||||
env:
|
working-directory: ${{ runner.temp }}/digests
|
||||||
DOCKER_REPO_TAGGED: ${{ env.DOCKER_REPO_TAGGED }}
|
|
||||||
run: |
|
run: |
|
||||||
docker buildx build \
|
TAGS="$(echo -e "${Git_Tag}\n${Git_Latest}\n${Ali_Tag}\n${Ali_Latest}\n${Docker_Hub_Tag}\n${Docker_Hub_Latest}")"
|
||||||
-f projects/app/Dockerfile \
|
for TAG in $TAGS; do
|
||||||
--platform linux/amd64,linux/arm64 \
|
docker buildx imagetools create -t $TAG \
|
||||||
--build-arg base_url=/gchat \
|
$(printf 'ghcr.io/${{ github.repository_owner }}/${{ matrix.sub_routes.repo }}@sha256:%s ' *)
|
||||||
--label "org.opencontainers.image.source=https://github.com/${{ github.repository_owner }}/FastGPT" \
|
sleep 5
|
||||||
--label "org.opencontainers.image.description=fastgpt-sub-route-gchat image" \
|
done
|
||||||
--push \
|
|
||||||
--cache-from=type=local,src=/tmp/.buildx-cache \
|
|
||||||
--cache-to=type=local,dest=/tmp/.buildx-cache \
|
|
||||||
-t ${Git_Tag} \
|
|
||||||
-t ${Git_Latest} \
|
|
||||||
-t ${Ali_Tag} \
|
|
||||||
-t ${Ali_Latest} \
|
|
||||||
-t ${Docker_Hub_Tag} \
|
|
||||||
-t ${Docker_Hub_Latest} \
|
|
||||||
.
|
|
||||||
|
|||||||
83
.github/workflows/fastgpt-preview-image.yml
vendored
@ -1,70 +1,89 @@
|
|||||||
name: Preview FastGPT images
|
name: Preview FastGPT images
|
||||||
on:
|
on:
|
||||||
pull_request_target:
|
pull_request_target:
|
||||||
paths:
|
|
||||||
- 'projects/app/**'
|
|
||||||
- 'packages/**'
|
|
||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
preview-fastgpt-images:
|
preview-fastgpt-images:
|
||||||
runs-on: ubuntu-20.04
|
permissions:
|
||||||
|
contents: read
|
||||||
|
packages: write
|
||||||
|
attestations: write
|
||||||
|
id-token: write
|
||||||
|
pull-requests: write
|
||||||
|
|
||||||
|
runs-on: ubuntu-24.04
|
||||||
|
strategy:
|
||||||
|
matrix:
|
||||||
|
image: [fastgpt, sandbox, mcp_server]
|
||||||
|
fail-fast: false # 即使一个镜像构建失败,也继续构建其他镜像
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v3
|
uses: actions/checkout@v3
|
||||||
with:
|
with:
|
||||||
ref: ${{ github.event.pull_request.head.ref }}
|
ref: ${{ github.event.pull_request.head.ref }}
|
||||||
repository: ${{ github.event.pull_request.head.repo.full_name }}
|
repository: ${{ github.event.pull_request.head.repo.full_name }}
|
||||||
submodules: recursive # Fetch submodules
|
fetch-depth: 0
|
||||||
fetch-depth: 0 # Fetch all history for .GitInfo and .Lastmod
|
token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
|
||||||
- name: Set up Docker Buildx
|
- name: Set up Docker Buildx
|
||||||
uses: docker/setup-buildx-action@v2
|
uses: docker/setup-buildx-action@v2
|
||||||
with:
|
with:
|
||||||
driver-opts: network=host
|
driver-opts: network=host
|
||||||
|
|
||||||
- name: Cache Docker layers
|
- name: Cache Docker layers
|
||||||
uses: actions/cache@v3
|
uses: actions/cache@v3
|
||||||
with:
|
with:
|
||||||
path: /tmp/.buildx-cache
|
path: /tmp/.buildx-cache
|
||||||
key: ${{ runner.os }}-buildx-${{ github.sha }}
|
key: ${{ runner.os }}-buildx-${{ github.sha }}-${{ matrix.image }}
|
||||||
restore-keys: |
|
restore-keys: |
|
||||||
|
${{ runner.os }}-buildx-${{ github.sha }}-
|
||||||
${{ runner.os }}-buildx-
|
${{ runner.os }}-buildx-
|
||||||
|
|
||||||
- name: Login to GitHub Container Registry
|
- name: Login to GitHub Container Registry
|
||||||
uses: docker/login-action@v2
|
uses: docker/login-action@v2
|
||||||
with:
|
with:
|
||||||
registry: ghcr.io
|
registry: ghcr.io
|
||||||
username: ${{ github.repository_owner }}
|
username: ${{ github.repository_owner }}
|
||||||
password: ${{ secrets.GH_PAT }}
|
password: ${{ secrets.GITHUB_TOKEN }}
|
||||||
- name: Set DOCKER_REPO_TAGGED based on branch or tag
|
|
||||||
|
- name: Set image config
|
||||||
|
id: config
|
||||||
run: |
|
run: |
|
||||||
echo "DOCKER_REPO_TAGGED=ghcr.io/${{ github.repository_owner }}/fastgpt-pr:${{ github.event.pull_request.head.sha }}" >> $GITHUB_ENV
|
if [[ "${{ matrix.image }}" == "fastgpt" ]]; then
|
||||||
- name: Build image for PR
|
echo "DOCKERFILE=projects/app/Dockerfile" >> $GITHUB_OUTPUT
|
||||||
env:
|
echo "DESCRIPTION=fastgpt-pr image" >> $GITHUB_OUTPUT
|
||||||
DOCKER_REPO_TAGGED: ${{ env.DOCKER_REPO_TAGGED }}
|
echo "DOCKER_REPO_TAGGED=ghcr.io/${{ github.repository_owner }}/fastgpt-pr:fatsgpt_${{ github.event.pull_request.head.sha }}" >> $GITHUB_OUTPUT
|
||||||
|
elif [[ "${{ matrix.image }}" == "sandbox" ]]; then
|
||||||
|
echo "DOCKERFILE=projects/sandbox/Dockerfile" >> $GITHUB_OUTPUT
|
||||||
|
echo "DESCRIPTION=fastgpt-sandbox-pr image" >> $GITHUB_OUTPUT
|
||||||
|
echo "DOCKER_REPO_TAGGED=ghcr.io/${{ github.repository_owner }}/fastgpt-pr:fatsgpt_sandbox_${{ github.event.pull_request.head.sha }}" >> $GITHUB_OUTPUT
|
||||||
|
elif [[ "${{ matrix.image }}" == "mcp_server" ]]; then
|
||||||
|
echo "DOCKERFILE=projects/mcp_server/Dockerfile" >> $GITHUB_OUTPUT
|
||||||
|
echo "DESCRIPTION=fastgpt-mcp_server-pr image" >> $GITHUB_OUTPUT
|
||||||
|
echo "DOCKER_REPO_TAGGED=ghcr.io/${{ github.repository_owner }}/fastgpt-pr:fatsgpt_mcp_server_${{ github.event.pull_request.head.sha }}" >> $GITHUB_OUTPUT
|
||||||
|
fi
|
||||||
|
|
||||||
|
- name: Build ${{ matrix.image }} image for PR
|
||||||
run: |
|
run: |
|
||||||
docker buildx build \
|
docker buildx build \
|
||||||
-f projects/app/Dockerfile \
|
-f ${{ steps.config.outputs.DOCKERFILE }} \
|
||||||
--label "org.opencontainers.image.source=https://github.com/${{ github.repository_owner }}/FastGPT" \
|
--label "org.opencontainers.image.source=https://github.com/${{ github.repository_owner }}/FastGPT" \
|
||||||
--label "org.opencontainers.image.description=fastgpt-pr image" \
|
--label "org.opencontainers.image.description=${{ steps.config.outputs.DESCRIPTION }}" \
|
||||||
--label "org.opencontainers.image.licenses=Apache" \
|
|
||||||
--push \
|
--push \
|
||||||
--cache-from=type=local,src=/tmp/.buildx-cache \
|
--cache-from=type=local,src=/tmp/.buildx-cache \
|
||||||
--cache-to=type=local,dest=/tmp/.buildx-cache \
|
--cache-to=type=local,dest=/tmp/.buildx-cache \
|
||||||
-t ${DOCKER_REPO_TAGGED} \
|
-t ${{ steps.config.outputs.DOCKER_REPO_TAGGED }} \
|
||||||
.
|
.
|
||||||
# Add write md step after build
|
|
||||||
- name: Write md
|
|
||||||
run: |
|
|
||||||
echo "# 🤖 Generated by deploy action" > report.md
|
|
||||||
echo "📦 Preview Image: \`${DOCKER_REPO_TAGGED}\`" >> report.md
|
|
||||||
cat report.md
|
|
||||||
|
|
||||||
- name: Gh Rebot for Sealos
|
- uses: actions/github-script@v7
|
||||||
uses: labring/gh-rebot@v0.0.6
|
|
||||||
if: ${{ (github.event_name == 'pull_request_target') }}
|
|
||||||
with:
|
with:
|
||||||
version: v0.0.6
|
github-token: ${{secrets.GITHUB_TOKEN}}
|
||||||
env:
|
script: |
|
||||||
GH_TOKEN: '${{ secrets.GH_PAT }}'
|
github.rest.issues.createComment({
|
||||||
SEALOS_TYPE: 'pr_comment'
|
issue_number: context.issue.number,
|
||||||
SEALOS_FILENAME: 'report.md'
|
owner: context.repo.owner,
|
||||||
SEALOS_REPLACE_TAG: 'DEFAULT_REPLACE_DEPLOY'
|
repo: context.repo.repo,
|
||||||
|
body: 'Preview ${{ matrix.image }} Image: `${{ steps.config.outputs.DOCKER_REPO_TAGGED }}`'
|
||||||
|
})
|
||||||
|
|||||||
32
.github/workflows/fastgpt-test.yaml
vendored
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
name: 'FastGPT-Test'
|
||||||
|
on:
|
||||||
|
pull_request:
|
||||||
|
workflow_dispatch:
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
test:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
# Required to checkout the code
|
||||||
|
contents: read
|
||||||
|
# Required to put a comment into the pull-request
|
||||||
|
pull-requests: write
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
ref: ${{ github.event.pull_request.head.ref }}
|
||||||
|
repository: ${{ github.event.pull_request.head.repo.full_name }}
|
||||||
|
- uses: pnpm/action-setup@v4
|
||||||
|
with:
|
||||||
|
version: 10
|
||||||
|
- name: 'Install Deps'
|
||||||
|
run: pnpm install
|
||||||
|
- name: 'Test'
|
||||||
|
run: pnpm run test
|
||||||
|
- name: 'Report Coverage'
|
||||||
|
# Set if: always() to also generate the report if tests are failing
|
||||||
|
# Only works if you set `reportOnFailure: true` in your vite config as specified above
|
||||||
|
if: always()
|
||||||
|
uses: davelosert/vitest-coverage-report-action@v2
|
||||||
9
.github/workflows/helm-release.yaml
vendored
@ -8,7 +8,12 @@ on:
|
|||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
helm:
|
helm:
|
||||||
runs-on: ubuntu-20.04
|
permissions:
|
||||||
|
packages: write
|
||||||
|
contents: read
|
||||||
|
attestations: write
|
||||||
|
id-token: write
|
||||||
|
runs-on: ubuntu-24.04
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v4
|
||||||
@ -20,7 +25,7 @@ jobs:
|
|||||||
run: echo "tag=$(git describe --tags)" >> $GITHUB_OUTPUT
|
run: echo "tag=$(git describe --tags)" >> $GITHUB_OUTPUT
|
||||||
- name: Release Helm
|
- name: Release Helm
|
||||||
run: |
|
run: |
|
||||||
echo ${{ secrets.GH_PAT }} | helm registry login ghcr.io -u ${{ github.repository_owner }} --password-stdin
|
echo ${{ secrets.GITHUB_TOKEN }} | helm registry login ghcr.io -u ${{ github.repository_owner }} --password-stdin
|
||||||
export APP_VERSION=${{ steps.vars.outputs.tag }}
|
export APP_VERSION=${{ steps.vars.outputs.tag }}
|
||||||
export HELM_VERSION=${{ steps.vars.outputs.tag }}
|
export HELM_VERSION=${{ steps.vars.outputs.tag }}
|
||||||
export HELM_REPO=ghcr.io/${{ github.repository_owner }}
|
export HELM_REPO=ghcr.io/${{ github.repository_owner }}
|
||||||
|
|||||||
151
.github/workflows/mcp_server-build-image.yml
vendored
Normal file
@ -0,0 +1,151 @@
|
|||||||
|
name: Build fastgpt-mcp-server images
|
||||||
|
on:
|
||||||
|
workflow_dispatch:
|
||||||
|
push:
|
||||||
|
paths:
|
||||||
|
- 'projects/mcp_server/**'
|
||||||
|
tags:
|
||||||
|
- 'v*'
|
||||||
|
jobs:
|
||||||
|
build-fastgpt-mcp_server-images:
|
||||||
|
permissions:
|
||||||
|
packages: write
|
||||||
|
contents: read
|
||||||
|
attestations: write
|
||||||
|
id-token: write
|
||||||
|
strategy:
|
||||||
|
matrix:
|
||||||
|
include:
|
||||||
|
- arch: amd64
|
||||||
|
- arch: arm64
|
||||||
|
runs-on: ubuntu-24.04-arm
|
||||||
|
runs-on: ${{ matrix.runs-on || 'ubuntu-24.04' }}
|
||||||
|
steps:
|
||||||
|
# install env
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
- name: Set up Docker Buildx
|
||||||
|
uses: docker/setup-buildx-action@v3
|
||||||
|
with:
|
||||||
|
driver-opts: network=host
|
||||||
|
- name: Cache Docker layers
|
||||||
|
uses: actions/cache@v4
|
||||||
|
with:
|
||||||
|
path: /tmp/.buildx-cache
|
||||||
|
key: ${{ runner.os }}-mcp-server-buildx-${{ github.sha }}
|
||||||
|
restore-keys: |
|
||||||
|
${{ runner.os }}-mcp_server-buildx-
|
||||||
|
|
||||||
|
# login docker
|
||||||
|
- name: Login to GitHub Container Registry
|
||||||
|
uses: docker/login-action@v3
|
||||||
|
with:
|
||||||
|
registry: ghcr.io
|
||||||
|
username: ${{ github.repository_owner }}
|
||||||
|
password: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
- name: Login to Ali Hub
|
||||||
|
uses: docker/login-action@v3
|
||||||
|
with:
|
||||||
|
registry: registry.cn-hangzhou.aliyuncs.com
|
||||||
|
username: ${{ secrets.ALI_HUB_USERNAME }}
|
||||||
|
password: ${{ secrets.ALI_HUB_PASSWORD }}
|
||||||
|
- name: Login to Docker Hub
|
||||||
|
uses: docker/login-action@v3
|
||||||
|
with:
|
||||||
|
username: ${{ secrets.DOCKER_HUB_NAME }}
|
||||||
|
password: ${{ secrets.DOCKER_HUB_PASSWORD }}
|
||||||
|
|
||||||
|
- name: Build for ${{ matrix.arch }}
|
||||||
|
id: build
|
||||||
|
uses: docker/build-push-action@v6
|
||||||
|
with:
|
||||||
|
context: .
|
||||||
|
file: projects/mcp_server/Dockerfile
|
||||||
|
platforms: linux/${{ matrix.arch }}
|
||||||
|
labels: |
|
||||||
|
org.opencontainers.image.source=https://github.com/${{ github.repository }}
|
||||||
|
org.opencontainers.image.description=fastgpt-mcp_server image
|
||||||
|
outputs: type=image,"name=ghcr.io/${{ github.repository_owner }}/fastgpt-mcp_server,${{ secrets.ALI_IMAGE_NAME }}/fastgpt-mcp_server,${{ secrets.DOCKER_IMAGE_NAME }}/fastgpt-mcp_server",push-by-digest=true,push=true
|
||||||
|
cache-from: type=local,src=/tmp/.buildx-cache
|
||||||
|
cache-to: type=local,dest=/tmp/.buildx-cache
|
||||||
|
|
||||||
|
- name: Export digest
|
||||||
|
run: |
|
||||||
|
mkdir -p ${{ runner.temp }}/digests
|
||||||
|
digest="${{ steps.build.outputs.digest }}"
|
||||||
|
touch "${{ runner.temp }}/digests/${digest#sha256:}"
|
||||||
|
|
||||||
|
- name: Upload digest
|
||||||
|
uses: actions/upload-artifact@v4
|
||||||
|
with:
|
||||||
|
name: digests-fastgpt-mcp_server-${{ github.sha }}-${{ matrix.arch }}
|
||||||
|
path: ${{ runner.temp }}/digests/*
|
||||||
|
if-no-files-found: error
|
||||||
|
retention-days: 1
|
||||||
|
|
||||||
|
release-fastgpt-mcp_server-images:
|
||||||
|
permissions:
|
||||||
|
packages: write
|
||||||
|
contents: read
|
||||||
|
attestations: write
|
||||||
|
id-token: write
|
||||||
|
needs: build-fastgpt-mcp_server-images
|
||||||
|
runs-on: ubuntu-24.04
|
||||||
|
steps:
|
||||||
|
- name: Login to GitHub Container Registry
|
||||||
|
uses: docker/login-action@v3
|
||||||
|
with:
|
||||||
|
registry: ghcr.io
|
||||||
|
username: ${{ github.repository_owner }}
|
||||||
|
password: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
- name: Login to Ali Hub
|
||||||
|
uses: docker/login-action@v3
|
||||||
|
with:
|
||||||
|
registry: registry.cn-hangzhou.aliyuncs.com
|
||||||
|
username: ${{ secrets.ALI_HUB_USERNAME }}
|
||||||
|
password: ${{ secrets.ALI_HUB_PASSWORD }}
|
||||||
|
- name: Login to Docker Hub
|
||||||
|
uses: docker/login-action@v3
|
||||||
|
with:
|
||||||
|
username: ${{ secrets.DOCKER_HUB_NAME }}
|
||||||
|
password: ${{ secrets.DOCKER_HUB_PASSWORD }}
|
||||||
|
|
||||||
|
- name: Download digests
|
||||||
|
uses: actions/download-artifact@v4
|
||||||
|
with:
|
||||||
|
path: ${{ runner.temp }}/digests
|
||||||
|
pattern: digests-fastgpt-mcp_server-${{ github.sha }}-*
|
||||||
|
merge-multiple: true
|
||||||
|
|
||||||
|
- name: Set up Docker Buildx
|
||||||
|
uses: docker/setup-buildx-action@v3
|
||||||
|
|
||||||
|
- name: Set image name and tag
|
||||||
|
run: |
|
||||||
|
if [[ "${{ github.ref_name }}" == "main" ]]; then
|
||||||
|
echo "Git_Tag=ghcr.io/${{ github.repository_owner }}/fastgpt-mcp_server:latest" >> $GITHUB_ENV
|
||||||
|
echo "Git_Latest=ghcr.io/${{ github.repository_owner }}/fastgpt-mcp_server:latest" >> $GITHUB_ENV
|
||||||
|
echo "Ali_Tag=${{ secrets.ALI_IMAGE_NAME }}/fastgpt-mcp_server:latest" >> $GITHUB_ENV
|
||||||
|
echo "Ali_Latest=${{ secrets.ALI_IMAGE_NAME }}/fastgpt-mcp_server:latest" >> $GITHUB_ENV
|
||||||
|
echo "Docker_Hub_Tag=${{ secrets.DOCKER_IMAGE_NAME }}/fastgpt-mcp_server:latest" >> $GITHUB_ENV
|
||||||
|
echo "Docker_Hub_Latest=${{ secrets.DOCKER_IMAGE_NAME }}/fastgpt-mcp_server:latest" >> $GITHUB_ENV
|
||||||
|
else
|
||||||
|
echo "Git_Tag=ghcr.io/${{ github.repository_owner }}/fastgpt-mcp_server:${{ github.ref_name }}" >> $GITHUB_ENV
|
||||||
|
echo "Git_Latest=ghcr.io/${{ github.repository_owner }}/fastgpt-mcp_server:latest" >> $GITHUB_ENV
|
||||||
|
echo "Ali_Tag=${{ secrets.ALI_IMAGE_NAME }}/fastgpt-mcp_server:${{ github.ref_name }}" >> $GITHUB_ENV
|
||||||
|
echo "Ali_Latest=${{ secrets.ALI_IMAGE_NAME }}/fastgpt-mcp_server:latest" >> $GITHUB_ENV
|
||||||
|
echo "Docker_Hub_Tag=${{ secrets.DOCKER_IMAGE_NAME }}/fastgpt-mcp_server:${{ github.ref_name }}" >> $GITHUB_ENV
|
||||||
|
echo "Docker_Hub_Latest=${{ secrets.DOCKER_IMAGE_NAME }}/fastgpt-mcp_server:latest" >> $GITHUB_ENV
|
||||||
|
fi
|
||||||
|
|
||||||
|
- name: Create manifest list and push
|
||||||
|
working-directory: ${{ runner.temp }}/digests
|
||||||
|
run: |
|
||||||
|
TAGS="$(echo -e "${Git_Tag}\n${Git_Latest}\n${Ali_Tag}\n${Ali_Latest}\n${Docker_Hub_Tag}\n${Docker_Hub_Latest}")"
|
||||||
|
for TAG in $TAGS; do
|
||||||
|
docker buildx imagetools create -t $TAG \
|
||||||
|
$(printf 'ghcr.io/${{ github.repository_owner }}/fastgpt-mcp_server@sha256:%s ' *)
|
||||||
|
sleep 5
|
||||||
|
done
|
||||||
131
.github/workflows/sandbox-build-image.yml
vendored
@ -8,50 +8,120 @@ on:
|
|||||||
- 'v*'
|
- 'v*'
|
||||||
jobs:
|
jobs:
|
||||||
build-fastgpt-sandbox-images:
|
build-fastgpt-sandbox-images:
|
||||||
runs-on: ubuntu-20.04
|
permissions:
|
||||||
|
packages: write
|
||||||
|
contents: read
|
||||||
|
attestations: write
|
||||||
|
id-token: write
|
||||||
|
strategy:
|
||||||
|
matrix:
|
||||||
|
include:
|
||||||
|
- arch: amd64
|
||||||
|
- arch: arm64
|
||||||
|
runs-on: ubuntu-24.04-arm
|
||||||
|
runs-on: ${{ matrix.runs-on || 'ubuntu-24.04' }}
|
||||||
steps:
|
steps:
|
||||||
# install env
|
# install env
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v3
|
uses: actions/checkout@v3
|
||||||
with:
|
with:
|
||||||
fetch-depth: 0
|
fetch-depth: 0
|
||||||
- name: Install Dependencies
|
|
||||||
run: |
|
|
||||||
sudo apt update && sudo apt install -y nodejs npm
|
|
||||||
- name: Set up QEMU (optional)
|
|
||||||
uses: docker/setup-qemu-action@v2
|
|
||||||
- name: Set up Docker Buildx
|
- name: Set up Docker Buildx
|
||||||
uses: docker/setup-buildx-action@v2
|
uses: docker/setup-buildx-action@v3
|
||||||
with:
|
with:
|
||||||
driver-opts: network=host
|
driver-opts: network=host
|
||||||
- name: Cache Docker layers
|
- name: Cache Docker layers
|
||||||
uses: actions/cache@v2
|
uses: actions/cache@v4
|
||||||
with:
|
with:
|
||||||
path: /tmp/.buildx-cache
|
path: /tmp/.buildx-cache
|
||||||
key: ${{ runner.os }}-buildx-${{ github.sha }}
|
key: ${{ runner.os }}-sandbox-buildx-${{ github.sha }}
|
||||||
restore-keys: |
|
restore-keys: |
|
||||||
${{ runner.os }}-buildx-
|
${{ runner.os }}-sandbox-buildx-
|
||||||
|
|
||||||
# login docker
|
# login docker
|
||||||
- name: Login to GitHub Container Registry
|
- name: Login to GitHub Container Registry
|
||||||
uses: docker/login-action@v2
|
uses: docker/login-action@v3
|
||||||
with:
|
with:
|
||||||
registry: ghcr.io
|
registry: ghcr.io
|
||||||
username: ${{ github.repository_owner }}
|
username: ${{ github.repository_owner }}
|
||||||
password: ${{ secrets.GH_PAT }}
|
password: ${{ secrets.GITHUB_TOKEN }}
|
||||||
- name: Login to Ali Hub
|
- name: Login to Ali Hub
|
||||||
uses: docker/login-action@v2
|
uses: docker/login-action@v3
|
||||||
with:
|
with:
|
||||||
registry: registry.cn-hangzhou.aliyuncs.com
|
registry: registry.cn-hangzhou.aliyuncs.com
|
||||||
username: ${{ secrets.ALI_HUB_USERNAME }}
|
username: ${{ secrets.ALI_HUB_USERNAME }}
|
||||||
password: ${{ secrets.ALI_HUB_PASSWORD }}
|
password: ${{ secrets.ALI_HUB_PASSWORD }}
|
||||||
- name: Login to Docker Hub
|
- name: Login to Docker Hub
|
||||||
uses: docker/login-action@v2
|
uses: docker/login-action@v3
|
||||||
with:
|
with:
|
||||||
username: ${{ secrets.DOCKER_HUB_NAME }}
|
username: ${{ secrets.DOCKER_HUB_NAME }}
|
||||||
password: ${{ secrets.DOCKER_HUB_PASSWORD }}
|
password: ${{ secrets.DOCKER_HUB_PASSWORD }}
|
||||||
|
|
||||||
# Set tag
|
- name: Build for ${{ matrix.arch }}
|
||||||
|
id: build
|
||||||
|
uses: docker/build-push-action@v6
|
||||||
|
with:
|
||||||
|
context: .
|
||||||
|
file: projects/sandbox/Dockerfile
|
||||||
|
platforms: linux/${{ matrix.arch }}
|
||||||
|
labels: |
|
||||||
|
org.opencontainers.image.source=https://github.com/${{ github.repository }}
|
||||||
|
org.opencontainers.image.description=fastgpt-sandbox image
|
||||||
|
outputs: type=image,"name=ghcr.io/${{ github.repository_owner }}/fastgpt-sandbox,${{ secrets.ALI_IMAGE_NAME }}/fastgpt-sandbox,${{ secrets.DOCKER_IMAGE_NAME }}/fastgpt-sandbox",push-by-digest=true,push=true
|
||||||
|
cache-from: type=local,src=/tmp/.buildx-cache
|
||||||
|
cache-to: type=local,dest=/tmp/.buildx-cache
|
||||||
|
|
||||||
|
- name: Export digest
|
||||||
|
run: |
|
||||||
|
mkdir -p ${{ runner.temp }}/digests
|
||||||
|
digest="${{ steps.build.outputs.digest }}"
|
||||||
|
touch "${{ runner.temp }}/digests/${digest#sha256:}"
|
||||||
|
|
||||||
|
- name: Upload digest
|
||||||
|
uses: actions/upload-artifact@v4
|
||||||
|
with:
|
||||||
|
name: digests-fastgpt-sandbox-${{ github.sha }}-${{ matrix.arch }}
|
||||||
|
path: ${{ runner.temp }}/digests/*
|
||||||
|
if-no-files-found: error
|
||||||
|
retention-days: 1
|
||||||
|
|
||||||
|
release-fastgpt-sandbox-images:
|
||||||
|
permissions:
|
||||||
|
packages: write
|
||||||
|
contents: read
|
||||||
|
attestations: write
|
||||||
|
id-token: write
|
||||||
|
needs: build-fastgpt-sandbox-images
|
||||||
|
runs-on: ubuntu-24.04
|
||||||
|
steps:
|
||||||
|
- name: Login to GitHub Container Registry
|
||||||
|
uses: docker/login-action@v3
|
||||||
|
with:
|
||||||
|
registry: ghcr.io
|
||||||
|
username: ${{ github.repository_owner }}
|
||||||
|
password: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
- name: Login to Ali Hub
|
||||||
|
uses: docker/login-action@v3
|
||||||
|
with:
|
||||||
|
registry: registry.cn-hangzhou.aliyuncs.com
|
||||||
|
username: ${{ secrets.ALI_HUB_USERNAME }}
|
||||||
|
password: ${{ secrets.ALI_HUB_PASSWORD }}
|
||||||
|
- name: Login to Docker Hub
|
||||||
|
uses: docker/login-action@v3
|
||||||
|
with:
|
||||||
|
username: ${{ secrets.DOCKER_HUB_NAME }}
|
||||||
|
password: ${{ secrets.DOCKER_HUB_PASSWORD }}
|
||||||
|
|
||||||
|
- name: Download digests
|
||||||
|
uses: actions/download-artifact@v4
|
||||||
|
with:
|
||||||
|
path: ${{ runner.temp }}/digests
|
||||||
|
pattern: digests-fastgpt-sandbox-${{ github.sha }}-*
|
||||||
|
merge-multiple: true
|
||||||
|
|
||||||
|
- name: Set up Docker Buildx
|
||||||
|
uses: docker/setup-buildx-action@v3
|
||||||
|
|
||||||
- name: Set image name and tag
|
- name: Set image name and tag
|
||||||
run: |
|
run: |
|
||||||
if [[ "${{ github.ref_name }}" == "main" ]]; then
|
if [[ "${{ github.ref_name }}" == "main" ]]; then
|
||||||
@ -70,27 +140,12 @@ jobs:
|
|||||||
echo "Docker_Hub_Latest=${{ secrets.DOCKER_IMAGE_NAME }}/fastgpt-sandbox:latest" >> $GITHUB_ENV
|
echo "Docker_Hub_Latest=${{ secrets.DOCKER_IMAGE_NAME }}/fastgpt-sandbox:latest" >> $GITHUB_ENV
|
||||||
fi
|
fi
|
||||||
|
|
||||||
- name: Build and publish image for main branch or tag push event
|
- name: Create manifest list and push
|
||||||
env:
|
working-directory: ${{ runner.temp }}/digests
|
||||||
Git_Tag: ${{ env.Git_Tag }}
|
|
||||||
Git_Latest: ${{ env.Git_Latest }}
|
|
||||||
Ali_Tag: ${{ env.Ali_Tag }}
|
|
||||||
Ali_Latest: ${{ env.Ali_Latest }}
|
|
||||||
Docker_Hub_Tag: ${{ env.Docker_Hub_Tag }}
|
|
||||||
Docker_Hub_Latest: ${{ env.Docker_Hub_Latest }}
|
|
||||||
run: |
|
run: |
|
||||||
docker buildx build \
|
TAGS="$(echo -e "${Git_Tag}\n${Git_Latest}\n${Ali_Tag}\n${Ali_Latest}\n${Docker_Hub_Tag}\n${Docker_Hub_Latest}")"
|
||||||
-f projects/sandbox/Dockerfile \
|
for TAG in $TAGS; do
|
||||||
--platform linux/amd64,linux/arm64 \
|
docker buildx imagetools create -t $TAG \
|
||||||
--label "org.opencontainers.image.source=https://github.com/${{ github.repository_owner }}/fastgpt-sandbox" \
|
$(printf 'ghcr.io/${{ github.repository_owner }}/fastgpt-sandbox@sha256:%s ' *)
|
||||||
--label "org.opencontainers.image.description=fastgpt-sandbox image" \
|
sleep 5
|
||||||
--push \
|
done
|
||||||
--cache-from=type=local,src=/tmp/.buildx-cache \
|
|
||||||
--cache-to=type=local,dest=/tmp/.buildx-cache \
|
|
||||||
-t ${Git_Tag} \
|
|
||||||
-t ${Git_Latest} \
|
|
||||||
-t ${Ali_Tag} \
|
|
||||||
-t ${Ali_Latest} \
|
|
||||||
-t ${Docker_Hub_Tag} \
|
|
||||||
-t ${Docker_Hub_Latest} \
|
|
||||||
.
|
|
||||||
|
|||||||
1
.gitignore
vendored
@ -44,3 +44,4 @@ files/helm/fastgpt/fastgpt-0.1.0.tgz
|
|||||||
files/helm/fastgpt/charts/*.tgz
|
files/helm/fastgpt/charts/*.tgz
|
||||||
|
|
||||||
tmp/
|
tmp/
|
||||||
|
coverage
|
||||||
|
|||||||
@ -5,4 +5,6 @@ node_modules
|
|||||||
docSite/
|
docSite/
|
||||||
*.md
|
*.md
|
||||||
|
|
||||||
cl100l_base.ts
|
pnpm-lock.yaml
|
||||||
|
cl100l_base.ts
|
||||||
|
dict.json
|
||||||
10
.vscode/i18n-ally-custom-framework.yml
vendored
@ -16,16 +16,6 @@ usageMatchRegex:
|
|||||||
# the `{key}` will be placed by a proper keypath matching regex,
|
# the `{key}` will be placed by a proper keypath matching regex,
|
||||||
# you can ignore it and use your own matching rules as well
|
# you can ignore it and use your own matching rules as well
|
||||||
- "[^\\w\\d]t\\(['\"`]({key})['\"`]"
|
- "[^\\w\\d]t\\(['\"`]({key})['\"`]"
|
||||||
- "[^\\w\\d]commonT\\(['\"`]({key})['\"`]"
|
|
||||||
# 支持 appT("your.i18n.keys")
|
|
||||||
- "[^\\w\\d]appT\\(['\"`]({key})['\"`]"
|
|
||||||
# 支持 datasetT("your.i18n.keys")
|
|
||||||
- "[^\\w\\d]datasetT\\(['\"`]({key})['\"`]"
|
|
||||||
- "[^\\w\\d]fileT\\(['\"`]({key})['\"`]"
|
|
||||||
- "[^\\w\\d]publishT\\(['\"`]({key})['\"`]"
|
|
||||||
- "[^\\w\\d]workflowT\\(['\"`]({key})['\"`]"
|
|
||||||
- "[^\\w\\d]userT\\(['\"`]({key})['\"`]"
|
|
||||||
- "[^\\w\\d]chatT\\(['\"`]({key})['\"`]"
|
|
||||||
- "[^\\w\\d]i18nT\\(['\"`]({key})['\"`]"
|
- "[^\\w\\d]i18nT\\(['\"`]({key})['\"`]"
|
||||||
|
|
||||||
# A RegEx to set a custom scope range. This scope will be used as a prefix when detecting keys
|
# A RegEx to set a custom scope range. This scope will be used as a prefix when detecting keys
|
||||||
|
|||||||
39
.vscode/launch.json
vendored
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
{
|
||||||
|
"version": "0.2.0",
|
||||||
|
"configurations": [
|
||||||
|
{
|
||||||
|
"name": "Next.js: debug server-side",
|
||||||
|
"type": "node-terminal",
|
||||||
|
"request": "launch",
|
||||||
|
"command": "pnpm run dev",
|
||||||
|
"cwd": "${workspaceFolder}/projects/app"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Next.js: debug client-side",
|
||||||
|
"type": "chrome",
|
||||||
|
"request": "launch",
|
||||||
|
"url": "http://localhost:3000"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Next.js: debug client-side (Edge)",
|
||||||
|
"type": "msedge",
|
||||||
|
"request": "launch",
|
||||||
|
"url": "http://localhost:3000"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Next.js: debug full stack",
|
||||||
|
"type": "node-terminal",
|
||||||
|
"request": "launch",
|
||||||
|
"command": "pnpm run dev",
|
||||||
|
"cwd": "${workspaceFolder}/projects/app",
|
||||||
|
"skipFiles": ["<node_internals>/**"],
|
||||||
|
"serverReadyAction": {
|
||||||
|
"action": "debugWithEdge",
|
||||||
|
"killOnServerStop": true,
|
||||||
|
"pattern": "- Local:.+(https?://.+)",
|
||||||
|
"uriFormat": "%s",
|
||||||
|
"webRoot": "${workspaceFolder}/projects/app"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
72
.vscode/nextapi.code-snippets
vendored
@ -52,71 +52,17 @@
|
|||||||
"description": "FastGPT usecontext template"
|
"description": "FastGPT usecontext template"
|
||||||
},
|
},
|
||||||
|
|
||||||
"Jest test template": {
|
"Vitest test case template": {
|
||||||
"scope": "typescriptreact",
|
"scope": "typescript",
|
||||||
"prefix": "jesttest",
|
"prefix": "template_test",
|
||||||
"body": [
|
"body": [
|
||||||
"import '@/pages/api/__mocks__/base';",
|
"import { describe, it, expect } from 'vitest';",
|
||||||
"import { root } from '@/pages/api/__mocks__/db/init';",
|
|
||||||
"import { getTestRequest } from '@fastgpt/service/test/utils'; ;",
|
|
||||||
"import { AppErrEnum } from '@fastgpt/global/common/error/code/app';",
|
|
||||||
"import handler from './demo';",
|
|
||||||
"",
|
"",
|
||||||
"// Import the schema",
|
"describe('authType2UsageSource', () => {",
|
||||||
"import { MongoOutLink } from '@fastgpt/service/support/outLink/schema';",
|
" it('Test description', () => {",
|
||||||
"",
|
" expect().toBe();",
|
||||||
"beforeAll(async () => {",
|
" });",
|
||||||
" // await MongoOutLink.create({",
|
|
||||||
" // shareId: 'aaa',",
|
|
||||||
" // appId: root.appId,",
|
|
||||||
" // tmbId: root.tmbId,",
|
|
||||||
" // teamId: root.teamId,",
|
|
||||||
" // type: 'share',",
|
|
||||||
" // name: 'aaa'",
|
|
||||||
" // })",
|
|
||||||
"});",
|
|
||||||
"",
|
|
||||||
"test('Should return a list of outLink', async () => {",
|
|
||||||
" // Mock request",
|
|
||||||
" const res = (await handler(",
|
|
||||||
" ...getTestRequest({",
|
|
||||||
" query: {",
|
|
||||||
" appId: root.appId,",
|
|
||||||
" type: 'share'",
|
|
||||||
" },",
|
|
||||||
" user: root",
|
|
||||||
" })",
|
|
||||||
" )) as any;",
|
|
||||||
"",
|
|
||||||
" expect(res.code).toBe(200);",
|
|
||||||
" expect(res.data.length).toBe(2);",
|
|
||||||
"});",
|
|
||||||
"",
|
|
||||||
"test('appId is required', async () => {",
|
|
||||||
" const res = (await handler(",
|
|
||||||
" ...getTestRequest({",
|
|
||||||
" query: {",
|
|
||||||
" type: 'share'",
|
|
||||||
" },",
|
|
||||||
" user: root",
|
|
||||||
" })",
|
|
||||||
" )) as any;",
|
|
||||||
" expect(res.code).toBe(500);",
|
|
||||||
" expect(res.error).toBe(AppErrEnum.unExist);",
|
|
||||||
"});",
|
|
||||||
"",
|
|
||||||
"test('if type is not provided, return nothing', async () => {",
|
|
||||||
" const res = (await handler(",
|
|
||||||
" ...getTestRequest({",
|
|
||||||
" query: {",
|
|
||||||
" appId: root.appId",
|
|
||||||
" },",
|
|
||||||
" user: root",
|
|
||||||
" })",
|
|
||||||
" )) as any;",
|
|
||||||
" expect(res.code).toBe(200);",
|
|
||||||
" expect(res.data.length).toBe(0);",
|
|
||||||
"});"
|
"});"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
6
.vscode/settings.json
vendored
@ -21,13 +21,11 @@
|
|||||||
"i18n-ally.namespace": true,
|
"i18n-ally.namespace": true,
|
||||||
"i18n-ally.pathMatcher": "{locale}/{namespaces}.json",
|
"i18n-ally.pathMatcher": "{locale}/{namespaces}.json",
|
||||||
"i18n-ally.extract.targetPickingStrategy": "most-similar-by-key",
|
"i18n-ally.extract.targetPickingStrategy": "most-similar-by-key",
|
||||||
"i18n-ally.translate.engines": ["google"],
|
"i18n-ally.translate.engines": ["deepl","google"],
|
||||||
"[typescript]": {
|
"[typescript]": {
|
||||||
"editor.defaultFormatter": "esbenp.prettier-vscode"
|
"editor.defaultFormatter": "esbenp.prettier-vscode"
|
||||||
},
|
},
|
||||||
"markdown.copyFiles.destination": {
|
"markdown.copyFiles.destination": {
|
||||||
"/docSite/content/**/*": "${documentWorkspaceFolder}/docSite/assets/imgs/"
|
"/docSite/content/**/*": "${documentWorkspaceFolder}/docSite/assets/imgs/"
|
||||||
},
|
}
|
||||||
"markdown.copyFiles.overwriteBehavior": "nameIncrementally",
|
|
||||||
"markdown.copyFiles.transformPath": "const filename = uri.path.split('/').pop(); return `/imgs/${filename}`;"
|
|
||||||
}
|
}
|
||||||
2
Makefile
@ -17,7 +17,7 @@ dev:
|
|||||||
|
|
||||||
build:
|
build:
|
||||||
ifeq ($(proxy), taobao)
|
ifeq ($(proxy), taobao)
|
||||||
docker build -f $(filePath) -t $(image) . --build-arg proxy=taobao
|
docker build -f $(filePath) -t $(image) . --build-arg proxy=taobao
|
||||||
else ifeq ($(proxy), clash)
|
else ifeq ($(proxy), clash)
|
||||||
docker build -f $(filePath) -t $(image) . --network host --build-arg HTTP_PROXY=http://127.0.0.1:7890 --build-arg HTTPS_PROXY=http://127.0.0.1:7890
|
docker build -f $(filePath) -t $(image) . --network host --build-arg HTTP_PROXY=http://127.0.0.1:7890 --build-arg HTTPS_PROXY=http://127.0.0.1:7890
|
||||||
else
|
else
|
||||||
|
|||||||
29
README.md
@ -10,7 +10,7 @@
|
|||||||
<a href="./README_ja.md">日语</a>
|
<a href="./README_ja.md">日语</a>
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
FastGPT 是一个基于 LLM 大语言模型的知识库问答系统,提供开箱即用的数据处理、模型调用等能力。同时可以通过 Flow 可视化进行工作流编排,从而实现复杂的问答场景!
|
FastGPT 是一个 AI Agent 构建平台,提供开箱即用的数据处理、模型调用等能力,同时可以通过 Flow 可视化进行工作流编排,从而实现复杂的应用场景!
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@ -114,16 +114,6 @@ https://github.com/labring/FastGPT/assets/15308462/7d3a38df-eb0e-4388-9250-2409b
|
|||||||
<img src="https://img.shields.io/badge/-返回顶部-7d09f1.svg" alt="#" align="right">
|
<img src="https://img.shields.io/badge/-返回顶部-7d09f1.svg" alt="#" align="right">
|
||||||
</a>
|
</a>
|
||||||
|
|
||||||
## 🏘️ 社区交流群
|
|
||||||
|
|
||||||
扫码加入飞书话题群:
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
<a href="#readme">
|
|
||||||
<img src="https://img.shields.io/badge/-返回顶部-7d09f1.svg" alt="#" align="right">
|
|
||||||
</a>
|
|
||||||
|
|
||||||
## 🏘️ 加入我们
|
## 🏘️ 加入我们
|
||||||
|
|
||||||
我们正在寻找志同道合的小伙伴,加速 FastGPT 的发展。你可以通过 [FastGPT 2025 招聘](https://fael3z0zfze.feishu.cn/wiki/P7FOwEmPziVcaYkvVaacnVX1nvg)了解 FastGPT 的招聘信息。
|
我们正在寻找志同道合的小伙伴,加速 FastGPT 的发展。你可以通过 [FastGPT 2025 招聘](https://fael3z0zfze.feishu.cn/wiki/P7FOwEmPziVcaYkvVaacnVX1nvg)了解 FastGPT 的招聘信息。
|
||||||
@ -133,17 +123,26 @@ https://github.com/labring/FastGPT/assets/15308462/7d3a38df-eb0e-4388-9250-2409b
|
|||||||
- [Laf:3 分钟快速接入三方应用](https://github.com/labring/laf)
|
- [Laf:3 分钟快速接入三方应用](https://github.com/labring/laf)
|
||||||
- [Sealos:快速部署集群应用](https://github.com/labring/sealos)
|
- [Sealos:快速部署集群应用](https://github.com/labring/sealos)
|
||||||
- [One API:多模型管理,支持 Azure、文心一言等](https://github.com/songquanpeng/one-api)
|
- [One API:多模型管理,支持 Azure、文心一言等](https://github.com/songquanpeng/one-api)
|
||||||
- [TuShan:5 分钟搭建后台管理系统](https://github.com/msgbyte/tushan)
|
|
||||||
|
|
||||||
<a href="#readme">
|
<a href="#readme">
|
||||||
<img src="https://img.shields.io/badge/-返回顶部-7d09f1.svg" alt="#" align="right">
|
<img src="https://img.shields.io/badge/-返回顶部-7d09f1.svg" alt="#" align="right">
|
||||||
</a>
|
</a>
|
||||||
|
|
||||||
|
|
||||||
## 🌿 第三方生态
|
## 🌿 第三方生态
|
||||||
|
- [PPIO 派欧云:一键调用高性价比的开源模型 API 和 GPU 容器](https://ppinfra.com/user/register?invited_by=VITYVU&utm_source=github_fastgpt)
|
||||||
- [COW 个人微信/企微机器人](https://doc.tryfastgpt.ai/docs/use-cases/external-integration/onwechat/)
|
- [AI Proxy:国内模型聚合服务](https://sealos.run/aiproxy/?k=fastgpt-github/)
|
||||||
- [SiliconCloud (硅基流动) —— 开源模型在线体验平台](https://cloud.siliconflow.cn/i/TR9Ym0c4)
|
- [SiliconCloud (硅基流动) —— 开源模型在线体验平台](https://cloud.siliconflow.cn/i/TR9Ym0c4)
|
||||||
|
- [COW 个人微信/企微机器人](https://doc.tryfastgpt.ai/docs/use-cases/external-integration/onwechat/)
|
||||||
|
|
||||||
|
<a href="#readme">
|
||||||
|
<img src="https://img.shields.io/badge/-返回顶部-7d09f1.svg" alt="#" align="right">
|
||||||
|
</a>
|
||||||
|
|
||||||
|
## 🏘️ 社区交流群
|
||||||
|
|
||||||
|
扫码加入飞书话题群:
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
<a href="#readme">
|
<a href="#readme">
|
||||||
<img src="https://img.shields.io/badge/-返回顶部-7d09f1.svg" alt="#" align="right">
|
<img src="https://img.shields.io/badge/-返回顶部-7d09f1.svg" alt="#" align="right">
|
||||||
|
|||||||
@ -69,7 +69,7 @@ Project tech stack: NextJs + TS + ChakraUI + MongoDB + PostgreSQL (PG Vector plu
|
|||||||
|
|
||||||
> When using [Sealos](https://sealos.io) services, there is no need to purchase servers or domain names. It supports high concurrency and dynamic scaling, and the database application uses the kubeblocks database, which far exceeds the simple Docker container deployment in terms of IO performance.
|
> When using [Sealos](https://sealos.io) services, there is no need to purchase servers or domain names. It supports high concurrency and dynamic scaling, and the database application uses the kubeblocks database, which far exceeds the simple Docker container deployment in terms of IO performance.
|
||||||
<div align="center">
|
<div align="center">
|
||||||
[](https://cloud.sealos.io/?openapp=system-fastdeploy%3FtemplateName%3Dfastgpt)
|
[](https://cloud.sealos.io/?openapp=system-fastdeploy%3FtemplateName%3Dfastgpt&uid=fnWRt09fZP)
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
Give it a 2-4 minute wait after deployment as it sets up the database. Initially, it might be a too slow since we're using the basic settings.
|
Give it a 2-4 minute wait after deployment as it sets up the database. Initially, it might be a too slow since we're using the basic settings.
|
||||||
|
|||||||
@ -94,7 +94,7 @@ https://github.com/labring/FastGPT/assets/15308462/7d3a38df-eb0e-4388-9250-2409b
|
|||||||
|
|
||||||
- **⚡ デプロイ**
|
- **⚡ デプロイ**
|
||||||
|
|
||||||
[](https://cloud.sealos.io/?openapp=system-fastdeploy%3FtemplateName%3Dfastgpt)
|
[](https://cloud.sealos.io/?openapp=system-fastdeploy%3FtemplateName%3Dfastgpt&uid=fnWRt09fZP)
|
||||||
|
|
||||||
デプロイ 後、データベースをセットアップするので、2~4分待 ってください。基本設定 を 使 っているので、最初 は 少 し 遅 いかもしれません。
|
デプロイ 後、データベースをセットアップするので、2~4分待 ってください。基本設定 を 使 っているので、最初 は 少 し 遅 いかもしれません。
|
||||||
|
|
||||||
|
|||||||
@ -100,7 +100,7 @@ services:
|
|||||||
exec docker-entrypoint.sh "$$@" &
|
exec docker-entrypoint.sh "$$@" &
|
||||||
|
|
||||||
# 等待MongoDB服务启动
|
# 等待MongoDB服务启动
|
||||||
until mongo -u myusername -p mypassword --authenticationDatabase admin --eval "print('waited for connection')" > /dev/null 2>&1; do
|
until mongo -u myusername -p mypassword --authenticationDatabase admin --eval "print('waited for connection')"; do
|
||||||
echo "Waiting for MongoDB to start..."
|
echo "Waiting for MongoDB to start..."
|
||||||
sleep 2
|
sleep 2
|
||||||
done
|
done
|
||||||
@ -110,19 +110,48 @@ services:
|
|||||||
|
|
||||||
# 等待docker-entrypoint.sh脚本执行的MongoDB服务进程
|
# 等待docker-entrypoint.sh脚本执行的MongoDB服务进程
|
||||||
wait $$!
|
wait $$!
|
||||||
|
redis:
|
||||||
|
image: redis:7.2-alpine
|
||||||
|
container_name: redis
|
||||||
|
# ports:
|
||||||
|
# - 6379:6379
|
||||||
|
networks:
|
||||||
|
- fastgpt
|
||||||
|
restart: always
|
||||||
|
command: |
|
||||||
|
redis-server --requirepass mypassword --loglevel warning --maxclients 10000 --appendonly yes --save 60 10 --maxmemory 4gb --maxmemory-policy noeviction
|
||||||
|
healthcheck:
|
||||||
|
test: ['CMD', 'redis-cli', '-a', 'mypassword', 'ping']
|
||||||
|
interval: 10s
|
||||||
|
timeout: 3s
|
||||||
|
retries: 3
|
||||||
|
start_period: 30s
|
||||||
|
volumes:
|
||||||
|
- ./redis/data:/data
|
||||||
|
|
||||||
# fastgpt
|
# fastgpt
|
||||||
sandbox:
|
sandbox:
|
||||||
container_name: sandbox
|
container_name: sandbox
|
||||||
image: ghcr.io/labring/fastgpt-sandbox:v4.8.23-fix # git
|
image: ghcr.io/labring/fastgpt-sandbox:v4.9.10-fix2 # git
|
||||||
# image: registry.cn-hangzhou.aliyuncs.com/fastgpt/fastgpt-sandbox:v4.8.23-fix # 阿里云
|
# image: registry.cn-hangzhou.aliyuncs.com/fastgpt/fastgpt-sandbox:v4.9.10-fix2 # 阿里云
|
||||||
networks:
|
networks:
|
||||||
- fastgpt
|
- fastgpt
|
||||||
restart: always
|
restart: always
|
||||||
|
fastgpt-mcp-server:
|
||||||
|
container_name: fastgpt-mcp-server
|
||||||
|
image: ghcr.io/labring/fastgpt-mcp_server:v4.9.10-fix2 # git
|
||||||
|
# image: registry.cn-hangzhou.aliyuncs.com/fastgpt/fastgpt-mcp_server:v4.9.10-fix2 # 阿里云
|
||||||
|
ports:
|
||||||
|
- 3005:3000
|
||||||
|
networks:
|
||||||
|
- fastgpt
|
||||||
|
restart: always
|
||||||
|
environment:
|
||||||
|
- FASTGPT_ENDPOINT=http://fastgpt:3000
|
||||||
fastgpt:
|
fastgpt:
|
||||||
container_name: fastgpt
|
container_name: fastgpt
|
||||||
image: ghcr.io/labring/fastgpt:v4.8.23-fix # git
|
image: ghcr.io/labring/fastgpt:v4.9.10-fix2 # git
|
||||||
# image: registry.cn-hangzhou.aliyuncs.com/fastgpt/fastgpt:v4.8.23-fix # 阿里云
|
# image: registry.cn-hangzhou.aliyuncs.com/fastgpt/fastgpt:v4.9.10-fix2 # 阿里云
|
||||||
ports:
|
ports:
|
||||||
- 3000:3000
|
- 3000:3000
|
||||||
networks:
|
networks:
|
||||||
@ -137,10 +166,13 @@ services:
|
|||||||
- FE_DOMAIN=
|
- FE_DOMAIN=
|
||||||
# root 密码,用户名为: root。如果需要修改 root 密码,直接修改这个环境变量,并重启即可。
|
# root 密码,用户名为: root。如果需要修改 root 密码,直接修改这个环境变量,并重启即可。
|
||||||
- DEFAULT_ROOT_PSW=1234
|
- DEFAULT_ROOT_PSW=1234
|
||||||
# AI模型的API地址哦。务必加 /v1。这里默认填写了OneApi的访问地址。
|
# AI Proxy 的地址,如果配了该地址,优先使用
|
||||||
- OPENAI_BASE_URL=http://oneapi:3000/v1
|
- AIPROXY_API_ENDPOINT=http://aiproxy:3000
|
||||||
# AI模型的API Key。(这里默认填写了OneAPI的快速默认key,测试通后,务必及时修改)
|
# AI Proxy 的 Admin Token,与 AI Proxy 中的环境变量 ADMIN_KEY
|
||||||
- CHAT_API_KEY=sk-fastgpt
|
- AIPROXY_API_TOKEN=aiproxy
|
||||||
|
# 模型中转地址(如果用了 AI Proxy,下面 2 个就不需要了,旧版 OneAPI 用户,使用下面的变量)
|
||||||
|
# - OPENAI_BASE_URL=http://oneapi:3000/v1
|
||||||
|
# - CHAT_API_KEY=sk-fastgpt
|
||||||
# 数据库最大连接数
|
# 数据库最大连接数
|
||||||
- DB_MAX_LINK=30
|
- DB_MAX_LINK=30
|
||||||
# 登录凭证密钥
|
# 登录凭证密钥
|
||||||
@ -154,6 +186,8 @@ services:
|
|||||||
# zilliz 连接参数
|
# zilliz 连接参数
|
||||||
- MILVUS_ADDRESS=http://milvusStandalone:19530
|
- MILVUS_ADDRESS=http://milvusStandalone:19530
|
||||||
- MILVUS_TOKEN=none
|
- MILVUS_TOKEN=none
|
||||||
|
# Redis 地址
|
||||||
|
- REDIS_URL=redis://default:mypassword@redis:6379
|
||||||
# sandbox 地址
|
# sandbox 地址
|
||||||
- SANDBOX_URL=http://sandbox:3000
|
- SANDBOX_URL=http://sandbox:3000
|
||||||
# 日志等级: debug, info, warn, error
|
# 日志等级: debug, info, warn, error
|
||||||
@ -167,51 +201,58 @@ services:
|
|||||||
- ALLOWED_ORIGINS=
|
- ALLOWED_ORIGINS=
|
||||||
# 是否开启IP限制,默认不开启
|
# 是否开启IP限制,默认不开启
|
||||||
- USE_IP_LIMIT=false
|
- USE_IP_LIMIT=false
|
||||||
|
# 对话文件过期天数
|
||||||
|
- CHAT_FILE_EXPIRE_TIME=7
|
||||||
volumes:
|
volumes:
|
||||||
- ./config.json:/app/data/config.json
|
- ./config.json:/app/data/config.json
|
||||||
|
|
||||||
# oneapi
|
# AI Proxy
|
||||||
mysql:
|
aiproxy:
|
||||||
image: registry.cn-hangzhou.aliyuncs.com/fastgpt/mysql:8.0.36 # 阿里云
|
image: ghcr.io/labring/aiproxy:v0.1.7
|
||||||
# image: mysql:8.0.36
|
# image: registry.cn-hangzhou.aliyuncs.com/labring/aiproxy:v0.1.7 # 阿里云
|
||||||
container_name: mysql
|
container_name: aiproxy
|
||||||
restart: always
|
restart: unless-stopped
|
||||||
ports:
|
|
||||||
- 3306:3306
|
|
||||||
networks:
|
|
||||||
- fastgpt
|
|
||||||
command: --default-authentication-plugin=mysql_native_password
|
|
||||||
environment:
|
|
||||||
# 默认root密码,仅首次运行有效
|
|
||||||
MYSQL_ROOT_PASSWORD: oneapimmysql
|
|
||||||
MYSQL_DATABASE: oneapi
|
|
||||||
volumes:
|
|
||||||
- ./mysql:/var/lib/mysql
|
|
||||||
oneapi:
|
|
||||||
container_name: oneapi
|
|
||||||
image: ghcr.io/songquanpeng/one-api:v0.6.7
|
|
||||||
# image: registry.cn-hangzhou.aliyuncs.com/fastgpt/one-api:v0.6.6 # 阿里云
|
|
||||||
ports:
|
|
||||||
- 3001:3000
|
|
||||||
depends_on:
|
depends_on:
|
||||||
- mysql
|
aiproxy_pg:
|
||||||
|
condition: service_healthy
|
||||||
networks:
|
networks:
|
||||||
- fastgpt
|
- fastgpt
|
||||||
restart: always
|
|
||||||
environment:
|
environment:
|
||||||
# mysql 连接参数
|
# 对应 fastgpt 里的AIPROXY_API_TOKEN
|
||||||
- SQL_DSN=root:oneapimmysql@tcp(mysql:3306)/oneapi
|
- ADMIN_KEY=aiproxy
|
||||||
# 登录凭证加密密钥
|
# 错误日志详情保存时间(小时)
|
||||||
- SESSION_SECRET=oneapikey
|
- LOG_DETAIL_STORAGE_HOURS=1
|
||||||
# 内存缓存
|
# 数据库连接地址
|
||||||
- MEMORY_CACHE_ENABLED=true
|
- SQL_DSN=postgres://postgres:aiproxy@aiproxy_pg:5432/aiproxy
|
||||||
# 启动聚合更新,减少数据交互频率
|
# 最大重试次数
|
||||||
- BATCH_UPDATE_ENABLED=true
|
- RETRY_TIMES=3
|
||||||
# 聚合更新时长
|
# 不需要计费
|
||||||
- BATCH_UPDATE_INTERVAL=10
|
- BILLING_ENABLED=false
|
||||||
# 初始化的 root 密钥(建议部署完后更改,否则容易泄露)
|
# 不需要严格检测模型
|
||||||
- INITIAL_ROOT_TOKEN=fastgpt
|
- DISABLE_MODEL_CONFIG=true
|
||||||
|
healthcheck:
|
||||||
|
test: ['CMD', 'curl', '-f', 'http://localhost:3000/api/status']
|
||||||
|
interval: 5s
|
||||||
|
timeout: 5s
|
||||||
|
retries: 10
|
||||||
|
aiproxy_pg:
|
||||||
|
image: pgvector/pgvector:0.8.0-pg15 # docker hub
|
||||||
|
# image: registry.cn-hangzhou.aliyuncs.com/fastgpt/pgvector:v0.8.0-pg15 # 阿里云
|
||||||
|
restart: unless-stopped
|
||||||
|
container_name: aiproxy_pg
|
||||||
volumes:
|
volumes:
|
||||||
- ./oneapi:/data
|
- ./aiproxy_pg:/var/lib/postgresql/data
|
||||||
|
networks:
|
||||||
|
- fastgpt
|
||||||
|
environment:
|
||||||
|
TZ: Asia/Shanghai
|
||||||
|
POSTGRES_USER: postgres
|
||||||
|
POSTGRES_DB: aiproxy
|
||||||
|
POSTGRES_PASSWORD: aiproxy
|
||||||
|
healthcheck:
|
||||||
|
test: ['CMD', 'pg_isready', '-U', 'postgres', '-d', 'aiproxy']
|
||||||
|
interval: 5s
|
||||||
|
timeout: 5s
|
||||||
|
retries: 10
|
||||||
networks:
|
networks:
|
||||||
fastgpt:
|
fastgpt:
|
||||||
|
|||||||
234
deploy/docker/docker-compose-oceanbase/docker-compose.yml
Normal file
@ -0,0 +1,234 @@
|
|||||||
|
# 数据库的默认账号和密码仅首次运行时设置有效
|
||||||
|
# 如果修改了账号密码,记得改数据库和项目连接参数,别只改一处~
|
||||||
|
# 该配置文件只是给快速启动,测试使用。正式使用,记得务必修改账号密码,以及调整合适的知识库参数,共享内存等。
|
||||||
|
# 如何无法访问 dockerhub 和 git,可以用阿里云(阿里云没有arm包)
|
||||||
|
|
||||||
|
version: '3.3'
|
||||||
|
services:
|
||||||
|
# vector db
|
||||||
|
ob:
|
||||||
|
image: oceanbase/oceanbase-ce:4.3.5-lts # docker hub
|
||||||
|
# image: quay.io/oceanbase/oceanbase-ce:4.3.5-lts # 镜像
|
||||||
|
container_name: ob
|
||||||
|
restart: always
|
||||||
|
# ports: # 生产环境建议不要暴露
|
||||||
|
# - 2881:2881
|
||||||
|
networks:
|
||||||
|
- fastgpt
|
||||||
|
environment:
|
||||||
|
# 这里的配置只有首次运行生效。修改后,重启镜像是不会生效的。需要把持久化数据删除再重启,才有效果
|
||||||
|
- OB_SYS_PASSWORD=obsyspassword
|
||||||
|
# 不同于传统数据库,OceanBase 数据库的账号包含更多字段,包括用户名、租户名和集群名。经典格式为“用户名@租户名#集群名”
|
||||||
|
# 比如用mysql客户端连接时,根据本文件的默认配置,应该指定 “-uroot@tenantname”
|
||||||
|
- OB_TENANT_NAME=tenantname
|
||||||
|
- OB_TENANT_PASSWORD=tenantpassword
|
||||||
|
# MODE分为MINI和NORMAL, 后者会最大程度使用主机资源
|
||||||
|
- MODE=MINI
|
||||||
|
- OB_SERVER_IP=127.0.0.1
|
||||||
|
# 更多环境变量配置见oceanbase官方文档: https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000002013494
|
||||||
|
volumes:
|
||||||
|
- ./ob/data:/root/ob
|
||||||
|
- ./ob/config:/root/.obd/cluster
|
||||||
|
- ./init.sql:/root/boot/init.d/init.sql
|
||||||
|
healthcheck:
|
||||||
|
# obclient -h127.0.0.1 -P2881 -uroot@tenantname -ptenantpassword -e "SELECT 1;"
|
||||||
|
test:
|
||||||
|
[
|
||||||
|
'CMD-SHELL',
|
||||||
|
'obclient -h$${OB_SERVER_IP} -P2881 -uroot@$${OB_TENANT_NAME} -p$${OB_TENANT_PASSWORD} -e "SELECT 1;"'
|
||||||
|
]
|
||||||
|
interval: 30s
|
||||||
|
timeout: 10s
|
||||||
|
retries: 1000
|
||||||
|
start_period: 10s
|
||||||
|
mongo:
|
||||||
|
image: mongo:5.0.18 # dockerhub
|
||||||
|
# image: registry.cn-hangzhou.aliyuncs.com/fastgpt/mongo:5.0.18 # 阿里云
|
||||||
|
# image: mongo:4.4.29 # cpu不支持AVX时候使用
|
||||||
|
container_name: mongo
|
||||||
|
restart: always
|
||||||
|
# ports:
|
||||||
|
# - 27017:27017
|
||||||
|
networks:
|
||||||
|
- fastgpt
|
||||||
|
command: mongod --keyFile /data/mongodb.key --replSet rs0
|
||||||
|
environment:
|
||||||
|
- MONGO_INITDB_ROOT_USERNAME=myusername
|
||||||
|
- MONGO_INITDB_ROOT_PASSWORD=mypassword
|
||||||
|
volumes:
|
||||||
|
- ./mongo/data:/data/db
|
||||||
|
entrypoint:
|
||||||
|
- bash
|
||||||
|
- -c
|
||||||
|
- |
|
||||||
|
openssl rand -base64 128 > /data/mongodb.key
|
||||||
|
chmod 400 /data/mongodb.key
|
||||||
|
chown 999:999 /data/mongodb.key
|
||||||
|
echo 'const isInited = rs.status().ok === 1
|
||||||
|
if(!isInited){
|
||||||
|
rs.initiate({
|
||||||
|
_id: "rs0",
|
||||||
|
members: [
|
||||||
|
{ _id: 0, host: "mongo:27017" }
|
||||||
|
]
|
||||||
|
})
|
||||||
|
}' > /data/initReplicaSet.js
|
||||||
|
# 启动MongoDB服务
|
||||||
|
exec docker-entrypoint.sh "$$@" &
|
||||||
|
|
||||||
|
# 等待MongoDB服务启动
|
||||||
|
until mongo -u myusername -p mypassword --authenticationDatabase admin --eval "print('waited for connection')"; do
|
||||||
|
echo "Waiting for MongoDB to start..."
|
||||||
|
sleep 2
|
||||||
|
done
|
||||||
|
|
||||||
|
# 执行初始化副本集的脚本
|
||||||
|
mongo -u myusername -p mypassword --authenticationDatabase admin /data/initReplicaSet.js
|
||||||
|
|
||||||
|
# 等待docker-entrypoint.sh脚本执行的MongoDB服务进程
|
||||||
|
wait $$!
|
||||||
|
redis:
|
||||||
|
image: redis:7.2-alpine
|
||||||
|
container_name: redis
|
||||||
|
# ports:
|
||||||
|
# - 6379:6379
|
||||||
|
networks:
|
||||||
|
- fastgpt
|
||||||
|
restart: always
|
||||||
|
command: |
|
||||||
|
redis-server --requirepass mypassword --loglevel warning --maxclients 10000 --appendonly yes --save 60 10 --maxmemory 4gb --maxmemory-policy noeviction
|
||||||
|
volumes:
|
||||||
|
- ./redis/data:/data
|
||||||
|
healthcheck:
|
||||||
|
test: ['CMD', 'redis-cli', '-a', 'mypassword', 'ping']
|
||||||
|
interval: 10s
|
||||||
|
timeout: 3s
|
||||||
|
retries: 3
|
||||||
|
start_period: 30s
|
||||||
|
|
||||||
|
# fastgpt
|
||||||
|
sandbox:
|
||||||
|
container_name: sandbox
|
||||||
|
image: ghcr.io/labring/fastgpt-sandbox:v4.9.10-fix2 # git
|
||||||
|
# image: registry.cn-hangzhou.aliyuncs.com/fastgpt/fastgpt-sandbox:v4.9.10-fix2 # 阿里云
|
||||||
|
networks:
|
||||||
|
- fastgpt
|
||||||
|
restart: always
|
||||||
|
fastgpt-mcp-server:
|
||||||
|
container_name: fastgpt-mcp-server
|
||||||
|
image: ghcr.io/labring/fastgpt-mcp_server:v4.9.10-fix2 # git
|
||||||
|
# image: registry.cn-hangzhou.aliyuncs.com/fastgpt/fastgpt-mcp_server:v4.9.10-fix2 # 阿里云
|
||||||
|
ports:
|
||||||
|
- 3005:3000
|
||||||
|
networks:
|
||||||
|
- fastgpt
|
||||||
|
restart: always
|
||||||
|
environment:
|
||||||
|
- FASTGPT_ENDPOINT=http://fastgpt:3000
|
||||||
|
fastgpt:
|
||||||
|
container_name: fastgpt
|
||||||
|
image: ghcr.io/labring/fastgpt:v4.9.10-fix2 # git
|
||||||
|
# image: registry.cn-hangzhou.aliyuncs.com/fastgpt/fastgpt:v4.9.10-fix2 # 阿里云
|
||||||
|
ports:
|
||||||
|
- 3000:3000
|
||||||
|
networks:
|
||||||
|
- fastgpt
|
||||||
|
depends_on:
|
||||||
|
mongo:
|
||||||
|
condition: service_started
|
||||||
|
ob:
|
||||||
|
condition: service_healthy
|
||||||
|
sandbox:
|
||||||
|
condition: service_started
|
||||||
|
restart: always
|
||||||
|
environment:
|
||||||
|
# 前端外部可访问的地址,用于自动补全文件资源路径。例如 https:fastgpt.cn,不能填 localhost。这个值可以不填,不填则发给模型的图片会是一个相对路径,而不是全路径,模型可能伪造Host。
|
||||||
|
- FE_DOMAIN=
|
||||||
|
# root 密码,用户名为: root。如果需要修改 root 密码,直接修改这个环境变量,并重启即可。
|
||||||
|
- DEFAULT_ROOT_PSW=1234
|
||||||
|
# # AI Proxy 的地址,如果配了该地址,优先使用
|
||||||
|
- AIPROXY_API_ENDPOINT=http://aiproxy:3000
|
||||||
|
# # AI Proxy 的 Admin Token,与 AI Proxy 中的环境变量 ADMIN_KEY
|
||||||
|
- AIPROXY_API_TOKEN=aiproxy
|
||||||
|
# 数据库最大连接数
|
||||||
|
- DB_MAX_LINK=30
|
||||||
|
# 登录凭证密钥
|
||||||
|
- TOKEN_KEY=any
|
||||||
|
# root的密钥,常用于升级时候的初始化请求
|
||||||
|
- ROOT_KEY=root_key
|
||||||
|
# 文件阅读加密
|
||||||
|
- FILE_TOKEN_KEY=filetoken
|
||||||
|
# MongoDB 连接参数. 用户名myusername,密码mypassword。
|
||||||
|
- MONGODB_URI=mongodb://myusername:mypassword@mongo:27017/fastgpt?authSource=admin
|
||||||
|
# OceanBase 向量库连接参数
|
||||||
|
- OCEANBASE_URL=mysql://root%40tenantname:tenantpassword@ob:2881/test
|
||||||
|
# Redis 连接参数
|
||||||
|
- REDIS_URL=redis://default:mypassword@redis:6379
|
||||||
|
# sandbox 地址
|
||||||
|
- SANDBOX_URL=http://sandbox:3000
|
||||||
|
# 日志等级: debug, info, warn, error
|
||||||
|
- LOG_LEVEL=info
|
||||||
|
- STORE_LOG_LEVEL=warn
|
||||||
|
# 工作流最大运行次数
|
||||||
|
- WORKFLOW_MAX_RUN_TIMES=1000
|
||||||
|
# 批量执行节点,最大输入长度
|
||||||
|
- WORKFLOW_MAX_LOOP_TIMES=100
|
||||||
|
# 自定义跨域,不配置时,默认都允许跨域(多个域名通过逗号分割)
|
||||||
|
- ALLOWED_ORIGINS=
|
||||||
|
# 是否开启IP限制,默认不开启
|
||||||
|
- USE_IP_LIMIT=false
|
||||||
|
# 对话文件过期天数
|
||||||
|
- CHAT_FILE_EXPIRE_TIME=7
|
||||||
|
volumes:
|
||||||
|
- ./config.json:/app/data/config.json
|
||||||
|
|
||||||
|
# AI Proxy
|
||||||
|
aiproxy:
|
||||||
|
image: ghcr.io/labring/aiproxy:v0.1.7
|
||||||
|
# image: registry.cn-hangzhou.aliyuncs.com/labring/aiproxy:v0.1.7 # 阿里云
|
||||||
|
container_name: aiproxy
|
||||||
|
restart: unless-stopped
|
||||||
|
depends_on:
|
||||||
|
aiproxy_pg:
|
||||||
|
condition: service_healthy
|
||||||
|
networks:
|
||||||
|
- fastgpt
|
||||||
|
environment:
|
||||||
|
# 对应 fastgpt 里的AIPROXY_API_TOKEN
|
||||||
|
- ADMIN_KEY=aiproxy
|
||||||
|
# 错误日志详情保存时间(小时)
|
||||||
|
- LOG_DETAIL_STORAGE_HOURS=1
|
||||||
|
# 数据库连接地址
|
||||||
|
- SQL_DSN=postgres://postgres:aiproxy@aiproxy_pg:5432/aiproxy
|
||||||
|
# 最大重试次数
|
||||||
|
- RETRY_TIMES=3
|
||||||
|
# 不需要计费
|
||||||
|
- BILLING_ENABLED=false
|
||||||
|
# 不需要严格检测模型
|
||||||
|
- DISABLE_MODEL_CONFIG=true
|
||||||
|
healthcheck:
|
||||||
|
test: ['CMD', 'curl', '-f', 'http://localhost:3000/api/status']
|
||||||
|
interval: 5s
|
||||||
|
timeout: 5s
|
||||||
|
retries: 10
|
||||||
|
aiproxy_pg:
|
||||||
|
image: pgvector/pgvector:0.8.0-pg15 # docker hub
|
||||||
|
# image: registry.cn-hangzhou.aliyuncs.com/fastgpt/pgvector:v0.8.0-pg15 # 阿里云
|
||||||
|
restart: unless-stopped
|
||||||
|
container_name: aiproxy_pg
|
||||||
|
volumes:
|
||||||
|
- ./aiproxy_pg:/var/lib/postgresql/data
|
||||||
|
networks:
|
||||||
|
- fastgpt
|
||||||
|
environment:
|
||||||
|
TZ: Asia/Shanghai
|
||||||
|
POSTGRES_USER: postgres
|
||||||
|
POSTGRES_DB: aiproxy
|
||||||
|
POSTGRES_PASSWORD: aiproxy
|
||||||
|
healthcheck:
|
||||||
|
test: ['CMD', 'pg_isready', '-U', 'postgres', '-d', 'aiproxy']
|
||||||
|
interval: 5s
|
||||||
|
timeout: 5s
|
||||||
|
retries: 10
|
||||||
|
networks:
|
||||||
|
fastgpt:
|
||||||
2
deploy/docker/docker-compose-oceanbase/init.sql
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
ALTER SYSTEM SET ob_vector_memory_limit_percentage = 30;
|
||||||
|
|
||||||
@ -7,12 +7,12 @@ version: '3.3'
|
|||||||
services:
|
services:
|
||||||
# db
|
# db
|
||||||
pg:
|
pg:
|
||||||
image: pgvector/pgvector:0.7.0-pg15 # docker hub
|
image: pgvector/pgvector:0.8.0-pg15 # docker hub
|
||||||
# image: registry.cn-hangzhou.aliyuncs.com/fastgpt/pgvector:v0.7.0 # 阿里云
|
# image: registry.cn-hangzhou.aliyuncs.com/fastgpt/pgvector:v0.8.0-pg15 # 阿里云
|
||||||
container_name: pg
|
container_name: pg
|
||||||
restart: always
|
restart: always
|
||||||
ports: # 生产环境建议不要暴露
|
# ports: # 生产环境建议不要暴露
|
||||||
- 5432:5432
|
# - 5432:5432
|
||||||
networks:
|
networks:
|
||||||
- fastgpt
|
- fastgpt
|
||||||
environment:
|
environment:
|
||||||
@ -22,14 +22,19 @@ services:
|
|||||||
- POSTGRES_DB=postgres
|
- POSTGRES_DB=postgres
|
||||||
volumes:
|
volumes:
|
||||||
- ./pg/data:/var/lib/postgresql/data
|
- ./pg/data:/var/lib/postgresql/data
|
||||||
|
healthcheck:
|
||||||
|
test: ['CMD', 'pg_isready', '-U', 'postgres', '-d', 'postgres']
|
||||||
|
interval: 5s
|
||||||
|
timeout: 5s
|
||||||
|
retries: 10
|
||||||
mongo:
|
mongo:
|
||||||
image: mongo:5.0.18 # dockerhub
|
image: mongo:5.0.18 # dockerhub
|
||||||
# image: registry.cn-hangzhou.aliyuncs.com/fastgpt/mongo:5.0.18 # 阿里云
|
# image: registry.cn-hangzhou.aliyuncs.com/fastgpt/mongo:5.0.18 # 阿里云
|
||||||
# image: mongo:4.4.29 # cpu不支持AVX时候使用
|
# image: mongo:4.4.29 # cpu不支持AVX时候使用
|
||||||
container_name: mongo
|
container_name: mongo
|
||||||
restart: always
|
restart: always
|
||||||
ports:
|
# ports:
|
||||||
- 27017:27017
|
# - 27017:27017
|
||||||
networks:
|
networks:
|
||||||
- fastgpt
|
- fastgpt
|
||||||
command: mongod --keyFile /data/mongodb.key --replSet rs0
|
command: mongod --keyFile /data/mongodb.key --replSet rs0
|
||||||
@ -58,7 +63,7 @@ services:
|
|||||||
exec docker-entrypoint.sh "$$@" &
|
exec docker-entrypoint.sh "$$@" &
|
||||||
|
|
||||||
# 等待MongoDB服务启动
|
# 等待MongoDB服务启动
|
||||||
until mongo -u myusername -p mypassword --authenticationDatabase admin --eval "print('waited for connection')" > /dev/null 2>&1; do
|
until mongo -u myusername -p mypassword --authenticationDatabase admin --eval "print('waited for connection')"; do
|
||||||
echo "Waiting for MongoDB to start..."
|
echo "Waiting for MongoDB to start..."
|
||||||
sleep 2
|
sleep 2
|
||||||
done
|
done
|
||||||
@ -69,18 +74,48 @@ services:
|
|||||||
# 等待docker-entrypoint.sh脚本执行的MongoDB服务进程
|
# 等待docker-entrypoint.sh脚本执行的MongoDB服务进程
|
||||||
wait $$!
|
wait $$!
|
||||||
|
|
||||||
# fastgpt
|
redis:
|
||||||
sandbox:
|
image: redis:7.2-alpine
|
||||||
container_name: sandbox
|
container_name: redis
|
||||||
image: ghcr.io/labring/fastgpt-sandbox:v4.8.23-fix # git
|
# ports:
|
||||||
# image: registry.cn-hangzhou.aliyuncs.com/fastgpt/fastgpt-sandbox:v4.8.23-fix # 阿里云
|
# - 6379:6379
|
||||||
networks:
|
networks:
|
||||||
- fastgpt
|
- fastgpt
|
||||||
restart: always
|
restart: always
|
||||||
|
command: |
|
||||||
|
redis-server --requirepass mypassword --loglevel warning --maxclients 10000 --appendonly yes --save 60 10 --maxmemory 4gb --maxmemory-policy noeviction
|
||||||
|
healthcheck:
|
||||||
|
test: ['CMD', 'redis-cli', '-a', 'mypassword', 'ping']
|
||||||
|
interval: 10s
|
||||||
|
timeout: 3s
|
||||||
|
retries: 3
|
||||||
|
start_period: 30s
|
||||||
|
volumes:
|
||||||
|
- ./redis/data:/data
|
||||||
|
|
||||||
|
# fastgpt
|
||||||
|
sandbox:
|
||||||
|
container_name: sandbox
|
||||||
|
image: ghcr.io/labring/fastgpt-sandbox:v4.9.10-fix2 # git
|
||||||
|
# image: registry.cn-hangzhou.aliyuncs.com/fastgpt/fastgpt-sandbox:v4.9.10-fix2 # 阿里云
|
||||||
|
networks:
|
||||||
|
- fastgpt
|
||||||
|
restart: always
|
||||||
|
fastgpt-mcp-server:
|
||||||
|
container_name: fastgpt-mcp-server
|
||||||
|
image: ghcr.io/labring/fastgpt-mcp_server:v4.9.10-fix2 # git
|
||||||
|
# image: registry.cn-hangzhou.aliyuncs.com/fastgpt/fastgpt-mcp_server:v4.9.10-fix2 # 阿里云
|
||||||
|
ports:
|
||||||
|
- 3005:3000
|
||||||
|
networks:
|
||||||
|
- fastgpt
|
||||||
|
restart: always
|
||||||
|
environment:
|
||||||
|
- FASTGPT_ENDPOINT=http://fastgpt:3000
|
||||||
fastgpt:
|
fastgpt:
|
||||||
container_name: fastgpt
|
container_name: fastgpt
|
||||||
image: ghcr.io/labring/fastgpt:v4.8.23-fix # git
|
image: ghcr.io/labring/fastgpt:v4.9.10-fix2 # git
|
||||||
# image: registry.cn-hangzhou.aliyuncs.com/fastgpt/fastgpt:v4.8.23-fix # 阿里云
|
# image: registry.cn-hangzhou.aliyuncs.com/fastgpt/fastgpt:v4.9.10-fix2 # 阿里云
|
||||||
ports:
|
ports:
|
||||||
- 3000:3000
|
- 3000:3000
|
||||||
networks:
|
networks:
|
||||||
@ -95,10 +130,10 @@ services:
|
|||||||
- FE_DOMAIN=
|
- FE_DOMAIN=
|
||||||
# root 密码,用户名为: root。如果需要修改 root 密码,直接修改这个环境变量,并重启即可。
|
# root 密码,用户名为: root。如果需要修改 root 密码,直接修改这个环境变量,并重启即可。
|
||||||
- DEFAULT_ROOT_PSW=1234
|
- DEFAULT_ROOT_PSW=1234
|
||||||
# AI模型的API地址哦。务必加 /v1。这里默认填写了OneApi的访问地址。
|
# AI Proxy 的地址,如果配了该地址,优先使用
|
||||||
- OPENAI_BASE_URL=http://oneapi:3000/v1
|
- AIPROXY_API_ENDPOINT=http://aiproxy:3000
|
||||||
# AI模型的API Key。(这里默认填写了OneAPI的快速默认key,测试通后,务必及时修改)
|
# AI Proxy 的 Admin Token,与 AI Proxy 中的环境变量 ADMIN_KEY
|
||||||
- CHAT_API_KEY=sk-fastgpt
|
- AIPROXY_API_TOKEN=aiproxy
|
||||||
# 数据库最大连接数
|
# 数据库最大连接数
|
||||||
- DB_MAX_LINK=30
|
- DB_MAX_LINK=30
|
||||||
# 登录凭证密钥
|
# 登录凭证密钥
|
||||||
@ -111,6 +146,8 @@ services:
|
|||||||
- MONGODB_URI=mongodb://myusername:mypassword@mongo:27017/fastgpt?authSource=admin
|
- MONGODB_URI=mongodb://myusername:mypassword@mongo:27017/fastgpt?authSource=admin
|
||||||
# pg 连接参数
|
# pg 连接参数
|
||||||
- PG_URL=postgresql://username:password@pg:5432/postgres
|
- PG_URL=postgresql://username:password@pg:5432/postgres
|
||||||
|
# Redis 连接参数
|
||||||
|
- REDIS_URL=redis://default:mypassword@redis:6379
|
||||||
# sandbox 地址
|
# sandbox 地址
|
||||||
- SANDBOX_URL=http://sandbox:3000
|
- SANDBOX_URL=http://sandbox:3000
|
||||||
# 日志等级: debug, info, warn, error
|
# 日志等级: debug, info, warn, error
|
||||||
@ -124,51 +161,58 @@ services:
|
|||||||
- ALLOWED_ORIGINS=
|
- ALLOWED_ORIGINS=
|
||||||
# 是否开启IP限制,默认不开启
|
# 是否开启IP限制,默认不开启
|
||||||
- USE_IP_LIMIT=false
|
- USE_IP_LIMIT=false
|
||||||
|
# 对话文件过期天数
|
||||||
|
- CHAT_FILE_EXPIRE_TIME=7
|
||||||
volumes:
|
volumes:
|
||||||
- ./config.json:/app/data/config.json
|
- ./config.json:/app/data/config.json
|
||||||
|
|
||||||
# oneapi
|
# AI Proxy
|
||||||
mysql:
|
aiproxy:
|
||||||
# image: registry.cn-hangzhou.aliyuncs.com/fastgpt/mysql:8.0.36 # 阿里云
|
image: ghcr.io/labring/aiproxy:v0.1.7
|
||||||
image: mysql:8.0.36
|
# image: registry.cn-hangzhou.aliyuncs.com/labring/aiproxy:v0.1.7 # 阿里云
|
||||||
container_name: mysql
|
container_name: aiproxy
|
||||||
restart: always
|
restart: unless-stopped
|
||||||
ports:
|
|
||||||
- 3306:3306
|
|
||||||
networks:
|
|
||||||
- fastgpt
|
|
||||||
command: --default-authentication-plugin=mysql_native_password
|
|
||||||
environment:
|
|
||||||
# 默认root密码,仅首次运行有效
|
|
||||||
MYSQL_ROOT_PASSWORD: oneapimmysql
|
|
||||||
MYSQL_DATABASE: oneapi
|
|
||||||
volumes:
|
|
||||||
- ./mysql:/var/lib/mysql
|
|
||||||
oneapi:
|
|
||||||
container_name: oneapi
|
|
||||||
image: ghcr.io/songquanpeng/one-api:v0.6.7
|
|
||||||
# image: registry.cn-hangzhou.aliyuncs.com/fastgpt/one-api:v0.6.6 # 阿里云
|
|
||||||
ports:
|
|
||||||
- 3001:3000
|
|
||||||
depends_on:
|
depends_on:
|
||||||
- mysql
|
aiproxy_pg:
|
||||||
|
condition: service_healthy
|
||||||
networks:
|
networks:
|
||||||
- fastgpt
|
- fastgpt
|
||||||
restart: always
|
|
||||||
environment:
|
environment:
|
||||||
# mysql 连接参数
|
# 对应 fastgpt 里的AIPROXY_API_TOKEN
|
||||||
- SQL_DSN=root:oneapimmysql@tcp(mysql:3306)/oneapi
|
- ADMIN_KEY=aiproxy
|
||||||
# 登录凭证加密密钥
|
# 错误日志详情保存时间(小时)
|
||||||
- SESSION_SECRET=oneapikey
|
- LOG_DETAIL_STORAGE_HOURS=1
|
||||||
# 内存缓存
|
# 数据库连接地址
|
||||||
- MEMORY_CACHE_ENABLED=true
|
- SQL_DSN=postgres://postgres:aiproxy@aiproxy_pg:5432/aiproxy
|
||||||
# 启动聚合更新,减少数据交互频率
|
# 最大重试次数
|
||||||
- BATCH_UPDATE_ENABLED=true
|
- RETRY_TIMES=3
|
||||||
# 聚合更新时长
|
# 不需要计费
|
||||||
- BATCH_UPDATE_INTERVAL=10
|
- BILLING_ENABLED=false
|
||||||
# 初始化的 root 密钥(建议部署完后更改,否则容易泄露)
|
# 不需要严格检测模型
|
||||||
- INITIAL_ROOT_TOKEN=fastgpt
|
- DISABLE_MODEL_CONFIG=true
|
||||||
|
healthcheck:
|
||||||
|
test: ['CMD', 'curl', '-f', 'http://localhost:3000/api/status']
|
||||||
|
interval: 5s
|
||||||
|
timeout: 5s
|
||||||
|
retries: 10
|
||||||
|
aiproxy_pg:
|
||||||
|
image: pgvector/pgvector:0.8.0-pg15 # docker hub
|
||||||
|
# image: registry.cn-hangzhou.aliyuncs.com/fastgpt/pgvector:v0.8.0-pg15 # 阿里云
|
||||||
|
restart: unless-stopped
|
||||||
|
container_name: aiproxy_pg
|
||||||
volumes:
|
volumes:
|
||||||
- ./oneapi:/data
|
- ./aiproxy_pg:/var/lib/postgresql/data
|
||||||
|
networks:
|
||||||
|
- fastgpt
|
||||||
|
environment:
|
||||||
|
TZ: Asia/Shanghai
|
||||||
|
POSTGRES_USER: postgres
|
||||||
|
POSTGRES_DB: aiproxy
|
||||||
|
POSTGRES_PASSWORD: aiproxy
|
||||||
|
healthcheck:
|
||||||
|
test: ['CMD', 'pg_isready', '-U', 'postgres', '-d', 'aiproxy']
|
||||||
|
interval: 5s
|
||||||
|
timeout: 5s
|
||||||
|
retries: 10
|
||||||
networks:
|
networks:
|
||||||
fastgpt:
|
fastgpt:
|
||||||
|
|||||||
@ -41,7 +41,7 @@ services:
|
|||||||
exec docker-entrypoint.sh "$$@" &
|
exec docker-entrypoint.sh "$$@" &
|
||||||
|
|
||||||
# 等待MongoDB服务启动
|
# 等待MongoDB服务启动
|
||||||
until mongo -u myusername -p mypassword --authenticationDatabase admin --eval "print('waited for connection')" > /dev/null 2>&1; do
|
until mongo -u myusername -p mypassword --authenticationDatabase admin --eval "print('waited for connection')"; do
|
||||||
echo "Waiting for MongoDB to start..."
|
echo "Waiting for MongoDB to start..."
|
||||||
sleep 2
|
sleep 2
|
||||||
done
|
done
|
||||||
@ -51,17 +51,47 @@ services:
|
|||||||
|
|
||||||
# 等待docker-entrypoint.sh脚本执行的MongoDB服务进程
|
# 等待docker-entrypoint.sh脚本执行的MongoDB服务进程
|
||||||
wait $$!
|
wait $$!
|
||||||
sandbox:
|
redis:
|
||||||
container_name: sandbox
|
image: redis:7.2-alpine
|
||||||
image: ghcr.io/labring/fastgpt-sandbox:v4.8.23-fix # git
|
container_name: redis
|
||||||
# image: registry.cn-hangzhou.aliyuncs.com/fastgpt/fastgpt-sandbox:v4.8.23-fix # 阿里云
|
# ports:
|
||||||
|
# - 6379:6379
|
||||||
networks:
|
networks:
|
||||||
- fastgpt
|
- fastgpt
|
||||||
restart: always
|
restart: always
|
||||||
|
command: |
|
||||||
|
redis-server --requirepass mypassword --loglevel warning --maxclients 10000 --appendonly yes --save 60 10 --maxmemory 4gb --maxmemory-policy noeviction
|
||||||
|
healthcheck:
|
||||||
|
test: ['CMD', 'redis-cli', '-a', 'mypassword', 'ping']
|
||||||
|
interval: 10s
|
||||||
|
timeout: 3s
|
||||||
|
retries: 3
|
||||||
|
start_period: 30s
|
||||||
|
volumes:
|
||||||
|
- ./redis/data:/data
|
||||||
|
|
||||||
|
sandbox:
|
||||||
|
container_name: sandbox
|
||||||
|
image: ghcr.io/labring/fastgpt-sandbox:v4.9.10-fix2 # git
|
||||||
|
# image: registry.cn-hangzhou.aliyuncs.com/fastgpt/fastgpt-sandbox:v4.9.10-fix2 # 阿里云
|
||||||
|
networks:
|
||||||
|
- fastgpt
|
||||||
|
restart: always
|
||||||
|
fastgpt-mcp-server:
|
||||||
|
container_name: fastgpt-mcp-server
|
||||||
|
image: ghcr.io/labring/fastgpt-mcp_server:v4.9.10-fix2 # git
|
||||||
|
# image: registry.cn-hangzhou.aliyuncs.com/fastgpt/fastgpt-mcp_server:v4.9.10-fix2 # 阿里云
|
||||||
|
ports:
|
||||||
|
- 3005:3000
|
||||||
|
networks:
|
||||||
|
- fastgpt
|
||||||
|
restart: always
|
||||||
|
environment:
|
||||||
|
- FASTGPT_ENDPOINT=http://fastgpt:3000
|
||||||
fastgpt:
|
fastgpt:
|
||||||
container_name: fastgpt
|
container_name: fastgpt
|
||||||
image: ghcr.io/labring/fastgpt:v4.8.23-fix # git
|
image: ghcr.io/labring/fastgpt:v4.9.10-fix2 # git
|
||||||
# image: registry.cn-hangzhou.aliyuncs.com/fastgpt/fastgpt:v4.8.23-fix # 阿里云
|
# image: registry.cn-hangzhou.aliyuncs.com/fastgpt/fastgpt:v4.9.10-fix2 # 阿里云
|
||||||
ports:
|
ports:
|
||||||
- 3000:3000
|
- 3000:3000
|
||||||
networks:
|
networks:
|
||||||
@ -75,10 +105,13 @@ services:
|
|||||||
- FE_DOMAIN=
|
- FE_DOMAIN=
|
||||||
# root 密码,用户名为: root。如果需要修改 root 密码,直接修改这个环境变量,并重启即可。
|
# root 密码,用户名为: root。如果需要修改 root 密码,直接修改这个环境变量,并重启即可。
|
||||||
- DEFAULT_ROOT_PSW=1234
|
- DEFAULT_ROOT_PSW=1234
|
||||||
# AI模型的API地址哦。务必加 /v1。这里默认填写了OneApi的访问地址。
|
# AI Proxy 的地址,如果配了该地址,优先使用
|
||||||
- OPENAI_BASE_URL=http://oneapi:3000/v1
|
- AIPROXY_API_ENDPOINT=http://aiproxy:3000
|
||||||
# AI模型的API Key。(这里默认填写了OneAPI的快速默认key,测试通后,务必及时修改)
|
# AI Proxy 的 Admin Token,与 AI Proxy 中的环境变量 ADMIN_KEY
|
||||||
- CHAT_API_KEY=sk-fastgpt
|
- AIPROXY_API_TOKEN=aiproxy
|
||||||
|
# 模型中转地址(如果用了 AI Proxy,下面 2 个就不需要了,旧版 OneAPI 用户,使用下面的变量)
|
||||||
|
# - OPENAI_BASE_URL=http://oneapi:3000/v1
|
||||||
|
# - CHAT_API_KEY=sk-fastgpt
|
||||||
# 数据库最大连接数
|
# 数据库最大连接数
|
||||||
- DB_MAX_LINK=30
|
- DB_MAX_LINK=30
|
||||||
# 登录凭证密钥
|
# 登录凭证密钥
|
||||||
@ -89,6 +122,8 @@ services:
|
|||||||
- FILE_TOKEN_KEY=filetoken
|
- FILE_TOKEN_KEY=filetoken
|
||||||
# MongoDB 连接参数. 用户名myusername,密码mypassword。
|
# MongoDB 连接参数. 用户名myusername,密码mypassword。
|
||||||
- MONGODB_URI=mongodb://myusername:mypassword@mongo:27017/fastgpt?authSource=admin
|
- MONGODB_URI=mongodb://myusername:mypassword@mongo:27017/fastgpt?authSource=admin
|
||||||
|
# Redis 连接参数
|
||||||
|
- REDIS_URI=redis://default:mypassword@redis:6379
|
||||||
# zilliz 连接参数
|
# zilliz 连接参数
|
||||||
- MILVUS_ADDRESS=zilliz_cloud_address
|
- MILVUS_ADDRESS=zilliz_cloud_address
|
||||||
- MILVUS_TOKEN=zilliz_cloud_token
|
- MILVUS_TOKEN=zilliz_cloud_token
|
||||||
@ -105,51 +140,58 @@ services:
|
|||||||
- ALLOWED_ORIGINS=
|
- ALLOWED_ORIGINS=
|
||||||
# 是否开启IP限制,默认不开启
|
# 是否开启IP限制,默认不开启
|
||||||
- USE_IP_LIMIT=false
|
- USE_IP_LIMIT=false
|
||||||
|
# 对话文件过期天数
|
||||||
|
- CHAT_FILE_EXPIRE_TIME=7
|
||||||
volumes:
|
volumes:
|
||||||
- ./config.json:/app/data/config.json
|
- ./config.json:/app/data/config.json
|
||||||
|
|
||||||
# oneapi
|
# AI Proxy
|
||||||
mysql:
|
aiproxy:
|
||||||
image: registry.cn-hangzhou.aliyuncs.com/fastgpt/mysql:8.0.36 # 阿里云
|
image: ghcr.io/labring/aiproxy:v0.1.7
|
||||||
# image: mysql:8.0.36
|
# image: registry.cn-hangzhou.aliyuncs.com/labring/aiproxy:v0.1.7 # 阿里云
|
||||||
container_name: mysql
|
container_name: aiproxy
|
||||||
restart: always
|
restart: unless-stopped
|
||||||
ports:
|
|
||||||
- 3306:3306
|
|
||||||
networks:
|
|
||||||
- fastgpt
|
|
||||||
command: --default-authentication-plugin=mysql_native_password
|
|
||||||
environment:
|
|
||||||
# 默认root密码,仅首次运行有效
|
|
||||||
MYSQL_ROOT_PASSWORD: oneapimmysql
|
|
||||||
MYSQL_DATABASE: oneapi
|
|
||||||
volumes:
|
|
||||||
- ./mysql:/var/lib/mysql
|
|
||||||
oneapi:
|
|
||||||
container_name: oneapi
|
|
||||||
image: ghcr.io/songquanpeng/one-api:v0.6.7
|
|
||||||
# image: registry.cn-hangzhou.aliyuncs.com/fastgpt/one-api:v0.6.6 # 阿里云
|
|
||||||
ports:
|
|
||||||
- 3001:3000
|
|
||||||
depends_on:
|
depends_on:
|
||||||
- mysql
|
aiproxy_pg:
|
||||||
|
condition: service_healthy
|
||||||
networks:
|
networks:
|
||||||
- fastgpt
|
- fastgpt
|
||||||
restart: always
|
|
||||||
environment:
|
environment:
|
||||||
# mysql 连接参数
|
# 对应 fastgpt 里的AIPROXY_API_TOKEN
|
||||||
- SQL_DSN=root:oneapimmysql@tcp(mysql:3306)/oneapi
|
- ADMIN_KEY=aiproxy
|
||||||
# 登录凭证加密密钥
|
# 错误日志详情保存时间(小时)
|
||||||
- SESSION_SECRET=oneapikey
|
- LOG_DETAIL_STORAGE_HOURS=1
|
||||||
# 内存缓存
|
# 数据库连接地址
|
||||||
- MEMORY_CACHE_ENABLED=true
|
- SQL_DSN=postgres://postgres:aiproxy@aiproxy_pg:5432/aiproxy
|
||||||
# 启动聚合更新,减少数据交互频率
|
# 最大重试次数
|
||||||
- BATCH_UPDATE_ENABLED=true
|
- RETRY_TIMES=3
|
||||||
# 聚合更新时长
|
# 不需要计费
|
||||||
- BATCH_UPDATE_INTERVAL=10
|
- BILLING_ENABLED=false
|
||||||
# 初始化的 root 密钥(建议部署完后更改,否则容易泄露)
|
# 不需要严格检测模型
|
||||||
- INITIAL_ROOT_TOKEN=fastgpt
|
- DISABLE_MODEL_CONFIG=true
|
||||||
|
healthcheck:
|
||||||
|
test: ['CMD', 'curl', '-f', 'http://localhost:3000/api/status']
|
||||||
|
interval: 5s
|
||||||
|
timeout: 5s
|
||||||
|
retries: 10
|
||||||
|
aiproxy_pg:
|
||||||
|
image: pgvector/pgvector:0.8.0-pg15 # docker hub
|
||||||
|
# image: registry.cn-hangzhou.aliyuncs.com/fastgpt/pgvector:v0.8.0-pg15 # 阿里云
|
||||||
|
restart: unless-stopped
|
||||||
|
container_name: aiproxy_pg
|
||||||
volumes:
|
volumes:
|
||||||
- ./oneapi:/data
|
- ./aiproxy_pg:/var/lib/postgresql/data
|
||||||
|
networks:
|
||||||
|
- fastgpt
|
||||||
|
environment:
|
||||||
|
TZ: Asia/Shanghai
|
||||||
|
POSTGRES_USER: postgres
|
||||||
|
POSTGRES_DB: aiproxy
|
||||||
|
POSTGRES_PASSWORD: aiproxy
|
||||||
|
healthcheck:
|
||||||
|
test: ['CMD', 'pg_isready', '-U', 'postgres', '-d', 'aiproxy']
|
||||||
|
interval: 5s
|
||||||
|
timeout: 5s
|
||||||
|
retries: 10
|
||||||
networks:
|
networks:
|
||||||
fastgpt:
|
fastgpt:
|
||||||
|
|||||||
@ -6,7 +6,8 @@ data:
|
|||||||
"openapiPrefix": "fastgpt",
|
"openapiPrefix": "fastgpt",
|
||||||
"vectorMaxProcess": 15,
|
"vectorMaxProcess": 15,
|
||||||
"qaMaxProcess": 15,
|
"qaMaxProcess": 15,
|
||||||
"pgHNSWEfSearch": 100
|
"vlmMaxProcess": 15,
|
||||||
|
"hnswEfSearch": 100
|
||||||
},
|
},
|
||||||
"llmModels": [
|
"llmModels": [
|
||||||
{
|
{
|
||||||
|
|||||||
232
dev.md
@ -1,114 +1,118 @@
|
|||||||
## Premise
|
## Premise
|
||||||
|
|
||||||
Since FastGPT is managed in the same way as monorepo, it is recommended to install ‘make’ first during development.
|
Since FastGPT is managed in the same way as monorepo, it is recommended to install ‘make’ first during development.
|
||||||
|
|
||||||
monorepo Project Name:
|
monorepo Project Name:
|
||||||
|
|
||||||
- app: main project
|
- app: main project
|
||||||
-......
|
-......
|
||||||
|
|
||||||
## Dev
|
## Dev
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
# Give automatic script code execution permission (on non-Linux systems, you can manually execute the postinstall.sh file content)
|
# Give automatic script code execution permission (on non-Linux systems, you can manually execute the postinstall.sh file content)
|
||||||
chmod -R +x ./scripts/
|
chmod -R +x ./scripts/
|
||||||
# Executing under the code root directory installs all dependencies within the root package, projects, and packages
|
# Executing under the code root directory installs all dependencies within the root package, projects, and packages
|
||||||
pnpm i
|
pnpm i
|
||||||
|
|
||||||
# Not make cmd
|
# Not make cmd
|
||||||
cd projects/app
|
cd projects/app
|
||||||
pnpm dev
|
pnpm dev
|
||||||
|
|
||||||
# Make cmd
|
# Make cmd
|
||||||
make dev name=app
|
make dev name=app
|
||||||
```
|
```
|
||||||
|
|
||||||
Note: If the Node version is >= 20, you need to pass the `--no-node-snapshot` parameter to Node when running `pnpm i`
|
Note: If the Node version is >= 20, you need to pass the `--no-node-snapshot` parameter to Node when running `pnpm i`
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
NODE_OPTIONS=--no-node-snapshot pnpm i
|
NODE_OPTIONS=--no-node-snapshot pnpm i
|
||||||
```
|
```
|
||||||
|
|
||||||
### Jest
|
### Jest
|
||||||
|
|
||||||
https://fael3z0zfze.feishu.cn/docx/ZOI1dABpxoGhS7xzhkXcKPxZnDL
|
https://fael3z0zfze.feishu.cn/docx/ZOI1dABpxoGhS7xzhkXcKPxZnDL
|
||||||
|
|
||||||
## I18N
|
## I18N
|
||||||
|
|
||||||
### Install i18n-ally Plugin
|
### Install i18n-ally Plugin
|
||||||
|
|
||||||
1. Open the Extensions Marketplace in VSCode, search for and install the `i18n Ally` plugin.
|
1. Open the Extensions Marketplace in VSCode, search for and install the `i18n Ally` plugin.
|
||||||
|
|
||||||
### Code Optimization Examples
|
### Code Optimization Examples
|
||||||
|
|
||||||
#### Fetch Specific Namespace Translations in `getServerSideProps`
|
#### Fetch Specific Namespace Translations in `getServerSideProps`
|
||||||
|
|
||||||
```typescript
|
```typescript
|
||||||
// pages/yourPage.tsx
|
// pages/yourPage.tsx
|
||||||
export async function getServerSideProps(context: any) {
|
export async function getServerSideProps(context: any) {
|
||||||
return {
|
return {
|
||||||
props: {
|
props: {
|
||||||
currentTab: context?.query?.currentTab || TabEnum.info,
|
currentTab: context?.query?.currentTab || TabEnum.info,
|
||||||
...(await serverSideTranslations(context.locale, ['publish', 'user']))
|
...(await serverSideTranslations(context.locale, ['publish', 'user']))
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
#### Use useTranslation Hook in Page
|
#### Use useTranslation Hook in Page
|
||||||
|
|
||||||
```typescript
|
```typescript
|
||||||
// pages/yourPage.tsx
|
// pages/yourPage.tsx
|
||||||
import { useTranslation } from 'next-i18next';
|
import { useTranslation } from 'next-i18next';
|
||||||
|
|
||||||
const YourComponent = () => {
|
const YourComponent = () => {
|
||||||
const { t } = useTranslation();
|
const { t } = useTranslation();
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Button
|
<Button
|
||||||
variant="outline"
|
variant="outline"
|
||||||
size="sm"
|
size="sm"
|
||||||
mr={2}
|
mr={2}
|
||||||
onClick={() => setShowSelected(false)}
|
onClick={() => setShowSelected(false)}
|
||||||
>
|
>
|
||||||
{t('common:close')}
|
{t('common:close')}
|
||||||
</Button>
|
</Button>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
export default YourComponent;
|
export default YourComponent;
|
||||||
```
|
```
|
||||||
|
|
||||||
#### Handle Static File Translations
|
#### Handle Static File Translations
|
||||||
|
|
||||||
```typescript
|
```typescript
|
||||||
// utils/i18n.ts
|
// utils/i18n.ts
|
||||||
import { i18nT } from '@fastgpt/web/i18n/utils';
|
import { i18nT } from '@fastgpt/web/i18n/utils';
|
||||||
|
|
||||||
const staticContent = {
|
const staticContent = {
|
||||||
id: 'simpleChat',
|
id: 'simpleChat',
|
||||||
avatar: 'core/workflow/template/aiChat',
|
avatar: 'core/workflow/template/aiChat',
|
||||||
name: i18nT('app:template.simple_robot'),
|
name: i18nT('app:template.simple_robot'),
|
||||||
};
|
};
|
||||||
|
|
||||||
export default staticContent;
|
export default staticContent;
|
||||||
```
|
```
|
||||||
|
|
||||||
### Standardize Translation Format
|
### Standardize Translation Format
|
||||||
|
|
||||||
- Use the t(namespace:key) format to ensure consistent naming.
|
- Use the t(namespace:key) format to ensure consistent naming.
|
||||||
- Translation keys should use lowercase letters and underscores, e.g., common.close.
|
- Translation keys should use lowercase letters and underscores, e.g., common.close.
|
||||||
|
|
||||||
## Build
|
## audit
|
||||||
|
|
||||||
```sh
|
Please fill the OperationLogEventEnum and operationLog/audit function is added to the ts, and on the corresponding position to fill i18n, at the same time to add the location of the log using addOpearationLog function add function
|
||||||
# Docker cmd: Build image, not proxy
|
|
||||||
docker build -f ./projects/app/Dockerfile -t registry.cn-hangzhou.aliyuncs.com/fastgpt/fastgpt:v4.8.1 . --build-arg name=app
|
## Build
|
||||||
# Make cmd: Build image, not proxy
|
|
||||||
make build name=app image=registry.cn-hangzhou.aliyuncs.com/fastgpt/fastgpt:v4.8.1
|
```sh
|
||||||
|
# Docker cmd: Build image, not proxy
|
||||||
# Docker cmd: Build image with proxy
|
docker build -f ./projects/app/Dockerfile -t registry.cn-hangzhou.aliyuncs.com/fastgpt/fastgpt:v4.8.1 . --build-arg name=app
|
||||||
docker build -f ./projects/app/Dockerfile -t registry.cn-hangzhou.aliyuncs.com/fastgpt/fastgpt:v4.8.1 . --build-arg name=app --build-arg proxy=taobao
|
# Make cmd: Build image, not proxy
|
||||||
# Make cmd: Build image with proxy
|
make build name=app image=registry.cn-hangzhou.aliyuncs.com/fastgpt/fastgpt:v4.8.1
|
||||||
make build name=app image=registry.cn-hangzhou.aliyuncs.com/fastgpt/fastgpt:v4.8.1 proxy=taobao
|
|
||||||
```
|
# Docker cmd: Build image with proxy
|
||||||
|
docker build -f ./projects/app/Dockerfile -t registry.cn-hangzhou.aliyuncs.com/fastgpt/fastgpt:v4.8.1 . --build-arg name=app --build-arg proxy=taobao
|
||||||
|
# Make cmd: Build image with proxy
|
||||||
|
make build name=app image=registry.cn-hangzhou.aliyuncs.com/fastgpt/fastgpt:v4.8.1 proxy=taobao
|
||||||
|
```
|
||||||
|
|||||||
@ -9,4 +9,6 @@ FROM fholzer/nginx-brotli:latest
|
|||||||
|
|
||||||
LABEL org.opencontainers.image.source https://github.com/labring/FastGPT
|
LABEL org.opencontainers.image.source https://github.com/labring/FastGPT
|
||||||
|
|
||||||
COPY --from=builder /app/hugo/public /usr/share/nginx/html
|
COPY --from=builder /app/hugo/public /usr/share/nginx/html
|
||||||
|
|
||||||
|
COPY ./docSite/nginx.conf /etc/nginx/conf.d/default.conf
|
||||||
BIN
docSite/assets/imgs/Ollama-aiproxy1.png
Normal file
|
After Width: | Height: | Size: 68 KiB |
BIN
docSite/assets/imgs/Ollama-aiproxy2.png
Normal file
|
After Width: | Height: | Size: 9.0 KiB |
BIN
docSite/assets/imgs/Ollama-aiproxy3.png
Normal file
|
After Width: | Height: | Size: 179 KiB |
BIN
docSite/assets/imgs/Ollama-direct1.png
Normal file
|
After Width: | Height: | Size: 72 KiB |
BIN
docSite/assets/imgs/Ollama-models1.png
Normal file
|
After Width: | Height: | Size: 20 KiB |
BIN
docSite/assets/imgs/Ollama-models2.png
Normal file
|
After Width: | Height: | Size: 138 KiB |
BIN
docSite/assets/imgs/Ollama-models3.png
Normal file
|
After Width: | Height: | Size: 122 KiB |
BIN
docSite/assets/imgs/Ollama-models4.png
Normal file
|
After Width: | Height: | Size: 124 KiB |
BIN
docSite/assets/imgs/Ollama-oneapi1.png
Normal file
|
After Width: | Height: | Size: 94 KiB |
BIN
docSite/assets/imgs/Ollama-oneapi2.png
Normal file
|
After Width: | Height: | Size: 57 KiB |
BIN
docSite/assets/imgs/Ollama-oneapi3 .png
Normal file
|
After Width: | Height: | Size: 76 KiB |
BIN
docSite/assets/imgs/Ollama-pull.png
Normal file
|
After Width: | Height: | Size: 26 KiB |
|
Before Width: | Height: | Size: 323 KiB After Width: | Height: | Size: 124 KiB |
|
Before Width: | Height: | Size: 153 KiB |
|
Before Width: | Height: | Size: 86 KiB |
|
Before Width: | Height: | Size: 145 KiB |
|
Before Width: | Height: | Size: 68 KiB |
|
Before Width: | Height: | Size: 205 KiB |
|
Before Width: | Height: | Size: 222 KiB After Width: | Height: | Size: 221 KiB |
|
Before Width: | Height: | Size: 204 KiB After Width: | Height: | Size: 203 KiB |
|
Before Width: | Height: | Size: 220 KiB After Width: | Height: | Size: 220 KiB |
BIN
docSite/assets/imgs/aiproxy-1.jpg
Normal file
|
After Width: | Height: | Size: 198 KiB |
BIN
docSite/assets/imgs/aiproxy-1.png
Normal file
|
After Width: | Height: | Size: 43 KiB |
BIN
docSite/assets/imgs/aiproxy-10.png
Normal file
|
After Width: | Height: | Size: 53 KiB |
BIN
docSite/assets/imgs/aiproxy-11.png
Normal file
|
After Width: | Height: | Size: 108 KiB |
BIN
docSite/assets/imgs/aiproxy-2.jpg
Normal file
|
After Width: | Height: | Size: 105 KiB |
BIN
docSite/assets/imgs/aiproxy-2.png
Normal file
|
After Width: | Height: | Size: 235 KiB |
BIN
docSite/assets/imgs/aiproxy-3.png
Normal file
|
After Width: | Height: | Size: 91 KiB |
BIN
docSite/assets/imgs/aiproxy-4.png
Normal file
|
After Width: | Height: | Size: 48 KiB |
BIN
docSite/assets/imgs/aiproxy-5.png
Normal file
|
After Width: | Height: | Size: 57 KiB |
BIN
docSite/assets/imgs/aiproxy-6.png
Normal file
|
After Width: | Height: | Size: 90 KiB |
BIN
docSite/assets/imgs/aiproxy-7.png
Normal file
|
After Width: | Height: | Size: 96 KiB |
BIN
docSite/assets/imgs/aiproxy-8.png
Normal file
|
After Width: | Height: | Size: 90 KiB |
BIN
docSite/assets/imgs/aiproxy-9.png
Normal file
|
After Width: | Height: | Size: 51 KiB |
BIN
docSite/assets/imgs/aiproxy1.png
Normal file
|
After Width: | Height: | Size: 135 KiB |
|
Before Width: | Height: | Size: 332 KiB After Width: | Height: | Size: 94 KiB |
|
Before Width: | Height: | Size: 206 KiB After Width: | Height: | Size: 66 KiB |
BIN
docSite/assets/imgs/chunkReader1.png
Normal file
|
After Width: | Height: | Size: 64 KiB |
BIN
docSite/assets/imgs/chunkReader2.jpg
Normal file
|
After Width: | Height: | Size: 159 KiB |
BIN
docSite/assets/imgs/chunkReader3.webp
Normal file
|
After Width: | Height: | Size: 71 KiB |
BIN
docSite/assets/imgs/chunkReader4.jpg
Normal file
|
After Width: | Height: | Size: 139 KiB |
BIN
docSite/assets/imgs/chunkReader5.jpg
Normal file
|
After Width: | Height: | Size: 57 KiB |
BIN
docSite/assets/imgs/chunkReader6.png
Normal file
|
After Width: | Height: | Size: 122 KiB |
BIN
docSite/assets/imgs/chunkReader7.jpg
Normal file
|
After Width: | Height: | Size: 44 KiB |
BIN
docSite/assets/imgs/chunkReader8.png
Normal file
|
After Width: | Height: | Size: 67 KiB |
BIN
docSite/assets/imgs/chunkReader9.jpg
Normal file
|
After Width: | Height: | Size: 120 KiB |
|
Before Width: | Height: | Size: 207 KiB After Width: | Height: | Size: 206 KiB |
BIN
docSite/assets/imgs/customfeedback2.png
Normal file
|
After Width: | Height: | Size: 56 KiB |
|
Before Width: | Height: | Size: 228 KiB After Width: | Height: | Size: 226 KiB |
|
Before Width: | Height: | Size: 211 KiB After Width: | Height: | Size: 210 KiB |
|
Before Width: | Height: | Size: 221 KiB After Width: | Height: | Size: 221 KiB |
|
Before Width: | Height: | Size: 207 KiB After Width: | Height: | Size: 205 KiB |
|
Before Width: | Height: | Size: 212 KiB After Width: | Height: | Size: 208 KiB |
|
Before Width: | Height: | Size: 313 KiB After Width: | Height: | Size: 101 KiB |
|
Before Width: | Height: | Size: 369 KiB After Width: | Height: | Size: 368 KiB |
|
Before Width: | Height: | Size: 249 KiB After Width: | Height: | Size: 248 KiB |
|
Before Width: | Height: | Size: 214 KiB After Width: | Height: | Size: 212 KiB |
|
Before Width: | Height: | Size: 246 KiB After Width: | Height: | Size: 242 KiB |
|
Before Width: | Height: | Size: 206 KiB After Width: | Height: | Size: 82 KiB |
|
Before Width: | Height: | Size: 309 KiB After Width: | Height: | Size: 98 KiB |
|
Before Width: | Height: | Size: 195 KiB After Width: | Height: | Size: 195 KiB |
|
Before Width: | Height: | Size: 190 KiB After Width: | Height: | Size: 65 KiB |
|
Before Width: | Height: | Size: 298 KiB After Width: | Height: | Size: 299 KiB |
|
After Width: | Height: | Size: 170 KiB |
|
After Width: | Height: | Size: 102 KiB |
|
After Width: | Height: | Size: 70 KiB |
|
After Width: | Height: | Size: 89 KiB |