当前位置: 首页 > article >正文

部署Gitlab-CE with Docker私有云环境

应用环境
Ubuntu 20.04.6 LTS (GNU/Linux 5.15.0-139-generic x86_64)
Docker version 28.1.1, build 4eba377

文章目录

    • 拉取容器镜像
    • 生成Run脚本
      • 参数解读
      • 实例脚本
      • 环境配置
      • 管理员密码遗忘
      • 服务邮箱配置
        • 邮件测试
    • 运维问题集锦
      • (1) 端口映射关系
      • (2) 服务日志
      • (3) 分支受保护
    • 项目操作
      • (1) 建立群组
      • (2) 创建项目
      • (3) 项目的版本控制

拉取容器镜像

sudo apt-get update## gitlab-ce:17.9.6-ce.0
docker pull swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/gitlab/gitlab-ce:17.9.6-ce.0## gitlab-ce:17.10.4-ce.0
docker pull swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/gitlab/gitlab-ce:17.10.4-ce.0
## 添加标签名Tag
docker tag swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/gitlab/gitlab-ce:17.10.4-ce.0 docker.io/gitlab/gitlab-ce:17.10.4-ce.0
## 移除标签名Tag
docker rmi swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/gitlab/gitlab-ce:17.10.4-ce.0

国内镜像参考:
渡渡鸟镜像
清华大学开源软件镜像

生成Run脚本

可参考:渡渡鸟-Run助手

参数解读

# 将镜像进实例化成容器并运行
docker run# 【i】保持STDIN(标准输入)开放,即使没有附加任何东西。这通常用于让容器的进程保持运行,即使没有附加到终端。例如,你可以在容器内部运行一个交互式shell
# 【t】分配一个伪终端(pseudo-TTY),这对于交互式shell非常重要,比如当你想要在容器中运行bash或sh时。
# 【d】后台运行,即所谓的“detached”模式。容器会在后台启动,并且你会得到容器的ID或名称
-itd# 容器命名
--name gitlab-ce# 重启策略
## no:不自动重启,缺省时默认
## always:始终重启
## unless-stopped:Docker 服务重启后自动启动容器,除非容器被手动停止。可指定最大重试次数,例如 --restart=on-failure:3(最多重启3次)。
## on-failure:仅在容器非正常退出(退出状态码非0)时重启。
--restart=always \# 【p】映射策略,<宿主端口>:<容器端口>
## 比如gitlab,22为ssh协议;80为http协议;443为https协议
-p 1022:22 \
-p 81:80 \
-p 10443:443 \# 使用本地时区
-e TimeZone='Asia/Shanghai' \
-e TZ='Asia/Shanghai' \
-v /etc/localtime:/etc/localtime \# Host域名映射
--add-host=gitlab.oh.com:172.10.3.200 \# 挂载卷映射(宿主:容器)
## /etc/gitlab:配置文件
## /var/log/gitlab:日志数据
## /var/opt/gitlab:应用数据
-v /gitlab-ce/config:/etc/gitlab  \
-v /gitlab-ce/logs:/var/log/gitlab \
-v /gitlab-ce/data:/var/opt/gitlab \# 让容器获取宿主机root权限
--privileged=true \# 最后一行所引用的docker镜像源

实例脚本

建议http服务,不要使用默认的80端口。很容易与其它docker容器服务或宿主机其它服务冲突,比如宿主机安装的nginx、apache服务。

docker run -itd \
--name gitlab-ce \
--restart=always \
-p 1022:22 \
-p 81:80 \
-p 10443:443 \
-e TimeZone='Asia/Shanghai' \
-e TZ='Asia/Shanghai' \
-v /etc/localtime:/etc/localtime \
-v /gitlab-ce/config:/etc/gitlab  \
-v /gitlab-ce/logs:/var/log/gitlab \
-v /gitlab-ce/data:/var/opt/gitlab \
--privileged=true \
docker.io/gitlab/gitlab-ce:17.10.4-ce.0

环境配置

# 打开配置文件
sudo vim /gitlab-ce/config/gitlab.rb

编辑内容如下

## GitLab URL
external_url 'http://192.168.1.50'## GitLab SSH
gitlab_rails['gitlab_ssh_host'] = '192.168.1.50'
gitlab_rails['time_zone'] = 'Asia/Shanghai'### GitLab Shell settings for GitLab
gitlab_rails['gitlab_shell_ssh_port'] = 1022
# gitlab_rails['gitlab_shell_git_timeout'] = 800

输入:wq保存退出后,进入Gitlab bash控制台

sudo docker exec -it gitlab-ce bash
# 更新配置
gitlab-ctl reconfigure#修改gitlab.yml
vi /opt/gitlab/embedded/service/gitlab-rails/config/gitlab.yml

内容如下
在这里插入图片描述

提示
如果不在Gitlab bash控制台中打开,则在宿主机/gitlab-ce/data/gitlab-rails/etc/gitlab.yml

打开编辑
sudo vim /gitlab-ce/data/gitlab-rails/etc/gitlab.yml

重启服务
sudo docker restart gitlab-ce

输入:wq!保存退出后,重启容器

gitlab-ctl restart

执行结果如下
在这里插入图片描述

当成功执行后,会生成容器ID(docker后端会直接开始运行该容器)。通过portainer-ce WEB端查看,就能看到当前运行状态
在这里插入图片描述
当运行状态呈现绿色时,就可以直接访问容器Web端了。在访问前,需要先查看Gitlab实例化时随机生成的root密码(注意密码仅24小时内有效)

# 先退出Gitlab控制台
exit
# 查看root初始化密码
sudo cat initial_root_password

内容如下
在这里插入图片描述
登录到Web端后,先修改显示语言:

  • 左侧导航栏右上角头像,进入【Preferences】偏好设置。
  • 拉到最下面【Localization】本地化,将【Language】语言,设置为【Chinese, Simplified】中文。
  • 再拉到底,直接【Save changes】保存。

保存成功后,直接刷新页面或直接按F5即可。之后再进入左侧导航栏【密码】,修改root密码即可。

提示
如果宿主机是虚拟机环境(比如Ubuntu Sublinux with WSL),那仍需将GitLab私有服做物理网络穿透。否则宿主机所在局域中其它计算机仍无法访问该Gitlab服务。

管理员密码遗忘

直接进入Gitlab bash控制台

sudo docker exec -it gitlab-ce bash--连接gitlab数据库(#号前缀是控制台提示符状态)
gitlab-rails console -e production## 执行结果
--------------------------------------------------------------------------------Ruby:         ruby 3.2.5 (2024-07-26 revision 31d0f1a2e7) [x86_64-linux]GitLab:       17.6.1 (8a31863db02) FOSSPostgreSQL:   14.11
------------------------------------------------------------[ booted in 32.61s ]
Loading production environment (Rails 7.0.8.4)
irb(main):001:0>--修改root密码
# 查找并指向到root账号
irb(main):005:0> user = User.find_by(username: 'root')
=> #<User id:1 @root>
# 修改root密码(注意第2遍为确认密码),user.save即为保存
irb(main):006:0> user.password = 'S87fdj@&yhkk'
irb(main):007:0> user.password_confirmation = 'S87fdj@&yhkk'
irb(main):008:0> user.save!
=> true
irb(main):009:0> exit# 退出Gitlab bash控制台
root@2a11f26e011d:/# exit

服务邮箱配置

# 打开配置文件
sudo vim /gitlab-ce/config/gitlab.rb

追加内容如下

### 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'] = "smtp.qq.com"
gitlab_rails['smtp_port'] = 465
gitlab_rails['smtp_user_name'] = "admin@smtp.com"
gitlab_rails['smtp_password'] = "S87fdj@&yhkk"
gitlab_rails['smtp_domain'] = "qq.com"
gitlab_rails['smtp_authentication'] = "login"
gitlab_rails['smtp_enable_starttls_auto'] = false
gitlab_rails['smtp_tls'] = true
# 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: gitlab@gitlab.example.com'
##! can change the 'From' with this setting.
gitlab_rails['gitlab_email_from'] = 'master@gitlab.com'
gitlab_rails['gitlab_email_display_name'] = 'GitLab CE'
gitlab_rails['gitlab_email_reply_to'] = 'master@gitlab.com'
# 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'
邮件测试

输入:wq保存退出后,进入Gitlab bash控制台

sudo docker exec -it gitlab-ce bash
# 更新配置
gitlab-ctl reconfigure# 重启gitlab-ctl服务
gitlab-ctl restart# 邮件测试
gitlab-rails console -e production
Notify.test_email('admin@smtp.com', 'Subject', 'Body').deliver_now

邮箱有收到邮件,就表示配置成功!

运维问题集锦

(1) 端口映射关系

# 登录gitlab控制台
sudo docker exec -it gitlab-ce bash# 查看运行进程
netstat -ltwen# 查看宿主机运行进程
sudo netstat -tunlp
sudo netstat -aptn##查看指定端口占用情况
sudo ps aux | grep 'xrdp*'
sudo netstat -tunlp | grep 端口号

在这里插入图片描述

(2) 服务日志

# 宿主机docker跟踪
## 参数:--tail 10表示实时跟踪最新的10条记录
sudo docker logs -f gitlab-ce --tail 10# 直接进入如下路径,Gitlab容器内相关子服务进程日志都在这里,比如nginx、redis、reconfigure重载配置实例化记录等等
cd /gitlab-ce/logs/# 将地址解析添加到hosts列表
echo "192.168.1.50 gitlab.local" | sudo tee -a /etc/hosts# 查看配置内容, 仅输出有效的配置项
sudo cat gitlab.rb | grep -vE '^#|^$'

(3) 分支受保护

错误信息【IntelliJ Idea or WebStorm】
remote: GitLab: You are not allowed to push code to protected branches on this project.
不允许将代码推送到此项目的受保护分支。
在这里插入图片描述
错误信息【Visual Sutdio】
Git failed with a fatal error.Unencrypted HTTP is not recommended for Gitlab. Ensure the repository remote URL is using HTTPS.
Git失败并出现致命错误。不建议对Gitlab使用未加密的HTTP。确保存储库远程URL使用HTTPS。

该错误也是因为支分保护的问题,本身极狐官方不推荐在http协议下进行远程操作代码。推荐是采用https或SSH代码操作方案。

打开项目【设置】-【仓库】-【受保护分支】一栏
在这里插入图片描述
允许推送和合并角色调整为如图(含开发角色),或者直接取消保护也可以(选项是立即生效的)。

项目操作

(1) 建立群组

在这里插入图片描述

(2) 创建项目

在这里插入图片描述

(3) 项目的版本控制

在解决方案中,经常会存在多个项目和项目目录,经常需要处理忽略对某个项目、项目里某个文件夹、文件的版本跟踪控制。

忽略某个项目版本控制,在解决方案根下的.gitignore文件,按下图添加该目录路径即可。
在这里插入图片描述
忽略文件夹版本控制(含子目录及文件),编辑项目根下的.gitignore文件,按下图添加该目录路径即可。
在这里插入图片描述
忽略某个文件,在上图中# Editor directories and files一切直接放入文件名就可以了。当然主文件名或扩展名是支持通配符的。

-待续-

相关文章:

部署Gitlab-CE with Docker私有云环境

应用环境 Ubuntu 20.04.6 LTS (GNU/Linux 5.15.0-139-generic x86_64) Docker version 28.1.1, build 4eba377 文章目录 拉取容器镜像生成Run脚本参数解读实例脚本环境配置管理员密码遗忘服务邮箱配置邮件测试 运维问题集锦(1) 端口映射关系(2) 服务日志(3) 分支受保护 项目操作…...

拉普拉斯高斯(LoG)滤波器掩模的注意事项

目录 问题&#xff1a; 解答&#xff1a; 一、高斯函数归一化&#xff1a;消除幅度偏差 1. 归一化的定义 2. 为何必须归一化&#xff1f; 二、拉普拉斯系数和为零&#xff1a;抑制直流项干扰 1. 拉普拉斯算子的特性 2. 系数和不为零的后果 三、直流项如何影响零交叉点&…...

铠大师:让用户畅享多元应用,助力鸿蒙生态发展

在全球信息技术产业格局加速重构的背景下&#xff0c;中国科技力量正以开放包容的姿态重塑操作系统生态范式。 5月19日&#xff0c;华为在成都举办的nova14系列及鸿蒙电脑新品发布会上&#xff0c;正式对外发布搭载了鸿蒙系统的笔记本电脑HUAWEI MateBook Pro与HUAWEI MateBoo…...

RocketMQ核心特性与最佳实践

目录 1. 引言 2. RocketMQ核心特性 2.1 架构演进 2.2 核心组件 2.3 消息模型 2.4 高级特性 3. RocketMQ与其他MQ产品选型对比 3.1 功能特性对比 3.2 适用场景对比 3.3 选型建议 4. RocketMQ部署最佳实践 4.1 部署模式选择 4.2 硬件配置建议 4.3 操作系统优化 4.4…...

springboot配置redis lettuce连接池,以及连接池参数解释

文章目录 前置基本配置参数解释 前置 javaspringbootredislettuce 连接池 有很多连接池&#xff0c;比如 jedis&#xff0c;lettuce&#xff0c;redission&#xff0c;springboot 默认使用 lettuce 连接池 lettuce 连接池的特点是&#xff1a;一个 lettuce 连接可以被多个线…...

基于aspnet,微信小程序,mysql数据库,在线微信小程序汽车故障预约系统

详细视频:【基于aspnet,微信小程序,mysql数据库,在线微信小程序汽车故障预约系统。-哔哩哔哩】 https://b23.tv/zfqLWPV...

如何使用AI搭建WordPress网站

人工智能正迅速成为包括网页设计在内的许多行业在其功能设置中添加的一种工具。在数字设计和营销领域&#xff0c;许多成熟的工具都在其产品中添加了人工智能功能。WordPress 也是如此。作为目前最流行的网站建设工具之一&#xff0c;WordPress 的人工智能插件越来越多也就不足…...

打破双亲委派模型的实践:JDBC与Tomcat的深度解析

一、JDBC如何打破双亲委派模型 1. JDBC SPI机制的核心矛盾 Java数据库连接(JDBC)是打破双亲委派模型的经典案例&#xff0c;其根本原因在于基础类库需要加载实现类的矛盾&#xff1a; 核心接口位置&#xff1a;java.sql.Driver等接口位于rt.jar中&#xff0c;由启动类加载器…...

《打破枷锁:Python多线程GIL困境突围指南》

GIL&#xff0c;这个Python解释器层面的独特机制&#xff0c;虽在一定程度上守护了内存管理的秩序&#xff0c;却也成为了多线程并行的紧箍咒&#xff0c;限制了Python在多核处理器上的性能发挥。今天&#xff0c;让我们深入剖析GIL的本质&#xff0c;探寻突破这一枷锁的有效策…...

Java并发编程:全面解析锁策略、CAS与synchronized优化机制

一、六种锁策略场景化解析 1. 乐观锁 vs 悲观锁&#xff1a;图书馆借书的两种策略 核心差异&#xff1a;对资源是否会被抢占的预期不同。 乐观锁&#xff08;假设冲突概率低&#xff09; → 行为&#xff1a;直接去书架上拿书&#xff08;围绕加锁要做的工作更少&#xff09…...

2025第三届黄河流域网络安全技能挑战赛--Crypto--WriteUp

2025第三届黄河流域网络安全技能挑战赛–Crypto–WriteUp Crypto sandwitch task from Crypto.Util.number import * import gmpy2 flag bflag{fake_flag} assert len(flag) 39 p getPrime(512) q getPrime(512) n p * q e 0x3 pad1 beasy_problem pad2 bHow_to_so…...

[爬虫知识] IP代理

相关实战案例&#xff1a;[爬虫实战] 代理爬取&#xff1a;小白也能看懂怎么用代理 相关爬虫专栏&#xff1a;JS逆向爬虫实战 爬虫知识点合集 爬虫实战案例 引言&#xff1a;爬虫与IP封锁的攻防战 对网络爬虫而言&#xff0c;遇到的一个较棘手的问题就是封IP&#xff1a;请…...

6个月Python学习计划 Day 1 - Python 基础入门 开发环境搭建

6个月Python学习计划&#xff1a;从入门到AI实战&#xff08;前端开发者进阶指南&#xff09; &#x1f3af; 今日目标 理解 Python 的背景和用途安装 Python 开发环境熟悉基本语法&#xff1a;变量、数据类型、打印输出动手编写第一个 Python 程序 &#x1f9e0; 学习内容详…...

GraphPad Prism工作表的基本操作

《2025新书现货 GraphPad Prism图表可视化与统计数据分析&#xff08;视频教学版&#xff09;雍杨 康巧昆 清华大学出版社教材书籍 9787302686460 GraphPadPrism图表可视化 无规格》【摘要 书评 试读】- 京东图书 GraphPad Prism中包含5种工作表&#xff0c;每种工作表的基本操…...

Maven插件之docker-maven-plugin

介绍 在持续集成过程中&#xff0c;项目工程一般使用 Maven 编译打包&#xff0c;然后生成镜像&#xff0c;通过镜像上线&#xff0c;能够大大提供上线效率&#xff0c;同时能够快速动态扩容&#xff0c;快速回滚&#xff0c;着实很方便。docker-maven-plugin 插件就是为了实现…...

成年后还能学习多少知识,由大脑的这个数量决定

撰文&#xff5c;Anne Trafton 编译&#xff5c;郑添惺 审校&#xff5c;clefable 麻省理工学院&#xff08;MIT&#xff09;的一些神经科学家发现&#xff0c;成年的大脑中含有数百万个“静默突触”&#xff08;silent synapses&#xff09;。它们是神经元之间未成熟的神经突…...

Flask 会话管理:从原理到实战,深度解析 session 机制

1、Flask中session 的实现原理&#xff1a;服务器与客户端的协作 HTTP 协议是无状态的——服务器无法区分两次请求是否来自同一用户。这意味着&#xff0c;用户登录后跳转到其他页面时&#xff0c;服务器会“忘记”用户身份。 为解决这一问题&#xff0c;Web 开发中引入了会话…...

MySQL连接错误解决方案:Can‘t connect to MySQL server on ‘localhost‘ (10038)

错误描述 当您尝试连接MySQL数据库时&#xff0c;可能会遇到以下错误提示&#xff1a; 这个错误表明客户端无法连接到本地MySQL服务器。 可能的原因 MySQL服务未启动 MySQL配置问题 防火墙或安全软件阻止连接 端口被占用或未正确配置 网络连接问题 解决方案 方法一&am…...

【跨端框架检测】使用adb logcat检测Android APP使用的跨端框架方法总结

目录 Weex 跨端框架使用了uni-app的情况区分使用了uni-app还是Weex 判断使用了Xamarin判断使用了KMM框架判断使用了 ​​Ionic 框架判断使用了Cordova框架判断使用了Capacitor 框架使用了React Native框架使用了QT框架使用了Cocos框架使用了Electron 框架使用了flutter 框架使用…...

lua脚本实战—— Redis并发原子性陷阱

需求分析 对于内容类网站&#xff0c;比如用户浏览题目的答案&#xff0c;需要先登录才能追溯&#xff0c;那么可以统计用户访问频率来限制数据的爬取。 可采用分级反爬虫策略&#xff0c;先告警、再采取强制措施&#xff1a; 如果每分钟超过 10 道题&#xff0c;给管理员发…...

【MySQL】第10节|MySQL全局优化与Mysql 8.0新增特性详解

全局优化 mysql server参数 1. max_connections&#xff08;最大连接数&#xff09; 含义&#xff1a;MySQL 服务允许的最大并发连接数&#xff08;包括正在使用和空闲的连接&#xff09;。超过此限制时&#xff0c;新连接会被拒绝&#xff08;报错 Too many connections&am…...

CSS相关知识

1.清除浮动的方法 2.定位 静态定位相当于标准流 相对定位不脱离文档流&#xff0c;仍然占据原来的位置&#xff08;最频繁的作用是给绝对定位当爹&#xff09; 绝对定位脱离文档标准流&#xff0c;不再占有原来位置 3.BFC 1. 解决浮动元素导致的父容器高度塌陷 2. 阻止相邻元…...

AI扫描王APP:高效便捷的手机扫描工具,让生活更智能

AI扫描王APP是一款功能强大的手机扫描软件&#xff0c;专为追求高效、便捷的用户设计。它不仅支持文字提取和扫描翻译&#xff0c;还能进行测量&#xff0c;满足用户在不同场景下的需求。无论是办公、学习还是日常使用&#xff0c;AI扫描王都能帮助你快速完成任务&#xff0c;节…...

《仿盒马》app开发技术分享-- 原生地图展示(端云一体)

开发准备 上一节我们实现了获取当前用户的位置&#xff0c;并且成功的拿到了经纬度&#xff0c;这一节我们就要根据拿到的经纬度&#xff0c;结合我们其他的知识点来实现地图的展示。 功能分析 地图的展示&#xff0c;我们需要在管理中心先给我们对应的应用开启地图api功能&…...

Linux 操作文本文件列数据的常用命令

文章目录 Linux 操作文本文件列数据的常用命令基本列处理命令高级列处理列数据转换和排序列数据统计和分析 Linux 操作文本文件列数据的常用命令 Linux 提供了多种强大的命令来处理文本文件中的列数据&#xff0c;以下是一些最常用的命令和工具&#xff1a; 基本列处理命令 c…...

IP、子网掩码、默认网关、DNS

IP、子网掩码、默认网关、DNS 1. 概述1.1 windows配置处 2.IP 地址&#xff08;Internet Protocol Address&#xff09;2.1 公网ip2.2 内网ip2.3 &#x1f310; 公网 IP 与内网 IP 的关系&#xff08;NAT&#xff09; 3. 子网掩码&#xff08;Subnet Mask&#xff09;4. 默认网…...

华为OD机试真题——字符串加密 (2025B卷:100分)Java/python/JavaScript/C/C++/GO最佳实现

2025 B卷 100分 题型 本专栏内全部题目均提供Java、python、JavaScript、C、C++、GO六种语言的最佳实现方式; 并且每种语言均涵盖详细的问题分析、解题思路、代码实现、代码详解、3个测试用例以及综合分析; 本文收录于专栏:《2025华为OD真题目录+全流程解析+备考攻略+经验分…...

角度回归——八参数检测四边形Gliding Vertex

文章目录 一、介绍&#xff08;一&#xff09;五参数检测方法&#xff08; 基于角度&#xff09;&#xff08;二&#xff09;八参数检测方法&#xff08;point-based&#xff09;的边界 二、方案分析&#xff08;一&#xff09;问题定义&#xff08;二&#xff09;方案&#xf…...

JVM 高质量面试题

&#x1f4cc; 文章目录 一、JVM 内存结构与运行时模型1. JVM 内存结构分区及作用2. 栈帧结构及方法调用链维护3. 逃逸分析及其对对象分配策略的影响4. TLAB 的作用及提升对象创建效率的机制 二、垃圾回收器与 GC 调优1. CMS 与 G1 垃圾收集器的设计区别及适用场景2. Full GC 频…...

AI助力,制作视频裁剪软件

1. 视频裁剪软件套路多 最近再做一些测试&#xff0c;经常需要录屏什么的&#xff0c;有时候录制的时长视频&#xff0c;需要裁剪&#xff0c;比如去掉开头一些帧或者结尾的一些帧&#xff0c;就想保留关键点。但是网上下的一些软件&#xff0c;打开一用都是要付费的。所以想着…...