From 92edae8aa70294c8a26613da887d2c3656edc91c Mon Sep 17 00:00:00 2001
From: hhhhsc <1710496817@qq.com>
Date: Thu, 26 Feb 2026 14:34:51 +0800
Subject: [PATCH 01/10] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E8=AF=81=E4=B9=A6?=
=?UTF-8?q?=E6=A0=BC=E5=BC=8F=E6=94=AF=E6=8C=81?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
scripts/images/frontend/Dockerfile | 2 +-
scripts/images/frontend/start.sh | 10 +++++++---
2 files changed, 8 insertions(+), 4 deletions(-)
diff --git a/scripts/images/frontend/Dockerfile b/scripts/images/frontend/Dockerfile
index d9d83f69..3aaf639c 100644
--- a/scripts/images/frontend/Dockerfile
+++ b/scripts/images/frontend/Dockerfile
@@ -12,7 +12,7 @@ FROM nginx:1.29 AS runner
RUN --mount=type=cache,target=/var/cache/apt \
--mount=type=cache,target=/var/lib/apt \
apt update \
- && apt install -y dos2unix python3 python3-dev python3-venv libaugeas-dev gcc \
+ && apt install -y dos2unix python3 python3-dev python3-venv libaugeas-dev gcc vim cron \
&& python3 -m venv /opt/certbot/ \
&& /opt/certbot/bin/pip install --upgrade pip \
&& /opt/certbot/bin/pip install certbot certbot-nginx \
diff --git a/scripts/images/frontend/start.sh b/scripts/images/frontend/start.sh
index fc3b4aed..457e4a54 100644
--- a/scripts/images/frontend/start.sh
+++ b/scripts/images/frontend/start.sh
@@ -6,10 +6,14 @@ if [ -f "/cert/server.pem" ]; then
fi
if [ -f "/cert/server.key" ]; then
- if openssl rsa -in /cert/server.key -passin pass:test_check -noout 2>/dev/null; then
- cp /cert/server.key /etc/nginx/cert/server.key
+ # Check if key is encrypted and decrypt if needed
+ # Supports RSA, EC (Elliptic Curve), PKCS#8, and DSA keys
+ if grep -q "ENCRYPTED" /cert/server.key 2>/dev/null; then
+ # Key is encrypted, decrypt using generic pkey command (supports all key types)
+ echo "$CERT_PASS" | openssl pkey -in /cert/server.key -out /etc/nginx/cert/server.key -passin stdin
else
- echo "$CERT_PASS" | openssl rsa -in /cert/server.key -out /etc/nginx/cert/server.key -passin stdin
+ # Key is not encrypted, copy directly
+ cp /cert/server.key /etc/nginx/cert/server.key
fi
chown nginx:nginx /etc/nginx/cert/server.key
fi
From 47ad050e2085feec0778544b928c29bd56a7f833 Mon Sep 17 00:00:00 2001
From: hhhhsc <1710496817@qq.com>
Date: Thu, 26 Feb 2026 15:36:22 +0800
Subject: [PATCH 02/10] =?UTF-8?q?=E5=88=9B=E5=BB=BA=E4=BB=BB=E5=8A=A1?=
=?UTF-8?q?=E6=97=B6=E5=A2=9E=E5=8A=A0=E4=BD=BF=E7=94=A8=E6=AC=A1=E6=95=B0?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../app/module/cleaning/service/cleaning_task_service.py | 5 +++++
.../app/module/operator/service/operator_service.py | 8 ++++++++
2 files changed, 13 insertions(+)
diff --git a/runtime/datamate-python/app/module/cleaning/service/cleaning_task_service.py b/runtime/datamate-python/app/module/cleaning/service/cleaning_task_service.py
index 9886a18d..5ce0bb19 100644
--- a/runtime/datamate-python/app/module/cleaning/service/cleaning_task_service.py
+++ b/runtime/datamate-python/app/module/cleaning/service/cleaning_task_service.py
@@ -180,6 +180,11 @@ async def create_task(
await self.operator_instance_repo.insert_instance(db, task_id, request.instance)
+ # Increment operator usage count
+ operator_ids = [inst.id for inst in request.instance if inst.id]
+ if operator_ids:
+ await self.operator_service.increment_usage_count(operator_ids, db)
+
all_operators = await self.operator_service.get_operators(db=db, page=0, size=1000, categories=[], keyword=None, is_star=None)
operator_map = {op.id: op for op in all_operators}
diff --git a/runtime/datamate-python/app/module/operator/service/operator_service.py b/runtime/datamate-python/app/module/operator/service/operator_service.py
index 6314f221..aced839d 100644
--- a/runtime/datamate-python/app/module/operator/service/operator_service.py
+++ b/runtime/datamate-python/app/module/operator/service/operator_service.py
@@ -619,6 +619,14 @@ def _get_upload_path(self, file_name: str) -> str:
"""获取上传文件路径"""
return os.path.join(OPERATOR_BASE_PATH, UPLOAD_DIR, file_name)
+ async def increment_usage_count(
+ self,
+ operator_ids: List[str],
+ db: AsyncSession
+ ) -> None:
+ """增加算子使用次数"""
+ await self.operator_repo.increment_usage_count(operator_ids, db)
+
def _get_extract_path(self, file_stem: str) -> str:
"""获取解压路径"""
return os.path.join(OPERATOR_BASE_PATH, EXTRACT_DIR, file_stem)
From 593e9c02b009c68eebd365c88dbcf708b9c1f23f Mon Sep 17 00:00:00 2001
From: hhhhsc <1710496817@qq.com>
Date: Thu, 26 Feb 2026 16:14:33 +0800
Subject: [PATCH 03/10] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E4=BD=BF=E7=94=A8?=
=?UTF-8?q?=E6=AC=A1=E6=95=B0=E8=AE=A1=E7=AE=97=E9=94=99=E8=AF=AF?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
frontend/src/components/SearchControls.tsx | 4 ++--
frontend/src/pages/OperatorMarket/operator.const.tsx | 3 ++-
.../app/module/operator/repository/operator_repository.py | 6 +++---
3 files changed, 7 insertions(+), 6 deletions(-)
diff --git a/frontend/src/components/SearchControls.tsx b/frontend/src/components/SearchControls.tsx
index 878f7fcc..b57f85ca 100644
--- a/frontend/src/components/SearchControls.tsx
+++ b/frontend/src/components/SearchControls.tsx
@@ -196,7 +196,7 @@ export function SearchControls({
- {t('components.searchControls.selectedFilters')}
+ {t('components.searchControls.filters.label')}
{Object.entries(selectedFilters).map(([filterKey, values]) =>
values.map((value) => {
@@ -231,7 +231,7 @@ export function SearchControls({
onClick={handleClearAllFilters}
className="text-gray-500 hover:text-gray-700"
>
- {t('components.searchControls.clearAll')}
+ {t('components.searchControls.filters.clearAll')}
diff --git a/frontend/src/pages/OperatorMarket/operator.const.tsx b/frontend/src/pages/OperatorMarket/operator.const.tsx
index 75d99cb0..14ddfd85 100644
--- a/frontend/src/pages/OperatorMarket/operator.const.tsx
+++ b/frontend/src/pages/OperatorMarket/operator.const.tsx
@@ -113,6 +113,7 @@ export const mapOperator = (op: OperatorI, t: (key: string) => string) => {
const FUNCTION_CATEGORY_IDS = {
cleaning: "8c09476a-a922-418f-a908-733f8a0de521",
annotation: "cfa9d8e2-5b5f-4f1e-9f12-1234567890ab",
+ system: "96a3b07a-3439-4557-a835-525faad60ca3"
} as const;
const categories = op?.categories || [];
@@ -142,7 +143,7 @@ export const mapOperator = (op: OperatorI, t: (key: string) => string) => {
},
{
label: t("operatorMarket.const.size"),
- value: formatBytes(op?.fileSize),
+ value: categories?.includes(FUNCTION_CATEGORY_IDS.system) ? '-' : formatBytes(op?.fileSize),
},
{
label: t("operatorMarket.const.language"),
diff --git a/runtime/datamate-python/app/module/operator/repository/operator_repository.py b/runtime/datamate-python/app/module/operator/repository/operator_repository.py
index 990f7eb3..805f8cb0 100644
--- a/runtime/datamate-python/app/module/operator/repository/operator_repository.py
+++ b/runtime/datamate-python/app/module/operator/repository/operator_repository.py
@@ -6,7 +6,7 @@
from typing import List, Optional
from datetime import datetime, timezone
-from sqlalchemy import select, text, update
+from sqlalchemy import select, text, update, func
from sqlalchemy.ext.asyncio import AsyncSession
from app.db.models.operator import Operator
@@ -115,7 +115,7 @@ async def increment_usage_count(
update(Operator)
.where(Operator.id.in_(operator_ids))
.values(
- usage_count=Operator.usage_count + 1,
- updated_at=datetime.now(timezone.utc),
+ usage_count=func.coalesce(Operator.usage_count, 0) + 1,
+ updated_at=datetime.utcnow(),
)
)
From 20d5d5336781a84e76abfa87c652bae56c278bb5 Mon Sep 17 00:00:00 2001
From: hhhhsc <1710496817@qq.com>
Date: Thu, 26 Feb 2026 16:28:52 +0800
Subject: [PATCH 04/10] =?UTF-8?q?=E4=BC=98=E5=8C=96=E9=94=99=E8=AF=AF?=
=?UTF-8?q?=E7=A0=81=E6=8F=8F=E8=BF=B0?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
frontend/public/config/error-code.json | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/frontend/public/config/error-code.json b/frontend/public/config/error-code.json
index 8270f4db..0a7bc651 100644
--- a/frontend/public/config/error-code.json
+++ b/frontend/public/config/error-code.json
@@ -11,9 +11,9 @@
"cleaning.0009": "设置解析错误",
"cleaning.0010": "任务ID不能为空",
"operator.0001": "算子不存在",
- "operator.0002": "算子正在使用中",
+ "operator.0002": "算子被编排于模版中或处在正在进行的任务中,无法删除",
"operator.0003": "无法删除预置算子",
- "operator.0004": "不支持的文件类型",
+ "operator.0004": "不支持的文件类型,当前仅支持tar和zip",
"operator.0005": "解析算子包失败",
"operator.0006": "缺少必要的字段",
"400": "请求参数错误",
From 5734c947f2c3d754bc48c62dba745638eeba5e68 Mon Sep 17 00:00:00 2001
From: hhhhsc <1710496817@qq.com>
Date: Thu, 26 Feb 2026 20:15:40 +0800
Subject: [PATCH 05/10] =?UTF-8?q?=E4=B8=8A=E4=BC=A0=E6=97=B6=E5=A2=9E?=
=?UTF-8?q?=E5=8A=A0=E5=8A=9F=E8=83=BD=E5=8F=82=E6=95=B0?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../app/module/operator/constants.py | 4 ++++
.../operator/parsers/abstract_parser.py | 5 +++++
runtime/ops/README.md | 16 +++++++++++++---
runtime/ops/examples/test_operator/README.md | Bin 8534 -> 16384 bytes
.../ops/examples/test_operator/metadata.yml | 3 +++
.../examples/test_operator/test_operator.tar | Bin 27648 -> 35328 bytes
6 files changed, 25 insertions(+), 3 deletions(-)
diff --git a/runtime/datamate-python/app/module/operator/constants.py b/runtime/datamate-python/app/module/operator/constants.py
index e6d83ee9..188e6a06 100644
--- a/runtime/datamate-python/app/module/operator/constants.py
+++ b/runtime/datamate-python/app/module/operator/constants.py
@@ -30,6 +30,8 @@
CATEGORY_DATAMATE_ID = "431e7798-5426-4e1a-aae6-b9905a836b34"
CATEGORY_DATA_JUICER_ID = "79b385b4-fde8-4617-bcba-02a176938996"
CATEGORY_OTHER_VENDOR_ID = "f00eaa3e-96c1-4de4-96cd-9848ef5429ec"
+CATEGORY_CLEANING_ID = "8c09476a-a922-418f-a908-733f8a0de521"
+CATEGORY_ANNOTATION_ID = "cfa9d8e2-5b5f-4f1e-9f12-1234567890ab"
# Category mapping
CATEGORY_MAP = {
@@ -42,6 +44,8 @@
"all": CATEGORY_ALL_ID,
"datamate": CATEGORY_DATAMATE_ID,
"data-juicer": CATEGORY_DATA_JUICER_ID,
+ "cleaning": CATEGORY_CLEANING_ID,
+ "annotation": CATEGORY_ANNOTATION_ID,
}
# File paths
diff --git a/runtime/datamate-python/app/module/operator/parsers/abstract_parser.py b/runtime/datamate-python/app/module/operator/parsers/abstract_parser.py
index 50ee98cf..7ec917ac 100644
--- a/runtime/datamate-python/app/module/operator/parsers/abstract_parser.py
+++ b/runtime/datamate-python/app/module/operator/parsers/abstract_parser.py
@@ -92,6 +92,11 @@ def parse_yaml(
CATEGORY_MAP.get(self._to_lower(content.get("vendor")), CATEGORY_OTHER_VENDOR_ID),
CATEGORY_CUSTOMIZED_ID,
]
+ types = content.get("types")
+ if isinstance(types, list):
+ for t in types:
+ if self._to_lower(t) in CATEGORY_MAP:
+ categories.append(CATEGORY_MAP[self._to_lower(t)])
operator.categories = categories
return operator
diff --git a/runtime/ops/README.md b/runtime/ops/README.md
index 3be7c956..40682f3d 100644
--- a/runtime/ops/README.md
+++ b/runtime/ops/README.md
@@ -36,7 +36,17 @@ operator_package/
| `inputs` | 输入的数据模态 (text/image/audio/video) | text |
| `outputs` | 输出的数据模态 (text/image/audio/video) | text |
-### 2.2 算子版本更新日志 (release)
+### 2.2 算子功能分类
+
+定义算子功能分类,支持清洗与标注。
+
+```yaml
+types:
+ - 'cleaning'
+ - 'annotation'
+```
+
+### 2.3 算子版本更新日志 (release)
定义算子当前版本较上版本更新内容。
@@ -46,7 +56,7 @@ release:
- '支持基本处理操作'
```
-### 2.2 运行时资源与指标 (runtime & metrics)
+### 2.4 运行时资源与指标 (runtime & metrics)
定义算子运行时的资源配额及性能指标参考。
@@ -65,7 +75,7 @@ metrics: # 算子性能参考指标
metric: '99.5%'
```
-### 2.3 参数设置 (settings) - UI 组件规范
+### 2.5 参数设置 (settings) - UI 组件规范
通过 `settings` 字段,开发者可以自定义用户在前端界面配置算子时的交互组件。系统支持以下类型:
diff --git a/runtime/ops/examples/test_operator/README.md b/runtime/ops/examples/test_operator/README.md
index a40a4a8321c8abb234adb5ed33c33409f0a371b6..8a33a93a4fce78074096b2900c5046264ba11e68 100644
GIT binary patch
literal 16384
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
diff --git a/runtime/ops/examples/test_operator/metadata.yml b/runtime/ops/examples/test_operator/metadata.yml
index fb1b59b8..725a86b4 100644
--- a/runtime/ops/examples/test_operator/metadata.yml
+++ b/runtime/ops/examples/test_operator/metadata.yml
@@ -7,6 +7,9 @@ version: '1.0.0'
modal: 'text' # text/image/audio/video/multimodal
inputs: 'text' # text/image/audio/video/multimodal
outputs: 'text' # text/image/audio/video/multimodal
+types:
+ - 'cleaning'
+ - 'annotation'
release:
- '首次发布'
- '支持基本处理操作'
diff --git a/runtime/ops/examples/test_operator/test_operator.tar b/runtime/ops/examples/test_operator/test_operator.tar
index e14771ea6b3e689dd3b5842fd26428265a8daad1..1d32149f2eff2b4d0413b86f99eb7ce9268449d0 100644
GIT binary patch
delta 621
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
From 73e9531f5ddf05d4dc5b5783aec7a4038dad29fb Mon Sep 17 00:00:00 2001
From: hhhhsc <1710496817@qq.com>
Date: Thu, 26 Feb 2026 20:42:23 +0800
Subject: [PATCH 06/10] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E9=87=8D=E5=A4=8D?=
=?UTF-8?q?=E6=96=87=E4=BB=B6=E8=B7=B3=E8=BF=87=E6=8B=B7=E8=B4=9D?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../application/DatasetFileApplicationService.java | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/backend/services/data-management-service/src/main/java/com/datamate/datamanagement/application/DatasetFileApplicationService.java b/backend/services/data-management-service/src/main/java/com/datamate/datamanagement/application/DatasetFileApplicationService.java
index 99d23759..d95f3564 100644
--- a/backend/services/data-management-service/src/main/java/com/datamate/datamanagement/application/DatasetFileApplicationService.java
+++ b/backend/services/data-management-service/src/main/java/com/datamate/datamanagement/application/DatasetFileApplicationService.java
@@ -877,6 +877,10 @@ private void addFile(String sourPath, String targetPath, boolean softAdd) {
}
try {
+ if (Files.exists(target) && Files.isSameFile(source, target)) {
+ return;
+ }
+
Path parent = target.getParent();
// 创建目标目录(如果需要)
if (parent != null) {
From 7ece6c9a7371913353cd4ed2a757787e2df3d577 Mon Sep 17 00:00:00 2001
From: hhhhsc <1710496817@qq.com>
Date: Fri, 27 Feb 2026 10:05:25 +0800
Subject: [PATCH 07/10] =?UTF-8?q?=E4=B8=8A=E4=BC=A0=E5=A2=9E=E5=8A=A0?=
=?UTF-8?q?=E5=8A=9F=E8=83=BD=E5=8F=82=E6=95=B0?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../operator/parsers/abstract_parser.py | 20 ++++++++++++-------
1 file changed, 13 insertions(+), 7 deletions(-)
diff --git a/runtime/datamate-python/app/module/operator/parsers/abstract_parser.py b/runtime/datamate-python/app/module/operator/parsers/abstract_parser.py
index 7ec917ac..e861f2f7 100644
--- a/runtime/datamate-python/app/module/operator/parsers/abstract_parser.py
+++ b/runtime/datamate-python/app/module/operator/parsers/abstract_parser.py
@@ -8,7 +8,8 @@
from typing import Dict, Any, Optional
from app.module.operator.schema import OperatorDto, OperatorReleaseDto
-from app.module.operator.constants import CATEGORY_MAP, CATEGORY_OTHER_VENDOR_ID, CATEGORY_CUSTOMIZED_ID
+from app.module.operator.constants import CATEGORY_MAP, CATEGORY_OTHER_VENDOR_ID, CATEGORY_CUSTOMIZED_ID, \
+ CATEGORY_CLEANING_ID
from app.module.operator.exceptions import FieldNotFoundError
@@ -86,17 +87,22 @@ def parse_yaml(
operator.releases = [operator_release]
# Build categories
- categories = [
- CATEGORY_MAP.get(self._to_lower(content.get("language")), ""),
- CATEGORY_MAP.get(self._to_lower(content.get("modal")), ""),
- CATEGORY_MAP.get(self._to_lower(content.get("vendor")), CATEGORY_OTHER_VENDOR_ID),
- CATEGORY_CUSTOMIZED_ID,
- ]
+ categories = []
types = content.get("types")
if isinstance(types, list):
for t in types:
if self._to_lower(t) in CATEGORY_MAP:
categories.append(CATEGORY_MAP[self._to_lower(t)])
+ if len(categories) == 0:
+ categories.append(CATEGORY_CLEANING_ID)
+
+ categories.extend([
+ CATEGORY_MAP.get(self._to_lower(content.get("language")), ""),
+ CATEGORY_MAP.get(self._to_lower(content.get("modal")), ""),
+ CATEGORY_MAP.get(self._to_lower(content.get("vendor")), CATEGORY_OTHER_VENDOR_ID),
+ CATEGORY_CUSTOMIZED_ID,
+ ])
+
operator.categories = categories
return operator
From 591db4ae67d3938d0e8240fe5a8d08b8e1120c1b Mon Sep 17 00:00:00 2001
From: hhhhsc <1710496817@qq.com>
Date: Fri, 27 Feb 2026 10:12:20 +0800
Subject: [PATCH 08/10] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E4=B8=80=E9=94=AE?=
=?UTF-8?q?=E9=83=A8=E7=BD=B2=E5=91=BD=E4=BB=A4?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
README-zh.md | 5 +++++
README.md | 5 +++++
2 files changed, 10 insertions(+)
diff --git a/README-zh.md b/README-zh.md
index c051e6f1..be78387d 100644
--- a/README-zh.md
+++ b/README-zh.md
@@ -35,6 +35,11 @@
- kubernetes (用于部署服务-k8s方式)
- Helm (用于部署服务-k8s方式)
+### 一键部署
+```shell
+wget -qO docker-compose.yml https://raw.githubusercontent.com/ModelEngine-Group/DataMate/refs/heads/main/deployment/docker/datamate/docker-compose.yml && docker compose up -d
+```
+
### 拉取代码
```bash
diff --git a/README.md b/README.md
index a890a786..da621b8d 100644
--- a/README.md
+++ b/README.md
@@ -38,6 +38,11 @@ If you like this project, please give it a Star⭐️!
- Kubernetes (for service deployment - k8s method)
- Helm (for service deployment - k8s method)
+### Quick deploy
+```shell
+wget -qO docker-compose.yml https://raw.githubusercontent.com/ModelEngine-Group/DataMate/refs/heads/main/deployment/docker/datamate/docker-compose.yml && docker compose up -d
+```
+
### Clone the Code
```bash
From 7cc93ff8ce0989d72aedffd2b074aa152341f078 Mon Sep 17 00:00:00 2001
From: hhhhsc <1710496817@qq.com>
Date: Fri, 27 Feb 2026 10:12:54 +0800
Subject: [PATCH 09/10] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E4=B8=80=E9=94=AE?=
=?UTF-8?q?=E9=83=A8=E7=BD=B2=E5=91=BD=E4=BB=A4?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
README-zh.md | 2 +-
README.md | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/README-zh.md b/README-zh.md
index be78387d..dd7b25d5 100644
--- a/README-zh.md
+++ b/README-zh.md
@@ -35,7 +35,7 @@
- kubernetes (用于部署服务-k8s方式)
- Helm (用于部署服务-k8s方式)
-### 一键部署
+### Docker一键部署
```shell
wget -qO docker-compose.yml https://raw.githubusercontent.com/ModelEngine-Group/DataMate/refs/heads/main/deployment/docker/datamate/docker-compose.yml && docker compose up -d
```
diff --git a/README.md b/README.md
index da621b8d..3ec6e243 100644
--- a/README.md
+++ b/README.md
@@ -38,7 +38,7 @@ If you like this project, please give it a Star⭐️!
- Kubernetes (for service deployment - k8s method)
- Helm (for service deployment - k8s method)
-### Quick deploy
+### Docker Quick deploy
```shell
wget -qO docker-compose.yml https://raw.githubusercontent.com/ModelEngine-Group/DataMate/refs/heads/main/deployment/docker/datamate/docker-compose.yml && docker compose up -d
```
From 4b5ba5c2cd54e23699a6d9566ae0fb0d4151dec9 Mon Sep 17 00:00:00 2001
From: hhhhsc <1710496817@qq.com>
Date: Fri, 27 Feb 2026 10:18:59 +0800
Subject: [PATCH 10/10] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E4=B8=80=E9=94=AE?=
=?UTF-8?q?=E9=83=A8=E7=BD=B2=E5=91=BD=E4=BB=A4?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
README-zh.md | 3 ++-
README.md | 3 ++-
2 files changed, 4 insertions(+), 2 deletions(-)
diff --git a/README-zh.md b/README-zh.md
index dd7b25d5..91e443d3 100644
--- a/README-zh.md
+++ b/README-zh.md
@@ -37,7 +37,8 @@
### Docker一键部署
```shell
-wget -qO docker-compose.yml https://raw.githubusercontent.com/ModelEngine-Group/DataMate/refs/heads/main/deployment/docker/datamate/docker-compose.yml && docker compose up -d
+wget -qO docker-compose.yml https://raw.githubusercontent.com/ModelEngine-Group/DataMate/refs/heads/main/deployment/docker/datamate/docker-compose.yml \
+ && REGISTRY=ghcr.io/modelengine-group/ docker compose up -d
```
### 拉取代码
diff --git a/README.md b/README.md
index 3ec6e243..8b30c597 100644
--- a/README.md
+++ b/README.md
@@ -40,7 +40,8 @@ If you like this project, please give it a Star⭐️!
### Docker Quick deploy
```shell
-wget -qO docker-compose.yml https://raw.githubusercontent.com/ModelEngine-Group/DataMate/refs/heads/main/deployment/docker/datamate/docker-compose.yml && docker compose up -d
+wget -qO docker-compose.yml https://raw.githubusercontent.com/ModelEngine-Group/DataMate/refs/heads/main/deployment/docker/datamate/docker-compose.yml \
+ && REGISTRY=ghcr.io/modelengine-group/ docker compose up -d
```
### Clone the Code