作为IT工程师,SSH是我们在Linux系统上进行远程管理和应用部署的核心工具。下面我将详细介绍通过SSH部署应用程序的标准流程和最佳实践。
# 本地生成SSH密钥对
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
# 将公钥上传到服务器
ssh-copy-id -i ~/.ssh/id_rsa.pub username@server_ip
# 禁用密码认证(生产环境推荐)
sudo sed -i 's/#PasswordAuthentication yes/PasswordAuthentication no/' /etc/ssh/sshd_config
sudo systemctl restart sshd
# ~/.ssh/config 示例配置
Host production
HostName server_ip_or_domain
User deploy
Port 2222
IdentityFile ~/.ssh/deploy_key
ServerAliveInterval 60
TCPKeepAlive yes
Compression yes
# 连接到服务器
ssh production
# 创建应用目录结构
sudo mkdir -p /opt/yourapp/{releases,shared/{logs,config}}
sudo chown -R deploy:deploy /opt/yourapp
# 使用scp传输文件(小项目适用)
scp -r ./dist/* production:/opt/yourapp/releases/v1.0.0/
# 使用rsync(推荐,支持增量传输)
rsync -avz -e "ssh -p 2222" ./dist/ production:/opt/yourapp/releases/v1.0.0/
# 在服务器上执行
ln -sfn /opt/yourapp/releases/v1.0.0 /opt/yourapp/current
ln -sfn /opt/yourapp/shared/logs /opt/yourapp/current/logs
#!/bin/bash
# deploy.sh
APP_NAME="yourapp"
RELEASE_DIR="/opt/$APP_NAME/releases/$(date +%Y%m%d%H%M%S)"
SHARED_DIR="/opt/$APP_NAME/shared"
# 创建新版本目录
ssh production "mkdir -p $RELEASE_DIR"
# 同步文件
rsync -avz --delete -e "ssh -p 2222" ./dist/ production:$RELEASE_DIR/
# 链接共享目录
ssh production "ln -sfn $SHARED_DIR/logs $RELEASE_DIR/logs"
# 切换当前版本
ssh production "ln -sfn $RELEASE_DIR /opt/$APP_NAME/current"
# 重启服务
ssh production "sudo systemctl restart $APP_NAME"
# 建立SSH隧道
ssh -L 63306:localhost:3306 production
# 在另一个终端执行迁移
DATABASE_URL="mysql://user:pass@127.0.0.1:63306/dbname" npm run migrate
# GitHub Actions 示例
name: Deploy to Production
on:
push:
branches: [ main ]
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Install dependencies
run: npm ci
- name: Build
run: npm run build
- name: Deploy
run: |
ssh production "mkdir -p /opt/yourapp/releases/$GITHUB_SHA"
rsync -avz -e "ssh" ./dist/ production:/opt/yourapp/releases/$GITHUB_SHA/
ssh production "ln -sfn /opt/yourapp/releases/$GITHUB_SHA /opt/yourapp/current"
ssh production "sudo systemctl restart yourapp"
使用非root用户部署:创建专用部署用户
sudo adduser deploy
sudo usermod -aG sudo deploy
限制SSH访问:
# /etc/ssh/sshd_config
AllowUsers deploy
PermitRootLogin no
使用防火墙限制:
sudo ufw allow from your_ip to any port 2222
sudo ufw enable
定期轮换密钥:每3-6个月更换一次部署密钥
审计日志:
# 监控SSH登录
sudo apt install fail2ban
sudo grep 'sshd' /var/log/auth.log
连接问题:
ssh -vvv production # 显示详细调试信息
权限问题:
namei -l /opt/yourapp/current # 查看完整路径权限
文件同步验证:
rsync -n -avz -e "ssh" ./dist/ production:/opt/yourapp/current/ --dry-run
服务状态检查:
ssh production "sudo systemctl status yourapp"
ssh production "journalctl -u yourapp -n 50 --no-pager"
通过以上方法和最佳实践,您可以高效、安全地通过SSH在Linux系统上部署应用程序。根据项目规模和需求,可以进一步集成Ansible、Docker或Kubernetes等工具实现更复杂的部署场景。