程序员日常学习和工作中有很多经验和心得需要记录下来,这里推荐使用GitBook
,既可以巩固记忆也可以加深理解,还能对社区做贡献。磨刀不误砍柴工,这里先介绍一整套GitBook
的安装、使用、部署还有自动化方法。
GitBook
其实就是把Markdown
简单优雅的组织成html
形式,方便查看或者部署到博客。查看成品例子
安装方法
macOS
安装命令
brew cask install gitbook
安装遇到问题:TypeError: cb.apply is not a function
.
原因: node
版本不对,本地是14.0.0
需要使用12.16.3
版本.
解决方法:安装nvm管理本地的多node
版本
使用方法
新建一个目录,然后在目录中运行初始化方法就可以了,然后就可以在里面用markdown
任意组织笔记或文章。
gitbook init
在当前目录用下面命令跑起来,可以预览,而且修改md文件后预览会实时变化。
gitbook serve
编译生成一个_book
文件夹。
gitbook build
部署到xxx.github.io
如果没有自己的服务器,可以完全免费部署到GitHub
。
首先在你的GitHub
建立一个Public
的xxx.github.io
仓库(这个域名的xxx
你自己记得修改,一般都是你的GitHub
名字,后面的格式固定),这个名字就是你网页的域名。
把这个仓库clone
到本地。
git clone https://github.com/xxx/xxx.github.io.git
然后把上面使用方法
生成的_book
文件夹下面的所有文件拷贝到本地的xxx.github.io
目录下,然后push
到云端。
git add .
git commit -m "xxx"
git push
完成后就可以打开xxx.github.io
了。
使用GitHub Actions
自动部署
然而每次写文章提交后还要手动部署很麻烦,所以想办法自动化这一过程。
这里你写的文章在book
仓库(可以是私有仓库),网页在xxx.github.io
仓库。
教程里面的方法或者Marketplace
里面的Publish Gitbook
都是部署到当前仓库的gh-pages
分支,无法部署到另外的仓库。
要部署到另外的仓库需要fork
Publish Gitbook
修改entrypoint.sh
文件,修改后的文件可以参考这里。
然后在book
仓库使用这个脚本,修改工作流文件 book/.github/workflows/main.yml
。
name: Deploy to github.io
on:
push:
branches: [ master ]
pull_request:
branches: [ master ]
jobs:
build-and-deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@master
- name: Publish Gitbook
uses: saucym/publish-gitbook@master
with:
github_token: ${{ secrets.ACCESS_TOKEN }}
这里面的secrets.ACCESS_TOKEN
配置方法可以参考这里。
这样你写好文章提交到book
仓库后就会自动运行这个工作流,自动把build
好的网页文件部署到xxx.github.io
。
这个工作流其实还可以做到很多事情,可以自信探索。
基于GitHub Issues
的GitBook
评论插件gitalk
其他简单插件可以参考推荐12个实用的gitbook
插件这篇文章。
这里重点介绍一下评论插件gitalk
。还有一个评论插件叫disqus
不过不推荐使用。
gitalk
的使用不用去网上搜,网上教程说的每个文件都要加代码的问题官方已经支持了,按官方介绍用就可以了。
介绍中的参数clientID
和clientSecret
可以通过点击在线申请
在GitHub
申请一个授权应用得到。
部署到自己的云服务器
下面的远程服务器
都是指腾讯云Debian
系统,当然其他云服务器也是大同小异的。
安装docker
,然后部署nginx
在远程服务器
上先随便启动一个容器,主要是用来生成默认的配置文件。
docker run -d -p 80:80 --name mynginx nginx
然后创建一个本地文件夹把默认配置copy
一份,然后关闭这个容器并删除。
mkdir /web
cd /web
docker cp mynginx:/etc/nginx/conf.d .
docker stop mynginx
docker rm mynginx
可以使用vim
编辑这个配置文件(这一步可以不做)。
vim conf.d/default.conf
可以看到有一个/usr/share/nginx/html
,表示资源地址,不过这个资源地址是容器的修改了也没用,我们启动的时候把本地目录映射到这个地址就可以了,所以这里不需要修改,如果深入研究这个配置文件,可以做到很多事。
然后本地电脑
把要部署的资源上传到远程服务器
。
scp -r _book root@ip:/web/book
最后在远程服务器
上启动容器并加上映射。这个80:80
前面这个80是服务器的端口,后面这个80是容器的端口。映射-v
可以加很多个,一般把conf
里面需要用到的加上就可以了,我们这里把配置文件和资源路径映射一下就好了。
docker run -d -p 80:80 --name web -v /web/book:/usr/share/nginx/html -v /web/conf.d:/etc/nginx/conf.d nginx
这个时候你就可以直接在浏览器输入你的ip地址浏览这个网页了。
scp
提示权限被拒绝的解决办法
Linux
的远程传输文件scp
出现Permission denied (publickey).lost connection
问题解决方法。
首先去本地电脑 ~/.ssh
目录下看是否已经有密匙。如果没有可以通过下面命令生成一份。.pub
结尾的是公匙。
cd ~/.ssh
ssh-keygen -t rsa
将本地主机上的id_rsa.pub
文件拷贝到远程Linux
主机的root
用户目录下的.ssh
目录下,并且改名为authorized_keys
。若已经有该文件可以把内容追加在后面,要配对多个机器就在后面追加就行了。
这样本地密匙跟远程主机密匙就能对上了,后续scp
命令就不需要带鉴权信息了。
问题?
- 把多个
web
服务部署到同一个机器上,使用不同的路径访问。 目前尝试了编辑配置文件conf.d/default.conf
,但貌似没效果,后续再深入研究一下。目前暂时启动了两个docker
指定不同端口来解决这个问题,不过这样就只能这样访问ip:81
,不优雅。 - 如何把多个web服务部署到同一个服务器并使用不同的子域名访问。