From 3bdb055b839803bc550f5844b75bb1bdd5e2f0ee Mon Sep 17 00:00:00 2001 From: jeremygan2021 Date: Fri, 20 Mar 2026 15:55:02 +0800 Subject: [PATCH] t --- .gitea/workflows/deploy.yml | 216 ++------- __pycache__/main.cpython-312.pyc | Bin 80358 -> 90123 bytes main.py | 235 +++++++++ templates/data_base.html | 796 +++++++++++++++++++++++++++++++ 4 files changed, 1062 insertions(+), 185 deletions(-) create mode 100644 templates/data_base.html diff --git a/.gitea/workflows/deploy.yml b/.gitea/workflows/deploy.yml index 7e8ebfd..0438265 100644 --- a/.gitea/workflows/deploy.yml +++ b/.gitea/workflows/deploy.yml @@ -1,159 +1,30 @@ -name: Docker 构建与部署 +name: 部署到服务器 on: push: branches: [main, master] workflow_dispatch: - inputs: - arch: - description: '构建架构' - required: true - default: 'amd64' - type: choice - options: - - amd64 - - arm64 - - both - upload_only: - description: '仅上传已存在的tar文件' - required: false - default: 'false' - type: boolean env: - IMAGE_NAME: checkin_sys - IMAGE_TAG: latest - CONTAINER_NAME: checkin_sys-container - LOCAL_PORT: 8800 - CONTAINER_PORT: 8800 + TARGET_DIR: /home/quant/data/dev/checkin jobs: - build: - runs-on: ubuntu - if: github.event_name == 'push' || (github.event_name == 'workflow_dispatch' && !inputs.upload_only) - - steps: - - name: 设置国内镜像源 - run: | - git config --global url."https://ghproxy.com/".insteadOf "https://github.com/" - - - name: 配置 Docker 镜像源 - run: | - sudo mkdir -p /etc/docker - | sudo tee /etc/docker/daemon.json << 'EOF' -{ - "registry-mirrors": [ - "https://docker.mirrors.ustc.edu.cn", - "https://hub-mirror.c.163.com", - "https://mirror.baidubce.com" - ] -} -EOF - sudo service docker restart || true - - - name: 检出代码 - uses: actions/checkout@v4 - - - name: 设置 Buildx - uses: docker/setup-buildx-action@v3 - with: - driver-opts: | - image=moby/buildkit:buildx-stable-1 - - - name: 提取架构信息 - id: arch - run: | - if [ "${{ github.event.inputs.arch }}" == "arm64" ]; then - echo "platform=linux/arm64" >> $GITHUB_OUTPUT - echo "arch_suffix=-arm64" >> $GITHUB_OUTPUT - elif [ "${{ github.event.inputs.arch }}" == "both" ]; then - echo "platforms=linux/amd64,linux/arm64" >> $GITHUB_OUTPUT - else - echo "platform=linux/amd64" >> $GITHUB_OUTPUT - echo "arch_suffix=-amd64" >> $GITHUB_OUTPUT - fi - - - name: 构建 Docker 镜像 - uses: docker/build-push-action@v5 - with: - context: . - platforms: ${{ steps.arch.outputs.platforms || 'linux/amd64' }} - push: false - load: true - tags: ${{ env.IMAGE_NAME }}:${{ env.IMAGE_TAG }} - outputs: type=docker,dest=${{ env.IMAGE_NAME }}-${{ env.IMAGE_TAG }}${{ steps.arch.outputs.arch_suffix }}.tar - - - name: 上传镜像 artifact - uses: actions/upload-artifact@v4 - with: - name: docker-image-${{ steps.arch.outputs.arch_suffix || '-amd64' }} - path: ${{ env.IMAGE_NAME }}-${{ env.IMAGE_TAG }}${{ steps.arch.outputs.arch_suffix }}.tar - retention-days: 1 - deploy: runs-on: ubuntu-latest - needs: build - if: github.event_name == 'push' || github.event_name == 'workflow_dispatch' steps: - - name: 设置国内镜像源 - run: | - git config --global url."https://ghproxy.com/".insteadOf "https://github.com/" - - - name: 配置 Docker 镜像源 - run: | - sudo mkdir -p /etc/docker - | sudo tee /etc/docker/daemon.json << 'EOF' -{ - "registry-mirrors": [ - "https://docker.mirrors.ustc.edu.cn", - "https://hub-mirror.c.163.com", - "https://mirror.baidubce.com" - ] -} -EOF - sudo service docker restart || true - - - name: 检出代码 - uses: actions/checkout@v4 - - - name: 下载镜像 artifact (AMD64) - if: github.event_name == 'push' || (github.event_name == 'workflow_dispatch' && (inputs.arch == 'amd64' || inputs.arch == 'both')) - uses: actions/download-artifact@v4 - with: - name: docker-image--amd64 - path: . - - - name: 下载镜像 artifact (ARM64) - if: github.event_name == 'workflow_dispatch' && inputs.arch == 'both' - uses: actions/download-artifact@v4 - with: - name: docker-image--arm64 - path: . - - name: 安装 sshpass run: | sudo apt-get update sudo apt-get install -y sshpass - - name: 上传到服务器 - env: - SERVER_HOST: ${{ secrets.SERVER_HOST }} - SERVER_USER: ${{ secrets.SERVER_USER }} - SERVER_PASSWORD: ${{ secrets.SERVER_PASSWORD }} - SERVER_PORT: ${{ secrets.SERVER_PORT }} - TAR_FILE: ${{ env.IMAGE_NAME }}-${{ env.IMAGE_TAG }}-amd64.tar - run: | - sshpass -p "$SERVER_PASSWORD" scp -P "$SERVER_PORT" -o StrictHostKeyChecking=no "$TAR_FILE" "${SERVER_USER}@${SERVER_HOST}:/tmp/" - sshpass -p "$SERVER_PASSWORD" scp -P "$SERVER_PORT" -o StrictHostKeyChecking=no ".env" "${SERVER_USER}@${SERVER_HOST}:/tmp/" - - name: 在服务器上部署 env: SERVER_HOST: ${{ secrets.SERVER_HOST }} SERVER_USER: ${{ secrets.SERVER_USER }} SERVER_PASSWORD: ${{ secrets.SERVER_PASSWORD }} SERVER_PORT: ${{ secrets.SERVER_PORT }} - TAR_FILE: ${{ env.IMAGE_NAME }}-${{ env.IMAGE_TAG }}-amd64.tar + TARGET_DIR: ${{ env.TARGET_DIR }} run: | sshpass -p "$SERVER_PASSWORD" ssh -p "$SERVER_PORT" -o StrictHostKeyChecking=no "${SERVER_USER}@${SERVER_HOST}" << 'EOF' set -e @@ -162,62 +33,37 @@ EOF echo "$SERVER_PASSWORD" | sudo -S -p '' "$@" } - echo "[INFO] 开始服务器端部署..." + echo "===== 切换到目标目录: $TARGET_DIR =====" + cd $TARGET_DIR || { + echo "错误:目录 $TARGET_DIR 不存在!" + exit 1 + } - # 检查并停止现有容器 - if run_sudo docker ps -a --format 'table {{.Names}}' | grep -q "^${CONTAINER_NAME}$"; then - echo "[INFO] 发现现有容器 ${CONTAINER_NAME},正在停止并删除..." - run_sudo docker stop ${CONTAINER_NAME} || true - run_sudo docker rm ${CONTAINER_NAME} || true + echo -e "\n===== 停止并清理 Docker =====" + run_sudo docker compose down || true + + echo -e "\n===== 拉取 Git 代码 =====" + if ! git pull; then + echo "警告:Git pull 失败,尝试强制同步远程代码..." + git fetch --all + CURRENT_BRANCH=$(git rev-parse --abbrev-ref HEAD) + git reset --hard origin/$CURRENT_BRANCH + git pull fi - # 检查并删除现有镜像 - if run_sudo docker images --format 'table {{.Repository}}:{{.Tag}}' | grep -q "^${IMAGE_NAME}:${IMAGE_TAG}$"; then - echo "[INFO] 发现现有镜像 ${IMAGE_NAME}:${IMAGE_TAG},正在删除..." - run_sudo docker rmi ${IMAGE_NAME}:${IMAGE_TAG} || true - fi + echo -e "\n===== 配置环境变量 =====" + cat > backend/.env <<'ENVEOF' +ALIYUN_ACCESS_KEY_ID=LTAI5tE62GW8MKyoEaotzxXk +ALIYUN_ACCESS_KEY_SECRET=Zdzqo1fgj57DxxioXOotNKhJdSfVQW +ALIYUN_OSS_ENDPOINT=https://oss-cn-shanghai.aliyuncs.com +ALIYUN_OSS_BUCKET_NAME=tangledup-ai-staging +ALIYUN_OSS_INTERNAL_ENDPOINT=https://oss-cn-shanghai-internal.aliyuncs.com +ALIYUN_TINGWU_APP_KEY=6eOX7N3tKE0fDwb +DASHSCOPE_API_KEY=sk-84e9eef24a274f568d4fa15c97556c9f +ENVEOF - # 加载新镜像 - echo "[INFO] 加载新镜像..." - run_sudo docker load -i /tmp/${TAR_FILE} + echo -e "\n===== 启动 Docker 容器 =====" + run_sudo docker compose up -d --build - # 验证镜像是否加载成功 - if run_sudo docker images | grep -q "${IMAGE_NAME}"; then - echo "[SUCCESS] 镜像加载成功" - else - echo "[ERROR] 镜像加载失败" - exit 1 - fi - - # 启动新容器 - echo "[INFO] 启动新容器..." - run_sudo docker run -d --network host --name ${CONTAINER_NAME} \ - --env-file /tmp/.env \ - -e DB_HOST=localhost \ - -e DB_PORT=5432 \ - ${IMAGE_NAME}:${IMAGE_TAG} - - # 验证容器是否启动成功 - if run_sudo docker ps | grep -q "${CONTAINER_NAME}"; then - echo "[SUCCESS] 容器启动成功" - echo "[INFO] 容器状态:" - run_sudo docker ps | grep "${CONTAINER_NAME}" - else - echo "[ERROR] 容器启动失败" - echo "[INFO] 查看容器日志:" - run_sudo docker logs ${CONTAINER_NAME} - exit 1 - fi - - # 清理临时文件 - echo "[INFO] 清理临时文件..." - rm -f /tmp/${TAR_FILE} - rm -f /tmp/.env - - echo "[SUCCESS] 部署完成!" - echo "[INFO] 应用访问地址: http://${SERVER_HOST}:${LOCAL_PORT}" + echo -e "\n===== 操作完成!=====" EOF - - - name: 清理本地临时文件 - run: | - rm -f ${{ env.IMAGE_NAME }}-${{ env.IMAGE_TAG }}-*.tar diff --git a/__pycache__/main.cpython-312.pyc b/__pycache__/main.cpython-312.pyc index c66f396355bbae3a7d506e39d3ac0b6b5e9eabe2..40dc01a39d61f753b2e5d93e9378cdecec38bcf3 100644 GIT binary patch delta 10764 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 BrcwX^ delta 3432 zcmaKu4_H)H7Qo+m^LQX5V~Q{c=nRR;Ghqb8G%Z_eCw*uEvb9G@g|BQdo_z*?S0kuT!bMLt$Li@S#ef-|J=bm%! zx#!+@-jvsSUA!Ua4*B`{a`f-ah-JA=rVY9vet_Su2vOuMchwkinpYstP3A0Zt2oOg ztFBIirW}`*N8F-5>~bA=#+E8;o@KjLGheW@uM+A!N-is(SzURA)zw~BHd61cAAIeh z)eqLE=ku29y(|ha&II>E3tWk}bo8=VY+YjMTol1^@*E3i5%c6MnLX`UcAm4^7hWPC zMEm!@vEycUj4X%MvG5vd^|!1`Ek9a*+Ht#1@FWf#o$F8<0wFj#tC;%B3vWKyQm=&>9q7eI)HaidmBXNgq^*=_kfN0_a8<2a`IR?y zU-bH);WY6oPYiXVJH%0 z(G}W0`m%NH&ekovE`3t-w2_7@shmi|?W-IKmq|xukY5X$w^K+1WR3(@ZGfN2wyIDq z3$udi?E{o0Nf7XMKM+ZKl@1eT?ZNWkXFlruL!E)L>pz(M4X zn~8v;vTHa5sxco%0V&zshvaS<=Nm%R%e+ihOD=h%U?~||GYW>NnKdu-;t9H*xt45L zs#o`KJ&SQ`YNIHR)s6}1DJ`oGo|B|i5_J#|+)QP;46y;B#q!3ZM9*z|3Jg;#w}*Oz zgE)81646g~k&xZSz*{J$A<_}ah-M(>XY|3BQSOQ835L3MvT}C{M5sr0`}uUoy6}1U zuQ?d@B*6%E?w%F_ejv&9lE|)`KpgeEXimc$29IOc19!!a?4ol|>+97$M@IEhe|bHw zz8bLx5s!OpCd(T}#<5&`Wr+4Z@{@QBtWxXHek;Nob!;&mIoBXTr0TObl}{glYJWTw zU$Z4Y*A|sin4c%pHpWSU{0c4_nE??7E(IQnBU$?_Zw@Zb;{51623cz2$U@mTH>nXzhcS zw&Y?M+#?@cEb7kN&=vyY$@sQlLr*&6un^B8dYv69Y%_|}agiCMvMmP8>fyGz-mrj- zx*h^nHT8Na5A(_4jtuPrG_s?6f*R4;!jD>piYb_63Z~;N_p-pLVzga~QV|=f<8M8o zfowAO_IfBI9k&ghkmWd;O+vaPNKhwr`D#l3fSOelk|Ce?El+5zT69E|ipqru zm;<%WBniqyaSKkkl!GRaKycnL!Bl?YBMRdZbK+(@@rG2EZvqYb@1i6aC+?@>Wzo4k34#San^Xwo9Rr!*uvZ_+EPQedF?EzK>-+xcD!#A*T$(t(RlPoY2eGTFkI zV5icS24N3ct)feZEU}T=IlL8HI^2PBB{u`2V2!dV14hHE%Bc)EU|_ES`?Q%cL?Ra8 zXO!4WQmE9w21HInf-Wvq(as9byr61`-6yOrUYFh+ZY zs_B5U&+>KVWI})!bU0VcfWZQP(^ok?3)Yo%a--lCxS`?rC^wIyn>KCUYfVsDP@}Km zC>Y&*Fl0mZ@JExyN!s-?hvBqZxEs7;swfKkpa5_O~be!khfU8>62;=9f~M zd{Xc|A?TX~{U)Dk`_74t30aMT{+N(`QrrK8Hnd3_dNf=+q;%qWp + + + + + 数据库管理 - 云南AI共生大会 + + + +
+

数据库管理

+ + + +
+

选择数据表

+
+
加载中...
+
+
+ + +
+ + + +
+ + + +