GitLab 部署和配置指南

GitLab 部署和配置指南

1. GitLab 容器配置概述

在部署 GitLab 时,可能涉及以下几部分内容:

  • 内置 Nginx 的配置和调整。
  • HTTPS 证书的申请、使用和续期。
  • 通过 FRP 映射内网服务到外部服务器。
  • 阿里云服务器的 Nginx 配置和反向代理。

本文将完整涵盖这些配置,帮助您成功部署和维护 GitLab 服务。


2. FRP 配置

2.1 FRP 客户端配置文件(群晖/内网)

使用以下示例配置文件,通过 FRP 将 GitLab 的 HTTP 和 HTTPS 服务暴露到外部。

HTTP 配置
[[proxies]]
name = "GitLab-HTTP"
type = "tcp"
local_ip = "127.0.0.1"
local_port = 6680  # 群晖上 GitLab 的 HTTP 端口
remote_port = 8080 # 阿里云服务器上的 HTTP 映射端口
HTTPS 配置
[[proxies]]
name = "GitLab-HTTPS"
type = "tcp"
local_ip = "127.0.0.1"
local_port = 6443  # 群晖上 GitLab 的 HTTPS 端口
remote_port = 8443 # 阿里云服务器上的 HTTPS 映射端口

3. 阿里云 Nginx 配置

阿里云服务器需要配置 Nginx,代理到 FRP 服务端暴露的端口。

3.1 HTTP 配置

server {
    listen 80;
    server_name gitlab.example.com;

    location / {
        proxy_pass http://127.0.0.1:8080;
        proxy_set_header Host $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 $scheme;
        proxy_connect_timeout 60s;
        proxy_read_timeout 60s;
        proxy_send_timeout 60s;
    }
}

3.2 HTTPS 配置

server {
    listen 443 ssl;
    server_name gitlab.example.com;

    ssl_certificate /etc/letsencrypt/live/gitlab.example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/gitlab.example.com/privkey.pem;
    include /etc/letsencrypt/options-ssl-nginx.conf;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;

    location / {
        proxy_pass https://127.0.0.1:8443;
        proxy_set_header Host $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 $scheme;
        proxy_connect_timeout 60s;
        proxy_read_timeout 60s;
        proxy_send_timeout 60s;
    }
}

4. GitLab 容器内 HTTPS 配置

4.1 编辑 gitlab.rb 文件

gitlab.rb 是 GitLab 配置的核心文件,位于容器内的 /etc/gitlab/gitlab.rb

# 设置外部 URL 为 HTTPS
external_url 'https://gitlab.example.com'

# 启用内置 Nginx
nginx['enable'] = true

# 客户端上传文件大小限制
nginx['client_max_body_size'] = '250m'

# 强制 HTTP 重定向到 HTTPS
nginx['redirect_http_to_https'] = true
nginx['redirect_http_to_https_port'] = 443

# SSL 证书和私钥路径
nginx['ssl_certificate'] = "/etc/letsencrypt/live/gitlab.example.com/fullchain.pem"
nginx['ssl_certificate_key'] = "/etc/letsencrypt/live/gitlab.example.com/privkey.pem"

# 启用的 TLS 协议和加密算法
nginx['ssl_protocols'] = "TLSv1.2 TLSv1.3"
nginx['ssl_ciphers'] = "ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384"
nginx['ssl_prefer_server_ciphers'] = "on"

4.2 应用配置并重启服务

在容器中运行以下命令:

gitlab-ctl reconfigure
gitlab-ctl restart

5. 证书申请和自动续期

5.1 使用 Certbot 申请证书

停止占用端口的服务

如果 GitLab 的内置 Nginx 服务占用了 80 端口,Certbot 无法运行。需要停止 Nginx:

gitlab-ctl stop nginx
使用 Certbot 申请证书

运行以下命令生成证书:

certbot certonly --standalone -d gitlab.example.com

提示: 如果生成失败,请查看日志 /var/log/letsencrypt/letsencrypt.log

确认证书文件路径
ls /etc/letsencrypt/live/gitlab.example.com/

应包含以下文件:

  • fullchain.pem
  • privkey.pem
重新启动 Nginx 服务
gitlab-ctl start nginx

5.2 自动续期配置

检查现有证书
certbot certificates

输出示例:

Certificate Name: gitlab.example.com
Domains: gitlab.example.com
Expiry Date: 2024-01-15 23:59:59+00:00 (VALID: 59 days)
测试续期任务
certbot renew --dry-run

成功输出示例:

Congratulations, all renewals succeeded!
配置自动续期任务

在容器内设置定时任务:

apt install cron -y
crontab -e

添加以下内容:

0 2 * * * certbot renew --deploy-hook "gitlab-ctl restart nginx"

启动 Cron 服务:

cron

验证任务是否正常运行:

cat /var/log/cron.log

6. 常见问题排查

问题 1:证书续期失败

  • 现象: Certbot 报错。

  • 解决方案:

    1. 检查端口占用:
    netstat -tuln | grep :80
    
    1. 手动续期:
    certbot renew
    

问题 2:通过 HTTP 拉取代码

  • 现象: 配置 HTTPS 后仍使用 HTTP 拉取代码。

  • 解决方案:
    修改 gitlab.rb

    external_url 'https://gitlab.example.com'
    

    然后运行:

    gitlab-ctl reconfigure
    

7. 总结与注意事项

  1. 阿里云 Nginx 配置的区别:

    • HTTP 使用:proxy_pass http://127.0.0.1:8080;
    • HTTPS 使用:proxy_pass https://127.0.0.1:8443;
    • 请确保配置一致且符合实际需求,避免混淆。
  2. FRP 的 HTTP 和 HTTPS 配置需区分:

    • HTTP 和 HTTPS 使用不同的远程端口。
    • 确保 FRP 客户端和服务器配置一致,并分别映射。
  3. 申请证书前的前提条件:

    • 域名必须先能通过 HTTP 访问成功,否则无法申请证书。
    • 如果 HTTP 无法访问或 FRP 配置有误,Certbot 将报错且申请失败。
  4. 为何配置 HTTPS 的 external_url:

    • 如果 external_url 未配置为 https://,即使 HTTPS 配置成功,GitLab 界面生成的 URL 仍然是 HTTP。
    • 这会导致代码克隆或推送使用 HTTP,而不是安全的 HTTPS。
  5. 通过 HTTP 判断 FRP 服务状态:

    • 成功通过 HTTP 访问,意味着 FRP 服务端和客户端均已正常运行。
    • 进一步通过 HTTPS 测试远程访问功能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/917179.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

使用Web Components构建模块化Web应用

💓 博客主页:瑕疵的CSDN主页 📝 Gitee主页:瑕疵的gitee主页 ⏩ 文章专栏:《热点资讯》 使用Web Components构建模块化Web应用 使用Web Components构建模块化Web应用 使用Web Components构建模块化Web应用 引言 Web Co…

谷歌浏览器的自动翻译功能如何开启

在当今全球化的网络环境中,能够流畅地浏览不同语言的网页是至关重要的。谷歌浏览器(Google Chrome)提供了一项强大的自动翻译功能,可以帮助用户轻松跨越语言障碍。本文将详细介绍如何开启和使用谷歌浏览器的自动翻译功能&#xff…

算法---解决“汉诺塔”问题

# 初始化步骤计数器 i 1 # 定义移动盘子的函数 def move(n, mfrom, mto): global i # 使用全局变量i来跟踪步骤 print("第%d步:将%d号盘子从%s->%s" % (i, n, mfrom, mto)) # 打印移动步骤 i 1 # 步骤计数器加1 #第一种方法 # 定义汉诺塔问题的递归…

uniapp对接极光推送,实现消息推送功能

通过集成JG-JPush和JG-JCore插件,可以在应用中添加消息推送功能,向用户发送通知、消息等。这对于提升用户体验、增加用户粘性非常有帮助‌。 效果图: 一、登录极光官网 进入【服务中心】-【开发者平台】 创建应用:【概览】- 【创…

redis高性能键值数据库技术简介

什么是redis redis是远程字典服务(Remote Dictionary Server )的简写,是一个完全开源的高性能的Key-Value数据库,提供了丰富的数据结构如string、Hash、List、SetSortedset等等。数据是存在内存中的,同时Redis支持事务…

进程信号

目录 信号入门 1. 生活角度的信号 2. 技术应用角度的信号 3. 注意 4. 信号概念 5. 用kill -l命令可以察看系统定义的信号列表 6. 信号处理常见方式概览 产生信号 1. 通过终端按键产生信号 Core Dump 2. 调用系统函数向进程发信号 3. 由软件条件产生信号 4. 硬件异…

NotePad++中安装XML Tools插件

一、概述 作为开发人员,日常开发中大部的数据是标准的json格式,但是对于一些古老的应用,例如webservice接口,由于其响应结果是xml,那么我们拿到xml格式的数据后,常常会对其进行格式化,以便阅读。…

Java基础——多线程

1. 线程 是一个程序内部的一条执行流程程序中如果只有一条执行流程,那这个程序就是单线程的程序 2. 多线程 指从软硬件上实现的多条执行流程的技术(多条线程由CPU负责调度执行) 2.1. 如何创建多条线程 Java通过java.lang.Thread类的对象…

HarmonyOS ArkUI(基于ArkTS) 常用组件

一 Button 按钮 Button是按钮组件,通常用于响应用户的点击操作,可以加子组件 Button(我是button)Button(){Text(我是button)}type 按钮类型 Button有三种可选类型,分别为胶囊类型(Capsule)、圆形按钮(Circle&#xf…

【FPGA开发】AXI-Stream总线协议解读

文章目录 AXI-Stream概述协议中一些定义字节定义流的定义 数据流类别字节流连续对齐流连续不对齐流稀疏流 协议的信号信号列表 文章为个人理解整理,如有错误,欢迎指正! 参考文献 ARM官方手册 《IHI0051B》 AXI-Stream概述 协议中一些定义 A…

谷粒商城のMySQL集群分库分表

文章目录 前言一、MySQL的集群架构二、MySQL主从同步实践1.创建主节点实例2.创建从节点实例3.修改配置4.开始同步4.测试主从同步效果5.小结 三、MySQL分库分表1.配置sharding-proxy2.测试sharding-proxy3.小结 前言 本篇是谷粒商城集群部署篇,搭建MySQL集群以及分库…

计算机组成原理对于学习嵌入式开发的意义

计算机组成原理对于学习嵌入式开发的意义 前言 最近有位同学向我咨询,问学习嵌入式开发需不需要学习硬件?进而引申到了需不需要学习计算机组成原理呢? 正文 首先计算机组成原理是计算机科学与技术专业的一门核心基础课程,它深入…

npm list -g --depth=0(用来列出全局安装的所有 npm 软件包而不显示它们的依赖项)

您提供的命令 npm list -g --depth0 是在 Node Package Manager (npm) 的上下文中使用的,用来列出全局安装的所有 npm 软件包而不显示它们的依赖项。 这是它的运作方式: npm list -g --depth0-g: 指定列表应包括全局安装的软件包。--depth0: 限制树形结…

SpringBoot 2.2.10 无法执行Test单元测试

很早之前的项目今天clone现在,想执行一个业务订单的检查,该检查的代码放在test单元测试中,启动也是好好的,当点击对应的方法执行Test的时候就报错 tip:已添加spring-boot-test-starter 所以本身就引入了junit5的库 No…

多表查询综合归纳

目录 1. 多表关系 1.1 一对多(多对一) 1.2 多对多 1.3 一对一 2. 多表查询概述 2.1 熟悉表 2.2 笛卡尔积 2.3 消除笛卡尔积 2.4 多表查询分类 3. 内连接 3.1 隐式内连接 3.2 显式内连接 4. 外连接 4.1 左外连接 4.2 右外连接 5. 自连接 …

python爬虫(二)爬取国家博物馆的信息

import requests from bs4 import BeautifulSoup# 起始网址 url https://www.chnmuseum.cn/zx/xingnew/index_1.shtml # 用于存储所有数据 all_data [] page 1 global_index 1 # 定义全局序号变量并初始化为1 while True:html_url requests.get(url).textif requests.get…

基于NI Vision和MATLAB的图像颜色识别与透视变换

1. 任务概述 利用LabVIEW的NI Vision模块读取图片,对图像中具有特征颜色的部分进行识别,并对识别的颜色区域进行标记。接着,通过图像处理算法检测图像的四个顶点(左上、左下、右上、右下),并识别每个顶点周…

Qt_day7_文件IO

目录 文件IO 1. QFileDialog 文件对话框(熟悉) 2. QFileInfo 文件信息类(熟悉) 3. QFile 文件读写类(掌握) 4. UI操作与耗时操作(掌握) 5. 多线程(掌握)…

[论文笔记]An LLM Compiler for Parallel Function Calling

引言 今天带来一篇优化函数调用的论文笔记——An LLM Compiler for Parallel Function Calling。 为了简单,下文中以翻译的口吻记录,比如替换"作者"为"我们"。 当前的函数(工具)调用方法通常需要对每个函数进行顺序推理和操作&…

网络性能测试

一、iperf网络性能测试工具 测试udp丢包率 在服务器启动 iperf 服务端 iperf -p 9000 -s -u -i 1参数说明: -p : 端口号 -s : 表示服务端 -u : 表示 udp 协议 -i : 检测的时间间隔(单位,秒) 在客户端,启动 iperf 客户端 iperf -c xxx.xxx.14…