设置家庭开发环境(docker + gitlab + DNS)

前言


我无法为该帖子找到合适的名称,因此我将简要描述将要讨论的内容。


我们大多数人都拥有一些小型的手工艺品,它们不会超出我们房屋的范围。 有人将它们托管在运行的计算机上,有人将其托管在Heroku上,有人将其托管在VPS上,并且有人具有家庭服务器。 在reddit上甚至有一个r / homelab社区,人们在其中讨论所谓的不同硬件和软件。 家庭实验室


我对这个问题不太热衷,但是我有一个Intel NUC,可以使用MPD播放来自NAS的音乐。 除了MPD之外,我的小手工艺品还在旋转,这有助于我使用它:现在是电报的死机,sinatra上的HTTP API和笨拙的前端。


在一篇博文中,我将不带特殊细节(其中许多我本人不了解),描述了安装用于处理服务域名的DNS服务器的过程,使用Docker同时运行多个服务的方案以及使用CI安装Gitlab的方案。 您没有学到任何新知识,但是突然之间,此“指南”对某人很有用。 另外,我想听听有关如何使它更容易/更优雅/更正确的建议。


最初,我的服务代码位于bitbucket / github上,创建docker映像后,我不得不使用SSH并运行几个脚本来创建/更新带有服务的容器。 我发现自己在应用程序中遇到了一个烦人的小错误,而我并没有解决这个错误,这仅仅是因为我懒于执行整个过程。 显然,是时候使一切自动化。 那时,出现了安装Gitlab + CI的想法。


使用DNS的本地域


为了简单起见,所有容器都使用--network=host标志创建-足以在应用程序中使用不同的端口。 但是,随着服务数量的增加,请记住哪个端口使用哪个应用程序。 是的,每次都在浏览器中使用端口输入IP地址不是很好,因此在安装gitlab之前,我决定在同一服务器上托管多个应用程序。


这个想法很简单:我们配置DNS,将其提供给路由器,安装Nginx,并使用其配置根据域将请求重定向到不同的端口。 这将使您不必在开发过程中烦恼端口,因为 容器将开始使用--publish而不是--network=host


在安装过程中,使用了本指南 。 在其中,为Ubuntu 16.04(我有Debian)完成了配置。


root身份执行其他操作。


首先,安装bind9和实用程序:


 apt-get install -y bind9 bind9utils bind9-doc dnsutils 

接下来,我们需要配置域区域。 为此,将以下内容添加到/etc/bind/named.conf.local文件中:


 zone "nondv.home" IN { //    type master; file "/etc/bind/fwd.nondv.home.db"; // Forward lookup file allow-update { none; }; // Since this is the primary DNS, it should be none. }; 

另外,用于反向查找的配置已添加到指南中,但是老实说,我并不真正理解为什么这样做是必要的,因此我没有这样做。


现在创建文件/etc/bind/fwd.nondv.home.db


 $TTL 604800 @ IN SOA ns1.mydomain.home. root.mydomain.home. ( 20 ; Serial 604800 ; Refresh 86400 ; Retry 2419200 ; Expire 604800 ) ; Negative Cache TTL ;Name Server Information IN NS ns1.nondv.home. ;IP address of Name Server ns1 IN A 192.168.0.3 ;A - Record HostName To Ip Address nuc IN A 192.168.0.3 gitlab IN A 192.168.0.3 mpd IN A 192.168.0.3 @ IN A 192.168.0.3 

接下来,重新启动bind9并设置自动运行:


 systemctl restart bind9 systemctl enable bind9 

请注意,我使用.home而不是.local 。 这样做是因为nondv.localnondv.local子域无法解析。 好吧,更准确地说, dig通常能识别出它,但是浏览器和curl却没有。 正如一位同事向我解释的那样,这很可能是由于各种软件(例如Bonjour(装有盖子的苹果公司的笔记本电脑))造成的。 通常, .home域不会出现此类问题。


实际上,仅此而已。 之后,我将DNS作为主要路由器添加到路由器,然后重新连接到路由器(以便/etc/resolve.conf文件自动更新)。


Nginx的


就像我说过的,为了能够通过HTTP在端口80上同时访问所有服务,我们需要配置Nginx,以便它根据域代理对不同端口的请求。


Nginx映像的文档可在Docker Hub网站上找到。


准备主配置文件/srv/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; keepalive_timeout 65; server { listen 80; server_name nondv.home; rewrite ^/$ http://mpd.nondv.home redirect; #  ,       } include /etc/nginx/conf.d/*.conf; } 

接下来,配置域。 我只会显示一个:


 # /srv/nginx/conf.d/gitlab.conf server { listen 80; server_name gitlab.nondv.home; location / { proxy_pass http://127.0.0.1:3080; } } 

该容器由以下命令启动:


 docker run --detach \ --network host \ --name nginx \ --restart always \ --volume /srv/nginx/nginx.conf:/etc/nginx/nginx.conf:ro \ --volume /srv/nginx/conf.d:/etc/nginx/conf.d:ro \ nginx:alpine 

就是这样,现在将使用nginx捕获对端口80的HTTP请求,并将其重定向到所需的端口。


Gitlab


根据官方指南,一切都很简单:


 docker run --detach \ --hostname gitlab.nondv.home \ --publish 3080:80 --publish 3022:22 \ --name gitlab \ --restart always \ --volume /srv/gitlab/config:/etc/gitlab:Z \ --volume /srv/gitlab/logs:/var/log/gitlab:Z \ --volume /srv/gitlab/data:/var/opt/gitlab:Z \ gitlab/gitlab-ce:latest 

我们正在等待所有配置(我们查看docker logs -f gitlab ),然后输入容器( docker exec -it gitlab bash )以获取更多信息。 设置:


 nano /etc/gitlab/gitlab.rb # or vim # /etc/gitlab/gitlab.rb external_url 'http://gitlab.nondv.home' gitlab_rails['gitlab_shell_ssh_port'] = 3022 # /etc/gitlab/gitlab.rb gitlab-ctl reconfigure 

为了提高可靠性,您可以重新启动容器( docker container restart gitlab )。


CI


Gitlab CI已经集成,但是它需要一个Gitlab Runner( 文档 )。


为此,我编写了一个小脚本:


 NAME="gitlab-runner$1" echo $NAME docker run -d --name $NAME --restart always \ --network=host \ -v /srv/gitlab-runner/config:/etc/gitlab-runner \ -v /var/run/docker.sock:/var/run/docker.sock \ gitlab/gitlab-runner:alpine 

创建跑步者后,我们需要对其进行注册。 为此,请转到gitlab(通过浏览器),然后转到管理区域→概述→运行程序。 它描述了流道的安装。 简而言之,您只需执行以下操作:


 docker exec -it gitlab-runner register 

并回答问题。


您自己的HTTP服务


它们与gitlab类似地启动。 将它们发布在某个端口上,并将配置添加到nginx。


结论


现在,您可以将项目托管在家庭服务器上,并使用Gi​​tlab CI的功能来自动化项目的组装和发布。 进行git push很方便,不用担心启动,对吧?


我也建议为gitlab设置邮件。 我个人在Yandex上使用了一个邮箱。 文献资料

Source: https://habr.com/ru/post/zh-CN417179/


All Articles