設置無密碼的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其中一個很不錯的地方在於可以讓你選擇防止誤刪除或者重寫分支。