在上周更新的《Obsidian 的 PC 端同步方案,无代码搞定 Git 同步》一文中我们讲到,如果想把 Obsidian 笔记通过 Git 同步,就需要选择一个合适的运营商。
上次已经提到了一些可以选择的服务商,例如公共的有 Github、 Gitee;私有的有 Gitlab、Gogs.io 。使用公共服务的方法上次已经讲过,这次主要讲解如何本地部署一个 Git 服务。
如果你不知道为什么要用 Git 同步的话,我在上篇文章中的”网盘实时同步的麻烦事“部分详细说明了原因。
为何选择 Gogs ?
我选择了 Gogs 来讲解,主要是出于以下几个原因:
- Gogs 是一个轻量化的 Git 服务,对系统占用较小。
- Gogs 的功能够用。
- Gogs 的安装流程简便。
其中第一点最重要,因为 Gitlab 对系统配置的要求比较高,单是内存这一项就要求大于 4 GB,如果是 2 GB 内存则会直接无法运行,这个要求已经可以淘汰掉一些入门级服务器了。而 Gogs 在 NAS、树莓派、入门级服务器上都可以无压力运行,长期运行也不会影响其他服务。
而且我们介绍的场景也不是多人开发协作,只是个人同步笔记用,不需要过多的开发相关功能,有最基本的 Git 服务和一个便于操作的网页就足够了。
Gogs 的安装过程也比较简单,官方的 Docker 版本基本做到了开箱即用,连数据库都不需要额外配置,有个文件夹存放数据就可以。
如何在图形界面中安装 Docker 版 Gogs
我通常建议通过图形化界面来管理 Docker,这样能够直观看到容器的运行状态,像启动、停止、修改配置这样的操作,都能以最简单的方式完成。
所以先来讲讲在图像界面下如何安装 Docker 版本的 Gogs。
了解 Docker 的关键配置
我们借助 Gogs 顺便了解一下通过 Docker 跑一个服务需要做什么配置。
首先我们找到 Gogs 在 hub.docker.com
中的包:Gogs - Docker Hub 。
根据它下方的文档提示可以得知,Gogs 的必要配置很少,我们根据它的官方配置可以得知,它需要这下面两行核心代码就可以完成部署。
docker pull gogs/gogs
docker run --name=gogs -p 10022:22 -p 10880:3000 -v /var/gogs:/data gogs/gogs
我们把这段命令拆分一下,再用白话翻译一下——
docker run # 通过 Docker 运行
--name=gogs # 取个名字叫 gogs
-p 10022:22 # 把 Docker 中的 22 端口映射到宿主机的 10022 端口。
-p 3000:3000 # 把 Docker 中的 3000 端口映射到宿主机的 3000 端口。
-v /var/gogs:/data # 把 Docker 中的 /data 目录映射到 /var/gogs 目录。
gogs/gogs # 用 gogs/gogs 这个镜像创建。
为照顾初学者,解释一下其中的名词:
- 宿主机(host):就是运行着 Docker 的这台机器。
- 镜像(image):可以理解为是一个系统的模板,其中包含了系统、软件、配置等文件。
- 容器(container):当 docker run 命令执行完,就会产生一个容器。每个容器都是独立的、隔离的、可运行的。
- 映射(mapping):是指将容器内部的端口或目录映射到宿主机上。当你在外部访问宿主机的 10022 端口时,就好像访问了容器的 22 端口一样。可以理解为打开一个通道。
由于镜像是不变的,所以端口 22、端口 3000,目录 /data
都是不变的。变的只是宿主机上的配置,如果你的 3000 端口已经被占用了,你可以改成 3001 。
还有一点需要注意,如果直接套用上面的代码,宿主机的 /var/gogs
应该是空的,并具有可读写权限。
在 NAS 中安装 Gogs
这里以群晖 DSM 系统中的 Docker 套件为例,这个套件可以直接在套件中心里安装(可能有机型限制)。如果没有找到,可以参考本文后半段的 Linux 方式在 NAS 上安装。
首先在“注册表”中搜索 gogs,第一个赞数最多的就是官方镜像,双击下载。
等待下载完毕后,在“映像”菜单中,找到 gogs/gogs:latest
双击安装。
根据上面的解释,应该很容易理解接下来的步骤,你只需要在图像界面中根据 Gogs 给出的信息,进行配置。其他的保持默认就可以了。
在映射文件夹这一步,还需要注意目录权限问题,这一点往往是安装服务后不正常或者打不开的重要原因。
为避免权限问题,通常可以建立一些公用目录,而不是放在 /home
目录下。我的做法是新建一个 docker
共享文件夹,把 docker/gogs
作为宿主机的映射目录。然后再修改目录的权限。
在容器启动后,访问 http://宿主机-ip:3000
就可以访问 Gogs 服务了。例如 http://192.168.1.168:3000
。
相同的操作也可以用在 Portainer 中,Portainer 也是一个 Docker 的图形化管理器,每个系统上都有。
不过为了覆盖 Docker 的大部分功能,Portainer 的界面反而没有 NAS 上的 Docker 管理器那么直观,还需要多学习了解一下创建的流程。不过配置 Gogs 的流程还是大同小异的。
如何在 Linux 中安装 Docker 版 Gogs
接下来讲讲在 Linux 系统下如何用命令行安装 Docker 版本的 Gogs。因为 Git 服务很适合搭建在云服务器上,Git 仓库不会占据太多容量,也不用考虑远程访问的问题。
注意:如果在 NAS 上通过命令行安装,则需要开启 NAS 的命令行权限,请查阅不同 NAS 的官方文档。
安装 Docker
首先你需要安装 Docker,Linux 版本的 Docker 可以通过各个发行版内置的包管理工具进行安装。
- Ubuntu 安装 Docker
apt install docker.io
- CentOS 安装 Docker
sudo yum install docker-ce docker-ce-cli containerd.io
默认 Docker 不会启动,需要手动启动。
- 启动 Docker
$ sudo systemctl enable docker
$ sudo systemctl start docker
最后还有个可选步骤,你可以运行 sudo docker run hello-world
验证一下有没有安装成功,这个命令会下载一个简单的镜像并运行,如果你已经正确安装 Docker,你会看到一条 Hello from Docker!
的信息。
安装 Gogs 的 Docker 版本
在安装完 Docker 后,可以在终端中运行以下命令来下载 Gogs Docker 镜像:
docker pull gogs/gogs
然后使用以下命令启动 Gogs:
docker run --name=gogs -p 10022:22 -p 3000:3000 -v /var/gogs:/data gogs/gogs
这段代码的含义我们上面已经拆分解释过了。需要注意的是如果你的宿主机上没有 /var/gogs
这个目录,应该改成一个已存在的目录,后面的 /data
则不需要改动。此外,宿主机的 /var/gogs
应该是空的,并具有可读写权限。
在这些配置之后,应该就可以在浏览器中访问 Gogs 了,地址是 http://宿主机-ip:3000
如何使用 Gogs
使用 Gogs 创建仓库和 Github 类似,注册账户,创建仓库……图形化界面总是容易让人理解。这里就不再赘述了。
不过有一点需要注意。在完成仓库创建后,我们需要通过 git clone 把仓库下载到本地。往常在 Github 中 git clone 仓库后再尝试 push 时会提示用账号密码登录,然后由服务器判别你是否有这个仓库的更多权限,允许你做进一步的操作。
不同于 Github,在 Gogs 中推荐用个人令牌来取代密码。你需要在刚刚搭建完的 Gogs 网页中,进入”头像 - 用户设置 - 授权应用“这个界面下生成一个个人令牌。
这个个人令牌类似一次性密码的作用,用于证明你的身份。然后当你在执行 git clone
的时候,需要在仓库地址中加上这个令牌,格式如下:
http(s)://【个人令牌】@【服务器地址:端口号】/【用户名】/【仓库名】.git
最终组合出来如下:
http://eb36xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxbf21@servername.myds.me:5080/username/repositorg.git
这样这个仓库就不再会丢失登录状态,始终以你的账号进行推送拉取操作了。
如果你想要同步 Obsidian 库,后续的操作就可以继续参考 Obsidian 的 PC 端同步方案,无代码搞定 Git 同步 完成。如果你想同步自己的代码库也是一样的。
Gogs 还提供了工单管理和知识库管理功能,支持多用户,对于小团队来说也是非常合适的选择。
小结
本文比较细致地讲解了关于 Docker 的基础操作,这一套操作在未来讲解其他服务安装时还会使用多次。
尽管 Docker 是一种非常便利的部署方式,但可别以为所有的部署都跟这次一样简单,未来也会涉及到一些复杂的情况。比如有些服务是把数据库外置的,你需要先安装一个 MySQL 的容器,再将两个容器连接在一起。再比如有些服务需要在配置阶段进行一些额外的参数配置,例如用户名、默认密码、时区等信息。
总之,在通过 Docker 部署个人服务这一步上,恭喜你迈出了第一步。