GitLab 安装,配置及维护

参考:
GitLab 官方文档
docker-gitlab,通过 docker-compose 快速安装 GitLab
rake,是 Rails 的工具,类似 ruby 中常用的的 make。通过 Rakefile 文件指定 Rake 任务后,通过 bundle exec rake xx RAILS_ENV=production 执行。

1. 安装

通过 docker-compose 安装(推荐)

可以通过 封装好的库 安装:

wget https://raw.githubusercontent.com/sameersbn/docker-gitlab/master/docker-compose.yml

这个文件的内容如下:

version: '2'

services:
  redis:
    restart: always
    image: sameersbn/redis:latest
    command:
    - --loglevel warning
    volumes:
    - /srv/docker/gitlab/redis:/var/lib/redis:Z

  postgresql:
    restart: always
    image: sameersbn/postgresql:9.6-2
    volumes:
    - /srv/docker/gitlab/postgresql:/var/lib/postgresql:Z
    environment:
    - DB_USER=gitlab
    - DB_PASS=password
    - DB_NAME=gitlabhq_production
    - DB_EXTENSION=pg_trgm

  gitlab:
    restart: always
    image: sameersbn/gitlab:10.7.4
    depends_on:
    - redis
    - postgresql
    ports:
    - "10080:80" # 改为你想使用的本机端口
    - "10022:22"
    volumes:
    - /srv/docker/gitlab/gitlab:/home/git/data:Z
    environment:
    - DEBUG=false

    - DB_ADAPTER=postgresql
    - DB_HOST=postgresql
    - DB_PORT=5432
    - DB_USER=gitlab
    - DB_PASS=password
    - DB_NAME=gitlabhq_production

    - REDIS_HOST=redis
    - REDIS_PORT=6379

    - TZ=Asia/Kolkata # 可以改为 Asia/Beijing,Rails 中不支持 Shanghai
    - GITLAB_TIMEZONE=Kolkata # 可以改为 Beijing,Rails 中不支持 Shanghai

    - GITLAB_HTTPS=false # 如果需要使用 HTTPS,需要设为 true
    - SSL_SELF_SIGNED=false # 如果需要使用自己签名的证书,需要设为 true

    - GITLAB_HOST=localhost # 改为自己的域名,我的是 https://gitlab.kikakika.com
    - GITLAB_PORT=10080 # 改为自己的端口号
    - GITLAB_SSH_PORT=10022
    - GITLAB_RELATIVE_URL_ROOT=
    - GITLAB_SECRETS_DB_KEY_BASE=long-and-random-alphanumeric-string
    - GITLAB_SECRETS_SECRET_KEY_BASE=long-and-random-alphanumeric-string
    - GITLAB_SECRETS_OTP_KEY_BASE=long-and-random-alphanumeric-string

    - GITLAB_ROOT_PASSWORD=
    - GITLAB_ROOT_EMAIL=

    - GITLAB_NOTIFY_ON_BROKEN_BUILDS=true
    - GITLAB_NOTIFY_PUSHER=false

    - GITLAB_EMAIL=notifications@example.com
    - GITLAB_EMAIL_REPLY_TO=noreply@example.com
    - GITLAB_INCOMING_EMAIL_ADDRESS=reply@example.com

    - GITLAB_BACKUP_SCHEDULE=daily
    - GITLAB_BACKUP_TIME=01:00

    # SMTP 用于发送邮件(忘记密码、通知等)
    - SMTP_ENABLED=false
    - SMTP_DOMAIN=www.example.com
    - SMTP_HOST=smtp.gmail.com
    - SMTP_PORT=587
    - SMTP_USER=mailer@example.com
    - SMTP_PASS=password
    - SMTP_STARTTLS=true
    - SMTP_AUTHENTICATION=login

    # IMAP 用于接收邮件
    - IMAP_ENABLED=false
    - IMAP_HOST=imap.gmail.com
    - IMAP_PORT=993
    - IMAP_USER=mailer@example.com
    - IMAP_PASS=password
    - IMAP_SSL=true
    - IMAP_STARTTLS=false

    # 用于通过 GitHub 等平台授权登录
    - OAUTH_ENABLED=false
    - OAUTH_AUTO_SIGN_IN_WITH_PROVIDER=
    - OAUTH_ALLOW_SSO=
    - OAUTH_BLOCK_AUTO_CREATED_USERS=true
    - OAUTH_AUTO_LINK_LDAP_USER=false
    - OAUTH_AUTO_LINK_SAML_USER=false
    - OAUTH_EXTERNAL_PROVIDERS=

    - OAUTH_CAS3_LABEL=cas3
    - OAUTH_CAS3_SERVER=
    - OAUTH_CAS3_DISABLE_SSL_VERIFICATION=false
    - OAUTH_CAS3_LOGIN_URL=/cas/login
    - OAUTH_CAS3_VALIDATE_URL=/cas/p3/serviceValidate
    - OAUTH_CAS3_LOGOUT_URL=/cas/logout

    - OAUTH_GOOGLE_API_KEY=
    - OAUTH_GOOGLE_APP_SECRET=
    - OAUTH_GOOGLE_RESTRICT_DOMAIN=

    - OAUTH_FACEBOOK_API_KEY=
    - OAUTH_FACEBOOK_APP_SECRET=

    - OAUTH_TWITTER_API_KEY=
    - OAUTH_TWITTER_APP_SECRET=

    - OAUTH_GITHUB_API_KEY=
    - OAUTH_GITHUB_APP_SECRET=
    - OAUTH_GITHUB_URL=
    - OAUTH_GITHUB_VERIFY_SSL=

    - OAUTH_GITLAB_API_KEY=
    - OAUTH_GITLAB_APP_SECRET=

    - OAUTH_BITBUCKET_API_KEY=
    - OAUTH_BITBUCKET_APP_SECRET=

    - OAUTH_SAML_ASSERTION_CONSUMER_SERVICE_URL=
    - OAUTH_SAML_IDP_CERT_FINGERPRINT=
    - OAUTH_SAML_IDP_SSO_TARGET_URL=
    - OAUTH_SAML_ISSUER=
    - OAUTH_SAML_LABEL="Our SAML Provider"
    - OAUTH_SAML_NAME_IDENTIFIER_FORMAT=urn:oasis:names:tc:SAML:2.0:nameid-format:transient
    - OAUTH_SAML_GROUPS_ATTRIBUTE=
    - OAUTH_SAML_EXTERNAL_GROUPS=
    - OAUTH_SAML_ATTRIBUTE_STATEMENTS_EMAIL=
    - OAUTH_SAML_ATTRIBUTE_STATEMENTS_NAME=
    - OAUTH_SAML_ATTRIBUTE_STATEMENTS_FIRST_NAME=
    - OAUTH_SAML_ATTRIBUTE_STATEMENTS_LAST_NAME=

    - OAUTH_CROWD_SERVER_URL=
    - OAUTH_CROWD_APP_NAME=
    - OAUTH_CROWD_APP_PASSWORD=

    - OAUTH_AUTH0_CLIENT_ID=
    - OAUTH_AUTH0_CLIENT_SECRET=
    - OAUTH_AUTH0_DOMAIN=

    - OAUTH_AZURE_API_KEY=
    - OAUTH_AZURE_API_SECRET=
    - OAUTH_AZURE_TENANT_ID=

为 GITLAB_SECRETS_OTP_KEY_BASE、GITLAB_SECRETS_DB_KEY_BASE 和 GITLAB_SECRETS_SECRET_KEY_BASE 创建至少 64 个字符长度的随机字符串(也可以先使用默认值),用途如下:

  • GITLAB_SECRETS_OTP_KEY_BASE:用于加密数据库的 2FA 密钥。如果丢失这个密码,所有用户都无法通过 2FA 登录。
  • GITLAB_SECRETS_DB_KEY_BASE:用于加密 CI 密钥变量及数据库中的重要凭证。如果丢失这个密码,将无法使用已经存在的 CI 密钥。
  • GITLAB_SECRETS_SECRET_KEY_BASE:用于密码重置链接以及其他“标准”身份验证功能。如果丢失这个密码,电子邮件中的密码重置 token 将重置。
docker-compose up

等待几分钟,在看到服务启动信息后,就可以访问 GitLab 了,默认是 10080 端口:

gitlab_1      | 2018-05-16 13:08:52,219 INFO success: gitaly entered RUNNING state, process has stayed up for > than 1 seconds (startsecs)
gitlab_1      | 2018-05-16 13:08:52,219 INFO success: sidekiq entered RUNNING state, process has stayed up for > than 1 seconds (startsecs)
gitlab_1      | 2018-05-16 13:08:52,219 INFO success: unicorn entered RUNNING state, process has stayed up for > than 1 seconds (startsecs)
gitlab_1      | 2018-05-16 13:08:52,219 INFO success: gitlab-workhorse entered RUNNING state, process has stayed up for > than 1 seconds (startsecs)
gitlab_1      | 2018-05-16 13:08:52,219 INFO success: cron entered RUNNING state, process has stayed up for > than 1 seconds (startsecs)
gitlab_1      | 2018-05-16 13:08:52,219 INFO success: nginx entered RUNNING state, process has stayed up for > than 1 seconds (startsecs)
gitlab_1      | 2018-05-16 13:08:52,219 INFO success: sshd entered RUNNING state, process has stayed up for > than 1 seconds (startsecs)

安装后,首次登陆时,会提示更改 root 用户的密码。改完后登陆即可。

也可以 参考这里 使用 GitLab 安装

通过 docker 手动安装

Step 1. 启动 postgresql 容器

docker run --name gitlab-postgresql -d 
    --env 'DB_NAME=gitlabhq_production' 
    --env 'DB_USER=gitlab' --env 'DB_PASS=password' 
    --env 'DB_EXTENSION=pg_trgm' 
    --volume /srv/docker/gitlab/postgresql:/var/lib/postgresql 
    sameersbn/postgresql:9.6-2

Step 2. 启动 redis 容器

docker run --name gitlab-redis -d 
    --volume /srv/docker/gitlab/redis:/var/lib/redis 
    sameersbn/redis:latest

Step 3. 启动 gitlab 容器

docker run --name gitlab -d 
    --link gitlab-postgresql:postgresql --link gitlab-redis:redisio 
    --publish 10022:22 --publish 10080:80 
    --env 'GITLAB_PORT=10080' --env 'GITLAB_SSH_PORT=10022' 
    --env 'GITLAB_SECRETS_DB_KEY_BASE=long-and-random-alpha-numeric-string' 
    --env 'GITLAB_SECRETS_SECRET_KEY_BASE=long-and-random-alpha-numeric-string' 
    --env 'GITLAB_SECRETS_OTP_KEY_BASE=long-and-random-alpha-numeric-string' 
    --volume /srv/docker/gitlab/gitlab:/home/git/data 
    sameersbn/gitlab:10.7.3

2. 配置

关闭用户注册功能

默认情况下,GitLab 允许用户在网站上自由注册。最好关闭。通过 你的 GitLab 域名/api/v4/application/settings 可以看到所有参数,其中 signup_enabled 为 true 时允许用户自由注册。

关闭方法:登录 root 用户,进入 /admin/application_settings Admin Area,找到“注册限制”,取消“Sign-up enabled”即可。

数据存储

GitLab 是一个代码托管软件,因此当 Docker 容器停止/删除时,不希望丢失代码。为避免丢失任何数据,应该将 Volume 挂载到这里:

/home/git/data

注意,如果你使用的是 docker-compose 安装方法,这会自动挂载。

SELinux 用户还需要更改挂载点的安全上下文,以便与 selinux 良好地配合。

mkdir -p /srv/docker/gitlab/gitlab
sudo chcon -Rt svirt_sandbox_file_t /srv/docker/gitlab/gitlab

通过在 docker run 命令中指定 -v 选项,可以在 docker 中挂载卷:

docker run --name gitlab -d 
    --volume /srv/docker/gitlab/gitlab:/home/git/data 
    sameersbn/gitlab:10.7.3

数据库

GitLab 支持 PostgreSQL 和 MySQL,但是建议用 PostgreSQL。

PostgreSQL

外部 PostgreSQL 服务器

GitLab 镜像支持使用外部的 PostgreSQL 服务器。通过环境变量实现。

CREATE ROLE gitlab with LOGIN CREATEDB PASSWORD 'password';
CREATE DATABASE gitlabhq_production;
GRANT ALL PRIVILEGES ON DATABASE gitlabhq_production to gitlab;

此外,从 GitLab 8.6.0 开始,pg_trgm 扩展也应该被 gitlabhq_production 数据库加载。

现在,可以启动 GitLab 应用程序了。

假设 PostgreSQL 服务器主机地址是 192.168.1.100

docker run --name gitlab -d 
    --env 'DB_ADAPTER=postgresql' --env 'DB_HOST=192.168.1.100' 
    --env 'DB_NAME=gitlabhq_production' 
    --env 'DB_USER=gitlab' --env 'DB_PASS=password' 
    --volume /srv/docker/gitlab/gitlab:/home/git/data 
    sameersbn/gitlab:10.7.3

连接到 PostgreSQL 容器

可以将此 gitlab 镜像与数据库所需的 postgresql 容器关联起来。postgresql 服务器容器的别名应该在与 gitlab 镜像链接时设置为 postgresql。

如果链接了 postgresql 容器,则仅使用链接自动检索 DB_ADAPTER,DB_HOST 和 DB_PORT 设置。可能仍然需要你设置其他数据库连接参数,例如 DB_NAME,DB_USER,DB_PASS 等。

sameersbn/postgresql 镜像说明了与 postgresql 容器的链接,可以直接使用。在生产中使用 postgresql 镜像时,应该为 postgresql 数据存储装入卷。详细信息请参阅 docker-postgresql 的 README

首先,从 docker 索引中提取 postgresql 镜像。

docker pull sameersbn/postgresql:9.6-2

对于数据持久性,可以为 postgresql 创建一个存储并启动容器。

SELinux 用户还需要更改挂载点的安全上下文,以便与 selinux 良好地配合。

mkdir -p /srv/docker/gitlab/postgresql
sudo chcon -Rt svirt_sandbox_file_t /srv/docker/gitlab/postgresql

完整的运行命令如下:

docker run --name gitlab-postgresql -d 
    --env 'DB_NAME=gitlabhq_production' 
    --env 'DB_USER=gitlab' --env 'DB_PASS=password' 
    --env 'DB_EXTENSION=pg_trgm' 
    --volume /srv/docker/gitlab/postgresql:/var/lib/postgresql 
    sameersbn/postgresql:9.6-2

上面命令会创建名为 gitlabhq_production 的数据库,同时创建名为 gitlab 且密码为 password 的用户。

现在,可以启动 GitLab 应用程序了。

docker run --name gitlab -d --link gitlab-postgresql:postgresql 
    --volume /srv/docker/gitlab/gitlab:/home/git/data 
    sameersbn/gitlab:10.7.3

下面几个镜像,可以自动从 postgresql 容器中获取 DB_NAME,DB_USER 和 DB_PASS 变量,因为它们是在 postgresql 容器的 docker run 命令中指定的。

MySQL

参考 这里

Redis

GitLab 使用 redis 数据库存储键值数据。可以通过环境变量指定到 Redis 服务器的连接。

内部 Redis 服务器

已从镜像中移除。请使用下面两种方式。

外部 Redis 服务器

需要在启动 GitLab 镜像时通过环境变量指定外部 Redis 服务器的相关信息。

假设 redis 服务器的地址是 192.168.1.100

docker run --name gitlab -it --rm 
    --env 'REDIS_HOST=192.168.1.100' --env 'REDIS_PORT=6379' 
    sameersbn/gitlab:10.7.3

连接到 Redis 容器

可以将此 gitlab 镜像与 redis 容器链接以满足 gitlab 的 redis 要求。在与 gitlab 镜像链接时,redis 服务器容器的别名应该设置为 redisio

sameersbn/redis 镜像已经说明了与 redis 容器的链接,可以直接使用。详细信息请参阅 docker-redis 的 README

首先,从 docker 仓库中提取 redis 镜像:

docker pull sameersbn/redis:latest

启动 redis 容器:

docker run --name gitlab-redis -d 
    --volume /srv/docker/gitlab/redis:/var/lib/redis 
    sameersbn/redis:latest

现在,可以启动 GitLab 应用程序了:

docker run --name gitlab -d --link gitlab-redis:redisio 
    sameersbn/gitlab:10.7.3

邮件

在启动 GitLab 镜像时,应使用环境变量指定邮件配置。该配置默认使用 gmail 发送电子邮件,并要求指定有效的用户名和密码才能登录 gmail 服务器。

如果使用的是 Gmail,则只需要执行以下操作:

docker run --name gitlab -d 
    --env 'SMTP_USER=USER@gmail.com' --env 'SMTP_PASS=PASSWORD' 
    --volume /srv/docker/gitlab/gitlab:/home/git/data 
    sameersbn/gitlab:10.7.3

所有可用的 SMTP 参数,可以查看 Available Configuration Parameters

如果需要配置其他邮箱(例如 腾讯企业邮箱),可以 参考这里

Reply by email

从 8.0.0 开始,GitLab 支持在评论 issue 时发送电子邮件。

要启用此功能,需要提供 IMAP 配置参数,以允许 GitLab 连接到你的邮件服务器并阅读邮件。此外,如果你的传入电子邮件地址与 IMAP_USER 不同,可能需要指定 GITLAB_INCOMING_EMAIL_ADDRESS。

如果你的电子邮件提供商支持电子邮件 子地址,那么应该在电子邮件地址的用户部分之后添加 +%{key} 占位符,例如 GITLAB_INCOMING_EMAIL_ADDRESS=reply+%{key}@example.com。请通过 这里 以了解此功能的要求。

如果使用的是 Gmail,那么只需要执行以下操作:

docker run --name gitlab -d 
    --env 'IMAP_USER=USER@gmail.com' --env 'IMAP_PASS=PASSWORD' 
    --env 'GITLAB_INCOMING_EMAIL_ADDRESS=USER+%{key}@gmail.com' 
    --volume /srv/docker/gitlab/gitlab:/home/git/data 
    sameersbn/gitlab:10.7.3

Rake Tasks

通过 app:rake 命令,可以执行 GitLab 的 rake 任务。例如收集 GitLab 及其所依赖的系统的信息:

docker run --name gitlab -it --rm [OPTIONS] 
    sameersbn/gitlab:10.7.3 app:rake gitlab:env:info

也可以通过 docker exec 在已经启动的 GitLab 实例上运行 rake 任务。例如:

docker exec --user git -it gitlab bundle exec rake gitlab:env:info RAILS_ENV=production

同样,可以将原始仓库导入到 GitLab 项目实例中:

docker run --name gitlab -it --rm [OPTIONS] 
    sameersbn/gitlab:10.7.3 app:rake gitlab:import:repos

或者

docker exec -it gitlab sudo -HEu git bundle exec rake gitlab:import:repos RAILS_ENV=production

For a complete list of available rake tasks please refer https://github.com/gitlabhq/gitlabhq/tree/master/doc/raketasks or the help section of your gitlab installation.
有关可用 rake 任务的完整列表,请参阅 https://github.com/gitlabhq/gitlabhq/tree/master/doc/raketasks 或 gitlab 安装的帮助部分。

附:请避免在正在运行的 gitlab 实例上通过 rake 任务进行备份和恢复操作。

要在 docker-compose 中使用 app:rake 命令,请使用以下命令:

# For stopped instances
docker-compose run --rm gitlab app:rake gitlab:env:info
docker-compose run --rm gitlab app:rake gitlab:import:repos

# For running instances
docker-compose exec --user git gitlab bundle exec rake gitlab:env:info RAILS_ENV=production
docker-compose exec gitlab sudo -HEu git bundle exec rake gitlab:import:repos RAILS_ENV=production

SSL

可以使用 SSL 进行保护对 gitlab 应用程序的访问,以防止未经授权访问存储库中的数据。尽管 CA 认证的 SSL 证书允许通过 CA 进行验证,但只要每个客户采取一些额外步骤来验证网站的身份,自签名证书也可以提供相同级别的信任验证。

如果使用了负载均衡器(如 hipache,haproxy 或 nginx),则跳转到下面的使用 HTTPS 和负载均衡器部分。

要通过 SSL 保护你的应用程序,需要两个东西:

  • 私钥(Private key,.key 文件)
  • SSL 证书(certificate,.crt 文件)
    使用 CA 认证证书时,CA 将向你提供这些文件。使用自签名证书时,需要自己生成这些文件。如果已经有了 CA 认证的 SSL 证书,请跳至下一部分 增强服务器安全性。

生成自签名证书

STEP 1: 创建服务器私钥

openssl genrsa -out gitlab.key 2048

STEP 2: 创建证书签名请求(CSR,certificate signing request)

openssl req -new -key gitlab.key -out gitlab.csr

STEP 3: 使用私钥和 CSR 签署证书

openssl x509 -req -days 3650 -in gitlab.csr -signkey gitlab.key -out gitlab.crt

这个自签名的 SSL 证书可以使用 10 年。

增强服务器安全性

生成更强大的 DHE 参数:

openssl dhparam -out dhparam.pem 2048

安装 SSL 证书

在上面生成的四个文件中,我们需要在 gitlab 服务器上安装 gitlab.keygitlab.crtdhparam.pem文件。CSR 文件不是必需的,只是用于安全地备份文件(以防再次需要)。

gitlab 应用程序配置为查找 SSL 证书的默认路径位于 /home/git/data/certs,但可以使用 SSL_KEY_PATH,SSL_CERTIFICATE_PATH 和 SSL_DHPARAM_PATH 配置选项更改此默认路径。

如果您从上面记得,/home/git/data 路径是数据存储的路径,这意味着我们必须在 /srv/docker/gitlab/gitlab/ 中创建 certs/ 目录并将文件复制到其中。作为安全措施,我们将更新 gitlab.key 文件的权限,以便所有者可读。

mkdir -p /srv/docker/gitlab/gitlab/certs
cp gitlab.key /srv/docker/gitlab/gitlab/certs/
cp gitlab.crt /srv/docker/gitlab/gitlab/certs/
cp dhparam.pem /srv/docker/gitlab/gitlab/certs/
chmod 400 /srv/docker/gitlab/gitlab/certs/gitlab.key

现在,还剩最后一步。

开启 HTTPS 支持

通过将 GITLAB_HTTPS 选项设置为 true 可以启用 HTTPS 支持。此外,使用自签名 SSL 证书时,还需要将 SSL_SELF_SIGNED 选项设置 为true。假设我们正在使用自签名证书:

docker run --name gitlab -d 
    --publish 10022:22 --publish 10080:80 --publish 10443:443 
    --env 'GITLAB_SSH_PORT=10022' --env 'GITLAB_PORT=10443' 
    --env 'GITLAB_HTTPS=true' --env 'SSL_SELF_SIGNED=true' 
    --volume /srv/docker/gitlab/gitlab:/home/git/data 
    sameersbn/gitlab:10.7.3

在此配置中,通过纯 HTTP 协议进行的任何请求都将自动重定向到使用 HTTPS 协议。但是,使用负载均衡时,这不是最佳选择。

配置 HSTS

如果浏览器支持 HSTS,请确保你的用户只能通过 HTTPS 访问您的服务器。当用户第一次来到时,它会看到服务器的标题,该标题声明从现在开始只能通过 HTTPS 访问该站点多长时间 - 这就是 HSTS 最大时间值。

可以通过 NGINX_HSTS_MAXAGE 配置该值。默认值是 31536000 秒。如果要禁用已发送的 HSTS MAXAGE 值,请将其设置为 0。

docker run --name gitlab -d 
 --env 'GITLAB_HTTPS=true' --env 'SSL_SELF_SIGNED=true' 
 --env 'NGINX_HSTS_MAXAGE=2592000' 
 --volume /srv/docker/gitlab/gitlab:/home/git/data 
 sameersbn/gitlab:10.7.3

将 NGINX_HSTS_ENABLED 设置为 false 可以关闭 HSTS。

在负载均衡器中使用 HTTPS

开启负载均衡后,流量路径为:

HTTPS -> Nginx 负载均衡 -> HTTP -> GitLab

此时需要配置两个地方:

  • Nginx 负载均衡配置:需要设置对 GitLab 的域名使用 HTTPS 访问,并通过 proxy_pass 将流量反向代理到 GitLab 监听的 HTTP 端口:
upstream gitlab {
  server localhost:10080 fail_timeout=0;
}

# 监听 HTTPS 流量
server {
    listen 443 ssl;
    server_name gitlab.kikakika.com;

    ## 用户最大可以上传的文件大小
    client_max_body_size 20m;

    ssl on;
    ssl_certificate /etc/nginx/ssl/fullchain.cer;
    ssl_certificate_key /etc/nginx/ssl/kikakika.key;
    ssl_session_timeout 5m;

    ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE

    location / {
        # 如果开启了 HTTPS,需要关闭 gzip 压缩来避免 BREACH 攻击
        gzip off;

        proxy_read_timeout 300;
        proxy_connect_timeout 300;
        proxy_redirect off;

        # Host 必须要设置,用于 external_url 参数,没有的话,部分跳转页面会跳到默认的 localhost:10080
        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 https;
        proxy_set_header X-Frame-Options SAMEORIGIN;

        proxy_pass http://gitlab;
    }
}
# 执行 HTTP 到 HTTPS 的重定向
server {
    listen 80;
    server_name gitlab.kikakika.com;

    return 301 https://$host$request_uri;
}
  • GitLab 配置:GITLAB_HTTPS 设置为 true 以通过 HTTPS 执行 pull 和 push,GITLAB_HOST 设置域名,GITLAB_PORT 设置为 443 使所有 pull 和 push 请求发送到域名的 443 端口。如下:
    - GITLAB_HTTPS=true
    - SSL_SELF_SIGNED=false

    - GITLAB_HOST=https://gitlab.kikakika.com
    - GITLAB_PORT=443

像 nginx、haproxy、hipache 这样的负载均衡器通过普通的 http 与后端应用程序进行通信,因此不需要安装 SSL 密钥和证书,也不应该安装在容器中。SSL 配置必须在负载均衡器上完成。

但是,使用负载均衡器时,必须将 GITLAB_HTTPS 设置为 true。此外,如果使用自签名 SSL 证书,则需要将 SSL_SELF_SIGNED 选项设置为 true。

有了这个,应该配置负载均衡器以支持处理 HTTPS 请求。有关该主题的信息,可以参阅 将 SSL/HTTPS 与 HAProxy 结合使用

在使用负载均衡器时,可能需要确保负载均衡器自动执行 HTTP 到 HTTPS 的重定向。

总之,在使用负载均衡器时,docker 命令会查找大部分内容,如下所示(the docker command would look for the most part something like this):

docker run --name gitlab -d 
    --publish 10022:22 --publish 10080:80 
    --env 'GITLAB_SSH_PORT=10022' --env 'GITLAB_PORT=443' 
    --env 'GITLAB_HTTPS=true' --env 'SSL_SELF_SIGNED=true' 
    --volume /srv/docker/gitlab/gitlab:/home/git/data 
    sameersbn/gitlab:10.7.3

如果使用的是 CA 签发的证书,删除上面命令的 --env 'SSL_SELF_SIGNED=true' 选项。

如果 GitLab 以 422 HTTP Error 响应任何类型的 POST 请求(登录,OAUTH,更改设置等),请考虑将其添加到你的反向代理配置中:

proxy_set_header X-Forwarded-Ssl on; (nginx format)

建立对服务器的信任

这里针对的是自行签署的 SSL 证书。如果使用的是 CA 认证证书,则直接看后面的部分。

这部分更多的是客户端配置,以便为客户增加一定的信心,使他们认为与他们认为的人沟通。

只需将服务器证书添加到其可信证书列表中即可完成。在 ubuntu 上,通过将 gitlab.crt 文件复制到 /usr/local/share/ca-certificates/ 并执行 update-ca-certificates 来完成。

同样,这是客户端配置,这意味着每个将与服务器通信的人都应该在他们的机器上执行此配置。简而言之,在所有开发人员中分发 gitlab.crt 文件,并要求他们将其添加到受信任的 SSL 证书列表中。不这样做会导致看起来像这样的错误:

git clone https://git.local.host/gitlab-ce.git
fatal: unable to access 'https://git.local.host/gitlab-ce.git': server certificate verification failed. CAfile: /etc/ssl/certs/ca-certificates.crt CRLfile: none

你可以在网络浏览器上做同样的事情。在这里可以找到为 Firefox 安装根证书的说明。chrome 只要确保在证书管理器对话框的“权限”选项卡下安装证书即可。

安装可信的 SSL 服务器证书

如果 GitLab CI 服务器使用自签名 SSL 证书,那么应该确保 GitLab CI 服务器证书在 GitLab 服务器上受信任,以便它们能够相互通话。

镜像配置为默认查找位于 /home/git/data/certs/ca.crt 的受信任 SSL 证书,但可以使用 SSL_CA_CERTIFICATES_PATH 配置选项更改此路径。

ca.crt 文件复制到数据存储上的 certs 目录中。ca.crt 文件应包含您要信任的所有服务器的根证书。关于 GitLab CI,这将是 docker-gitlab-ci 容器自述文件中描述的 gitlab_ci.crt 文件的内容。

默认情况下,我们自己的服务器证书 gitlab.crt 被添加到可信证书列表中。

OmniAuth Integration

添加 OmniAuth 服务后,用户可以通过 GitHub、微信等登录 GitLab。

可用的配置参数

https://github.com/sameersbn/docker-gitlab#available-configuration-parameters

所有的参数都可以在这里查找对应的解释,例如 GITLAB_PORT、GITLAB_TIMEZONE、DB_HOST

3. 维护

创建备份

GitLab 定义了一个 rake 任务来为 gitlab 安装备份。备份包括所有 git 存储库,上传的文件以及可能预期的 sql 数据库。

在进行备份之前,请确保容器已停止并被移除以避免容器名称冲突:

docker stop gitlab && docker rm gitlab

执行 rake 任务创建备份:

docker run --name gitlab -it --rm [OPTIONS] 
    sameersbn/gitlab:10.7.3 app:rake gitlab:backup:create

备份将在上面第 2 节第一部分的 数据存储 对应的备份文件夹中创建。可以使用 GITLAB_BACKUP_DIR 配置参数更改备份的位置。

附:备份也可以使用 docker exec 在正在运行的实例上生成,如 Rake Tasks 部分所述。但是,为了避免不必要的副作用,建议不要在正在运行的实例上运行备份和还原操作。

使用 docker-compose 时,可以使用以下命令执行备份:

docker-compose run --rm gitlab app:rake gitlab:backup:create

还原备份

执行还原之前,请确保容器已停止并被移除以避免容器名称冲突。

docker stop gitlab && docker rm gitlab

如果这是一个全新的数据库,那么首先需要准备数据库:

docker run --name gitlab -it --rm [OPTIONS] 
    sameersbn/gitlab:10.7.3 app:rake db:setup

执行 rake 任务来恢复备份。需要在 -it 交互模式下运行容器:

docker run --name gitlab -it --rm [OPTIONS] 
    sameersbn/gitlab:10.7.3 app:rake gitlab:backup:restore

所有可用备份的列表将以反向时间顺序显示。选择要恢复的备份并继续。

要避免用户在还原操作中进行交互,请使用 rake 任务的 BACKUP 参数指定备份的时间戳。

docker run --name gitlab -it --rm [OPTIONS] 
    sameersbn/gitlab:10.7.3 app:rake gitlab:backup:restore BACKUP=1417624827

使用 docker-compose 时,可以使用以下命令执行还原:

docker-compose run --rm gitlab app:rake gitlab:backup:restore # List available backups
docker-compose run --rm gitlab app:rake gitlab:backup:restore BACKUP=1417624827 # Choose to restore from 1417624827

自动备份

可以使用 GITLAB_BACKUP_SCHEDULE 配置选项设置每天,每周或每月自动进行备份(对应 daily、weekly 或 monthly)。

每日备份在 GITLAB_BACKUP_TIME 创建,默认为每天 04:00。每周备份与每日备份同时创建。每月备份每月一日与每日备份同时创建。

默认情况下,启用自动备份时,备份将保留 7 天。在禁用自动备份时,备份会保留无限期。此行为可以通过 GITLAB_BACKUP_EXPIRY 选项进行配置。

导入仓库

将所有裸露的 git 存储库复制到数据存储库的 repositories/ 目录,然后执行 gitlab:import:repos rake 任务,如下所示:

docker run --name gitlab -it --rm [OPTIONS] 
    sameersbn/gitlab:10.7.3 app:rake gitlab:import:repos

注意日志,并且你的存储库应该可用于新的 gitlab 容器。

升级

可以通过下面命令拉取最新的镜像,然后重启。可以升级所有镜像:

docker-compose pull

或升级指定的镜像:

docker-compose pull gitlab

重启:

docker-compose up

4. 常见问题

访问 GitLab 仓库时,跳转到 https://localhost:10080/users/sign_in

  • 问题描述:
    我的 GitLab 通过 Nginx 反向代理访问。GITLAB_HOST 已经设置成域名了,访问这个域名时,跳转到的登录页面是错误的。Nginx 设置如下:
server {
    listen 443 ssl;
    server_name gitlab.kikakika.com;

    ## 用户最大可以上传的文件大小
    client_max_body_size 20m;

    ssl on;
    ssl_certificate /etc/nginx/ssl/fullchain.cer;
    ssl_certificate_key /etc/nginx/ssl/kikakika.key;
    ssl_session_timeout 5m;

    ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE

    location / {
        # 如果开启了 HTTPS,需要关闭 gzip 压缩来避免 BREACH 攻击
        gzip off;

        proxy_pass http://gitlab;
    }
}

GitLab 部分设置如下:

    - GITLAB_HTTPS=true
    - SSL_SELF_SIGNED=false

    - GITLAB_HOST=https://gitlab.kikakika.com
    - GITLAB_PORT=443
  • 现象:
    通过 Fiddler 抓包,内容如下:
HTTP/1.1 302 Found
Server: nginx/1.14.0
Date: Wed, 23 May 2018 07:36:23 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 103
Connection: keep-alive
Cache-Control: no-cache
Location: https://localhost:10080/users/sign_in
X-Content-Type-Options: nosniff
X-Frame-Options: DENY
X-Request-Id: caac687b-4cd3-4952-a962-fefab3fca54d
X-Runtime: 0.101189
X-Ua-Compatible: IE=edge
X-Xss-Protection: 1; mode=block
Strict-Transport-Security: max-age=31536000;

<html><body>You are being <a href="https://localhost:10080/users/sign_in">redirected</a>.</body></html>
  • 分析:
    这里访问首页时通过 302 跳转转到登录页面,但是跳转到的是 GitLab 默认的 localhost:10080,而不是 GITLAB_HOST 中设置的域名。
    经过一番资料查找,GitLab 需要 HTTP 请求中的 Host 参数。所以需要在 Nginx 中添加这个参数,更新后的 Nginx 配置如下:
server {
    listen 443 ssl;
    server_name gitlab.kikakika.com;

    ## 用户最大可以上传的文件大小
    client_max_body_size 20m;

    ssl on;
    ssl_certificate /etc/nginx/ssl/fullchain.cer;
    ssl_certificate_key /etc/nginx/ssl/kikakika.key;
    ssl_session_timeout 5m;

    ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE

    location / {
        # 如果开启了 HTTPS,需要关闭 gzip 压缩来避免 BREACH 攻击
        gzip off;

        proxy_read_timeout 300;
        proxy_connect_timeout 300;
        proxy_redirect off;

        # Host 必须要设置,用于 external_url 参数,没有的话,部分跳转页面会跳到默认的 localhost:10080
        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 https;
        proxy_set_header X-Frame-Options SAMEORIGIN;

        proxy_pass http://gitlab;
    }
}
原文地址:https://www.cnblogs.com/kika/p/10851616.html