Git部署指南:专业Web托管部署方法
Learn professional web hosting deployment with Git
如果您是专业的Web开发人员,您可能曾使用FTP或SFTP将文件上传到服务器。但是,这种方法存在很大缺陷:费时、容易出错,缺乏版本控制。Git部署是管理Web应用程序部署的专业行业标准。在这个综合指南中,我们将为您展示如何在泰国VPS和虚拟主机上使用Git部署网站,涵盖Git工作流程、GitHub Actions CI/CD、WordPress部署、.gitignore最佳实践和回滚程序。
目录
什么是Git以及为什么用它进行Web部署?
Git是一个分布式版本控制系统(VCS),帮助开发人员跟踪代码更改、提交修改并在必要时恢复到以前的版本。由Linus Torvalds为管理复杂的Linux内核项目而创建,Git已成为版本控制和部署自动化的行业标准。
Git能够进行Web部署,因为它提供了向远程仓库推送的功能。当您将代码推送到服务器的Git仓库时,Git钩子可以自动触发脚本,这些脚本会将更新的代码拉取到您的web根目录。这种方法比传统的FTP上传更快、更安全、更容易管理。
除了速度之外,Git部署还提供众多优势:完整的更改跟踪、轻松的团队协作、用于功能开发的分支管理、即时回滚功能、与CI/CD管道集成、卓越的安全性和详细的部署历史。这些功能使Git部署成为专业Web开发团队和DevOps实践的标准。
Git与FTP:哪种部署方法更好?
在深入Git部署设置之前,让我们比较Git和FTP,以理解为什么Git对现代Web托管管理更优越。这种比较将帮助您欣赏通过切换到基于Git的部署所获得的好处。
FTP(文件传输协议)是最传统的文件传输方法。您打开FTP客户端,连接到服务器,然后手动上传更改的文件。虽然看起来很直接,但这种方法有很多缺点。您必须手动跟踪哪些文件已更改,上传正确版本的风险很高,管理团队部署很复杂,回滚失败的部署很困难且耗时。
FTP缺点:许多文件的上传费时、缺乏更改跟踪透明度、上传错误版本的风险很高、困难的回滚程序、不适合团队开发,因为缺乏冲突管理、手动跟踪要上传的文件。
Git部署使用版本控制来管理代码。您在本地提交代码,推送到远程仓库(GitHub、GitLab或您的服务器),服务器通过Git钩子自动拉取更新的代码。这个流线化的过程在专业开发中从根本上优于FTP。
Git部署优势:快速简单的部署、完整的更改跟踪、即时回滚功能、极好的团队协作、支持CI/CD自动化、卓越的安全实践、支持功能分支开发和合并前测试。
总而言之,Git部署在几乎所有方面都超越了FTP,特别是对于复杂项目或基于团队的开发。相比所获得的效率收益,学习曲线很小。
在VPS上设置Git仓库
Git部署的第一步是在VPS上创建仓库。假设您已从AsiaGB.com或类似的支持SSH访问的虚拟主机租用了VPS,您将通过SSH连接开始。
ssh user@your-vps-ip
连接后,在/var/www/或您的主目录下创建一个目录来存放您的仓库。我们将为裸仓库创建一个专用的repo目录。
mkdir -p /var/www/repo/mysite.git
cd /var/www/repo/mysite.git
初始化一个裸Git仓库,它将接收来自您本地机器的推送:
git init --bare
裸仓库不包含工作目录,仅用于接收推送。这是服务器端仓库的标准设置。接下来,为您的实际网站文件创建一个目录:
mkdir -p /var/www/mysite
现在您需要配置一个Git钩子,以便在您推送到服务器时自动将代码拉取到web根目录。我们将在Git Hooks部分详细介绍这一点。这个配置完成了接收部署的基本服务器端设置。
使用Git Push工作流部署
配置了您的服务器仓库,我们现在可以讨论标准的Git推送工作流程以部署网站。这是您将用于有效管理部署的日常工作流程。
首先将您的GitHub仓库克隆到本地机器(如果尚未完成):
git clone https://github.com/yourusername/mysite.git
cd mysite
修改文件后,使用git add命令暂存您的更改:
git add .
git status
git status命令显示了哪些文件已暂存以提交。现在使用描述性消息提交您的更改:
git commit -m "Fix homepage layout and add new features"
将您的更改推送到GitHub:
git push origin main
要部署到您的生产服务器,请将其添加为远程并推送那里:
git remote add production user@your-vps-ip:/var/www/repo/mysite.git
git push production main
git remote add production命令创建一个指向您服务器仓库的命名远程,git push production main向服务器发送您的代码,触发自动更新您网站的post-receive钩子。
GitHub Actions自动部署
要完全自动化您的部署流程,GitHub Actions提供持续集成和持续部署(CI/CD)功能。这消除了手动推送命令,并确保由仓库事件触发的一致部署。
在.github/workflows/deploy.yml创建GitHub Actions工作流文件:
name: Deploy to Production
on:
push:
branches: [ main ]
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Deploy via SSH
uses: appleboy/ssh-action@master
with:
host: ${{ secrets.VPS_HOST }}
username: ${{ secrets.VPS_USER }}
key: ${{ secrets.VPS_KEY }}
script: |
cd /var/www/repo/mysite.git
git remote set-url origin https://github.com/yourusername/mysite.git
git fetch origin main
git reset --hard origin/main
cd /var/www/mysite
npm install
npm run build
当您推送到main分支时,此工作流会自动部署到您的VPS。GitHub Actions通过SSH连接、拉取最新代码并运行您指定的构建脚本。其优势是所有部署逻辑都是版本控制的且可重现的,消除了手动部署步骤并减少了人为错误。
使用Git部署WordPress
WordPress部署需要特殊处理,因为有动态生成的内容。wp-content/uploads目录存储用户上传的图像和文件,这些文件可能会非常大,永远不应包含在Git提交中,因为这会使您的仓库膨胀并导致部署问题。
创建一个.gitignore文件来排除上传和其他动态内容:
# WordPress
/wp-config.php
/wp-content/plugins/hello.php
wp-content/uploads/
.env
node_modules/
*.log
通过这个配置,上传的文件在部署期间保留在您的服务器上,不受Git操作影响。部署WordPress后,使用SSH确保正确的文件权限:
cd /var/www/mysite
sudo chown -R www-data:www-data .
sudo chmod -R 755 .
sudo chmod -R 644 wp-content/
sudo chmod 755 wp-content/uploads/
sudo chmod 755 wp-content/plugins/
sudo chmod 755 wp-content/themes/
这些权限允许您的Web服务器管理WordPress文件,同时保护系统安全。这个设置可以进行无缝的WordPress开发与Git,同时保留用户上传的内容。
.gitignore:排除的文件和文件夹
.gitignore文件告诉Git排除哪些文件和文件夹不纳入版本控制。这很关键,因为某些文件不应该被提交,例如包含密码的配置文件、日志文件、临时构建工件和特定于环境的设置。
一个全面的.gitignore示例:
# Configuration files
.env
.env.local
.env.*.local
config.php
wp-config.php
# Dependencies
node_modules/
vendor/
composer.lock
# Build output
dist/
build/
*.min.js
*.min.css
# Logs
logs/
*.log
npm-debug.log*
# OS files
.DS_Store
Thumbs.db
.vscode/
.idea/
# Temporary files
tmp/
temp/
*.tmp
*.swp
*.swo
# WordPress
wp-content/uploads/
wp-content/backup-*/
wp-content/upgrade/
将.gitignore放在您的仓库根目录并提交它,以便团队成员应用相同的规则。这可以防止意外提交敏感文件,并保持您的仓库整洁。良好的gitignore实践是专业Git工作流管理的基础。
部署失败后的回滚程序
对于开发人员来说,最糟糕的情景是部署了会破坏您网站的代码。Git提供了多种安全的方法来快速从失败的部署中恢复,确保您的网站可以在几分钟内恢复到工作状态。
最安全的回滚方法使用git revert,它创建一个新提交来撤销来自特定提交的更改,同时保留完整的历史记录:
git log --oneline
git revert HEAD~1
git log --oneline显示您的提交历史,git revert HEAD~1创建一个新提交来撤销上一个提交的更改。这为审计目的保持了完整的历史记录。
或者,git reset将HEAD移动到特定的提交,但它会永久删除其后的提交。谨慎使用:
git reset --hard HEAD~1
--hard标志重置提交和工作目录以匹配指定的提交。这很强大但如果使用不当会很危险。
只回滚特定文件:
git checkout HEAD~1 -- path/to/file.php
使用任何回滚方法后,提交更改并推送到您的服务器:
git commit -m "Revert changes to fix the issue"
git push production main
Git Hooks:使用post-receive自动部署
Git钩子是在特定Git事件发生时自动执行的脚本,例如pre-commit、post-commit或post-receive事件。post-receive钩子非常适合自动部署,在您的服务器接收推送后运行。
连接到您的服务器并创建钩子文件:
ssh user@your-vps-ip
cd /var/www/repo/mysite.git
nano hooks/post-receive
添加此部署脚本:
#!/bin/bash
WORKTREE=/var/www/mysite
while read oldrev newrev ref
do
if [[ $ref = refs/heads/main ]];
then
echo "Deploying main branch to production..."
git --work-tree=$WORKTREE --git-dir=/var/www/repo/mysite.git checkout -f
echo "Deployment completed."
fi
done
使钩子可执行:
chmod +x hooks/post-receive
现在无论何时您推送到main分支,此钩子都会自动将您的代码检出到web目录,使部署立即进行且自动。这个设置在推送命令完成后提供无缝部署且零人工干预。
常见问题
main或master代表生产代码,而develop和feature/*分支用于开发。在生产部署前将测试的功能合并到main。git push all main。为获得更多控制,使用GitHub Actions自动部署到多个服务器。git revert创建一个新提交来撤销更改(最安全),或git reset移动HEAD到特定的提交。git revert对于生产环境推荐使用。