目录
知识要求:
搭建感想
注:以下是我搭建gitlab 时的思考,需要nginx 的基础知识,Docker 的基础知识才容易理解,与下面的搭建过程是独立的,不感兴趣可直接略过。
其实gitlab 已经搭建并用了一年多了,现在所有的项目管理都通过gitlab 完成。但是一直以来都有2个问题:
-
80 端口被系统的nginx 占用了,所以只能监听非80 端口;
-
443 端口也被系统的nginx 占用,所以也一直没增加对https 的支持;
最近正在尝试对所有已有的服务Docker 化,一方面想让gitlab 的搭建更简单些,另一方面也把这两个问题都处理掉。
于是就做了两个Docker 容器: nginx 和gitlab ,相当于nginx 和gitlab 运行在局域网的不同主机,所以端口上没冲突。nginx 是对外的服务器,它做一层反向代理到gitlab 就能让gitlab 提供对外的服务。
然而。。。这个做法却带来了一个新问题:gitlab 需要的是22 ,80 ,443 端口,80 与443 通过反向代理解决了,22 却没办法解决。因为正常来讲,宿主机的SSH 肯定也在使用,所以gitlab 的SSH 监听端口映射到宿主机会有冲突。
当然了,解决办法还是有的,不过非常繁琐。我们做Docker 的目的不就是为了降低布署难度吗?如果使用Docker 的配置比在宿主机上还繁琐,那使用起来就没太大意义了。
于是gitlab 就没有放在Docker 中,而是直接搭在宿主机上。
搭建过程
安装
gitlab 的安装是很简单的,先下载安装包:
wget https:
安装:
rpm -Uvh gitlab-ce-10.2.5-ce.0.el7.x86_64.rpm
配置
gitlab 内置了nginx 的服务,所以默认会占用80 和443 端口。一般来说,我们做WEB 开发,服务器上早就安装了nginx 或者apache ,把80 和443 端口给占了,所以需要做些修改防止冲突。
简单的修改端口是不可行的,比如80 改成85 ,当查看gitlab 项目时,下图中的项目地址会变成http://git.papamk.com:85/papamk/groupbill 这样,看着就不舒服。启用https 则在使用过程中则会出现其他的问题。这里不一一论述,直接说明正确的配置方法。
具体步骤:
1.首先确保你的服务器已经有运行nginx ,并且该nginx 监听宿主机的80 和443 端口。(如果你原来使用的apache ,请通过nginx 反向代理到apache ,这样apache 原来的服务仍然可用)。
2.编辑/etc/gitlab/gitlab.rb :
external_url 'http://gitlab.papamk.com/'
nginx['enable'] = false
web_server['external_users'] = ['www']
修改监听方式和监听地址(如果nginx 与gitlab 都在宿主机上,不用改也行;如果nginx 在docker 中,则需要修改)
gitlab_workhorse['listen_network'] = "tcp"
# 下面的172.18.147.173为本机IP,根据实际情况修改,不能为localhost或者127.0.0.1,否则docker访问不到
gitlab_workhorse['listen_addr'] = "172.18.147.173:8181"
最后执行下面命令让配置生效:
$gitlab-ctl reconfigure
3.配置nginx
增加gitlab.conf 的配置(所有需要注意的地方都加了中文注释):
upstream gitlab-workhorse {
server 172.18.147.173:8181;
}
server {
listen 80;
listen [::]:80 default_server;
server_name gitlab.papamk.com;
server_tokens off;
root /opt/gitlab/embedded/service/gitlab-rails/public;
access_log /home/wwwlogs/gitlab_access.log;
error_log /home/wwwlogs/gitlab_error.log;
location / {
client_max_body_size 0;
gzip off;
proxy_read_timeout 300;
proxy_connect_timeout 300;
proxy_redirect off;
proxy_http_version 1.1;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_pass http://gitlab-workhorse;
}
}
该配置根据官网提供的配置修改而来: https://gitlab.com/gitlab-org/gitlab-recipes/blob/master/web-server/nginx/gitlab-omnibus-nginx.conf。
重启nginx :
$sudo service nginx restart
4.登陆浏览器,这时可以看到安装成功了,如下图所示:
首次登陆会要求重置管理员密码,管理员的默认用户名为root 。
https 的支持
1.使用Let's encrypt 申请免费的SSL 证书,该项目提供了一个叫certbot /certbot-auto 的工具获取证书,执行下面命令获取工具:
$wget https://dl.eff.org/certbot-auto
$chmod +x certbot-auto
执行下面命令生成生成gitlab.papamk.com 的证书,其中--agree-tos 表示同意协议,--email 95496875@qq.com 为自己的email 。
$./certbot-auto --agree-tos --email 95496875@qq.com certonly --webroot -w /opt/gitlab/embedded/service/gitlab-rails/public/ -d gitlab.papamk.com
执行成功后,可通过以下命令查看下证书位置,nginx 需要引用这些文件。(一般位于/etc/letsencrypt/live/gitlab.papamk.com/ 目录)
$./certbot-auto certificates
2.修改/etc/gitlab/gitlab.rb ,对外的URL 改为https :
external_url 'https:
执行重新配置命令以便让新配置生效:
$gitlab-ctl reconfigure
3.修改前面的nginx 的gitlab.conf 的配置,全部替换成下面的内容(所有需要注意的地方都加了中文注释):
upstream gitlab-workhorse {
server 172.18.147.173:8181;
}
server {
listen 0.0.0.0:80;
listen [::]:80 ipv6only=on default_server;
server_name gitlab.papamk.com;
server_tokens off;
return 301 https://$http_host$request_uri;
access_log /home/wwwlogs/gitlab_access.log;
error_log /home/wwwlogs/gitlab_error.log;
}
server {
listen 0.0.0.0:443 ssl;
listen [::]:443 ipv6only=on ssl default_server;
server_name gitlab.papamk.com;
server_tokens off;
root /opt/gitlab/embedded/service/gitlab-rails/public;
ssl on;
ssl_certificate /etc/letsencrypt/live/gitlab.papamk.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/gitlab.papamk.com/privkey.pem;
ssl_ciphers "ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA:ECDHE-RSA-DES-CBC3-SHA:AES256-GCM-SHA384:AES128-GCM-SHA256:AES256-SHA256:AES128-SHA256:AES256-SHA:AES128-SHA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!MD5:!PSK:!RC4";
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 5m;
access_log /home/wwwlogs/gitlab_access.log;
error_log /home/wwwlogs/gitlab_error.log;
location / {
client_max_body_size 0;
gzip off;
proxy_read_timeout 300;
proxy_connect_timeout 300;
proxy_redirect off;
proxy_http_version 1.1;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Ssl on;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_pass http://gitlab-workhorse;
}
}
重启nginx :
$sudo service nginx restart
4.定期更新ssl 证书
Let's encrypt 提供的证书,有效期为90 天,到期后执行如下命令即可继续使用:
$./certbot-auto renew
将该命令加入到crontab ,每小时刷新一次,就不用担心过期了。先将该命令移到系统目录下:
$sudo mv certbot-auto /usr/bin/certbot-auto
然后执行crontab -e ,添加一行:
0 */1 * * * /usr/bin/certbot-auto renew
发送邮件的支持
官网已经给出详细的配置说明和各大邮件服务提供商的示例,不再对配置做说明: https://docs.gitlab.com/omnibus/settings/smtp.html。
我自己使用163邮箱做测试,而官网示例没有,这里给出参考配置:
gitlab_rails['gitlab_email_from'] = 'xxxx@163.com' # 替换成实际的email
gitlab_rails['smtp_enable'] = true
gitlab_rails['smtp_address'] = "smtp.163.com"
gitlab_rails['smtp_port'] = 465
gitlab_rails['smtp_user_name'] = "xxxx@163.com" # 替换成实际的email
gitlab_rails['smtp_password'] = "xxx" # 替换成实际的密码
#gitlab_rails['smtp_domain'] = "163.com"
gitlab_rails['smtp_authentication'] = "login"
gitlab_rails['smtp_enable_starttls_auto'] = true
gitlab_rails['smtp_tls'] = true
一般来说,服务提供商的SMTP 邮箱都会限制每日发送次数(250封左右),所以推荐有兴趣的同学用Postfix 自建邮箱服务器,或者使用mailgun 这种专业的邮件服务提供商。
如果是阿里云上的服务器,作为客户端使用第三方的SMTP配置,会发现被禁止连接SMTP 的25端口,需要使用465 或者587 。
安全相关
-
root 的密码建议设置得复杂些;
-
管理员登陆后,推荐开启注册邮箱验证, 防恶意注册,见:https://docs.gitlab.com/ce/security/user_email_confirmation.html。
参考
-
用Docker安装Gitlab
-
gitlab升级
-
为gitlab启用let’s encrypt颁布的证书
(责任编辑:IT) |