From 7a4b407f228542ea2164a5b5d1b8e7767d7f556b Mon Sep 17 00:00:00 2001 From: ddCat Date: Wed, 22 Jul 2026 23:51:40 +0800 Subject: [PATCH] =?UTF-8?q?chore(release):=20=E7=89=88=E6=9C=AC=E5=8F=91?= =?UTF-8?q?=E5=B8=83=20-=20publish=20v1.0.2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/publish-images.yml | 65 ++++++++++++++++++++++++++++ CHANGELOG.md | 6 +++ README.md | 6 ++- VERSION | 2 +- docker-compose.deploy.yml | 12 +---- scripts/install-server.sh | 14 +++++- 6 files changed, 90 insertions(+), 15 deletions(-) create mode 100644 .github/workflows/publish-images.yml diff --git a/.github/workflows/publish-images.yml b/.github/workflows/publish-images.yml new file mode 100644 index 000000000..941505f08 --- /dev/null +++ b/.github/workflows/publish-images.yml @@ -0,0 +1,65 @@ +name: Publish container images + +on: + push: + branches: + - main + tags: + - "v*" + workflow_dispatch: + +permissions: + contents: read + packages: write + +jobs: + publish: + name: Publish ${{ matrix.image }} + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + include: + - image: open-ai-canvas-web + dockerfile: Dockerfile + - image: open-ai-canvas-backend + dockerfile: backend/Dockerfile + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Set up QEMU + uses: docker/setup-qemu-action@v3 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Log in to GitHub Container Registry + uses: docker/login-action@v3 + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Generate image metadata + id: metadata + uses: docker/metadata-action@v5 + with: + images: ghcr.io/${{ github.repository_owner }}/${{ matrix.image }} + tags: | + type=raw,value=latest,enable=${{ github.ref == format('refs/heads/{0}', github.event.repository.default_branch) }} + type=semver,pattern={{version}} + type=sha,prefix=sha- + + - name: Build and push image + uses: docker/build-push-action@v6 + with: + context: . + file: ${{ matrix.dockerfile }} + platforms: linux/amd64,linux/arm64 + push: true + tags: ${{ steps.metadata.outputs.tags }} + labels: ${{ steps.metadata.outputs.labels }} + cache-from: type=gha,scope=${{ matrix.image }} + cache-to: type=gha,mode=max,scope=${{ matrix.image }} diff --git a/CHANGELOG.md b/CHANGELOG.md index c1381840a..a2ffeb01a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,12 @@ ## Unreleased +## v1.0.2 + +- 增加前端与后端多架构 GHCR 镜像发布,并让服务器一键部署直接拉取指定版本镜像。 +- 完善 Codex App 插件的仓库 marketplace 安装入口。 +- 修复 xAI 视频生成请求未使用官方字段的问题。 + ## v1.0.1 - 自定义模型渠道改由登录态后端中转,减少第三方接口 CORS 限制。 diff --git a/README.md b/README.md index b714ffd30..ca0dc93ed 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@

GitHub stars - Version + Version License

@@ -75,7 +75,7 @@ Issue 反馈、技术讨论和产品升级建议都可以在 QQ 群中沟通。 curl -fsSL https://raw.githubusercontent.com/ddcat-ai/open-ai-canvas/main/scripts/install-server.sh | sudo bash ``` -脚本会自动安装 Docker 和 Docker Compose,把项目安装到 `/opt/open-ai-canvas`,生成随机数据库密码,并启动网页、后端、PostgreSQL 和 Redis。数据库和上传文件使用 Docker 数据卷持久保存,重新启动容器不会丢失。 +脚本会自动安装 Docker 和 Docker Compose,把部署配置安装到 `/opt/open-ai-canvas`,生成随机数据库密码,从 GitHub Container Registry 拉取网页与后端镜像,并启动网页、后端、PostgreSQL 和 Redis。数据库和上传文件使用 Docker 数据卷持久保存,重新启动容器不会丢失。 完成后打开 `http://服务器IP:3000`。第一个注册的账号会自动成为管理员;登录后在系统设置中配置模型渠道即可开始使用。公开注册默认关闭,但不影响第一个管理员注册。 @@ -87,6 +87,8 @@ sudo docker compose --env-file .env -f docker-compose.deploy.yml ps sudo docker compose --env-file .env -f docker-compose.deploy.yml logs -f --tail=200 ``` +默认拉取 `ghcr.io/ddcat-ai/open-ai-canvas-web:latest` 和 `ghcr.io/ddcat-ai/open-ai-canvas-backend:latest`。发布版本还会生成去掉 `v` 前缀的版本标签;如需固定版本,可在 `.env` 中设置 `CANVAS_IMAGE_TAG=1.0.2`。 + 部署配置和 PostgreSQL 密码保存在 `/opt/open-ai-canvas/.env`,不要发送给他人,也不要删除 `backend-data`、`postgres-data` 和 `redis-data` 数据卷。数据卷持久化不等于备份,请定期备份 PostgreSQL 和上传文件。直接使用 IP 访问仅适合首次配置;公网长期使用必须绑定域名并配置 HTTPS。 ## 本地开发 diff --git a/VERSION b/VERSION index b18d46540..570c79651 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -v1.0.1 +v1.0.2 diff --git a/docker-compose.deploy.yml b/docker-compose.deploy.yml index 97d40c610..1406d8042 100644 --- a/docker-compose.deploy.yml +++ b/docker-compose.deploy.yml @@ -27,12 +27,7 @@ services: restart: unless-stopped backend: - image: open-ai-canvas-backend:deploy - build: - context: . - dockerfile: backend/Dockerfile - args: - GOPROXY: ${GOPROXY:-https://proxy.golang.org,direct} + image: ghcr.io/ddcat-ai/open-ai-canvas-backend:${CANVAS_IMAGE_TAG:-latest} environment: CANVAS_BACKEND_ADDR: ":8080" CANVAS_BACKEND_DATA_DIR: /data @@ -54,10 +49,7 @@ services: restart: unless-stopped web: - image: open-ai-canvas-web:deploy - build: - context: . - dockerfile: Dockerfile + image: ghcr.io/ddcat-ai/open-ai-canvas-web:${CANVAS_IMAGE_TAG:-latest} ports: - "${CANVAS_HTTP_PORT:-3000}:3000" depends_on: diff --git a/scripts/install-server.sh b/scripts/install-server.sh index a9e64cb0e..bb91c0316 100755 --- a/scripts/install-server.sh +++ b/scripts/install-server.sh @@ -6,6 +6,7 @@ REPOSITORY_URL="${REPOSITORY_URL:-https://github.com/ddcat-ai/open-ai-canvas.git REPOSITORY_REF="${REPOSITORY_REF:-main}" INSTALL_DIR="${INSTALL_DIR:-/opt/open-ai-canvas}" CANVAS_HTTP_PORT="${CANVAS_HTTP_PORT:-3000}" +CANVAS_IMAGE_TAG="${CANVAS_IMAGE_TAG:-latest}" COMPOSE_FILE="docker-compose.deploy.yml" step() { @@ -24,6 +25,7 @@ require_root() { [[ "$(uname -s)" == "Linux" ]] || fail "一键部署脚本仅支持 Linux 服务器" [[ "$CANVAS_HTTP_PORT" =~ ^[0-9]+$ ]] || fail "CANVAS_HTTP_PORT 必须是 1 到 65535 的数字" ((CANVAS_HTTP_PORT >= 1 && CANVAS_HTTP_PORT <= 65535)) || fail "CANVAS_HTTP_PORT 必须是 1 到 65535 的数字" + [[ "$CANVAS_IMAGE_TAG" =~ ^[A-Za-z0-9_][A-Za-z0-9_.-]{0,127}$ ]] || fail "CANVAS_IMAGE_TAG 不是有效的 Docker 镜像标签" } install_packages() { @@ -90,6 +92,12 @@ prepare_environment() { ((configured_http_port >= 1 && configured_http_port <= 65535)) || fail ".env 中的 CANVAS_HTTP_PORT 无效" CANVAS_HTTP_PORT="$configured_http_port" fi + local configured_image_tag + configured_image_tag="$(sed -n 's/^CANVAS_IMAGE_TAG=//p' .env | tail -n 1)" + if [[ -n "$configured_image_tag" ]]; then + [[ "$configured_image_tag" =~ ^[A-Za-z0-9_][A-Za-z0-9_.-]{0,127}$ ]] || fail ".env 中的 CANVAS_IMAGE_TAG 无效" + CANVAS_IMAGE_TAG="$configured_image_tag" + fi return fi @@ -103,6 +111,7 @@ POSTGRES_USER=open_ai_canvas POSTGRES_PASSWORD=${database_password} DATABASE_URL=postgresql://open_ai_canvas:${database_password}@postgres:5432/open_ai_canvas?sslmode=disable CANVAS_HTTP_PORT=${CANVAS_HTTP_PORT} +CANVAS_IMAGE_TAG=${CANVAS_IMAGE_TAG} CANVAS_REGISTRATION_ENABLED=false CANVAS_ALLOW_PRIVATE_UPSTREAMS=false CANVAS_ALLOWED_PRIVATE_UPSTREAM_HOSTS= @@ -111,8 +120,9 @@ EOF } start_services() { - step "构建并启动 PostgreSQL、Redis、后端和网页服务" - docker compose --env-file .env -f "$COMPOSE_FILE" up -d --build --remove-orphans --wait --wait-timeout 600 + step "拉取并启动 PostgreSQL、Redis、后端和网页服务" + docker compose --env-file .env -f "$COMPOSE_FILE" pull + docker compose --env-file .env -f "$COMPOSE_FILE" up -d --remove-orphans --wait --wait-timeout 600 } print_result() {