v8运维知识

udc应用推送

# 在开发环境中:
cd /home/app
sh image.sh
# 此时输入镜像名称 kube的yaml文件中具体镜像名称
# 例如:10.242.56.29/seeyon-dev/xxx-1.0.0
# 2、在搭建环境、生产环境 中执行
cd /home/app
sh push-image.sh
# 输入镜像包名称 xxx.tar
# 输入命名空间

研发补丁包前端包

# 解压后是 portal文件夹,meta.properties,patch.properties 	为前端包

wget 'https:xxxx'
mv xxxx(链接wget出来的文件) v8.zip
unzip v8.zip
cd portal/frontend/content/

开发:
for i  in `ls` ; do obsutil cp -r -f --flat $i/ obs://obs-zjjt-jttyoa-dev-0001/$i ;done

搭建:
for i  in `ls` ; do obsutil cp -r -f --flat $i/ obs://obs-zjjt-jttioa-pre-public/$i ;done

预生产:
for i  in `ls` ; do obsutil cp -r -f --flat $i/ obs://obs-zjjt-jttioa-pre02-public/$i ;done

研发补丁包组件包

# 解压后为 fe_comp文件夹、log.txt 的,为前端组件包
wget 'https:xxxx'
mv xxxx(链接wget出来的文件) v8.zip
unzip v8.zip
cd fe_comp

开发:
obsutil cp -r -f --flat web/libs/ obs://obs-zjjt-jttyoa-dev-0001/libs/

搭建:
obsutil cp -r -f --flat web/libs/ obs://obs-zjjt-jttioa-pre-public/libs/

预生产:
obsutil cp -r -f --flat web/libs/ obs://obs-zjjt-jttioa-pre02-public/libs/

研发补丁包镜像部署

# wget下载研发补丁包 解压后为 tar的,为后端镜像包
wget https://seeyon-product-private.oss-cn-beijing.aliyuncs.com/a9c-install-history/V5.0.3_20250918/arm/tomcat/udc-arm-5.3.292.zip?OSSAccessKeyId=TMP.3KpYMgJVkvpM2Geykx8eeZPFptmvMBEByF1wertxEeUJxSthL2rCvDV7k3PFDxJtpyr35VntNaLx9yKM3qZpnqpAaQVniC&Expires=1758551942&Signature=pJKZzy0IKhYPRbfaXoECu5bc7mU%3D
# 解压
unzip xxx.zip
# load研发docker包
docker load -i edoc335172694483814428.tar
# 改研发包docker标签
docker tag seeyonv8-registry-vpc.cn-beijing.cr.aliyuncs.com/xinchuang_arm/edoc335172694483814428:5.3.761 10.241.62.88/seeyon-oa/edoc335172694483814428:5.3.761
# push研发包到对应环境docker仓库
docker push 10.241.62.88/seeyon-oa/edoc335172694483814428:5.3.761
# 重启对应微服务,改镜像版本


#比如
docker load -i bpm.tar
#开发:
docker tag seeyonv8-registry-vpc.cn-beijing.cr.aliyuncs.com/xinchuang_arm/bpm:5.3.296 10.242.56.29/seeyon-dev/bpm:5.3.296
docker push 10.242.56.29/seeyon-dev/bpm:5.3.296
#在kuborad上将镜像替换

#搭建:
docker tag seeyonv8-registry-vpc.cn-beijing.cr.aliyuncs.com/xinchuang_arm/bpm:5.3.296 10.241.64.92/seeyon-wsc/bpm:5.3.296
docker push 10.241.64.92/seeyon-wsc/bpm:5.3.296
在kuborad上将镜像替换

#预生产:
docker tag seeyonv8-registry-vpc.cn-beijing.cr.aliyuncs.com/xinchuang_arm/bpm:5.3.296 10.241.64.92/seeyon-pre/bpm:5.3.296
docker push 10.241.64.92/seeyon-pre/bpm:5.3.296
#在kuborad上将镜像替换

#生产:
#预生产:
docker tag seeyonv8-registry-vpc.cn-beijing.cr.aliyuncs.com/xinchuang_arm/bpm:5.3.296 10.241.62.88/seeyon-oa/bpm:5.3.296
docker push 10.241.62.88/seeyon-oa/bpm:5.3.296
#在kuborad上将镜像替换

脚本

推送udc脚本内容

image.sh

#!/bin/bash
read -p '请输入镜像名称:' IMAGE
docker pull $IMAGE
if [ $? -eq 0 ]; then
	echo "pull success"
else
	echo "pull fail"
	exit 1
fi
tar_name=$(echo $IMAGE | awk -F':' '{print $2}' | awk -F'-' '{print $1}').tar
docker save -o $tar_name $IMAGE
if [ $? -eq 0 ]; then
	echo "success"
else
        echo "fail"
fi
chmod 777 $tar_name
mv $tar_name /home/app
ls /home/app/$tar_name
if [ $? -eq 0 ]; then
        echo "镜像已保存到/home/app"
else
	echo "无$tar_name"
fi
obsutil cp -r -f /home/app/$tar_name obs://obs-zjjt-jttyoa-dev-0001/udctuisong/

push-image.sh

#!/bin/bash

# 输入镜像包名称
read -p "请输入镜像包名称(xxx.tar):" tar_name
#拉取镜像
cd /home/app/
obsutil cp -r -f obs://obs-zjjt-jttyoa-dev-0001/udctuisong/$tar_name ./
# 检查文件是否存在
if [ ! -f "$tar_name" ]; then
	echo "错误:文件 $tar_name 不存在!"
	exit 1
fi

# 加载镜像并获取完整镜像名称
echo "正在加载镜像..."
load_output=$(docker load -i "$tar_name")
if [ $? -ne 0 ]; then
	echo "镜像加载失败!"
	exit 1
fi

full_image_name=$(echo "$load_output" | awk '{print $3}')
if [ -z "$full_image_name" ]; then
	echo "无法获取镜像名称!"
	exit 1
fi

# 从tar文件名提取基本名称(去除.tar)
base_name=$(basename "$tar_name" .tar)

# 从完整镜像名称中匹配源tag
src_tag_name=$(echo "$full_image_name" | grep -o "$base_name[^:]*")
if [ -z "$src_tag_name" ]; then
	echo "无法从镜像名称中提取tag部分!"
	exit 1
fi	

echo "加载的镜像tag是: $src_tag_name"

# 构建目标tag名称
dest_tag_name="10.241.62.88/seeyon-oa/dyapp:$src_tag_name"
echo "目标镜像地址: $dest_tag_name"

# 重新打tag
echo "正在重新打tag..."
docker tag "$full_image_name" "$dest_tag_name"
if [ $? -ne 0 ]; then
	echo "打tag失败!"
	exit 1
fi

# 推送镜像
echo "正在推送镜像..."
docker push "$dest_tag_name"
if [ $? -eq 0 ]; then
	echo "$dest_tag_name 推送成功"
else
	echo "镜像推送失败!"
	exit 1
fi

echo "操作完成"

应用调优

提示

1、去掉-Xmn4G,给收集器自由分配的空间【公文】

2、去掉-Xdebug -Xnoagent -Djava.compiler=NONE 【提升性能,生产所有应用,注意修改会引起服务重启】

3、去掉-Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8888 【提升性能,生产所有应用,注意修改会引起服务重启】

4、增加-XX:G1HeapRegionSize=16M,当前堆够大,增加该参数降低大对象分配问题与gc压力【公文】

5、-XX:+PrintGCTimeStamps 改为 -XX:+PrintGCDateStamps,gc日志记录具体时间【生产所有应用,注意修改会引起服务重启】

GitLab

数据库和仓库位置分析

基于您提供的 Docker 命令,以下是关键存储位置:

容器内路径宿主机挂载路径用途说明
/etc/gitlab/data/gitlab/etcGitLab 配置文件(包括 gitlab.rb
/var/log/gitlab/data/gitlab/log日志文件
/var/opt/gitlab/data/gitlab/opt核心数据存储区
├── postgresql/data/data/gitlab/opt/postgresql/data数据库文件(PostgreSQL)
└── git-data/repositories/data/gitlab/opt/git-data/repositories代码仓库(按哈希存储)

如何检索和获取对应项目的代码文件?

1. 找到对应项目的仓库路径

在GitLab中,每个项目的代码仓库按照一定的哈希规则存储在/var/opt/gitlab/git-data/repositories下。路径规则为:

@hashed/{a}/{b}/{project_id}-{project_path}.git

其中:

  • a是项目ID(十六进制)的前一位(取模后的值)
  • b是项目ID(十六进制)的后一位(取模后的值)
  • project_id是项目的数字ID
  • project_path是项目的路径(例如:group/project

例如,如果项目ID为123,路径为mygroup/myproject,则仓库路径可能为:

@hashed/7b/9b/123-mygroup/myproject.git

2. 如何知道项目ID和路径?

您可以通过以下方式获取:

在容器内执行:

gitlab-rails runner "Project.all.each { |p| puts \"ID: #{p.id}, Path: #{p.path}, Full Path: #{p.full_path}, Storage: #{p.repository_storage}\" }"

这将列出所有项目的ID、路径(相对于命名空间的路径)、完整路径(包括命名空间)和存储位置。

3. 如何访问项目代码?

一旦您知道了项目的仓库路径(例如/var/opt/gitlab/git-data/repositories/@hashed/7b/9b/123-mygroup/myproject.git),您可以通过Git命令来访问:

在容器内,您可以使用git clonegit log等命令来查看:

# 进入项目仓库
cd /var/opt/gitlab/git-data/repositories/@hashed/7b/9b/123-mygroup/myproject.git

# 克隆项目到临时目录(如果需要)
git clone /var/opt/gitlab/git-data/repositories/@hashed/7b/9b/123-mygroup/myproject.git /tmp/myproject

# 查看项目内容
ls -la /tmp/myproject

4. 如果无法进入容器(在宿主机上操作)

由于仓库挂载在宿主机上,您可以直接在宿主机上访问:

cd /data/gitlab/opt/git-data/repositories/@hashed/7b/9b/123-mygroup/myproject.git

# 或者克隆到宿主机
git clone /data/gitlab/opt/git-data/repositories/@hashed/7b/9b/123-mygroup/myproject.git

5. 如果您无法确定项目对应的仓库路径

如果您不知道项目ID和路径,可以按照以下步骤查找:

  1. 在宿主机上,列出/data/gitlab/opt/git-data/repositories/@hashed目录下的所有子目录(第一层)。
  2. 查看每个哈希目录(如7b)下的子目录(如9b),然后查看其中的.git目录(例如123-mygroup/myproject.git)。
  3. 打开.git目录,查看里面的config文件(如果存在),里面可能会有项目的远程信息(例如GitLab的URL),这可以帮助您识别是哪个项目。

文件结构说明

仓库目录遵循Git的标准结构:

@hashed/
├── 7b/                    # 第一层哈希目录(项目ID取模)
│   └── 9b/                # 第二层哈希目录(项目ID取模)
│       ├── 123-mygroup.myproject.git/  # 项目仓库(Git标准格式)
│       │   ├── HEAD
│       │   ├── objects/   # 存储实际代码(二进制压缩文件)
│       │   ├── refs/      # 分支/标签引用
│       │   └── config     # 仓库配置
│       └── 456-anothergroup.anotherproject.git/  # 其他项目...


@hashed/ab/cd/project-name.git/
├── HEAD          # 分支指针
├── objects/      # Git 对象存储区(核心数据)
│   ├── 01/       # 内容哈希目录
│   ├── info/     # 垃圾回收信息
│   └── pack/     # 压缩包文件
├── refs/         # 引用(分支/标签)文件
└── config        # 仓库配置

假设找到目标项目路径为:@hashed/7b/9b/123-mygroup.myproject.git

完整导出项目代码:

cd /data/gitlab/opt/git-data/repositories
git clone @hashed/7b/9b/123-mygroup.myproject.git /tmp/exported_code

# 拿到本地获取文件
ls -la /data/gitlab/opt/git-data/repositories/@hashed/ | grep "项目B"
# 在宿主机上查找项目仓库(已知项目名 project-a)
find /data/gitlab/opt/git-data/repositories -path "*/project-a.git*" -name "*.zip"
# 输出示例:/data/gitlab/opt/git-data/repositories/@hashed/7b/9b/project-a.git/releases/v1.0.zip

# 进入仓库目录
cd /var/opt/gitlab/git-data/repositories/@hashed/7b/9b/project-a.git
# 提取二进制文件(必须用 git show,不能直接 cp)
git show HEAD:releases/v1.0.zip > /tmp/v1.0.zip