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