Docker
使用docker来部署gitlab-ce,基本上就是两步走:首先创建文件目录,然后编写docker-compose.yml,就完了。
目录结构是这样的:
1 | /opt/gitlab/ |
docker-compose.yml
的内容修改自官方的文件,主要去除了gitlab-runner的内容[1]。
1 | version: '3.6' |
然后配置一下gitlab.rb,主要是为了确保容器内的nginx不要监听https以及不自动尝试申请ssl证书:
1 | nginx['client_max_body_size'] = '0' |
然后就可以拉起容器了:sudo docker compose up -d
。
Tips
- 官方文档:install - docker
- 有的教程会说,需要确保yaml的端口映射内外一致,其实是错的。比如官方教程里说可以配置
gitlab_rails['gitlab_shell_ssh_port']
来更改ssh监听端口,然而实际没有效果。其实根据docker的运作方式可以知道,容器里的端口根本无所谓,只要端口映射写对了就能够正常用。 - 修改gitlab.rb之后需要
docker compose restart
,而修改docker compose.yml
的话就需要docker compose down && docker compose up -d
了。而官方docker其实是根据你的配置重新build一个出来的,所以耗时非常长。
传统方法
!!! bug
这种庞然大物建议真的,用gitlab-ce的docker,别实机部署,难保哪次system update就炸了,而且很难找log来分析。
Gitlab官方没有支持archlinux,但是archwiki有详尽的安装介绍。只不过wiki中有些没有说清楚的部分,需要记录下来。
请在阅读本文的过程中同时参照官方wiki:GitLab。
Pre
Redis
按照Redis页面的指引安装Redis(pacman -S redis
)并编辑配置文件(/etc/redis/redis.conf
):
- 仅限本机用unix domain socket访问,禁用TCP连接:将
port 6379
改为port 0
- 打开unix domain socket监听以及修改权限为0770(允许redis组成员访问):
1
2unixsocket /run/redis/redis.sock
unixsocketperm 770
保存配置之后,启动并设置开机启动Redis服务:
1 | sudo systemctl enable redis |
PostgreSQL
从这里开始官方指南就开始有点麻了
根据官方wiki 安装PostgreSQL(pacman -S postgresql
)。并不需要急着启动服务,需要先进行配置。
首先切换到postgres用户:sudo -iu postgres
;然后初始化initdb -D /var/lib/postgres/data
。等命令行出现以下内容就代表初始化完毕:
1 | Success. You can now start the database server using: |
随后先exit
切回原来的用户,启动并设置开机启动postgresql:
1 | sudo systemctl enable postgresql.service |
GitLab
先安装gitlab包:pacman -S gitlab
。也是不急着启动,一大堆要配置的。
基础配置
对于/etc/webapps/gitlab/gitlab.yml
,至少要更改gitlab
下的host
,把它设置成你的完整域名,比如我的是git.mutebot.net
:
1 | production: |
注意这里的port我没有改成443,因为后面的内网访问其实是需要用http的,所以保留是80就可以了。外网的访问会由外网的Nginx自动重定向至HTTPS。
官方指南的2.2节看到这里就行了,后面一大堆路径配置其实如果是用默认安装方式是不需要看的。接下来直接跳过2.3小节(自定义Puma端口),来到2.4的配置secret部分。
secret
需要往/etc/webapps/gitlab/secret
和/etc/webapps/gitlab-shell/secret
里面随便填点东西,因为gitlab需要根据这两个文件来生成token。官方指南里提供的生成随机字符串的方案是(需要用root身份执行):
1 | hexdump -v -n 64 -e '1/1 "%02x"' /dev/urandom > /etc/webapps/gitlab/secret |
那么用同样的方法我们可以在/etc/webapps/gitlab/secrets.yml
里配置一些字符串。该文件需要包含以下内容,其中每个secret
都用hexdump -v -n 64 -e '1/1 "%02x"' /dev/urandom
生成一条字符串再粘进去就行了:
1 | production: |
Redis
为了让GitLab可以连接我们配置好的Redis,需要做两件事:
- 把gitlab用户添加到redis用户组:
sudo usermod -aG redis gitlab
- 配置
/etc/webapps/gitlab/resque.yml
文件:1
2
3
4
5
6development:
url: unix:/run/redis/redis.sock
test:
url: unix:/run/redis/redis.sock
production:
url: unix:/run/redis/redis.sock
PostgreSQL
为了这一点醋包了一大盘饺子
首先切换到postgres用户,然后创建gitlab用的postgresql用户和数据库。注意自行替换your_username_here
和your_password_here
的地方,其他都不需要动。
note
- 无论你输入用户名的时候是否包含大写,最后都会被postgresql转换成小写,所以请务必全小写。(就是因为这个坑我总是auth不成功)
- gitlab需要一些postgresql的extension,archwiki上建议直接把gitlab的用户给到superuser权限来让它自己安装extension。这是一种办法,但是为了安全性,建议手动安装extension。
手动安装extension
1 | sudo -iu postgres |
根据GitLab的文档安装所需extension,比如本文写作时需要安装的包括pg_trgm
、btree_gist
和plpgsql
。分两步走,首先创建用户和数据库,然后切换数据库安装插件。
1 | CREATE USER your_username_here WITH PASSWORD 'your_password_here'; |
1 | # 切换数据库到gitlabhq_production |
1 | /* 先看看装了什么插件 */ |
正常来说后面这个\dx
会输出类似这样的结果:
1 | gitlabhq_production=# \dx |
那就可以了,用\q
退出postgresql的命令行就行。
让gitlab自己安装extension
1 | sudo -iu postgres |
1 | CREATE USER your_username_here WITH PASSWORD 'your_password_here'; |
SUPERUSER
是故意的,因为gitlab需要这个权限:
The reason for creating the user as a superuser is that GitLab is trying to be “smart” and install extensions (not just create them in its own userspace). And this is only allowed by superusers in Postgresql.
设置GitLab的数据库配置文件
然后就是改配置/etc/webapps/gitlab/database.yml
:
1 | production: |
到这里基本成功一半,可以初始化安装了。
初始化
由于我是远程部署的,没办法通过内网用浏览器访问网页端设置密码,所以只能用命令行参数的方式直接指定root账户的密码和邮箱。
这里就涉及一个小技巧,怎么让zsh不记住这个包含敏感信息的命令呢?其实很简单的:先套娃启动一个zsh,然后unset掉HISTFILE,后面执行的命令就不会记录在历史记录里了。
命令行指定root密码和邮箱的变量分别是GITLAB_ROOT_PASSWORD
和GITLAB_ROOT_EMAIL
,改成自己实际的值。另外,还需要先手动启动gitlab-gitaly.service
(不需要设置成开机启动,后面有socket统一处理)。
1 | # 原地启动一个新的zsh |
执行之后会提示yes/no的,记得输入别傻等。
warning
可能有的小聪明会问,“sudo的-E选项不是可以保留当前的环境变量嘛?我直接export然后-E就好了呀”。重点就是-E会保留所有的环境变量,包括HOME,这会导致错误的初始化结果——初始化命令的log输出也会提示你:Warning提示$HOME目录无法写入,正在使用临时目录。
然后先忽略官方指南中check your installation的部分,因为按照指南来说你的gitlab-workhorse
等等都还没启动,check是肯定不过的。直接先调整modifier bits先:
1 | # 直接切root用户做 |
官方指南接下来就是反向代理的部分了,但是我们这里先把整个gitlab启动起来先:
1 | sudo systemctl enable gitlab.target |
Tips
重新初始化
万一由于各种原因需要重新执行这个初始化命令,那就需要先更改sudo的env_keep配置,添加DISABLE_DATABASE_ENVIRONMENT_CHECK
。先sudo visudo
添加这一行:
1 | Defaults env_keep+="DISABLE_DATABASE_ENVIRONMENT_CHECK" |
然后再重新初始化:
1 | export DISABLE_DATABASE_ENVIRONMENT_CHECK=1 |
反向代理
由于我是用内网穿透的方式提供服务的,所以这里免不了讲内网穿透的内容。对于直接把gitlab部署在公网服务器的有钱人,那大概看看改改就好。
由于我之前就有其他服务内网穿透到公网了,而且公网的nginx开了proxy_protocol,所以listen的port也有点不同。总而言之内网穿透的影射关系是内网443->公网8002。另外为了ssh授权,还需要映射本地的sshd到公网,这个端口比较敏感就不说了。
公网Nginx
公网的配置很简单,毕竟只是一个转发器。敏感内容就打星号了。
1 | server { |
记得测试并重启nginx:sudo nginx -t && sudo systemctl restart nginx
。
内网Nginx
内网Nginx的配置因为要兼顾HTTP和HTTPS,所以需要把公用的内容保存起来,放在/etc/nginx/snippets/gitlab.conf
里:
1 | location ~ ^/(assets)/ { |
然后就是server部分的配置,放在/etc/nginx/sites/mutebot/git.conf
里:
1 | upstream gitlab-workhorse { |
记得测试并重启nginx:sudo nginx -t && sudo systemctl restart nginx
。
到这里,通过访问完整域名(https://git.mutebot.net)应该是可以打开gitlab的登录界面的了。如果不能的话就要看看哪里出问题了。
Post
ssh授权
需要把sshd的配置改一下,将AuthorizedKeysFile
加一个%h/
上去(/etc/ssh/sshd_config
):
1 | #AuthorizedKeysFile .ssh/authorized_keys |
改完之后重启sshd(sudo systemctl restart sshd
)。在GitLab登录之后点击头像,Edit Profile,SSH Keys添加SSH Keys之后,就可以用ssh -T gitlab@git.mutebot.net
来测试是否成功了。这里很当然地省略了~/.ssh/config的内容,摸了
自动更新数据库
原文照搬,就是创建两个hooks和一个script。首先是Update前的hook(/etc/pacman.d/hooks/05-gitlab-pre.hook
):
1 | [Trigger] |
然后是Update后的hook(/etc/pacman.d/hooks/99-gitlab-post.hook
):
1 | [Trigger] |
最后是post hook所调用的script(/etc/pacman.d/scripts/gitlab-migrate-database.sh
):
note
wiki里写的是bundle-2.7,但是实际上在我更新了gitlab之后,升级脚本并没有运行成功。手动执行这个命令,它会抱怨什么CFPropertyList找不到。但是如果去掉这个版本号,直接用bundle的话,就成功了。
1 |
|
记得给script加上可执行权限:sudo chmod +x /etc/pacman.d/scripts/gitlab-migrate-database.sh
内网直连
我用的是mosdns,所以直接在hosts插件里面新增一条记录,git.mutebot.net的地址就是运行gitlab的机子的IP。这样的话内网机就可以直连gitlab而不用跑公网转发了。但是比如gitlab-runner是一定要用https授权的,那就没办法了,只能不用它了。
参考
- 关掉gitlab-ce的docker的letsencrypt:How to disable Let’s Encrypt in the Gitlab CE docker image
关于这部分内容请看本博客的另一篇文章gitlab-runner。 ↩︎