diff --git a/.gitea/workflows/deploy.yml b/.gitea/workflows/deploy.yml new file mode 100644 index 0000000..f585b47 --- /dev/null +++ b/.gitea/workflows/deploy.yml @@ -0,0 +1,47 @@ +name: 部署到群晖 + +on: + push: + branches: [main] + +jobs: + deploy: + runs-on: ubuntu-latest + steps: + - name: 安装 Docker CLI + run: | + # 替换 Debian 源为清华镜像,避免国内连 deb.debian.org 超时 + sed -i 's|deb.debian.org|mirrors.tuna.tsinghua.edu.cn|g' /etc/apt/sources.list /etc/apt/sources.list.d/*.list 2>/dev/null || true + sed -i 's|security.debian.org|mirrors.tuna.tsinghua.edu.cn/debian-security|g' /etc/apt/sources.list /etc/apt/sources.list.d/*.list 2>/dev/null || true + apt-get update -qq + apt-get install -y -qq docker.io + + - name: 拉取代码 + uses: actions/checkout@v4 + + - name: 构建镜像 + run: docker build -f Dockerfile.prod -t dysync:latest . + + - name: 停止旧容器 + run: | + docker stop dysync 2>/dev/null || true + docker rm dysync 2>/dev/null || true + + - name: 启动新容器 + run: | + docker run -d \ + --name dysync \ + --restart unless-stopped \ + -p 10101:10101 \ + -e TZ=Asia/Shanghai \ + -e ASPNETCORE_ENVIRONMENT=Production \ + -v /volume1/docker/apps/dysync/db:/app/db \ + -v /volume1/docker/apps/dysync/logs:/app/logs \ + -v /volume2/save/dysync/collect:/app/collect \ + -v /volume2/save/dysync/favorite:/app/favorite \ + -v /volume2/save/dysync/uper:/app/uper \ + dysync:latest + + - name: 部署完成提示 + run: | + echo "✅ 部署完成,浏览器访问 http://192.168.1.66:10101 查看" diff --git a/Dockerfile.prod b/Dockerfile.prod new file mode 100644 index 0000000..df9202e --- /dev/null +++ b/Dockerfile.prod @@ -0,0 +1,69 @@ +# 多阶段构建 Dockerfile +# 第一阶段:构建前端 +# 使用国内镜像源,避免 Docker Hub 拉取失败(可改为 node:18-alpine 若已配置 Docker 镜像加速) +FROM registry.cn-hangzhou.aliyuncs.com/library/node:18-alpine AS frontend-builder + +WORKDIR /app/frontend + +# 复制前端依赖文件 +COPY app/package.json app/pnpm-lock.yaml* ./ + +# 配置 npm 和 pnpm 使用国内镜像源 +RUN npm config set registry https://registry.npmmirror.com && \ + npm install -g pnpm && \ + pnpm config set registry https://registry.npmmirror.com && \ + if [ -f pnpm-lock.yaml ]; then \ + pnpm install --frozen-lockfile; \ + else \ + npm install; \ + fi + +# 复制前端源码 +COPY app/ ./ + +# 构建前端 +RUN pnpm build || npm run build + +# 第二阶段:构建后端 +FROM mcr.microsoft.com/dotnet/sdk:6.0 AS backend-builder + +WORKDIR /src + +# 复制项目文件 +COPY *.csproj ./ +RUN dotnet restore dy.net.csproj + +# 复制所有文件 +COPY . . + +# 删除 macOS 资源分叉文件(._* 文件) +RUN find . -name "._*" -type f -delete + +# 复制前端构建产物 +COPY --from=frontend-builder /app/frontend/dist ./app/dist + +# 发布后端 +RUN dotnet publish dy.net.csproj -c Release -o /app/publish + +# 第三阶段:运行镜像 +FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS final + +WORKDIR /app + +# 设置时区 +ENV TZ=Asia/Shanghai +RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone + +# 从构建阶段复制发布文件 +COPY --from=backend-builder /app/publish . + +# 暴露端口 +EXPOSE 10101 + +# 设置环境变量 +ENV ASPNETCORE_URLS=http://*:10101 +ENV ASPNETCORE_ENVIRONMENT=Production + +# 启动应用 +ENTRYPOINT ["dotnet", "dy.net.dll"] +