如何在极狐GitLab 自定义 Pages 域名、SSL/TLS 证书
本文作者:徐晓伟
GitLab 是一个全球知名的一体化 DevOps 平台,很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab 是 GitLab 在中国的发行版,专门为中国程序员服务。可以一键式部署极狐GitLab。
本文主要讲述了在极狐GitLab 用户自定义 Pages 域名、SSL/TLS 域名证书。
描述
默认情况下,pages 域名和证书 是被禁用的
自定义域名配置
导出 helm gitlab 配置
# 将已配置的值导出到文件中
helm -n gitlab-test get values my-gitlab > my-gitlab.yaml
查看 GitLab Pages Custom Domains Service 的 EXTERNAL-IP
[root@anolis-7-9 ~]# kubectl -n gitlab-test get service
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
cm-acme-http-solver-jpzhd NodePort 10.105.18.121 <none> 8089:32764/TCP 39h
cm-acme-http-solver-kvj5q NodePort 10.99.177.114 <none> 8089:30973/TCP 39h
cm-acme-http-solver-q82j2 NodePort 10.103.217.244 <none> 8089:32188/TCP 39h
my-gitlab-certmanager ClusterIP 10.101.131.129 <none> 9402/TCP 39h
my-gitlab-certmanager-webhook ClusterIP 10.104.249.65 <none> 443/TCP 39h
my-gitlab-gitaly ClusterIP None <none> 8075/TCP,9236/TCP 39h
my-gitlab-gitlab-exporter ClusterIP 10.104.47.204 <none> 9168/TCP 39h
my-gitlab-gitlab-pages-custom-domains LoadBalancer 10.97.49.247 172.25.25.32,10.97.49.247 80:32713/TCP 87m
my-gitlab-gitlab-pages-metrics ClusterIP 10.109.40.15 <none> 9235/TCP 3h3m
my-gitlab-gitlab-shell ClusterIP 10.107.227.187 <none> 22/TCP 39h
my-gitlab-kas ClusterIP 10.108.130.73 <none> 8150/TCP,8153/TCP,8154/TCP,8151/TCP 39h
my-gitlab-minio-svc ClusterIP 10.109.30.226 <none> 9000/TCP 39h
my-gitlab-nginx-ingress-controller LoadBalancer 10.102.62.140 <pending> 80:30875/TCP,443:31768/TCP,22:30561/TCP 39h
my-gitlab-nginx-ingress-controller-metrics ClusterIP 10.96.243.11 <none> 10254/TCP 39h
my-gitlab-postgresql ClusterIP 10.104.225.8 <none> 5432/TCP 39h
my-gitlab-postgresql-hl ClusterIP None <none> 5432/TCP 39h
my-gitlab-postgresql-metrics ClusterIP 10.107.233.118 <none> 9187/TCP 39h
my-gitlab-prometheus-server ClusterIP 10.101.151.224 <none> 80/TCP 39h
my-gitlab-redis-headless ClusterIP None <none> 6379/TCP 39h
my-gitlab-redis-master ClusterIP 10.103.127.195 <none> 6379/TCP 39h
my-gitlab-redis-metrics ClusterIP 10.104.184.133 <none> 9121/TCP 39h
my-gitlab-registry ClusterIP 10.107.98.111 <none> 5000/TCP 39h
my-gitlab-webservice-default ClusterIP 10.110.211.99 <none> 8080/TCP,8181/TCP,8083/TCP 39h
[root@anolis-7-9 ~]# kubectl -n gitlab-test get svc | grep gitlab-pages-custom-domains
my-gitlab-gitlab-pages-custom-domains LoadBalancer 10.97.49.247 172.25.25.32,10.97.49.247 80:32713/TCP 87m
[root@anolis-7-9 ~]#
修改配置
注意:此处填写的 externalHttp 不能和 gitlab 实例的 IP 相同
- 作者 gitlab 实例域名
gitlab.test.helm.xuxiaowei.cn
解析到172.25.25.32
- 作者 gitlab pages 域名
*.pages.test.helm.xuxiaowei.cn
、*.test.helm.xuxiaowei.io
解析到172.25.25.31
- 文档
global:pages:# 用于支持自定义域名:仅支持 HTTP 请求externalHttp:# HTTP 请求到达 Pages daemon 的 IP 地址列表。用于支持自定义域名。# 使用上述 GitLab Pages Custom Domains Service 的部分 EXTERNAL-IP- 172.25.25.31- 10.97.49.247
更新配置
helm upgrade -n gitlab-test --install my-gitlab gitlab/gitlab --timeout 600s -f my-gitlab.yaml --version 7.7.0
等待所有 pod 更新完成
[root@anolis-7-9 ~]# kubectl -n gitlab-test get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
cm-acme-http-solver-2ldtp 1/1 Running 14 (10m ago) 37h 192.168.210.234 anolis-7-9 <none> <none>
cm-acme-http-solver-94dv5 1/1 Running 14 (10m ago) 37h 192.168.210.247 anolis-7-9 <none> <none>
cm-acme-http-solver-klkpz 1/1 Running 14 (10m ago) 37h 192.168.210.230 anolis-7-9 <none> <none>
my-gitlab-certmanager-8457bfdc8-w858k 1/1 Running 14 (10m ago) 37h 192.168.240.118 anolis-7-7 <none> <none>
my-gitlab-certmanager-cainjector-74df787cf4-j7cfc 1/1 Running 14 (10m ago) 37h 192.168.240.66 anolis-7-7 <none> <none>
my-gitlab-certmanager-webhook-7b86db4c96-dhcxl 1/1 Running 14 (10m ago) 37h 192.168.240.95 anolis-7-7 <none> <none>
my-gitlab-gitaly-0 1/1 Running 14 (10m ago) 37h 192.168.210.228 anolis-7-9 <none> <none>
my-gitlab-gitlab-exporter-55dcfcb595-gl6nm 1/1 Running 14 (10m ago) 37h 192.168.210.242 anolis-7-9 <none> <none>
my-gitlab-gitlab-pages-848b78cbbb-7x6nt 1/1 Running 0 7m14s 192.168.240.115 anolis-7-7 <none> <none>
my-gitlab-gitlab-runner-5f6ff5994c-wdw5l 1/1 Running 3 (10m ago) 4h13m 192.168.210.222 anolis-7-9 <none> <none>
my-gitlab-gitlab-shell-55fdc9cb9f-52gnr 1/1 Running 14 (12m ago) 37h 192.168.240.76 anolis-7-7 <none> <none>
my-gitlab-gitlab-shell-55fdc9cb9f-cfhsh 1/1 Running 14 (10m ago) 37h 192.168.210.223 anolis-7-9 <none> <none>
my-gitlab-issuer-37-gqljk 0/1 Completed 0 7m14s 192.168.240.82 anolis-7-7 <none> <none>
my-gitlab-kas-688dc97ddd-28gr7 1/1 Running 40 (9m39s ago) 37h 192.168.240.96 anolis-7-7 <none> <none>
my-gitlab-kas-688dc97ddd-tvkvd 1/1 Running 46 (9m34s ago) 37h 192.168.210.245 anolis-7-9 <none> <none>
my-gitlab-migrations-37-t69sl 0/1 Completed 0 7m14s 192.168.240.75 anolis-7-7 <none> <none>
my-gitlab-minio-66f584f746-t6qwb 1/1 Running 6 (10m ago) 29h 192.168.210.251 anolis-7-9 <none> <none>
my-gitlab-minio-create-buckets-37-6lsd8 0/1 Completed 0 7m14s 192.168.240.97 anolis-7-7 <none> <none>
my-gitlab-nginx-ingress-controller-6bdd56c45-ch57n 1/1 Running 14 (10m ago) 37h 192.168.240.67 anolis-7-7 <none> <none>
my-gitlab-nginx-ingress-controller-6bdd56c45-cm2lz 1/1 Running 14 (10m ago) 37h 192.168.210.246 anolis-7-9 <none> <none>
my-gitlab-postgresql-0 2/2 Running 28 (10m ago) 37h 192.168.210.244 anolis-7-9 <none> <none>
my-gitlab-prometheus-server-646489c599-8mgc9 2/2 Running 28 (10m ago) 37h 192.168.210.208 anolis-7-9 <none> <none>
my-gitlab-redis-master-0 2/2 Running 28 (10m ago) 37h 192.168.210.239 anolis-7-9 <none> <none>
my-gitlab-registry-78fc549f8d-d2zjv 1/1 Running 14 (10m ago) 37h 192.168.240.98 anolis-7-7 <none> <none>
my-gitlab-registry-78fc549f8d-xbkvh 1/1 Running 14 (10m ago) 37h 192.168.210.240 anolis-7-9 <none> <none>
my-gitlab-sidekiq-all-in-1-v2-7ff55f699b-phhjt 1/1 Running 0 7m14s 192.168.210.235 anolis-7-9 <none> <none>
my-gitlab-toolbox-7f79f69d96-xvl47 1/1 Running 0 6m44s 192.168.240.101 anolis-7-7 <none> <none>
my-gitlab-webservice-default-6f5d96f89c-c779l 2/2 Running 0 7m14s 192.168.240.81 anolis-7-7 <none> <none>
my-gitlab-webservice-default-6f5d96f89c-m2svw 2/2 Running 0 5m7s 192.168.240.78 anolis-7-7 <none> <none>
[root@anolis-7-9 ~]#
查看项目 Pages 配置
默认 webservice-default
Deployment 只有两个副本,请等待 webservice-default
Deployment 恢复正常副本数后再查看, 否则页面数据在每次刷新可能结果不同
自定义域名
添加完成后,需要验证 DNS,如果你有域名 DNS 权限,可以选择添加 DNS 后刷新验证。 !
如果你没有 DNS 权限,或者你不想验证 DNS 权限,可以在管理页面取消验证。
取消验证后,需要重新添加域名才生效
访问效果
注意:由于此项目存在项目名问题,所以此效果是使用 https://framagit.org/xuxiaowei-com-cn/my-maven-app 的 domain
分支(无项目名)部署的,并且只能使用 http 方式访问 !
由于只配置了 externalHttp,所以只能通过 http 方式访问,https 将无法访问
自定义域名 SSL/TLS 证书 配置
导出 helm gitlab 配置
# 将已配置的值导出到文件中
helm -n gitlab-test get values my-gitlab > my-gitlab.yaml
查看 GitLab Pages Custom Domains Service 的 EXTERNAL-IP
[root@anolis-7-9 ~]# kubectl -n gitlab-test get service
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
cm-acme-http-solver-jpzhd NodePort 10.105.18.121 <none> 8089:32764/TCP 39h
cm-acme-http-solver-kvj5q NodePort 10.99.177.114 <none> 8089:30973/TCP 39h
cm-acme-http-solver-q82j2 NodePort 10.103.217.244 <none> 8089:32188/TCP 39h
my-gitlab-certmanager ClusterIP 10.101.131.129 <none> 9402/TCP 39h
my-gitlab-certmanager-webhook ClusterIP 10.104.249.65 <none> 443/TCP 39h
my-gitlab-gitaly ClusterIP None <none> 8075/TCP,9236/TCP 39h
my-gitlab-gitlab-exporter ClusterIP 10.104.47.204 <none> 9168/TCP 39h
my-gitlab-gitlab-pages-custom-domains LoadBalancer 10.97.49.247 172.25.25.32,10.97.49.247 80:32713/TCP 87m
my-gitlab-gitlab-pages-metrics ClusterIP 10.109.40.15 <none> 9235/TCP 3h3m
my-gitlab-gitlab-shell ClusterIP 10.107.227.187 <none> 22/TCP 39h
my-gitlab-kas ClusterIP 10.108.130.73 <none> 8150/TCP,8153/TCP,8154/TCP,8151/TCP 39h
my-gitlab-minio-svc ClusterIP 10.109.30.226 <none> 9000/TCP 39h
my-gitlab-nginx-ingress-controller LoadBalancer 10.102.62.140 <pending> 80:30875/TCP,443:31768/TCP,22:30561/TCP 39h
my-gitlab-nginx-ingress-controller-metrics ClusterIP 10.96.243.11 <none> 10254/TCP 39h
my-gitlab-postgresql ClusterIP 10.104.225.8 <none> 5432/TCP 39h
my-gitlab-postgresql-hl ClusterIP None <none> 5432/TCP 39h
my-gitlab-postgresql-metrics ClusterIP 10.107.233.118 <none> 9187/TCP 39h
my-gitlab-prometheus-server ClusterIP 10.101.151.224 <none> 80/TCP 39h
my-gitlab-redis-headless ClusterIP None <none> 6379/TCP 39h
my-gitlab-redis-master ClusterIP 10.103.127.195 <none> 6379/TCP 39h
my-gitlab-redis-metrics ClusterIP 10.104.184.133 <none> 9121/TCP 39h
my-gitlab-registry ClusterIP 10.107.98.111 <none> 5000/TCP 39h
my-gitlab-webservice-default ClusterIP 10.110.211.99 <none> 8080/TCP,8181/TCP,8083/TCP 39h
[root@anolis-7-9 ~]# kubectl -n gitlab-test get svc | grep gitlab-pages-custom-domains
my-gitlab-gitlab-pages-custom-domains LoadBalancer 10.97.49.247 172.25.25.32,10.97.49.247 80:32713/TCP 87m
[root@anolis-7-9 ~]#
修改配置
注意:此处填写的 externalHttp 不能和 gitlab 实例的 IP 相同
- 作者 gitlab 实例域名
gitlab.test.helm.xuxiaowei.cn
解析到172.25.25.32
- 作者 gitlab pages 域名
*.pages.test.helm.xuxiaowei.cn
、*.test.helm.xuxiaowei.io
解析到172.25.25.31
- 文档
global:pages:# 用于支持自定义域名、SSL/TLS 证书:仅支持 HTTPS 请求externalHttps:# HTTPS 请求到达 Pages daemon 的 IP 地址列表。用于支持自定义域名。# 使用上述 GitLab Pages Custom Domains Service 的部分 EXTERNAL-IP- 172.25.25.31- 10.97.49.247
更新配置
helm upgrade -n gitlab-test --install my-gitlab gitlab/gitlab --timeout 600s -f my-gitlab.yaml --version 7.7.0
可以观察到 GitLab Pages 无法部署
[root@anolis-7-9 ~]# kubectl -n gitlab-test get pod -o wide | grep gitlab-pages
my-gitlab-gitlab-pages-6b5f557b5c-pp6ww 0/1 Init:0/2 0 102s <none> anolis-7-9 <none> <none>
my-gitlab-gitlab-pages-848b78cbbb-7x6nt 1/1 Running 0 94m 192.168.240.115 anolis-7-7 <none> <none>
[root@anolis-7-9 ~]#
查看无法部署的原因
无法找到 my-gitlab-pages-tls
secret,原因是开启了自定义 域名 SSL/TLS 证书后,需要创建一个 TLS secret
[root@anolis-7-9 ~]# kubectl -n gitlab-test describe pod my-gitlab-gitlab-pages-6b5f557b5c-pp6ww
# 节选
Events:
Type Reason Age From Message---- ------ ---- ---- -------
Normal Scheduled 2m42s default-scheduler Successfully assigned gitlab-test/my-gitlab-gitlab-pages-6b5f557b5c-pp6ww to anolis-7-9
Warning FailedMount 34s (x9 over 2m42s) kubelet MountVolume.SetUp failed for volume "init-pages-secrets" : secret "my-gitlab-pages-tls" not found
[root@anolis-7-9 ~]#
创建 my-gitlab-pages-tls
TLS secret
openssl genrsa -out ca.key 2048
openssl req -new -x509 -days 3650 -key ca.key -subj "/C=CN/ST=山东/L=青岛/O=徐晓伟工作室/OU=徐晓伟工作室/CN=*.pages.test.helm.xuxiaowei.cn/CN=*.test.helm.xuxiaowei.io/emailAddress=xuxiaowei@xuxiaowei.com.cn" -out ca.crt -utf8
KEY_FILE=ca.key
CERT_FILE=ca.crt
CERT_NAME=my-gitlab-pages-tls
kubectl -n gitlab-test create secret tls ${CERT_NAME} --key ${KEY_FILE} --cert ${CERT_FILE}
重启 pages Deployment
[root@anolis-7-9 ~]# kubectl -n gitlab-test rollout restart deployment my-gitlab-gitlab-pages
deployment.apps/my-gitlab-gitlab-pages restarted
[root@anolis-7-9 ~]#
等待所有 pod 更新完成
[root@anolis-7-9 ~]# kubectl -n gitlab-test get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
cm-acme-http-solver-2ldtp 1/1 Running 14 (121m ago) 39h 192.168.210.234 anolis-7-9 <none> <none>
cm-acme-http-solver-94dv5 1/1 Running 14 (121m ago) 39h 192.168.210.247 anolis-7-9 <none> <none>
cm-acme-http-solver-klkpz 1/1 Running 14 (121m ago) 39h 192.168.210.230 anolis-7-9 <none> <none>
my-gitlab-certmanager-8457bfdc8-w858k 1/1 Running 14 (121m ago) 39h 192.168.240.118 anolis-7-7 <none> <none>
my-gitlab-certmanager-cainjector-74df787cf4-j7cfc 1/1 Running 14 (121m ago) 39h 192.168.240.66 anolis-7-7 <none> <none>
my-gitlab-certmanager-webhook-7b86db4c96-dhcxl 1/1 Running 14 (121m ago) 39h 192.168.240.95 anolis-7-7 <none> <none>
my-gitlab-gitaly-0 1/1 Running 14 (121m ago) 39h 192.168.210.228 anolis-7-9 <none> <none>
my-gitlab-gitlab-exporter-55dcfcb595-gl6nm 1/1 Running 14 (121m ago) 39h 192.168.210.242 anolis-7-9 <none> <none>
my-gitlab-gitlab-pages-6bd898c7d5-tvspn 1/1 Running 0 4m36s 192.168.240.104 anolis-7-7 <none> <none>
my-gitlab-gitlab-runner-5f6ff5994c-lbbjt 0/1 Running 0 21s 192.168.240.121 anolis-7-7 <none> <none>
my-gitlab-gitlab-shell-55fdc9cb9f-52gnr 1/1 Running 14 (123m ago) 39h 192.168.240.76 anolis-7-7 <none> <none>
my-gitlab-gitlab-shell-55fdc9cb9f-cfhsh 1/1 Running 14 (121m ago) 39h 192.168.210.223 anolis-7-9 <none> <none>
my-gitlab-issuer-38-742q6 0/1 Completed 0 91m 192.168.240.73 anolis-7-7 <none> <none>
my-gitlab-issuer-55-fp5rb 0/1 Completed 0 24m 192.168.240.105 anolis-7-7 <none> <none>
my-gitlab-kas-688dc97ddd-28gr7 1/1 Running 40 (120m ago) 39h 192.168.240.96 anolis-7-7 <none> <none>
my-gitlab-kas-688dc97ddd-tvkvd 1/1 Running 46 (120m ago) 39h 192.168.210.245 anolis-7-9 <none> <none>
my-gitlab-migrations-38-9mz5h 0/1 Completed 0 91m 192.168.210.252 anolis-7-9 <none> <none>
my-gitlab-migrations-55-tbpvq 0/1 Completed 0 24m 192.168.240.90 anolis-7-7 <none> <none>
my-gitlab-minio-66f584f746-t6qwb 1/1 Running 6 (121m ago) 31h 192.168.210.251 anolis-7-9 <none> <none>
my-gitlab-minio-create-buckets-38-lzrsj 0/1 Completed 0 91m 192.168.240.79 anolis-7-7 <none> <none>
my-gitlab-minio-create-buckets-55-g2gvz 0/1 Completed 0 24m 192.168.240.107 anolis-7-7 <none> <none>
my-gitlab-nginx-ingress-controller-6bdd56c45-ch57n 1/1 Running 14 (121m ago) 39h 192.168.240.67 anolis-7-7 <none> <none>
my-gitlab-nginx-ingress-controller-6bdd56c45-cm2lz 1/1 Running 14 (121m ago) 39h 192.168.210.246 anolis-7-9 <none> <none>
my-gitlab-postgresql-0 2/2 Running 28 (121m ago) 39h 192.168.210.244 anolis-7-9 <none> <none>
my-gitlab-prometheus-server-646489c599-8mgc9 2/2 Running 28 (121m ago) 39h 192.168.210.208 anolis-7-9 <none> <none>
my-gitlab-redis-master-0 2/2 Running 28 (121m ago) 38h 192.168.210.239 anolis-7-9 <none> <none>
my-gitlab-registry-78fc549f8d-d2zjv 1/1 Running 14 (121m ago) 39h 192.168.240.98 anolis-7-7 <none> <none>
my-gitlab-registry-78fc549f8d-xbkvh 1/1 Running 14 (121m ago) 39h 192.168.210.240 anolis-7-9 <none> <none>
my-gitlab-sidekiq-all-in-1-v2-84f99f6776-78g2z 1/1 Running 0 24m 192.168.210.197 anolis-7-9 <none> <none>
my-gitlab-toolbox-6cbbbdcbdf-v6mf2 1/1 Running 0 24m 192.168.210.202 anolis-7-9 <none> <none>
my-gitlab-webservice-default-79f7757847-2mw8g 2/2 Running 0 24m 192.168.210.215 anolis-7-9 <none> <none>
my-gitlab-webservice-default-79f7757847-gz9lm 2/2 Running 0 2m27s 192.168.240.117 anolis-7-7 <none> <none>
[root@anolis-7-9 ~]#
创建一个自定义域名 abc123.xuxiaowei.cn 证书
openssl genrsa -out ca.key 2048
openssl req -new -x509 -days 3650 -key ca.key -subj "/C=CN/ST=ShanDong/L=QingDao/O=xuxiaowei/OU=xuxiaowei/CN=abc123.xuxiaowei.cn/emailAddress=xuxiaowei@xuxiaowei.com.cn" -out ca.crt -utf8
新增/编辑域名,填写域名 SSL/TLS 证书
体验 域名 SSL/TLS 证书
号外号外!
极狐GitLab 正在推出DevSecOps 成熟度测评!链接:https://gitlab.cn/devsecops-assessment/ 测评非常全面并提供了可靠建议,即使不付费买产品,对自己想要落地 DevSecOps 的用户具有很高的参考意义!快来动手试试吧!
相关文章:

如何在极狐GitLab 自定义 Pages 域名、SSL/TLS 证书
本文作者:徐晓伟 GitLab 是一个全球知名的一体化 DevOps 平台,很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab 是 GitLab 在中国的发行版,专门为中国程序员服务。可以一键式部署极狐GitLab。 本文主要讲述了在极狐GitLab 用户…...

React Native 应用打包
引言 在将React Native应用上架至App Store时,除了通常的上架流程外,还需考虑一些额外的优化策略。本文将介绍如何通过配置App Transport Security、Release Scheme和启动屏优化技巧来提升React Native应用的上架质量和用户体验。 配置 App Transport…...

单链表就地逆置
算法思想:构建一个带头结点的单链表L,然后访问链表中的每一个数据结点,将访问到的数据结点依此插入到L的头节点之后。 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> typedef int ElemType; typedef s…...

MTU/TCPMSS/VLAN/ACCESS/TRUNK/HYBRID
MTU RFC标准定义以太网的默认MTU值为1500 最小64字节是为了保证最极端的冲突能被检测到,64字节是能被检测到的最小值;最大不超过1518字节是为了防止过长的帧传输时间过长而占用共享链路太长时间导致其他业务阻塞。所以规定以太网帧大小为64~1518字节&am…...
Spring Boot的基础知识和应用
在快速发展的软件开发领域,Spring Boot已经成为了一个广受欢迎的框架,它极大地简化了Spring应用的初始搭建以及开发过程。Spring Boot遵循“约定优于配置”的原则,通过默认配置减少了开发者的配置工作量,使得开发者能够更专注于业…...

【Linux】详解动静态库的制作和使用动静态库在系统中的配置步骤
一、库的作用 1、提高开发效率,让开发者所有的函数实现不用从零开始。 2、隐藏源代码。 库其实就是所有的.o文件用特定的方式进行打包形成一个文件,各个.o文件包含了源代码中的机器语言指令。 二、动态库和静态库的制作和使用 2.1、静态库的制作和使用…...
开源模型应用落地-qwen1.5-7b-chat-LoRA微调(二)
一、前言 预训练模型提供的是通用能力,对于某些特定领域的问题可能不够擅长,通过微调可以让模型更适应这些特定领域的需求,让它更擅长解决具体的问题。 本篇是开源模型应用落地-qwen-7b-chat-LoRA微调(一)进阶篇,学习通义千问最新1.5系列模型的微调方式。 二、术语介绍 …...

【现代企业管理】企业组织结构和组织文化的理论与实践——以华为为例
一、前言 管理是科学和艺术的统一体,它是企业成长的保证。企业管理中,管理者面对的往往不是一个完整的系统,而是各种不具有整体规律性的零碎信息的总和,因此进行信息的整合和研究是管理的重点和关键。 组织管理作为管理的四大职…...
【Kotlin】Sequence简介
1 前言 序列(Sequence)是 Kotlin 中为方便操作集合及其元素而定制的接口,是一个延迟获取数据的集合,只有需要元素时才会生产元素。在处理大量数据时,序列可以显著地提升性能。 Sequence 类似 Java 中的 Stream…...

【Java】Thread详解
🍒前言 本文将从以下几方面来展开对Thread的介绍。 1.线程创建 2.线程中断 3.线程等待 4.线程休眠 在前面的文章中,已经总结了关于Thread的一些理解。 在阅读本文之前,最好对其有一些基础的了解。 文章链接: 【JavaSE】进程是什么?…...
QT TCP和UDP网络编程
代表网络概念的QTcpSocket,QTcpServer和QUdpSocket,以及QNetworkRequest,QNetworkReply和QNetworkAccessManager之类的高级类来执行使用通用协议的网络操作。 它还提供了QNetworkConfiguration,QNetworkConfigurationManager和QNetworkSession等,实现承载…...
Maven入门指南:构建与管理Java项目的利器
引言 在Java开发领域,项目构建和管理是一个至关重要的环节。随着项目规模和复杂度的不断增加,有效地管理项目的依赖、构建过程以及部署流程变得尤为关键。在这样的背景下,Apache Maven作为一款优秀的项目管理工具应运而生,成为了…...

EXCEL-VB编程实现自动抓取多工作簿多工作表中的单元格数据
一、VB编程基础 1、 EXCEL文件启动宏设置 文件-选项-信任中心-信任中心设置-宏设置-启用所有宏 汇总文件保存必须以宏启动工作簿格式类型进行保存 2、 VB编程界面与入门 参考收藏 https://blog.csdn.net/O_MMMM_O/article/details/107260402?spm1001.2014.3001.5506 二、…...

用Vue仿了一个类似抖音的App
大家好,我是 Java陈序员。 今天,给大家介绍一个基于 Vue3 实现的高仿抖音开源项目。 关注微信公众号:【Java陈序员】,获取开源项目分享、AI副业分享、超200本经典计算机电子书籍等。 项目介绍 douyin —— 一个基于 Vue、Vite 实…...

HarmonyOS 应用开发之非线性容器
非线性容器实现能快速查找的数据结构,其底层通过hash或者红黑树实现,包括HashMap、HashSet、TreeMap、TreeSet、LightWeightMap、LightWeightSet、PlainArray七种。非线性容器中的key及value的类型均满足ECMA标准。 HashMap HashMap 可用来存储具有关联…...

Golang Context是什么
一、这篇文章我们简要讨论Golang的Context有什么用 1、首先说一下Context的基本作用,然后在讨论他的实现 (1)数据传递,子Context只能看到自己的和父Context的数据,子Context是不能看到孙Context添加的数据。 (2)父子协程的协同,比…...

算法基础--递推
😀前言 递推算法在计算机科学中扮演着重要的角色。通过递推,我们可以根据已知的初始条件,通过一定的规则推导出后续的结果,从而解决各种实际问题。本文将介绍递推算法的基础知识,并通过一些入门例题来帮助读者更好地理…...

超市销售数据-python数据分析项目
Python数据分析项目-基于Python的销售数据分析项目 文章目录 Python数据分析项目-基于Python的销售数据分析项目项目介绍数据分析结果导出数据查阅 数据分析内容哪些类别比较畅销?哪些商品比较畅销?不同门店的销售额占比哪个时间段是超市的客流高封期?查看源数据类型计算本月…...
java实现手机号,密码,游邮箱 , 验证码的正则匹配工具类
先定义一个抽象类RegexPatterns,定义相关正则字符串 : public abstract class RegexPatterns {/*** 手机号正则*/public static final String PHONE_REGEX "^1([38][0-9]|4[579]|5[0-3,5-9]|6[6]|7[0135678]|9[89])\\d{8}$";/*** 邮箱正则*/public stat…...
java中的Arrays类的常用操作
Arrays类位于 java.util 包中,主要包含了操作数组的各种方法。 import java.util.Arrays; Arrays.sort(arr); int index Arrays.binarySearch(arr, 3); boolean isEqual Arrays.equals(arr1, arr2); // isEqual为true int[] arrnew int[5]; Arrays.fill(arr, 7)…...

网络编程(Modbus进阶)
思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...

Debian系统简介
目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版ÿ…...

HTML 列表、表格、表单
1 列表标签 作用:布局内容排列整齐的区域 列表分类:无序列表、有序列表、定义列表。 例如: 1.1 无序列表 标签:ul 嵌套 li,ul是无序列表,li是列表条目。 注意事项: ul 标签里面只能包裹 li…...

苍穹外卖--缓存菜品
1.问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得,如果用户端访问量比较大,数据库访问压力随之增大 2.实现思路 通过Redis来缓存菜品数据,减少数据库查询操作。 缓存逻辑分析: ①每个分类下的菜品保持一份缓存数据…...
Qt Http Server模块功能及架构
Qt Http Server 是 Qt 6.0 中引入的一个新模块,它提供了一个轻量级的 HTTP 服务器实现,主要用于构建基于 HTTP 的应用程序和服务。 功能介绍: 主要功能 HTTP服务器功能: 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...

企业如何增强终端安全?
在数字化转型加速的今天,企业的业务运行越来越依赖于终端设备。从员工的笔记本电脑、智能手机,到工厂里的物联网设备、智能传感器,这些终端构成了企业与外部世界连接的 “神经末梢”。然而,随着远程办公的常态化和设备接入的爆炸式…...
第八部分:阶段项目 6:构建 React 前端应用
现在,是时候将你学到的 React 基础知识付诸实践,构建一个简单的前端应用来模拟与后端 API 的交互了。在这个阶段,你可以先使用模拟数据,或者如果你的后端 API(阶段项目 5)已经搭建好,可以直接连…...
32单片机——基本定时器
STM32F103有众多的定时器,其中包括2个基本定时器(TIM6和TIM7)、4个通用定时器(TIM2~TIM5)、2个高级控制定时器(TIM1和TIM8),这些定时器彼此完全独立,不共享任何资源 1、定…...

【iOS】 Block再学习
iOS Block再学习 文章目录 iOS Block再学习前言Block的三种类型__ NSGlobalBlock____ NSMallocBlock____ NSStackBlock__小结 Block底层分析Block的结构捕获自由变量捕获全局(静态)变量捕获静态变量__block修饰符forwarding指针 Block的copy时机block作为函数返回值将block赋给…...
文件上传漏洞防御全攻略
要全面防范文件上传漏洞,需构建多层防御体系,结合技术验证、存储隔离与权限控制: 🔒 一、基础防护层 前端校验(仅辅助) 通过JavaScript限制文件后缀名(白名单)和大小,提…...