远程访问GitLab内置的PostgreSQL数据库
gitlab 默认的数据库是 PostgreSQL ,用它官网的话来说就是“The World’s Most Advanced Open Source Relational Database”。
一般情况下,我们没有必要去直接访问它。但是,没必要不代表没需求。gitlab 结构、用户数据、配置信息等。
注意:
在 GitLab 12.1 中删除了对 MySQL 的支持。建议在 MySQL / MariaDB 上使用 GitLab 的现有用户在升级之前迁移到 PostgreSQL。 从 GitLab 10.0 开始,需要 PostgreSQL 9.6 或更高版本,并且不支持较早的版本。我们强烈建议用户使用 PostgreSQL 9.6,因为这是用于开发和测试的 PostgreSQL 版本。
背景:业务系统需要接入GitLab,业务系统以及GitLab都有一套各自的用户系统,需要实现同一套账户密码的话需要将数据同步给GitLab(主要是密码),然而由于GitLab安全策略,通过api进行同步GitLab用户数据并不满足需求,所以需要能直接访问GitLab数据库进行数据修改。
本地GitLab使用的是Docker拉取的远程Gitlab镜像
拉取镜像 docker pull gitlab/gitlab-ce 启动命令 docker run --detach --hostname gitlab --publish 443:443 --publish 80:80 --publish 222:22 --publish 4567:4567 --publish 5432:5432 --name gitlab --volume C:\Users\admin\Documents\gitlab-ce\config:/etc/gitlab --volume C:\Users\admin\Documents\gitlab-ce\logs:/var/log/gitlab --volume C:\Users\admin\Documents\gitlab-ce\data:/var/opt/gitlab gitlab/gitlab-ce:latest
镜像启动命令主要映射了一部分端口还有文件夹,端口方便使用工具进行远程连接,文件夹方便对GitLab配置进行修改(主要用来实现GitLab接入Cas跟业务系统的单点登录)以及与宿主机之间的文件转移。
本地直接进行访问
GitLab内置有直接访问内部 postgreSQL 的命令:
sudo gitlab-psql -d gitlabhq_production
这样就进入了 postgreSQL 命令窗口,可以输入 sql 语句进行操作
/list 查看所有数据库
select * from namespaces;
查看 gitlab 中已经有了哪些用户
特别注意: 这里显示的 Name 有 4 个,除了 gitlabhq_porduction 的 owner 是 gitlab 之外,其它的是 gitlab-psql。 所以,在连接到 gitlab 内部的 postgresql 数据库时,指定数据库名称为 gitlabhq_porduction 才有实际意义,才能看到需要的信息。 这里的 dbconsole 默认是选择的 gitlabhq_production,但后续外部连接就不一定了。
配置远程访问
默认情况下,外部是无法访问 Gitlab 内部的 postgreSQL 的。具体原因需要查看GitLab配置
默认的 gitlab 数据库配置文件在/var/opt/gitlab/gitlab-rails/etc/databse.yml
做了文件映射后可以直接在宿主机本地文件查看
# This file is managed by gitlab-ctl. Manual changes will be # erased! To change the contents below, edit /etc/gitlab/gitlab.rb # and run `sudo gitlab-ctl reconfigure`. production: main: adapter: postgresql encoding: unicode collation: database: gitlabhq_production username: "gitlab" password: host: "/var/opt/gitlab/postgresql" port: 5432 socket: sslmode: sslcompression: 0 sslrootcert: sslca: load_balancing: {"hosts":[]} prepared_statements: false statement_limit: 1000 connect_timeout: keepalives: keepalives_idle: keepalives_interval: keepalives_count: tcp_user_timeout: application_name: variables: statement_timeout:
上面配置中hosts就是本地的一个文件,外部肯定是无法访问的
也可以直接查看 postgreSQL 的用户权限配置文件/var/opt/gitlab/postgresql/data/pg_hba.conf
# If you want to allow non-local connections, you need to add more # "host" records. In that case you will also need to make PostgreSQL listen # on a non-local interface via the listen_addresses configuration parameter, # or via the -i or -h command line switches. # TYPE DATABASE USER CIDR-ADDRESS METHOD # "local" is for Unix domain socket connections only local all all peer map=gitlab
默认文件也是只有一个local,根据上面的注解翻译一下就是:
如果想允许非本地连接,需要增加更多hosts记录,在此情况下还需要配置监听地址或者使用命令-i、-h参数确保PostgreSQL数据库监听非本地连接的接口。
根据注解提供的信息查看PostgreSQL配置文件,就在同目录下postgresql.conf
# - Connection Settings - listen_addresses = '' # what IP address(es) to listen on; # comma-separated list of addresses; # defaults to 'localhost', '*' = all # (change requires restart) port = 5432 # (change requires restart) max_connections = 200 # (change requires restart)
看出监听的host为空
修改配置文件实现远程访问 PostgreSQL
了解上述配置文件后就可以分别单独修改文件来实现外部访问,但是GitLab重启之后就会失效,所以是可以只修改GitLab的总配置文件来实现远程访问,GitLab重启之后还是可以访问。
打开/etc/gitlab/gitlab.rb
配置文件,找到## Gitlab PostgreSQL
区块,在### Advanced settings
最末,加上以下内容:
postgresql['listen_address'] = '{gitlab主机IP}' postgresql['port'] = 5432 postgresql['trust_auth_cidr_addresses'] = %w(127.0.0.1/24) postgresql['md5_auth_cidr_addresses'] = %w({gitlab主机IP}/0) postgresql['sql_user'] = "gitlab" postgresql['sql_user_password'] = Digest::MD5.hexdigest "gitlab" << postgresql['sql_user']
把{gitlab 主机 IP}替换成 gitlab 主机的真实 IP 即可。
这几行的配置分别是:
- postgresql 的监听地址,
- postgresql 的监听端口,
- 本地访问(127.0.0.1 或者 localhost)postgresql 不用输密码,
- 需要输入密码的访问地址,
- 连接到 postgresql 数据库的账号(示例中为 gitlab),
- 连接到 postgresql 数据库的密码(示例中为 gitlab)。
然后,找到### Gitlab database settings
,在最末添加以下内容:
gitlab_rails['db_username'] = "gitlab" gitlab_rails['db_password'] = "gitlab" gitlab_rails['db_host'] = "{gitlab主机IP}" gitlab_rails['db_port'] = 5432 gitlab_rails['db_database'] = "gitlabhq_production"
这几行的配置分别是:
- 数据库用户名
- 密码
- 地址
- 端口
如果不设定最后一行,那么默认连接的数据库就是 postgres。
到这里,配置就修改完了,先运行sudo gitlab-ctl restart postgresql
,再运行sudo gitlab-ctl reconfigure
就可以生效了。
由于使用了docker启动的GitLab网桥好像有点问题
ip配置好之后启动还是会报错,最方便的方法就是直接把{gitlab主机IP}改为0.0.0.0
通过GUI连接
我使用的是Navicat Premium版本,基本上主流数据库都支持连接,除此之外也可以使用DBeaver,除了关系型数据库也支持nosql数据库。
这样就可以非常方便的对数据库进行操作了。
总结&后续
本文通过修改GitLab配置文件实现远程访问GitLab内置PostgreSQL数据库,后续尝试通过java代码进行连接以及对数据的增删改查,以实现相关系统轻量级接入GitLab的需求。