先天八卦
南
乾1
兑2 巽5
东 离3 9 坎6 西
震4 艮7
坤8
北
乾三连、坤六段、震仰盂、艮覆碗、离中虚、坎中满、兑上缺、巽下断
More than 10 years backend development experience in e-commerce field. More than 3 years tech leader and frontend development experience. Proficient practical experience in DDD,Cloud-Native Development and DevOps。Focusing on ML&AI. Interested in web3 and metaverse.
南
乾1
兑2 巽5
东 离3 9 坎6 西
震4 艮7
坤8
北
乾三连、坤六段、震仰盂、艮覆碗、离中虚、坎中满、兑上缺、巽下断
main、release/*(每期一个)、临时 hotfix/*。没有长期 dev。release/*;Prod 只接“已签名的 release tag”。main。main 合并依赖 merge queue:单测、契约测、集成测、静态扫描、迁移脚本干跑全绿才合。产出:一堆通过所有检查的提交在 main,但还没承诺“本期必上”。
main 切出 release/2025.08.S12(名字随你,关键是唯一)。release/* 上构建一次产物:镜像/包打不可变 tag(如 app:2025.08.S12-rc.1),记录 digest、SBOM,并签名。注意:冻结后 release/* 只收 fix 类 PR。带 refactor/deps/migration/public-api-change 标签的一律被 CI 拒收。
需要修的 bug:
main 修,打 backport:release/2025.08.S12 标签,机器人自动 cherry-pick -x 回 release/*,重跑 Staging 验证。release/* 修,同时 反向合回 main,保持主线干净。若发现“混了重构”的提交:在 release/* 上 git revert -m 1 <merge-commit>,重出 rc.2,继续测。主线不动。
DB 迁移遵循 expand/contract:
release/* 当前 commit 打签名 tag:v2025.08.S12,指向已在 Staging 验证过的同一产物。app:2025.08.S12 → 指向那个 digest。记录 SBOM、变更单、审批人,审计闭环。从“线上最近一次生产 tag”切 hotfix/XYZ,修完:
v2025.08.S12-p1,可先在短暂 Staging 或金丝雀验证;release/* 和 main。不去动任何“下一班”的 release/*。候选车和现网车各开各的。
release/* 的签名 tag,技术上禁止从任意分支 HEAD 部署。release/* 的 CI Gate:仅放 type=fix 且触达面与行数低于阈值的 PR,其他一律 fail。main 的合并必须经 merge queue,合并后不会自动部署到 Staging;Staging 只吃 release/*。release/*;发完补回。release/* 上 revert,另起干净 fix;main 不动。release/*,没齐就下一班。就这么简单:主线做演化,release 做交付,产物做真相。别再把 prod 当工作台,别再让提交当发布单位。你要的是确定性,不是惊喜。
已可用密钥登录当前服务器(ed25519)
具备 root 权限(首次执行用 root 登录)
### 备份
sudo cp -a /etc/ssh/sshd_config /etc/ssh/sshd_config.bak.$(date +%s)
### 禁用密码类登录,仅允许密钥
sudo sed -i 's/^#\?PasswordAuthentication.*/PasswordAuthentication no/' /etc/ssh/sshd_config
sudo sed -i 's/^#\?KbdInteractiveAuthentication.*/KbdInteractiveAuthentication no/' /etc/ssh/sshd_config || true
sudo sed -i 's/^#\?ChallengeResponseAuthentication.*/ChallengeResponseAuthentication no/' /etc/ssh/sshd_config || true
### root 仅允许密钥登录(若后续要彻底禁用 root 远程登录,可改为 PermitRootLogin no)
if grep -q '^PermitRootLogin' /etc/ssh/sshd_config; then
sudo sed -i 's/^PermitRootLogin.*/PermitRootLogin prohibit-password/' /etc/ssh/sshd_config
else
echo 'PermitRootLogin prohibit-password' | sudo tee -a /etc/ssh/sshd_config
fi
### 锁定 root 密码(无密码登录)
sudo passwd -l root
### 重载 SSH 服务
sudo systemctl reload sshd || sudo service ssh reload
# 创建用户并加入 docker 组
sudo useradd -m -s /bin/bash deploy || true
sudo getent group docker >/dev/null || sudo groupadd docker
sudo usermod -aG docker deploy
# 安装公钥(二选一)
# A) 复用 root 的 authorized_keys
sudo install -d -m 700 -o deploy -g deploy /home/deploy/.ssh
sudo cp /root/.ssh/authorized_keys /home/deploy/.ssh/authorized_keys
sudo chown deploy:deploy /home/deploy/.ssh/authorized_keys
sudo chmod 600 /home/deploy/.ssh/authorized_keys
# B) 或者手动粘贴你的公钥
# sudo install -d -m 700 -o deploy -g deploy /home/deploy/.ssh
# echo 'ssh-ed25519 AAAA... your_key' | sudo tee /home/deploy/.ssh/authorized_keys >/dev/null
# sudo chown deploy:deploy /home/deploy/.ssh/authorized_keys
# sudo chmod 600 /home/deploy/.ssh/authorized_keys
# 配置最小 sudo 权限(仅允许 docker/docker-compose)
echo 'deploy ALL=(root) NOPASSWD:/usr/bin/docker,/usr/local/bin/docker-compose,/usr/bin/docker-compose' \
| sudo tee /etc/sudoers.d/deploy >/dev/null
sudo chmod 440 /etc/sudoers.d/deploy
# 使用密钥登录 deploy
ssh -i ~/.ssh/id_ed25519 deploy@<SERVER_IP> 'whoami; id'
# 验证最小 sudo 权限可用
ssh -i ~/.ssh/id_ed25519 deploy@<SERVER_IP> \
'sudo docker ps --format "table {{.Names}}\t{{.Image}}\t{{.Status}}" || true'
# 可选:验证 root 密码登录已禁用(不要在生产上做危险测试)
# ssh root@<SERVER_IP> # 应拒绝密码,密钥仍可用
# 若后续决定完全禁用 root 远程登录(推荐在确认 deploy 完全可用后执行)
sudo sed -i 's/^PermitRootLogin.*/PermitRootLogin no/' /etc/ssh/sshd_config
sudo systemctl reload sshd || sudo service ssh reload
# 保留 /opt/echoflow/.env 便于 docker-compose 使用,确保权限最小
sudo chmod 600 /opt/echoflow/.env
sudo chown root:root /opt/echoflow/.env
# 若采用“零驻留”,部署成功后清理(下次部署/重启前需先解密再生成)
# sudo shred -u /opt/echoflow/.env || sudo rm -f /opt/echoflow/.env
已完成配置的状态应满足:
简要验证清单:
find . -type f -size +100M -exec du -h {} + | sort -rh
du -ahx / | sort -rh | head -20
mysql -u root -p
SHOW VARIABLES LIKE 'slow_query_log';
SHOW VARIABLES LIKE 'slow_query_log_file';
SHOW VARIABLES LIKE 'long_query_time';
SET GLOBAL slow_query_log = 'ON';
SET GLOBAL slow_query_log_file = '/path/filename';
typically, the slow query log file is located at /var/lib/mysql/{hostname}-slow.log.
SELECT SLEEP(X);
test whether slow query log is working
SET GLOBAL slow_query_log = 'OFF';
turn off slow query log when you are done troubleshooting
Try these useful commands:
mysql> SELECT * FROM INFORMATION_SCHEMA.INNODB_TRX\G
Output:

Normally, the output should be empty.
Kill locked process
mysql> kill {trx_mysql_thread_id}
mysql> show processlist;
Output:

Kill the locked process
mysql> kill {id}
mysql> show OPEN TABLES where In_use > 0;
Output:

Normally, the output should be empty.
Hope these helpful commands will help you recover your locked MySQL. Good luck!
根据监听端口号找进程PID
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
node 14374 root 12u IPv6 376449654 0t0 TCP *:8957 (LISTEN)
如果一个文件正在被一个运行中的进程读取,此时删除次文件,此文件空间不会被释放,使用du -sh无法统计此文件占用的空间;可以通过此命令查看已经被删除过仍然占用空间的文件清单,然后通过kill进程释放文件占用空间
$ which mysqld
/usr/sbin/mysqld
$ /usr/sbin/mysqld --verbose --help | grep -A 1 "Default options"
Default options are read from the following files in the given order:
/etc/mysql/my.cnf ~/.my.cnf /usr/etc/my.cnf
nginx -t
lsns -t net|pid
ls -la /proc/{pid}/ns
pred='process matches ".*(ocker|vpnkit).*"
|| (process in {"taskgated-helper", "launchservicesd", "kernel"} && eventMessage contains[c] "docker")'
/usr/bin/log stream --style syslog --level=debug --color=always --predicate "$pred"