当前位置:首页 > 运维 > 正文内容

Gitlab 安装与配置

phpmianshi3周前 (07-14)运维55

Gitlab 安装

使用 docker-compose 安装 Gitlab,traefik 反向代理 Gitlab,并开启 https

编辑 docker-compose.yaml 文件

$ mkdir gitlab
$ cat << 'EOF' | tee gitlab/docker-compose.yaml
version: "3"

services:
  gitlab:
    image: gitlab/gitlab-ce
    container_name: gitlab
    restart: always
    environment:
      GITLAB_OMNIBUS_CONFIG: |
        # Gitlab访问URL
        external_url "https://git.YOU_DOMAIN"
        # Gitlab SSH端口,注意映射端口时不要与宿主机的SSH端口冲突
        gitlab_rails["gitlab_shell_ssh_port"] = 22
        # 时区设置
        gitlab_rails["time_zone"] = "Asia/Shanghai"
        # 邮件设置,以QQ企业邮箱为例
        gitlab_rails["smtp_enable"] = true
        gitlab_rails["smtp_address"] = "smtp.exmail.qq.com"
        gitlab_rails["smtp_port"] = 465
        gitlab_rails["smtp_user_name"] = "YOU_EMAIL"
        gitlab_rails["smtp_password"] = "YOU_EMAIL_PASSWORD"
        gitlab_rails["smtp_domain"] = "exmail.qq.com"
        gitlab_rails["smtp_authentication"] = "login"
        gitlab_rails["smtp_enable_starttls_auto"] = true
        gitlab_rails["smtp_tls"] = true
        gitlab_rails["gitlab_email_enabled"] = true
        gitlab_rails["gitlab_email_from"] = "YOU_EMAIL"
        gitlab_rails["gitlab_email_display_name"] = "YOU_EMAIL_DISPLAY_NAME"
        gitlab_rails["gitlab_email_reply_to"] = "YOU_EMAIL"
        gitlab_rails["gitlab_email_subject_suffix"] = ""
        # 备份设置,保留14天的备份
        gitlab_rails["manage_backup_path"] = true
        gitlab_rails["backup_path"] = "/var/opt/gitlab/backups"
        gitlab_rails["backup_archive_permissions"] = 0644
        gitlab_rails["backup_pg_schema"] = "public"
        gitlab_rails["backup_keep_time"] = 1209600
        # 超时设置
        gitlab_rails["webhook_timeout"] = 60 
        unicorn["worker_timeout"] = 60
        unicorn["worker_processes"] = 4
        # Gitlab自带的nginx设置,使用外部的traefik反向代理
        nginx["enable"] = true
        nginx["listen_port"] = 80
        nginx["listen_https"] = false
    ports:
      - "2222:22"
    networks:
      - gitlab
    volumes:
      - "/etc/localtime:/etc/localtime"
      - "/data/gitlab/config:/etc/gitlab"
      - "/data/gitlab/logs:/var/log/gitlab"
      - "/data/gitlab/data:/var/opt/gitlab"
    labels:
      - "traefik.enable=true"
      # HTTP访问入口,HTTP自动跳转HTTPS
      - "traefik.http.routers.gitlab.entrypoints=web"
      - "traefik.http.routers.gitlab.rule=Host(`git.YOU_DOMAIN`)"
      - "traefik.http.routers.gitlab.middlewares=redirect-to-https"
      - "traefik.http.middlewares.redirect-to-https.redirectscheme.scheme=https"
      # HTTPS访问入口
      - "traefik.http.routers.gitlab-secure.entrypoints=websecure"
      - "traefik.http.routers.gitlab-secure.rule=Host(`git.YOU_DOMAIN`)"
      # 开启TLS,指定证书域名
      - "traefik.http.routers.gitlab-secure.tls=true"
      - "traefik.http.routers.gitlab-secure.tls.certresolver=default"
      # 指定Gitlab的端口,多端口容器需要指定
      - "traefik.http.services.gitlab-secure.loadbalancer.server.port=80"

  traefik:
    image: traefik:2.1
    container_name: traefik
    restart: always
    command: 
      # 开启api/dashboard
      - "--api.dashboard=true" 
      # 设置provider为docker
      - "--providers.docker=true"
      - "--providers.docker.exposedbydefault=false"
      # 设置http和https入口点
      - "--entryPoints.web.address=:80"
      - "--entryPoints.websecure.address=:443"
      # ACME验证方式,这里选择TLS验证
      - "--certificatesresolvers.default.acme.tlschallenge=true"
      # 申请证书的邮箱
      - "--certificatesResolvers.default.acme.email=YOU_EMAIL"
      # 保存ACME证书的位置
      - "--certificatesResolvers.default.acme.storage=/letsencrypt/acme.json"
    networks:
      - gitlab
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - "/etc/localtime:/etc/localtime"                                          
      - "./letsencrypt:/letsencrypt"
      - "/var/run/docker.sock:/var/run/docker.sock"

networks:
  gitlab:
    driver: bridge
EOF

注意将 YOU_XXX 换成符合要求的名称,使用 TLS 验证必须将域名解析到所在服务器,CA服务器能通过解析到达此服务器(本例中 git.YOU_DOAMIN )

启动 Gitlab

$ cd gitlab
$ docker-compose up -d

启动要拉取对应的 docker 镜像,等待时间可能较长,也可以预先拉取

Gitlab 备份还原

查看 Gitlab 版本

$ docker exec gitlab /opt/gitlab/bin/gitlab-rake gitlab:env:info

备份 Gitlab

$ docker exec gitlab /opt/gitlab/bin/gitlab-rake gitlab:backup:create RAILS_ENV=production

在 Gitlab 容器的路径 /var/opt/gitlab/backups(对应于宿主机的 /data/gitlab/data/backups 目录)下会生成形如 1576482525_2019_12_16_12.5.4_gitlab_backup.tar 的备份文件

将此备份命令加入 corntab 中,定期执行即可自动定期备份

还原 Gitlab

将备份文件复制到要还原的机器中(该机器安装一样版本的 Gitlab)

拷贝备份文件到 Gitlab 容器中

 $ docker cp 1576482525_2019_12_16_12.5.4_gitlab_backup.tar gitlab:/var/opt/gitlab/backups/

交互式进入 Gitlab 容器内部

$ docker exec -it gitlab /bin/bash

在 Gitlab 容器内执行如下还原命令(注意还原文件不需要加 _gitlab_backup.tar )

$ /opt/gitlab/bin/gitlab-rake gitlab:backup:restore RAILS_ENV=production BACKUP=/var/opt/gitlab/backups/1576482525_2019_12_16_12.5.4

一路敲 yes 回车即可


版权声明:本文由PHP面试资料网发布,如需转载请注明出处。
分享给朋友:
返回列表

上一篇:SonarQube的安装、配置与使用

没有最新的文章了...

相关文章

CSRF攻击与防御

 CSRF概念:CSRF跨站点请求伪造(Cross—Site Request Forgery),跟XSS攻击一样,存在巨大的危害性,你可以这样来理解:    &nbs...

linux中sed用法读这一篇就够了

1.概念sed是一种行编辑器,它一次处理一行内容。处理时,把 当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的...


1、应用程序中调用read() 方法,这里会涉及到一次上下文切换(用户态->内核态),底层采用DMA(direct memory access)读取磁盘的文件,并把内容存储到内核地址空间的读取缓存区。

操作系统检测到进程向I/O设备发起请求后就暂停进程的运行,怎么暂停运行呢?

很简单:只需要记录下当前进程的运行状态并把CPU的PC寄存器指向其它进程的指令就可以了。
进程有暂停就会有继续执行,因此操作系统必须保存被暂停的进程以备后续继续执行,显然我们可以用队列来保存被暂停执行的进程。

注意:现代磁盘向内存copy数据时无需借助CPU的帮助,这就是所谓的DMA(Direct Memory Access)。

实际上:操作系统中除了有阻塞队列之外也有就绪队列,所谓就绪队列是指队列里的进程准备就绪可以被CPU执行了。
你可能会问为什么不直接执行非要有个就绪队列呢?

答案很简单:那就是僧多粥少,在即使只有1个核的机器上也可以创建出成千上万个进程,CPU不可能同时执行这么多的进程,因此必然存在这样的进程,即使其一切准备就绪也不能被分配到计算资源,这样的进程就被放到了就绪队列。

当进程A被暂停执行后CPU是不可以闲下来的,因为就绪队列中还有嗷嗷待哺的进程B,这时操作系统开始在就绪队列中找下一个可以执行的进程,也就是这里的进程B。
此时操作系统将进程B从就绪队列中取出,找出进程B被暂停时执行到的机器指令的位置,然后将CPU的PC寄存器指向该位置,这样进程B就开始运行啦。

此后磁盘终于将全部数据都copy到了进程A的内存中,这时磁盘通知操作系统任务完成啦,你可能会问怎么通知呢?这就是中断
操作系统接收到磁盘中断后发现数据copy完毕,进程A重新获得继续运行的资格,这时操作系统小心翼翼的把进程A从阻塞队列放到了就绪队列当中。

注意:从前面关于就绪状态的讨论中我们知道,操作系统是不会直接运行进程A的,进程A必须被放到就绪队列中等待,这样对大家都公平。

此后进程B继续执行,进程A继续等待,进程B执行了一会儿后操作系统认为进程B执行的时间够长了,因此把进程B放到就绪队列,把进程A取出并继续执行。

注意:操作系统把进程B放到的是就绪队列,因此进程B被暂停运行仅仅是因为时间片到了而不是因为发起I/O请求被阻塞。

进程A继续执行,此时buff中已经装满了想要的数据,进程A就这样愉快的运行下去了,就好像从来没有被暂停过一样


2、由于应用程序无法读取内核地址空间的数据,如果应用程序要操作这些数据,必须把这些内容从读取缓冲区拷贝到用户缓冲区。这个时候,read() 调用返回,且引发一次上下文切换(内核态->用户态),现在数据已经被拷贝到了用户地址空间缓冲区,这时,如果有需要,应用程序可以操作修改这些内容。

3、我们最终目的是把这个文件内容通过Socket传到另一个服务中,调用Socket的send()方法,这里又涉及到一次上下文切换(用户态->内核态),同时,文件内容被进行第三次拷贝,被再次拷贝到内核地址空间缓冲区,但是这次的缓冲区与目标套接字相关联,与读取缓冲区没有半点关系。

4、send()调用返回,引发第四次的上下文切换,同时进行第四次的数据拷贝,通过DMA把数据从目标套接字相关的缓存区传到协议引擎进行发送。

"在整个过程中,过程1和4是由DMA负责,并不会消耗CPU,只有过程2和3的拷贝需要CPU参与


如果在应用程序中,不需要操作内容,过程2和3就是多余的,如果可以直接把内核态读取缓存冲区数据直接拷贝到套接字相关的缓存区,是不是可以达到优化的目的?

Linux中nio的实现原理

我们上一篇文章 《linux中netstat和ss命令详解》中提到了nio 原文:https://phpmianshi.com/?id=105有一些小伙伴私信想了解什么是nio,我们这篇详细介绍下什么...

linux中cat EOF详解

关于cat << EOF语句在linux shell脚本中cat << EOF的语句,起到什么作用?首先必须要说明的是EOF在这里没有特殊的含义,你可以使用FOE或OOO等(当...

linux中netstat和ss命令详解

由于nio的普及,ck10k的问题已经成为过去式。现在随便一台服务器,都可以支持数十万级别的连接了。那么10万的连接需要多少资源呢?由于一个连接都是文件句柄,所以需要文件描述符数量支持才行,每一个so...

linux中tcpdump的详细用法

linux中tcpdump的详细用法

在调试网络通信程序是tcpdump是必备工具。tcpdump很强大,可以看到网络通信的每个细节。如TCP,可以看到3次握手,PUSH/ACK数据推送,close4次挥手,全部细节。包括每一次网络收包的...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。