以前我安装Gitlab是使用源码安装的方式来安装的,这种方式的好处是可以高度自定义安装程序和指定安装位置。缺点是Golang、Ruby、Git 1.8+、Nodejs都需要编译安装,太麻烦了。

现在家里面搞了台机器做内部服务器使用,想偷懒了。于是就开始试试 Omnibus-GitLab 这个一键安装包。

但是Omnibus-GitLab 自带了 PostgreSQL 作为缺省的内部数据存储,比如用户信息, 源码仓库信息等。

平时使用最多的是MySQL数据库,其次是MongoDB,或者SQL Server数据库,但是对PostgreSQL这个数据库却很少接触,只能去找Google大叔了。

这里记录一下过程。

PostgreSQL默认情况下,远程访问不能成功,如果需要允许远程访问,网站普遍是修改2个配置文件。

这里为了安全,我们使用的是Password/Md5 Authentications的认证方式

给 Gitlab 用户加上密码

默认缺省情况下, Gitlab 用户使用的是 Peer Authentication , 这意味着客户端只能以 PostgreSQL 所在主机上的Linux系统账号访问数据库, 无法远程访问。

1、设置PostgreSQL数据库用户 gitlab 的密码:

$ su  - gitlab-psql #切换到gitlab-psql用户
$ psql gitlabhq_production #连接gitlabhq_production数据库
$ \password gitlab #修改密码,然后输入两次密码,回车
$ \q #退出PostgreSQL

2、配置 Gitlab 使用刚刚设置的密码连接数据库,在/etc/gitlab/gitlab.rb 中搜索# GitLab database settings #,找到 GitLab database 部分的配置项

gitlab_rails['db_password'] = "***" #您上面设置的PostgreSQL数据库用户 gitlab 的密码

3、重新生成配置文件

sudo gitlab-ctl reconfigure

这部分完成,接着下面部分。

开启 PostgreSQL 远程(方法一)

这个方法是网上普遍的方法,但是这个方法有不足的地方。 不足的地方就是每次执行: sudo gitlab-ctl reconfigure 来重新生成配置文件的时候,配置文件又会被还原了的

1、修改 postgresql.conf 配置文件

我们从这里路径来找到 PostgreSQL 配置文件:/var/opt/gitlab/postgresql/data/postgresql.conf

大概找到63行,或者搜索 listen_addresses 。 将 postgresql.conf 文件中的 listen_addresses 项值设定为*

# - Connection Settings -

listen_addresses = '*'

2、修改 pg_hba.conf 配置文件

在pg_hba.conf文件最底部新增一行

host    all         all         0.0.0.0/0             md5

表示运行所以的IP连接,如果想指定连接IP的,可以将上述配置项中的0.0.0.0设定为特定的IP值。

最后重启Gitlab: sudo gitlab-ctl restart

Tips: 但是这样的话,每次执行:sudo gitlab-ctl reconfigure 的时候,配置文件又会被还原了的。

开启 PostgreSQL 远程(方法二)

方法一有不足的地方,于是本着挖根究底的心态,我们就要找一个更加优异的解决方法。

根据上面的文件,我们知道了修改方法,也知道每次更新配置文件的时候都会被重置,那么证明这两个配置文件是又Gitlab生成的。

那么这样问题也很好解决,我们先去看看生成模板:

postgresql.conf.erb pg_hba.conf.erb

从中可以看到生成的规则是从配置文件里面读取的,进行了循环生成:

<% @trust_auth_cidr_addresses.each do |cidr| %>
host    all         all         <%= cidr %>           trust
<% end %>

<% @md5_auth_cidr_addresses.each do |cidr| %>
host    all         all         <%= cidr %>           md5
  <% if @sql_replication_user %>
host    replication <%= @sql_replication_user %> <%= cidr %>     md5
  <% end %>
<% end %>

那么怎么解决呢?

既然 postgresql.confpg_hba.conf 这两个配置文件是动态生成的,那么我们就不能去修改这两个文件了,而正确的做法应该是修改配置文件:/etc/gitlab/gitlab.rb

从上面的 pg_hba.conf.erb 模板文件里面,可以看到里面有几个变量 trust_auth_cidr_addresses , md5_auth_cidr_addresses , sql_replication_user ,这里面我们只要设置 md5_auth_cidr_addresses 即可。

打开 /etc/gitlab/gitlab.rb 文件,搜索 # GitLab PostgreSQL # ,找到postgresql[''] 数组的部分,然后在最底部新增 listen_addressmd5_auth_cidr_addresses 的配置项,如下:

找到 GitLab PostgreSQL 配置项的 ## Advanced settings 部分,然后在这部分的最后新如下配置项。

#####################
# GitLab PostgreSQL #
#####################

# postgresql['enable'] = true
# postgresql['listen_address'] = nil
# postgresql['port'] = 5432
# postgresql['data_dir'] = "/var/opt/gitlab/postgresql/data"
# postgresql['shared_buffers'] = "256MB" # recommend value is 1/4 of total RAM, up to 14GB.

## Advanced settings
# postgresql['ha'] = false
# postgresql['dir'] = "/var/opt/gitlab/postgresql"
# postgresql['log_directory'] = "/var/log/gitlab/postgresql"
# postgresql['username'] = "gitlab-psql"
# postgresql['uid'] = nil
# postgresql['gid'] = nil
# postgresql['shell'] = "/bin/sh"
# postgresql['home'] = "/var/opt/gitlab/postgresql"
# postgresql['user_path'] = "/opt/gitlab/embedded/bin:/opt/gitlab/bin:$PATH"
# postgresql['sql_user'] = "gitlab"
# postgresql['sql_ci_user'] = "gitlab_ci"
# postgresql['max_connections'] = 200
# postgresql['md5_auth_cidr_addresses'] = []
# postgresql['trust_auth_cidr_addresses'] = []
# postgresql['shmmax'] =  17179869184 # or 4294967295
# postgresql['shmall'] =  4194304 # or 1048575
# postgresql['work_mem'] = "8MB"
# postgresql['effective_cache_size'] = "1MB"
# postgresql['checkpoint_segments'] = 10
# postgresql['checkpoint_timeout'] = "5min"
# postgresql['checkpoint_completion_target'] = 0.9
# postgresql['checkpoint_warning'] = "30s"
postgresql['listen_address'] = '*'
postgresql['md5_auth_cidr_addresses'] = ["0.0.0.0/0"] #表示运行所以的IP连接,如果想指定连接IP的,可以将上述配置项中的0.0.0.0设定为特定的IP值。

最后重新生成配置文件、重启Gitlab:

sudo gitlab-ctl reconfigure #重新生成配置文件
sudo gitlab-ctl restart #重启Gitlab

至此,完成。