目录结构

需要上传到服务器的文件如下

      ├── backend
│   └── server.js //node后端
├── deploy.sh
├── dist         //打包产物
│   ├── assets
│   ├── favicon.ico
├── Dockerfile
├── nginx
│   └── default.conf
├── package.json
    

Dockerfile

      # 使用 Node 官方镜像
FROM node:18-alpine

# 设置工作目录
WORKDIR /app

# 拷贝后端文件(假设 server.js 和 package.json 都在当前目录)
COPY backend/server.js package.json ./

# 安装依赖和 pm2
RUN npm config set registry https://registry.npmmirror.com && \
    npm install --no-audit --no-fund && \
    npm install -g pm2 --no-audit --no-fund


# 开放端口(如果后端监听 3600)
EXPOSE 3600

# 使用 pm2 启动
CMD ["pm2-runtime", "server.js"]
    

deploy.sh

      #!/bin/bash
set -e

PROJECT_NAME=sha1-checker

echo "🔄 停止并删除旧容器..."
sudo docker stop $PROJECT_NAME || true
sudo docker rm $PROJECT_NAME || true

echo "🔧 构建镜像..."
sudo docker build -t $PROJECT_NAME .

echo "🚀 启动容器..."
sudo docker run -d \
  --name $PROJECT_NAME \
  -p 3600:3600 \
  $PROJECT_NAME

echo "✅ 部署完成!访问: https://maven.xiaoying.org.cn/"

# echo "📄 后端日志输出:"
docker logs -f $PROJECT_NAME
    

nginx.conf

      server {
    listen  443 ssl;
    server_name  maven.xiaoying.org.cn;

    ssl_certificate /etc/nginx/fullchain.cer;
    ssl_certificate_key /etc/nginx/xiaoying.org.cn.key;
    ssl_session_cache shared:SSL:1m;
    ssl_session_timeout  10m;
    ssl_ciphers HIGH:!aNULL:!MD5;
    ssl_prefer_server_ciphers on;

    client_max_body_size 50m;

    location / {
        root /usr/local/maven/dist;
        index index.html;
        try_files $uri $uri/ /index.html;
    }

    location /api/ {
        proxy_set_header Host $host;
        proxy_set_header   X-Forwarded-Proto $scheme;
        proxy_set_header   X-Real-IP         $remote_addr;
        proxy_pass http://127.0.0.1:3600;
    }
}
    

publish.sh

      #!/bin/bash

set -e
set -x

# 远程服务器信息
REMOTE_USER="root"
REMOTE_SERVER="服务器IP"
REMOTE_DIR="/usr/local/maven"
NGINX_DIR="/etc/nginx/conf.d"

FILES_TO_COPY="dist backend nginx Dockerfile deploy.sh package.json"

# === 打包并拷贝代码 ===
echo "📦 打包代码..."

rm -f app.tar.gz
tar czf app.tar.gz $FILES_TO_COPY

echo "🚀 拷贝代码到服务器 $REMOTE_SERVER ..."
scp app.tar.gz "$REMOTE_USER@$REMOTE_SERVER:/tmp/app.tar.gz"

# 上传到服务器后删除本地的包
rm -f app.tar.gz

# 远程登录并执行部署
ssh $REMOTE_USER@$REMOTE_SERVER << EOF

set -e

echo "🧹 清理旧文件..."
rm -rf "$REMOTE_DIR"
mkdir -p "$REMOTE_DIR"
tar xzf /tmp/app.tar.gz -C "$REMOTE_DIR"
rm /tmp/app.tar.gz

# 删除旧的nginx配置
cd $NGINX_DIR
rm -rf sha1Checker.conf

echo "拷贝 nginx 配置..."
cp $REMOTE_DIR/nginx/default.conf $NGINX_DIR/sha1Checker.conf

#重启nginx
systemctl restart nginx

echo "🎉 前端部署完成,开始部署后端!"

echo "Checking for deploy.sh..."
if [ -f "$REMOTE_DIR/deploy.sh" ]; then
  echo "deploy.sh found."
  cd $REMOTE_DIR
  chmod +x deploy.sh
  ./deploy.sh
else
  echo "deploy.sh not found."
fi
EOF
    

部署

打开Git Bash ,在项目根目录下执行

      ./publish.sh
    

声明

作者: liyao

版权:本博客所有文章除特别声明外,均采用CCBY-NC-SA4.O许可协议。转载请注明!

最后更新于 2026-02-17 19:36 history