设置无密码的SSH访问html
首先,你须要经过SSH链接到你的服务器,若是有提示的话请输入密码。git
ssh user@hostname
若是在你的用户的主目录中没有~/.ssh
目录,请建立一个:mkdir ~/.ssh
github
接下来,你须要复制你的公共SSH key(请看生成一个SSH key)到你的服务器。这样你就能够经过SSH链接,而且不须要每次都输入密码。npm
在你的本地 - 假设你的公共key能够在~/.ssh/id_rsa.pub
找到 - 使用正确的用户和主机名称输入下面的指令。它将会把你的公共秘钥(key)添加到远程服务器的authorized_keys
文件。服务器
ssh user@hostname 'cat >> ~/.ssh/authorized_keys' < ~/.ssh/id_rsa.pub
若是你关闭链接,而且尝试创建SSH访问,你应该再也不会被提示输入密码。dom
你须要为每一个域名创建2个目录。一个做为Git的仓库,另外一个包含其余信息。ssh
举个栗子,若是你的域名是example.com
,而且你想要创建一个环境,那么你须要在你的服务器上创建这些目录:post
mkdir ~/example.com ~/example.git mkdir ~/staging.example.com ~/staging.example.git
初始化空的Git仓库ui
在服务器上建立空的Git仓库,也就是把本地文件(资源)传送到服务器储存的地方。可是你不想要的文件在这里,这就是为何这是一个空的仓库。翻译
cd ~/example.git git init --bare
若是你想的话,你能够重复此步骤。
一个发送-接收钩子可让你在Git仓库接收到commits后运行指令。这样,你能够改变Git的工做目录,从example.git
到 example.com
,而且检查在example.com
目录下的副本。
工做目录的位置可使用GIT_WORK_TRE
E在per-command的基础上设置,Git的环境变量中其中一个或者work-tree
选项。
cat > hooks/post-receive #!/bin/sh WEB_DIR=/path/to/example.com # remove any untracked files and directories git --work-tree=${WEB_DIR} clean -fd # force checkout of the latest deploy git --work-tree=${WEB_DIR} checkout --force
确保hook上的文件权限正确。
chmod +x hooks/post-receive
若是你须要使一些文件不被Git清理(好比.htpasswd
文件),你可使用--exclude选项。这须要在你的服务器上安装Git 1.7.3或者以上版本。
git --work-tree=${WEB_DIR} clean -fd --exclude=<pattern>
若是你想的话,能够重复此步骤。
如今,服务器配置已经完成,你想要为静态站点部署build assets(不是源码)。
我正在使用生成文件(Makefile),可是你可使用任何你擅长的。下面是我想要自动化完成的基本工做流程。
创建静态站点的生产版本。
make build
初始化一个新的Git repo在构建目录中。 我不想尝试合并到以前部署的文件,尤为是对于分段域(staging domain)。
git init ./build
远程部署cd ./build git remote add origin ssh://user@hostname/~/example.git
commit repo中的全部内容cd ./build git add -A git commit -m "Release"
强制转换远程主分支, 若是丢失的话,则建立它。cd ./build git push -f origin +master:refs/heads/master
在源repo中标记出检查commit的SHA,因而我能够看到哪一个是最新部署。git tag -f production
使用一个生成文件:
BUILD_DIR := ./build STAGING_REPO = ssh://user@hostname/~/staging.example.git PROD_REPO = ssh://user@hostname/~/example.git install: npm install # Deploy tasks staging: build git-staging deploy @ git tag -f staging @ echo "Staging deploy complete" prod: build git-prod deploy @ git tag -f production @ echo "Production deploy complete" # Build tasks build: clean # whatever your build step is # Sub-tasks clean: @ rm -rf $(BUILD_DIR) git-prod: @ cd $(BUILD_DIR) && \ git init && \ git remote add origin $(PROD_REPO) git-staging: @ cd $(BUILD_DIR) && \ git init && \ git remote add origin $(STAGING_REPO) deploy: @ cd $(BUILD_DIR) && \ git add -A && \ git commit -m "Release" && \ git push -f origin +master:refs/heads/master .PHONY: install build clean deploy git-prod git-staging prod staging
分阶段部署:
make staging
部署生产:
make prod
使用Make,,由于cd
命令在子流程中。可是你须要确保后来的命令在同一行中。举个栗子:若是没有在命令中加入&&
或 ;
,那么deploy
任务会强制推送到你源代码的远程主分支。
我把个人站点源码传到了BitBucket一个私人的仓库。BitBucket其中一个很不错的地方在于可以让你选择防止误删除或者重写分支。