利用aws服务布署gitlab高可用服务

利用aws服务布署gitlab高可用服务

通过docker搭建镜像

前提是你已经有了docker服务,此处略过。

拉取镜像

sudo docker pull gitlab/gitlab-ce:latest

创建容器

sudo docker run -d -p 8443:443 -p 8081:80 -p 8022:22 \
--name gitlab --restart always \
--volume /home/ubuntu/dockerData/gitlab/config:/etc/gitlab \
--volume /home/ubuntu/dockerData/gitlab/logs:/var/log/gitlab \
--volume /home/ubuntu/dockerData/gitlab/data:/var/opt/gitlab \
gitlab/gitlab-ce:latest

说明:

  1. 因为我用了nginx使用了80端口,所以起了新端口以mapping 容器内的端口。
  2. /home/ubuntu/dockerData/gitlab/config 等三个目录需要事先创建好。

配置nginx

新建/etc/nginx/conf.d/gitlab.conf文件

server {
        listen 80;
        server_name  gitlab.xxxx.com;
        charset utf-8;

        access_log  /var/log/nginx/gitlab.access_log;
        error_log  /var/log/nginx/gitlab.error_log;
        if ($http_x_forwarded_proto = 'http') {
            return 301 https://$server_name$request_uri;
        }
        location / {
                proxy_pass http://127.0.0.1:8081;
                proxy_http_version 1.1;
                proxy_set_header Upgrade $http_upgrade;
                proxy_set_header Connection 'upgrade';
                proxy_set_header Host $host;
                proxy_cache_bypass $http_upgrade;
    }
}

测试

直接访问gitlab.xxxx.com就已经好了,刚进来要求设置管理员密码。管理员是root
不过这里有个问题,就是数据库配置都是默认配置,使用的容器里给你创建好的数据库,如redis、postgresql等。
为了服务的稳定性,现在都要求把web和数据库分离。下面就是相关的配置说明

自定义相关配置

配置文件都在/etc/gitlab/gitlab.rb文件下。对应的宿主机文件是/home/ubuntu/dockerData/gitlab/config/gitlab.rb
修改完了,在docker中运行gitlab-ctl reconfigure即可。

配置域名

创建了一个test项目,结果发现clone地址是http://78638653e348/root/test.git
这显明有问题。

这里需要修改配置文件, 改配置:

external_url "http://gitlab.example.com"

然后reconfigure就好了。
如果你的域名是http的,到此就结束了。

如果你的域名是https的,可能会和我一样遇到502错误。
针对https的配置是

external_url "https://gitlab.example.com"
nginx['listen_port'] = 80
nginx['listen_https'] = false

同样是reconfigure就好了。

邮件发送服务

搜索smtp即可找到对应的配置项。由于我们主要用的aws服务,他提供了SES发送邮件服务。
我们用的是SES相关的配置。其它如QQ邮箱等,可以查看官方文档

gitlab_rails['smtp_enable'] = true
gitlab_rails['smtp_address'] = "email-smtp.region-1.amazonaws.com"
gitlab_rails['smtp_port'] = 587
gitlab_rails['smtp_user_name'] = "IAMmailerKey"
gitlab_rails['smtp_password'] = "IAMmailerSecret"
gitlab_rails['smtp_domain'] = "yourdomain.com"
gitlab_rails['smtp_authentication'] = "login"
gitlab_rails['smtp_enable_starttls_auto'] = true
gitlab_rails['gitlab_email_from'] = 'gitlab@example.com'
gitlab_rails['gitlab_email_reply_to'] = 'noreply@example.com'

说明:
1. 我在配置过程中一开始没有配置gitlab_email_reply_to选项,结果一直报SMTP错误, 554 Transaction failed: Invalid domain name: '78638653e348' 因为我的gitlab默认的gitlab_email_reply_tonoreply@78638653e348。明确指定之后就正常了。
2. 最后发现78638653e348是做为域名配置在/etc/hosts中的。

保存完后:

1. 进入容器

sudo docker exec -it gitlab /bin/bash

2. 使配置生效

gitlab-ctl reconfigure

3. 测试邮件功能

gitlab-rails console

irb(main):003:0> Notify.test_email('xxxx@xxx.com', 'Message Subject', 'Message Body').deliver_now

使用S3存储数据

S3是由aws提供的分布式存储方案。

搜索store可以迅速定位到相关的配置项

gitlab_rails['artifacts_enabled'] = true
gitlab_rails['artifacts_object_store_enabled'] = true
gitlab_rails['artifacts_object_store_remote_directory'] = "artifacts"
gitlab_rails['artifacts_object_store_connection'] = {
  'provider' => 'AWS',
  'region' => 'us-east-1',
  'use_iam_profile' => true
}

测试
在容器中执行命令: gitlab-rake gitlab:artifacts:migrate

Git LFSGitLab uploads按类似设置,都上传到S3。

备份

备份配置文件

配置文件都在/etc/gitlab目录。由于我们把这个目录mapping到了宿主机的/home/ubuntu/dockerData/gitlab/config目录。

创建在/home/ubuntu/dockerData/gitlab/目录上创建backup.sh

backup=$(date "+etc-gitlab-%s.tar")
sudo sh -c 'umask 0077; tar -cf $backup  config';
# backup to S3
aws s3 cp  $backup s3://yourbucket/backups/config/

每次修改了配置文件后,执行sh backup.sh即可。

备份应用数据

此处我把备份直接备份到S3上。

gitlab_rails['backup_keep_time'] = 604800

 gitlab_rails['backup_upload_connection'] = {
   'provider' => 'AWS',
   'region' => 'us-east-1',
   'aws_access_key_id' => 'aws_access_key_id',
   'aws_secret_access_key' => 'aws_secret_access_key'
 }
 gitlab_rails['backup_upload_remote_directory'] = 'yourbucket/backups/data'

执行docker exec -t gitlab gitlab-rake gitlab:backup:create即可创建一份备份

恢复

恢复配置文件

1. 备份下现有的/etc/gitlab配置文件。

sudo mv /home/ubuntu/dockerData/gitlab/config/ /home/ubuntu/dockerData/gitlab/configgitlab.$(date +%s)

2. 用备份好的配置文件恢复配置文件

sudo tar -xf etc-gitlab-1399948539.tar -C /home/ubuntu/dockerData/gitlab/config/

3. 使新的配置文件生效

gitlab-ctl reconfigure

恢复应用数据

1. 把备份文件拷贝到备份目录。

sudo cp 11493107454_2018_04_25_10.6.4-ce_gitlab_backup.tar /home/ubuntu/dockerData/gitlab/data/backups/

2. 停掉连接了数据库的服务。只留下gitlab。

sudo gitlab-ctl stop unicorn
sudo gitlab-ctl stop sidekiq
# Verify
sudo gitlab-ctl status

3. 从备份文件中恢复数据

ls /var/opt/gitlab/backups/ #看下文件名
cd /var/opt/gitlab/backups/ #进入备份目录
sudo gitlab-rake gitlab:backup:restore BACKUP=1493107454_2018_04_25_10.6.4-ce #备份文件名中的_gitlab_backup.tar不需要填写。

4. 重启服务并检查

sudo gitlab-ctl restart
sudo gitlab-rake gitlab:check SANITIZE=true

参考

  1. 利用docker和gitLab搭建git私有服务器
  2. gitlab smtp配置
  3. 配置gitlab通过smtp发送邮件
  4. 使用对象存储
  5. 文件上传使用S3
  6. 使用外部数据库
  7. 备份
  8. 恢复
  9. 配置url
  10. external_url 502
8 Comments