Featured image of post 使用GitLab和docker搭建个人代码仓库

使用GitLab和docker搭建个人代码仓库

使用GitLab和docker在自己的电脑或服务器上搭建个人代码仓库

缘起

之前的代码基本都放在GitHub上,但有些代码因为涉及到科研中的一些项目,即使放在GitHub的私有仓库可能也会有潜在的安全问题,所以就想在自己的电脑或服务器上搭建一个私有的代码仓库。

前提

  • docker和docker compose
  • 域名(二级域名即可)
  • acme.sh (生成SSL证书)
  • nginx (反向代理)

准备工作

域名和SSL证书

  1. 在自己购买域名的网站上或者自己域名的管理网站上创建一个二级域名并配置域名解析,具体过程可参见“个人网站的建立过程(一):购买个人域名并配置动态域名解析”

例如我有一个主域名jinli.cyou,于是我为私有GitLab服务器创建了一个"git.jinli.cyou"的二级域名。然后在阿里云的域名管理平台上进行了域名和IP地址的绑定。

  1. 这里使用acme.sh来为"git.jinli.cyou"生成证书。具体过程可参见个人网站的建立过程(二):使用Hugo框架搭建个人网站。 主要过程如下:
  • 找到你的域名管理账户的Access key。可以使用之前的,也可以重新获取,然后将Access key到处为系统变量Ali_KeyAli_Secret

  • 使用下面的命令生成证书:

    1
    
    acme.sh --issue --dns dns_ali -d your.domain.com
    
  • 使用下面的命令将证书复制到你的mailcow目录下,例如我在mailcow安装目录下新建了一个文件夹cert来存放证书文件:

    1
    2
    3
    
    acme.sh --install-cert -d your.domain.com \
            --key-file /media/gitlab/cert/key.pem \
            --fullchain-file /media/gitlab/cert/cert.pem 
    

nginx反向代理配置

在nginx的配置目录下创建一个新的配置文件gitlab.conf作为云网盘的反向代理配置文件,文件内写入:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
upstream git.jinli.li {  
    server 127.0.0.1:8080; 
}

server {
    listen 80;
    server_name  git.jinli.li;
    return 301 https://git.jinli.li$request_uri;
}

server {
    listen 443 ssl;
    server_name  git.jinli.li;

    # ssl 配置
    ssl_certificate /media/gitlab/cert/cert.pem;
    ssl_certificate_key /media/gitlab/cert/key.pem;

    location / {
        proxy_redirect off;
        proxy_pass http://git.jinli.li;

        proxy_set_header  Host                $http_host;
        proxy_set_header  X-Real-IP           $remote_addr;
        proxy_set_header  X-Forwarded-Ssl     on;
        proxy_set_header  X-Forwarded-For     $proxy_add_x_forwarded_for;
        proxy_set_header  X-Forwarded-Proto   $scheme;
        proxy_set_header  X-Frame-Options     SAMEORIGIN;

	client_max_body_size 100m;
    }
}

这里我使用8080端口作为GitLab的服务端口。SSL证书存放在上一步中证书安装的位置。

配置完成后重启nginx服务使修改生效:

1
sudo service nginx restart

安装GitLab

这里使用docker-compose来安装jellyfin,具体操作参照https://docs.gitlab.com/ee/install/docker.html。 在安装目录/media/gitlab下创建以下docker-compose.yml文件:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
version: '3.6'
services:
  web:
    image: 'gitlab/gitlab-ee:latest'
    restart: always
    hostname: 'git.jinli.io'
    environment:
      GITLAB_OMNIBUS_CONFIG: |
        external_url 'http://git.jinli.io'
        gitlab_rails['gitlab_shell_ssh_port'] = 22        
    ports:
      - '1080:80'
      - '1443:443'
      - '1022:22'
    volumes:
      - './config:/etc/gitlab'
      - './logs:/var/log/gitlab'
      - './data:/var/opt/gitlab'
    shm_size: '256m'

然后执行以下命令启动GitLab服务:

1
sudo docker-compose up -d

网站初始化和设置

如果上述配置全部成功完成的话,就可以通过浏览器访问网站,可以在地址栏输入http://0.0.0.0:8080来访问,或者通过域名https://git.jinli.cyou来访问。 如果网站尚未初始化完毕,通过浏览器访问时会看到提示502 Bad Gateway,需要耐心等待几分钟,直到网站初始化完成。

第一次访问网站时需要设置管理员账户和密码,然后可以创建一个普通账户,用于日常使用。

配置系统通知邮箱

经过以上配置,GitLab已经可以正常使用了。但是我们还想使用系统通知功能,例如发送系统通知邮件、注册账户时的邮件验证等,就需要配置系统通知邮箱。这里我使用的是自己的邮箱服务器,具体配置如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
### GitLab email server settings
###! Docs: https://docs.gitlab.com/omnibus/settings/smtp.html
###! **Use smtp instead of sendmail/postfix.**

gitlab_rails['smtp_enable'] = true
gitlab_rails['smtp_address'] = "mail.jinli.cyou"
gitlab_rails['smtp_port'] = 587
gitlab_rails['smtp_user_name'] = "[email protected]"
gitlab_rails['smtp_password'] = "your_email_password"
gitlab_rails['smtp_domain'] = "mail.jinli.cyou"
gitlab_rails['smtp_authentication'] = "login"
gitlab_rails['smtp_enable_starttls_auto'] = true
gitlab_rails['smtp_tls'] = false
# gitlab_rails['smtp_pool'] = false

###! **Can be: 'none', 'peer', 'client_once', 'fail_if_no_peer_cert'**
###! Docs: http://api.rubyonrails.org/classes/ActionMailer/Base.html
gitlab_rails['smtp_openssl_verify_mode'] = 'none'

# gitlab_rails['smtp_ca_path'] = "/etc/ssl/certs"
# gitlab_rails['smtp_ca_file'] = "/etc/ssl/certs/ca-certificates.crt"

### Email Settings

# gitlab_rails['gitlab_email_enabled'] = true

##! If your SMTP server does not like the default 'From: [email protected]'
##! can change the 'From' with this setting.
gitlab_rails['gitlab_email_from'] = '[email protected]'
gitlab_rails['gitlab_email_display_name'] = 'GitLab Mailer'
gitlab_rails['gitlab_email_reply_to'] = '[email protected]'
# gitlab_rails['gitlab_email_subject_suffix'] = ''
# gitlab_rails['gitlab_email_smime_enabled'] = false
# gitlab_rails['gitlab_email_smime_key_file'] = '/etc/gitlab/ssl/gitlab_smime.key'
# gitlab_rails['gitlab_email_smime_cert_file'] = '/etc/gitlab/ssl/gitlab_smime.crt'
# gitlab_rails['gitlab_email_smime_ca_certs_file'] = '/etc/gitlab/ssl/gitlab_smime_cas.crt'

这样我们自己的GitLab服务器也有系统通知功能了。

comments powered by Disqus