Skip to content

esc

centOs

bash
# 查ip
curl ifconfig.me
curl ipinfo.io/ip
curl -4 icanhazip.com

# curl
yum install -y curl

连接

bash
ssh -p 22 root@公网ip

# 新增用户
adduser laosu
# pwd
passwd laosu
# 分组
usermod -aG wheel laosu

#确认wheel组有sudo权限
visudo
# 找这行前有没有#号
# %wheel  ALL=(ALL)       ALL

# 切换用户
su - laosu
sudo -i

ssh免密登录

bash
# 创建密钥
ssh-keygen -t ed25519 -C "laosu-key"

- 私钥: ~/.ssh/id_ed25519
- 公钥: ~/.ssh/id_ed25519.pub

# 上传密钥 - 公钥
ssh-copy-id -i ~/.ssh/id_ed25519.pub laosu@服务器公网IP -p 当前SSH端口
## win系统
ssh-copy-id -i ~/.ssh/id_ed25519.pub -p 8899 laosu@47.115.139.239

# 连接
ssh laosu@公网ip

# 改端口
# 切换 root
su -

cd /etc/ssh
vi ./sshd_config

Port 你的端口
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
# 在确认新用户能免密登录之前,建议先保留:
PasswordAuthentication yes
  1. 在云厂商控制台(阿里云)放行新端口
  • 打开 ECS 实例 → 安全组规则
  • 入方向新增一条:协议端口 TCP:22222 ,源 0.0.0.0/0 (或指定你本地 IP 更安全)

iptables

bash
iptables -I IN_public_allow -p tcp --dport 你的端口 -m conntrack --ctstate NEW,UNTRACKED -j ACCEPT

# 检查
iptables -L IN_public_allow -n

# 保存
service iptables save
# 或
iptables-save > /etc/sysconfig/iptables
bash
# 4. 重启ssh服务
systemctl restart sshd

# 5. 测试连接
ssh -p 你的端口 deploy@公网ip

nginx

bash
# 安装
yum install -y epel-release
yum install -y nginx

# 安装完成后:
systemctl enable nginx
systemctl start nginx
systemctl status nginx

# 上传打包后的代码
scp -r dist/* laosu@你的公网IP:/xxx/dist

# 如有权限报错处理 在服务器上执行下面命令
sudo chown -R laosu:laosu /xxx/dist

scp -P 端口 -r dist/* 用户@公网ip:/xxx/dist/

docker

bash
docker --version

docker build -t laosu-xin:v1 .

docker stop laosu-xin || true
docker rm laosu-xin || true

sudo mkdir -p /data/laosu-xin/html
docker run -d --name laosu-xin -p 8082:80 \
  -v /data/laosu-xin/html:/usr/share/nginx/html \
  laosu-xin:v1

docker exec -it laosu-xin ls /usr/share/nginx/html

发布脚本(deploy.js)

推荐直接使用 [deploy.js](file:///Volumes/note/gitee/learn/apps/blog/deploy.js)。

bash
pnpm build:all
DEPLOY_ENV=aliyun pnpm --filter blog docs:deploy
bash
SSH_HOST=47.115.139.239
SSH_PORT=22222
SSH_USERNAME=laosu

# 若使用 Docker bind mount,填宿主机“被挂载”的目录(Source)
SSH_TARGET_PATH=/data/laosu-xin/html
SSH_STAGE_PATH=/tmp/blog-deploy

# 可选:强制发布策略(atomic / inplace)
# DEPLOY_STRATEGY=atomic

# 可选:更新 Nginx 负载均衡(如有)
# LB_HOST=xxx
# LB_NGINX_CONFIG_PATH=/etc/nginx/sites-available/default
# LB_UPSTREAM_NAME=backend_servers
# LB_UPSTREAM_PORT=80

deploy.js 流程图(puml)

uml diagram

deploy.js 详解

  • 配置来源
    • 支持 DEPLOY_ENV 对应的 .env.${DEPLOY_ENV}(.local),以及兜底的 .env(.local)apps/blog/deploy.js:46-54
    • 关键变量:SSH_HOSTSSH_PORTSSH_USERNAMESSH_TARGET_PATHSSH_STAGE_PATHDEPLOY_STRATEGYLB_*(见 [deploy.js](file:///Volumes/note/gitee/learn/apps/blog/deploy.js))
  • 认证方式
    • 优先使用 ssh-agent 或私钥,其次密码;若三者都缺失,自动探测 ~/.ssh/id_rsa / id_dsa / id_ed25519apps/blog/deploy.js:56-79
  • 构建产物校验与路径规范
    • 校验 .vitepress/dist 存在(apps/blog/deploy.js:100-104
    • SSH_TARGET_PATH/SSH_STAGE_PATH 必须是安全的绝对路径(apps/blog/deploy.js:91-98apps/blog/deploy.js:558-559
  • 进度与动画
    • 解析 rsyncto-check=剩余/总数,实时计算并绘制进度条(apps/blog/deploy.js:249-310apps/blog/deploy.js:312-345
    • 设置最短展示时长 UPLOAD_MIN_MS,在极快上传时用平滑动画补足到 100%(apps/blog/deploy.js:556-557apps/blog/deploy.js:280-301apps/blog/deploy.js:466-469
  • 传输策略
    • 优先使用 rsync -az --delete -e "ssh -p PORT",失败回退到 scpapps/blog/deploy.js:312-357apps/blog/deploy.js:433-540
  • 落盘策略
    • 默认 atomic:先写入 target.release-<ts>,再 mv 原子切换(apps/blog/deploy.js:359-387apps/blog/deploy.js:470-495
    • 若目标目录是 Docker bind mount,则自动切换为 inplace,并重启使用该目录的容器(apps/blog/deploy.js:408-431apps/blog/deploy.js:496-497
  • 负载均衡(可选)
    • 配置 LB_HOST 后自动生成 upstream,并在 LB 上 nginx -t + reload/restart(apps/blog/deploy.js:187-233
  • 安全实践
    • 不在代码中硬编码敏感信息;使用环境变量或 ssh-agent/私钥
    • apps/blog/.gitignore 已忽略 .env.local.env,避免误提交
    • CI 场景用平台 Secrets 注入环境变量

deploy.js 详解(PUML 扩展)

uml diagram