安装计划
发布于 - 修改于 - 大约需要 6 分钟 - 2836 字服务器
我的服务器是一个debian的虚拟机。之所以选择debian,一方面是因为我是ubuntu老用户,平时开发也用ubuntu/debian,另一方面debian本身比较轻量,使用人数众多,各大软件debian上虽然没有最新的,但是大部分都有。
但是其实具体服务器是什么关系不大,因为我准备全部采用docker托管。这样安装方便,也不会弄坏底层系统。唯一的问题在于日后迁移。为此,我准备将几乎所有文件全部集中在git里。毕竟简单的克隆可比别的方式简单多了。
将来则考虑使用树莓派作为服务器,独立运行,更加方便,可以全天24小时不间断运行。目前之所以不用是因为树莓派还没有64位系统,即使有也需要显示器来进行安装,而gitea在树莓派上有一个bug。
docker
正如之前所说,最先安装的自然是docker。这个没啥可说的,就按照官网说的做就行了。
portainer
我不是一个喜欢使用命令行的人,如果能有更好的选择我自然会用更好的选择。portainer就是这样的一个软件。它是一个托管于docker内的docker设置软件,可以通过它的图形界面来创建新的容器,十分简洁。
portainer的设置也在官网上有。
创建完毕portainer之后,我们便可以连接portainer了。找到docker所在机器的ip地址,访问端口9000,即可看到初始界面。
创建用户并选择Local进行连接,我们就可以管理所有的容器了。
nginx
nginx主要有两个目的:设置主机名,方便访问;设置https安全证书。
主机名设置
这么多软件装在docker上,如果每次上网都要输入端口号,未免过于难过。因此nginx的作用便是给每个端口号一个网址。当然,这也需要路由器的配合,更确切地说,需要一个dhcp服务器和一个dns服务器。dhcp用于分配固定的ip地址,dns用于重定向网址。我的路由器是MikroTik,自带两者。如果没有dns服务器或dhcp服务器,那可能还需要自己建立一个。
在设置完dns和dhcp服务器后,我可以通过debian.local
来访问我的虚拟机,但是还是不得不用debian.local:9000
来访问portainer,十分不便,所以我需要将其变为portainer.local
或portainer.debian.local
。
首先我们建立nginx这个容器。我们映射网络端口80到80,重新启动设置为Always,将/etc/nginx/conf.d
映射到主机上的某一个文件夹,方便修改。
我们可以看到,在/etc/nginx/nginx.conf
中的默认为:
user nginx;
worker_processes 1;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
include /etc/nginx/conf.d/*.conf;
}
这就意味着,我们只需要将文件名以.conf结尾的文件放在conf.d这个文件夹中,就会被放入nginx.conf里。如此一来,就可以在避免直接修改nginx.conf的情况下添加内容。
我们可在conf.d文件夹中添加my.conf这个文件:
server {
listen 80;
server_name portainer.debian.local;
location / {
proxy_pass http://172.17.0.2:9000;
proxy_redirect default;
}
}
这样我们就可以通过portainer.debian.local
来访问172.17.0.2:9000
。要注意这里的172.17.0.2
是在docker内部的网址,而不是主机网址,也不是localhost
。具体地址可以通过portainer的容器列表查看。同样的,在设置完成以后,即使容器停止端口公开映射,依然可以通过设置的主机名访问容器。
内网
当然,这里会存在一个问题。当下一次docker重启后,每一个容器还会被分配到同样的地址吗?
为了解决这个问题,我们根据教程另外搭建一个网络,并将除了nginx和portainer的容器全部转移到这个网络上来。如此一来,nginx就可以通过容器的名字直接解析容器地址,不用担心具体容器在哪个位置的问题了。
WebSocket
由于portainer使用websocket连接命令行,因此WebSocket的代理也是不可或缺的。
可以看到portainer访问的是ws://portainer.debian.local/api/websocket/...
,我们可以添加以下内容:
server {
# 之前的内容
location /api/websocket/ {
proxy_pass http://172.17.0.2:9000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
proxy_set_header Host $host;
}
}
于是我们便可以使用websocket进行通信了。
https
现在的浏览器对于http访问的服务器都十分不客气,大大的“不安全”显示在左上角上,让人分外难过。因此这一次我准备设置https。
问题在于,我的服务器托管在本地,我并没有一个域名,也没有DNS提供商,因此我无法使用Let’s encrypt。我的唯一解决方法就是使用一个自签名证书。
由于我对此一窍不通,基本照抄了网上的教程。
由于自己签发的根证书浏览器并不认可,因此大大的不安全依然显示在左上角。但是至少我们可以希望它确确实实地采用了https加密浏览。之后进入更高级别,购买云主机及域名后,便可使用Let’s encrypt进行加密了。
gitea
gitea是一个非常轻量的git服务器,比gitbucket好看,比gitlab轻量,有中文支持,是个很不错的选择。
老样子,根据教程安装。之后调整Nginx的代理设置。
添加
server {
listen 80;
listen [::]:80;
listen 443 ssl;
listen [::]:443 ssl;
server_name gitea.debian.local;
location / {
proxy_pass http://172.17.0.4:3000;
proxy_redirect default;
}
}
即可。但是这里并没有解决ssh的问题。
我们需要利用Stream模块。
stream {
server {
listen 22;
proxy_pass 172.17.0.4:22;
proxy_connect_timeout 1h;
proxy_timeout 1h;
}
}
如此一来,在gitea里加入自己的公钥以后,我们就可以通过ssh来传输文件。要注意的是stream是和event以及http一个层级,因此不能直接放在conf.d里,需要修改/etc/nginx/nginx.conf文件,或加一条include命令,或直接改写。
drone
drone是个持续集成服务器,比jenkins看起来现代化,也能和gitea集成,就是文档内容略简单,但是也足够了。其主要任务便是编译并托管这个博客。另外可能用于别的私人项目。
安装过程参考官网。注意第一步添加OAuth应用程序时,是在Gitea个人账户设置>应用里。Gitea服务器地址和其本身地址都是对于用户来说的网址,不能使用内网名称。Gitea服务器地址不能忘了加http://
。另外当drone在gitea里添加钩子时,一定要确认钩子是否设置正确。
hugo
hugo是我唯一没有搞定的部分,所以只能依赖gitlab了。
建立一个公开的仓库,把所有文件上传,然后根据给出的pages网址修改config.toml
里的baseURL
。pipeline可以直接采用gitlab官方范例。如此一来就全部搞定了。
总结
目前设置下来nginx感觉还不够好用,https则毫无意义(很多程序不接受个人签名)。
portainer不应该放进内网,因为它是设置docker的重要组件。
这么看下来感觉Go可能真的是未来最重要的语言之一了。Gitea,drone,hugo,还有正在考虑的反向代理服务器caddy,以及可能增加的一些服务器都是用go写的。也许我哪天也该去学学go。