独立于 Github,更方便地管理自己的静态网站?来试试这套自托管 Git 仓库方案!
原文章來(lái)自:獨(dú)立于 Github,更方便地管理自己的靜態(tài)網(wǎng)站?來(lái)試試這套自托管 Git 倉(cāng)庫(kù)方案! - Sxrhhh 的個(gè)人小站
目錄就在前幾天,我成功地將我自己的網(wǎng)站由 wordpress 遷移為了靜態(tài)網(wǎng)站。不過(guò)說(shuō)是遷移,但是域名保持不變,本質(zhì)上就是把將網(wǎng)站文件夾一整個(gè)換了遍。我選擇的是 mkdocs 的網(wǎng)站框架,在一般情況下,我們選用 Github Pages 作為網(wǎng)站托管方案。但是這一次,我想仍然保留在自己的服務(wù)器上。但是我還是想要享受到 git 版本管理網(wǎng)站的快捷感,怎么辦呢?這篇文章提供的 Git 自托管方案便可以為你解決這一煩惱!
- 服務(wù)器結(jié)構(gòu)簡(jiǎn)介
- 在自己的 PC 上構(gòu)建網(wǎng)站
-
建立遠(yuǎn)程 Git 服務(wù)器
- Github 的倉(cāng)庫(kù)方案
- 建立 git 用戶(hù)管理倉(cāng)庫(kù)
- 將客戶(hù)端與 git 服務(wù)器同步
- 注意事項(xiàng):編寫(xiě) .gitignore文件
-
建立 web 服務(wù)器
- 將 web 服務(wù)器連接到 Git 服務(wù)器
- 創(chuàng)建 Apache 虛擬主機(jī)
- 實(shí)時(shí)同步 web 網(wǎng)站目錄
- 驗(yàn)收成果
- 網(wǎng)站維護(hù)碎碎念
服務(wù)器結(jié)構(gòu)簡(jiǎn)介
這套方案可以實(shí)現(xiàn)一個(gè)非常方便的編寫(xiě)博客的方法。你可以在自己電腦上寫(xiě)好文章,生成網(wǎng)站,并且直接git push即可部署到自己的服務(wù)器上,一氣呵成,一般情況下完全不需要登陸遠(yuǎn)程服務(wù)器。
在講述方案之前,我先說(shuō)明一下這套方案采用的服務(wù)器結(jié)構(gòu)。
- 本地客戶(hù)端:在本地,也就是我們用來(lái)寫(xiě)文章的 Windows 系統(tǒng),在下文,我稱(chēng)之為客戶(hù)端??蛻?hù)端上,我們需要安裝
Git,并且我們要會(huì)用git提交文件。git的安裝方法和使用方法在此不做贅述,相信各位試圖搭建靜態(tài)網(wǎng)站的讀者,git的用法肯定是有所涉獵的。(當(dāng)然,如果你的主力機(jī)是 Linux 系統(tǒng)的話(huà)也完全沒(méi)有問(wèn)題,將這篇文章涉及的 Windows 目錄結(jié)構(gòu)和命令使用翻譯為 Linux 版本的,想必對(duì)你來(lái)說(shuō)并不難。) - 遠(yuǎn)程 Git 倉(cāng)庫(kù):如果我們不想要將網(wǎng)站依托于 Github 這個(gè)網(wǎng)站,那么我們就得要自己建立一個(gè) Git 服務(wù)器。通過(guò)這個(gè) Git 服務(wù)器,我們接受來(lái)自客戶(hù)端的 Git 請(qǐng)求來(lái)儲(chǔ)存網(wǎng)站。
- 遠(yuǎn)程網(wǎng)站服務(wù)器:這個(gè)服務(wù)器就是實(shí)際上的 web 服務(wù)器。這一次,我采用的是
apache服務(wù)器,通過(guò)虛擬主機(jī)方式,建立網(wǎng)絡(luò)站點(diǎn),并且實(shí)時(shí)同步 Git 服務(wù)器的內(nèi)容,實(shí)現(xiàn)網(wǎng)站的更新。
通過(guò)這一套流程,我們就可以在本地寫(xiě)好文章,放在相應(yīng)的網(wǎng)站位置,生成預(yù)覽、提交文件,從而完成網(wǎng)站更新的一整套流程。
如下圖,便為這一套系統(tǒng)的基本框架了,非常的簡(jiǎn)單。
在自己的 PC 上構(gòu)建網(wǎng)站
構(gòu)建網(wǎng)站的第一步,便是構(gòu)建自己網(wǎng)站。要構(gòu)建靜態(tài)網(wǎng)站,有很多的解決方案,比較著名的就有Hexo,Mkdocs,Hugo,Jekyll等,甚至你還可以自己手寫(xiě)前端 CSS 和 JS 生成 html 文件。不管采用那種方案,最后的要求便是你要有一個(gè)site文件夾,或者叫其他名字,他的里面便是網(wǎng)站所有的被掛在前端的文件,包括 html 之類(lèi)的玩意。我們的 Apache 服務(wù)器的文件目錄便最終會(huì)指向它。
這次,我采用的 Mkdocs 由python編寫(xiě)而成,它的一個(gè)名為mkdocs material的主題顯得非常簡(jiǎn)潔美觀,所以我選擇了它。和其他運(yùn)行環(huán)境不同的是,這一次我們所有的網(wǎng)站環(huán)境全部會(huì)部署在本地,遠(yuǎn)程服務(wù)器完全不需要。這也很好理解,畢竟遠(yuǎn)程服務(wù)器只要展示網(wǎng)站文件就夠了,生成網(wǎng)站的任務(wù)落在了客戶(hù)端的頭上。
Mkdocs 采用一個(gè)叫做mkdocs build的命令來(lái)構(gòu)建網(wǎng)站文件夾,我們每一次用 git 提交文件之前都會(huì)進(jìn)行一次這樣的構(gòu)建。現(xiàn)在,我們來(lái)建立那個(gè) git 服務(wù)器。
建立遠(yuǎn)程 Git 服務(wù)器
要*方便地管理網(wǎng)站文件,離不開(kāi)的就是一個(gè) Git 服務(wù)器。我們將會(huì)在遠(yuǎn)程服務(wù)器上搭建一個(gè) Git 服務(wù)器。與想象中的不同,他不需要也沒(méi)必要像 GitLab 那樣配置復(fù)雜。與之相反的是,這件事出乎意料的簡(jiǎn)單。在此之前,我先帶各位回憶一下 Github 上的 git 服務(wù)器長(zhǎng)什么樣。
Github 的倉(cāng)庫(kù)方案
在 Github 上,如果我們需要克隆一個(gè)存儲(chǔ)庫(kù),我們需要諸如以下命令:
git clone git@github.com:cycode0527/learngit.git
可以看到,這條命令采用 ssh 的方式鏈接的 Github 服務(wù)器,并且克隆了上面的 cycode0527/learngit.git 的倉(cāng)庫(kù)。但是這個(gè)克隆并不是一個(gè)簡(jiǎn)單的復(fù)制,在服務(wù)器上,它叫 xxx.git ,克隆到了本地,他就變成了一個(gè)叫做 xxx 的文件夾,里面有一個(gè)叫做 .git的隱藏文件夾。這其中的差別其實(shí)就是:Git 服務(wù)器上的 git 倉(cāng)庫(kù)叫做裸倉(cāng)庫(kù)。裸倉(cāng)庫(kù)沒(méi)有“工作區(qū)”的概念,所有的數(shù)據(jù)全部保存在一個(gè)文件夾內(nèi),不需要直接操控其中的文件,只要干好 Git 服務(wù)器一件事就行。
再次看向上面那條 clone 命令,你可能還會(huì)注意到 git@github.com這一小節(jié)。只要你用過(guò) ssh 這條命令,你應(yīng)該就會(huì)清楚,這是指人家 Github 服務(wù)器上的一個(gè)叫做 git 的用戶(hù)名。我們?cè)诳寺}(cāng)庫(kù)時(shí),就會(huì)連接到 github.com 的 git 用戶(hù),并且讀取你(cycode0527)的 xxx.git 文件。搞清楚這一點(diǎn),我們就清楚了,在遠(yuǎn)程服務(wù)器上,有一個(gè)負(fù)責(zé)處理 git 請(qǐng)求和存儲(chǔ)的用戶(hù),叫做 “git” 。
建立 git 用戶(hù)管理倉(cāng)庫(kù)
現(xiàn)在,我們就可以在遠(yuǎn)程服務(wù)端建立 git 用戶(hù)了。
首先,我們要讓服務(wù)器支持 git ,直接安裝即可。
sudo yum install -y git # 本條命令為 CentOS 使用,其他操作系統(tǒng)可自行更改
然后,我們建立 git 用戶(hù)和用戶(hù)組,用來(lái)運(yùn)行 git 服務(wù)。
groupadd git
useradd git -g git # 建立用戶(hù) git 并加入 git 用戶(hù)組
用這種方式創(chuàng)建的用戶(hù),系統(tǒng)會(huì)默認(rèn)創(chuàng)建好它的家目錄。我們現(xiàn)在創(chuàng)建一個(gè)倉(cāng)庫(kù)吧。
cd /home/git
mkdir repo # 創(chuàng)建了一個(gè)叫做 repo 的文件夾,用于存放各種倉(cāng)庫(kù)
cd repo
git init --bare website.git # 建立一個(gè)名為 website 的倉(cāng)庫(kù),--bare參數(shù)就是創(chuàng)建裸倉(cāng)庫(kù)
# 輸出結(jié)果: Initialized empty Git repository in /home/git/repo/website.git
最后我們調(diào)整一下倉(cāng)庫(kù)的所有者,以防止你剛才創(chuàng)建 git 用戶(hù)所用的 root 用戶(hù)忘記切回來(lái),導(dǎo)致 git 用戶(hù)家目錄下全是 root 的文件。
chown -R git:git /home/git/repo
現(xiàn)在,這個(gè) git 服務(wù)器已經(jīng)建好了,下一步要做的就是將客戶(hù)端連接到這個(gè)服務(wù)器。
將客戶(hù)端與 git 服務(wù)器同步
現(xiàn)在我們要做的就是,通過(guò) clone 命令,將客戶(hù)端的文件夾與遠(yuǎn)程 git 服務(wù)器建立映射。(當(dāng)然,你也可以通過(guò)已有的網(wǎng)站目錄,用 git remote add 的命令與新的服務(wù)器建立映射關(guān)系。)
為了在與遠(yuǎn)程服務(wù)器同步時(shí)不在輸入密碼,我們選用的是 ssh 的連接方式,但是在此之前,我們需要將自己客戶(hù)端上的 ssh 公鑰發(fā)給遠(yuǎn)程服務(wù)器的 git 用戶(hù),從此登陸 git 用戶(hù)就不用密碼了,更為方便的提交網(wǎng)站更改。
首先看一下自己的家目錄下有沒(méi)有 .ssh 文件夾,這個(gè)目錄處在 C:\Users\<你的用戶(hù)名>\.ssh 這里,如果有的話(huà),跳轉(zhuǎn)下一步;沒(méi)有的話(huà),請(qǐng)看如何生成一個(gè) ssh 公鑰。
現(xiàn)在打開(kāi)你的 windows 終端,或者是 cmd、powershell、git bash 之類(lèi)的玩意,輸入如下命令:
ssh-keygen -t rsa
然后連按三個(gè)回車(chē),ssh 密鑰對(duì)就生成好了。現(xiàn)在再進(jìn)入家目錄下的 .ssh 文件夾,找到一個(gè)后綴名為 .pub 的文件,不要雙擊打開(kāi),右鍵打開(kāi)方式,找一個(gè)記事本或是 vscode 等能打開(kāi)文本文件的軟件打開(kāi)這個(gè)文件,將里面的內(nèi)容盡數(shù)復(fù)制出來(lái)。
然后我們來(lái)到遠(yuǎn)程服務(wù)器,登錄到 git 用戶(hù),建立 ssh 用戶(hù)驗(yàn)證文件:
cd ~
mkdir .ssh
vim .ssh/authorized_keys
我們用 vim 打開(kāi)了這個(gè)叫做 authorized_keys 的文件,然后把復(fù)制好的 ssh 公鑰粘貼進(jìn)去,保存并退出。(各位應(yīng)該知道 vim 怎么操作吧……)
現(xiàn)在你可以試驗(yàn)一下,登錄到 git 用戶(hù)還需要密碼不。
ssh git@www.sxrhhh.top
如果直接進(jìn)去了,說(shuō)明 ssh 已經(jīng)不需要密碼了,那么 git 的一切操作也可以不用密碼快速進(jìn)行。
在客戶(hù)端下:
git clone git@www.sxrhhh.top:/home/git/repo/website.git
git clone git@www.sxrhhh.top:repo/website.git # 是的,冒號(hào)后面的路徑就是相對(duì)于 git 用戶(hù)家目錄的相對(duì)路徑
好了,如果你的電腦上出現(xiàn)了 website 文件夾并且里面還有 .git 隱藏文件,那么就成功了!
現(xiàn)在,你就可以將你的網(wǎng)站文件放進(jìn)去,歡快地 mkdocs build, git add .,git commit, git push了。
注意事項(xiàng):編寫(xiě) .gitignore文件
為了防止在寫(xiě)網(wǎng)站時(shí)一些亂七八糟的更改影響 git 的跟蹤文件,我們要提前寫(xiě)好一個(gè) .gitignore 文件,阻止它們進(jìn)入 git 的跟蹤。
.gitignore:
.vscode # 防止用 vscode 管理網(wǎng)站的時(shí)候工作區(qū)更改
*~ # 防止用vim編輯網(wǎng)站文件時(shí)留下一堆儲(chǔ)存文件
后面我們還會(huì)往里面加一點(diǎn)東西,這個(gè)請(qǐng)讀者留意一下。
建立 web 服務(wù)器
現(xiàn)在,我們已經(jīng)搭建好了這一套管理系統(tǒng)的核心結(jié)構(gòu),那么最后一步,就是將上傳的網(wǎng)站文件夾發(fā)給 Apache 服務(wù)器,讓它幫忙共享這個(gè)文件夾。
我們知道,git 服務(wù)器上的文件是不能直接用的。我們還是需要用 clone 和 pull 的方法將文件提取出來(lái)。這一次我們操作的是 root 用戶(hù),這在權(quán)限管理上是不可取的,但是在這次的方案中,我們搭建的是靜態(tài)網(wǎng)站,對(duì) apache 用戶(hù)的寫(xiě)入權(quán)限要求不高。另外,apache 是一個(gè) "nologin" 的用戶(hù),他不能使用諸如 git 之類(lèi)的命令,局限性過(guò)大。為了更好管理 web 文件夾,我們采用 root 用戶(hù)登陸。當(dāng)然,為了安全,你完全可以再創(chuàng)建一個(gè)名字類(lèi)似于 www-data 的普通用戶(hù)來(lái)給 apache 用。
現(xiàn)在我們就開(kāi)始新建文件夾吧!
將 web 服務(wù)器連接到 Git 服務(wù)器
首先,我們要讓 root 用戶(hù)被 git 用戶(hù)認(rèn)證,原因和之前一樣。即使在同一臺(tái)機(jī)子上的 root 用戶(hù),想要 ssh 連接另一個(gè)用戶(hù)照樣需要認(rèn)證。
ssh-keygen -t rsa
cat ~/.ssh/id_rsa.pub >> /home/git/.ssh/authorized_keys # 將root用戶(hù)的ssh公鑰加入到git用戶(hù)的認(rèn)證文件中。請(qǐng)確保在上一步中你已經(jīng)創(chuàng)建了這個(gè)文件。
我們?cè)诟夸浵聞?chuàng)建一個(gè)文件夾,用來(lái)存儲(chǔ)網(wǎng)站。當(dāng)然你也可以在 /var/www/ 下面建立,主要是我這個(gè)文件夾算是比較特殊,拎出來(lái)單獨(dú)處理。
mkdir /www
cd /www
git clone git@localhost:repo/website.git # 哈哈,來(lái)自遠(yuǎn)程的localhost。如果你不確定,你可以把localhost改成你服務(wù)器域名。
如果一切順利,你會(huì)有一個(gè) /www/website 文件夾,在這個(gè)文件夾里面又有一個(gè)存放構(gòu)建完畢的 site 文件夾。那么,/www/website/site 就是你的網(wǎng)站的文件系統(tǒng)路徑了。記住它!
創(chuàng)建 Apache 虛擬主機(jī)
如果你先前沒(méi)有見(jiàn)過(guò)網(wǎng)站,你完全可以通過(guò)修改 DocumentRoot 的參數(shù)來(lái)直接運(yùn)行服務(wù)器。但是建立過(guò)網(wǎng)站的同學(xué)都知道,虛擬主機(jī)還是挺重要的。所用的方法我有另一篇博客寫(xiě)過(guò)了,網(wǎng)上也有很多教程和官方文檔,這里長(zhǎng)話(huà)短說(shuō)。
這里以 CentOS 和 fedora 之類(lèi)的使用 rpm 包管理器的系統(tǒng)為例,apache 的服務(wù)名字叫 httpd,配置文件在 /etc/httpd/ 下,其他系統(tǒng),譬如 ubuntu 下的 apache 可能被稱(chēng)作 apache2 ,目錄結(jié)構(gòu)也不太一致。請(qǐng)各位同學(xué)自行查找相應(yīng)配置方法,但是下面的配置文件內(nèi)容不會(huì)有問(wèn)題。(當(dāng)然文件路徑你也要根據(jù)自己實(shí)際情況修改)
cd /etc/httpd/conf.d
vim vhost.conf # 建立了一個(gè)叫做vhost.conf的文件,如果你有其他相同作用的文件,請(qǐng)打開(kāi)它。
vhost.conf:
<VirtualHost *:80>
# 如果這個(gè)是你第一個(gè)虛擬主機(jī),那么它也會(huì)成為你apache的默認(rèn)共享位置
ServerName www.sxrhhh.top # 請(qǐng)自行更改為你自己的域名
DocumentRoot "/www/website/site"
<Directory /www/website/site>
AllowOverride All
Require all granted
</Directory>
# 下面的是用來(lái)強(qiáng)制跳轉(zhuǎn)https用的,可以暫時(shí)不寫(xiě)。
RewriteEngine on
RewriteCond %{SERVER_PORT} !^443$
RewriteRule ^(.*)$ https://%{SERVER_NAME}$1 [L,R]
</VirtualHost>
或者,我們?nèi)サ裟切](méi)用的,可以直接復(fù)制下面的:
<VirtualHost *:80>
ServerName www.example.com
DocumentRoot "/www/website/site"
<Directory /www/website/site>
AllowOverride All
Require all granted
</Directory>
</VirtualHost>
保存并退出,重啟 Apache,看一下能否訪問(wèn)到自己的網(wǎng)站。
apachectl restart
如果一切安好,你現(xiàn)在就可以看到瀏覽器能訪問(wèn)到你自己的域名網(wǎng)站。
在此還是確認(rèn)一下,在測(cè)試瀏覽器訪問(wèn)的時(shí)候,請(qǐng)確保你的域名服務(wù)商解析了你的域名到遠(yuǎn)程服務(wù)器上,或者你在本地客戶(hù)端更改了 hosts 文件。否則你不可能用你的域名訪問(wèn)到服務(wù)器。
實(shí)時(shí)同步 web 網(wǎng)站目錄
我們?cè)诿恳淮斡?git push 更新網(wǎng)站后還得要上 root 用戶(hù)去 git pull 一下才能完成更新部署,太麻煩了。這時(shí)候,我們就要請(qǐng)出 crontab 這個(gè)自動(dòng)任務(wù)管理工具了。
首先我們要寫(xiě)好一個(gè)更新腳本:
cd /www/website/
touch update update_log update_err
vim update # 這個(gè)就是更新腳本,坑爹的一個(gè)點(diǎn)就是文件名不能帶小數(shù)點(diǎn),要不然crontab會(huì)出問(wèn)題。
update:
#!/bin/bash
cd /www/website
/bin/git pull 1>>./update_log 2>>./update_err
# 上面那個(gè) 1>>./update_log 這一條是記錄git pull的日志,如果更新頻率夠快,它會(huì)很快占用比你的網(wǎng)站還大。所以當(dāng)你的網(wǎng)站已穩(wěn)定運(yùn)行后,你可以將這一段改為 1>/dev/null
我們建立了兩個(gè)文件,叫 update_log 和 update_err 作為同步結(jié)果的日志收集。你現(xiàn)在可以直接運(yùn)行來(lái)測(cè)試。
bash ./update
cat update_log
看一下 update_log 有沒(méi)有多出一條回顯信息。如果有,說(shuō)明 pull 成功,已經(jīng)完成了一次 Git 服務(wù)器到 web 服務(wù)器的同步。
現(xiàn)在我們要利用 crontab 實(shí)現(xiàn)實(shí)時(shí)同步。原理也很簡(jiǎn)單,就是每分鐘運(yùn)行一次 update 腳本。
crontab -e
在打開(kāi)的頁(yè)面中,我們?cè)谧詈蠹尤脒@么一條:
* * * * * /bin/bash /www/website/update > /dev/null 2>&1
上面這一條可以讓我們每一分鐘都執(zhí)行一次 update 腳本。>/dev/null 后面的內(nèi)容是用來(lái)防止 crontab 發(fā)一些奇怪的郵件的。
完成之后,你就可以時(shí)不時(shí)地看一眼你的 update_log 文件,看一眼它有沒(méi)有每分鐘都更新一次。
最后,我們將這幾個(gè)文件加入到 .gitignore 文件里,確保它們只在本地運(yùn)行。
.vscode
*~
./update*
驗(yàn)收成果
現(xiàn)在,我們的兩個(gè)服務(wù)器和一個(gè)客戶(hù)端上應(yīng)該搞的東西都已經(jīng)完成了,可以開(kāi)始驗(yàn)收成果了!
首先,我們?cè)诳蛻?hù)端上寫(xiě)好網(wǎng)站內(nèi)容,放置好博客文章,構(gòu)建,發(fā)送!
mkdocs serve # 通過(guò)虛擬服務(wù)器實(shí)時(shí)檢驗(yàn)網(wǎng)站更改
mkdocs build
git add .
git commit -m "website updated"
git push
如果一切順利,你會(huì)在1分鐘以?xún)?nèi)看到你的網(wǎng)站成功發(fā)生了改變。從此,你只要在 vscode 中操作好文章,vscode 就能做好從撰寫(xiě)文章、yaml 編寫(xiě)和網(wǎng)站上傳等多種工作,怎么樣,學(xué)會(huì)了嗎?
網(wǎng)站維護(hù)碎碎念
在最后,我還是多提醒一些事項(xiàng),防止有人在這里學(xué)習(xí)第一次建站。
首先,完成工作后,你的域名一定要解析到你的服務(wù)器,否則你的域名就沒(méi)有用,而且 Apache 的虛擬主機(jī)策略也有可能讓你的網(wǎng)站無(wú)法使用。
然后,記得使用 SSL 技術(shù),也就是將你的網(wǎng)站升級(jí)為 https ,一方面是安全,另一方面是瀏覽器的一些自動(dòng)跳轉(zhuǎn)設(shè)置,尤其是以前用類(lèi)似域名綁定過(guò)帶 https 的服務(wù)器,可能會(huì)讓你訪問(wèn)自己網(wǎng)站困難,一直跳轉(zhuǎn)到帶 https 的同名網(wǎng)址。
最后就是,如果你想多一份保障,不想完全脫離 Github ,只是網(wǎng)站不想建在那個(gè)上面,你還可以在 Github 上建立一個(gè)倉(cāng)庫(kù),并且在 update 文件里面去 git push 它。相當(dāng)于每分鐘將網(wǎng)站倉(cāng)庫(kù)同步到 Github ,但是并不依賴(lài)于它,只是作為一個(gè) Github 的備份策略。
作者:Sxrhhh
個(gè)人網(wǎng)站:https://www.sxrhhh.top
博客園:Sxrhhh - 博客園 (cnblogs.com)
轉(zhuǎn)載請(qǐng)注明出處.
在個(gè)人網(wǎng)站持續(xù)更新中……
總結(jié)
以上是生活随笔為你收集整理的独立于 Github,更方便地管理自己的静态网站?来试试这套自托管 Git 仓库方案!的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 毕业论文的表的上标如何
- 下一篇: 基于开源模型搭建实时人脸识别系统(六):