游之 - 博文
type: channel
link: https://mikuai.world/category/bw/
items: 在PHP容器环境安装PHP-SG11扩展
items: Omnivore 的私有化部署尝试
items: 离线安装 Kubernetes 高可用集群并设置证书期限
items: Docker安装SonarQube并配置阿里P3C规范
items: 基于rsync + inotify实现服务器间文件实时同步
items: 基于阿里云API实现DDNS内网穿透功能
items: 快速部署一套CICD环境

在PHP容器环境安装PHP-SG11扩展
type: item
date: 2024-04-16T11:07:00+08:00
description: SourceGuardian 安全组件是 PHP 中较为重要和安全级别较高的安全组件，目前大部分 php 官方镜像未安装或启用 SG11，所以如果你的项目需要此组件，则可以参照此文档一、配置 Dockerfile在你原有的 Dockerfile 中，FROM 下面一行添加下述命令，RUN PHP_VERSION=$(php -v | head -n1 | cut -d' ' -f2 | cut -d. -f1-2) \ && mkdir -p /tmp/sourceguardian \ && cd /tmp/sourceguardian \ && curl -Os https://www.sourceguardian.com/loaders/download/loaders.linux-x86_64.tar.gz \ && tar xzf loaders.linux-x86_64.tar.gz \ && cp ixed.${PHP_VERSION}.lin "$(php -i | grep '^extension_dir =' | cut -d' ' -f3)/sourceguardian.so" \ && echo "extension=sourceguardian.so" > $PHP_INI_DIR/conf.d/15-sourceguardian.ini \ && rm -rf /tmp/sourceguardian 注意要放在 COPY 你的代码之前，避免每次构建重新剥离层。如果基础镜像用的是alpine，可能会缺少libudev库，这是因为alpine默认使用的是mdev，建议替换基础镜像非alpine的，本文方案只测试过基于非alpine镜像的php镜像二、验证是否开启当访问时查看是否存在如下信息，如果有则证明添加成功三、完整示例本示例是一个Typecho的运行环境，新建一个文件 Dockerfile，内容如下，构建后运行，将typecho目录挂载到 /var/www/html 即可FROM php:7.4-fpm RUN sed -i 's/deb.debian.org/mirrors.tuna.tsinghua.edu.cn/g' /etc/apt/sources.list RUN apt-get update && export DEBIAN_FRONTEND=noninteractive && apt-get install -y pkg-config zlib1g-dev libwebp-dev libjpeg-dev libpng-dev libfreetype6-dev \ tzdata \ && cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \ && echo "Asia/Shanghai" > /etc/timezone \ && docker-php-ext-configure gd \ --with-freetype=/usr/include/freetype2 \ --with-jpeg=/usr/include/ \ --with-webp=/usr/include/webp \ && docker-php-ext-install -j$(nproc) gd \ && docker-php-ext-install mysqli pdo pdo_mysql && docker-php-ext-enable mysqli # 安装sourceguardian对应版本loader RUN PHP_VERSION=$(php -v | head -n1 | cut -d' ' -f2 | cut -d. -f1-2) \ && mkdir -p /tmp/sourceguardian \ && cd /tmp/sourceguardian \ && curl -Os https://www.sourceguardian.com/loaders/download/loaders.linux-x86_64.tar.gz \ && tar xzf loaders.linux-x86_64.tar.gz \ && cp ixed.${PHP_VERSION}.lin "$(php -i | grep '^extension_dir =' | cut -d' ' -f3)/sourceguardian.so" \ && echo "extension=sourceguardian.so" > $PHP_INI_DIR/conf.d/15-sourceguardian.ini \ && rm -rf /tmp/sourceguardian RUN s…

Omnivore 的私有化部署尝试
type: item
date: 2024-04-15T09:26:00+08:00
description: 本文适用于 omnivore android-0.200.5 版本，其他分支是否有变化暂无可知，内容仅做参考，测试于 2024-4-12部署架构api 服务migrate 脚本web 服务content-fetch 服务PostgreSQL 数据库redis 数据库本地存储一些问题：content-fetch 服务报错 redisURL not supplied，缺少 redis 支持，需要安装 redis 数据库并给服务配置环境变量 REDIS_URL=redis://redis:6379 和 MQ_REDIS_URL=redis://redis:6379web 页面重置密码错误，api 后台报错 redis 初始化失败错误，解决办法同上，可通过查看源码发现问题web 页面重置密码，提示邮件已发送，但是未收到，可能是邮箱配置（还未解决，源码发现使用的是 Sendgrid 服务来发送邮件， packages/api/src/utils/sendEmail.ts， SENDGRID_MSGS_API_KEY）web 页面注册页 提示 Application error: a client-side exception has occurred (see the browser console for more information). 怀疑是谷歌人机校验问题，检查源码 ./packages/web/components/templates/auth/EmailSignup.tsx 和 ./packages/api/src/routers/auth/auth_router.ts 部分，确定环境变量 RECAPTCHA_CHALLENGE_SECRET_KEY https://cloud.tencent.com/developer/article/2199414API 服务的所有环境变量可在此查看 packages/api/src/util.ts不使用 GAE 部署，即使用本地自建时，api 服务的环境变量 API_ENV 设置应为 API_ENV=local页面无修改密码的接口，考虑修改数据库实现（重置密码依赖邮件发送服务 Sendgrid）,参考 packages/db/setup.sh# create demo user with email: demo@omnivore.app, password: demo_password if [ -z "${NO_DEMO_USER}" ]; then USER_ID=$(uuidgen) PASSWORD='$2a$10$41G6b1BDUdxNjH1QFPJYDOM29EE0C9nTdjD1FoseuQ8vZU1NWtrh6' psql --host $PG_HOST --username $POSTGRES_USER --dbname $PG_DB --command "INSERT INTO omnivore.user (id, source, email, source_user_id, name, password) VALUES ('$USER_ID', 'EMAIL', 'demo@omnivore.app', 'demo@omnivore.app', 'Demo User', '$PASSWORD'); INSERT INTO omnivore.user_profile (user_id, username) VALUES ('$USER_ID', 'demo_user');" echo "created demo user with email: demo@omnivore.app, password: demo_password" fiweb 剪藏插件默认连接官方地址，暂未发现配置修改方式，可能需要修改源码重新制作插件Android 版可正常连接自建服务，但是添加稍后读貌似不行，原因没细究，web 端应该是好使的。问题太多了，自建还不太成熟，要不从源码开始调整，要么放弃吧下载源代码git clone https://github.com/extdomains/github.com/omnivore-app/omnivore.git cd omnivore git checkout android-0.200.5镜像构建国内构建需要修改 apk，apt 和 npm 源，因此需要逐个修改 Dockerfile，修改项为以下几个，后面会给我修改后的文件内容：使用 alpine 镜像的，需在 apk 执行前添加RUN sed -i "s/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g" /etc/apk/repositories…

离线安装 Kubernetes 高可用集群并设置证书期限
type: item
date: 2024-03-02T09:44:00+08:00
description: 在查阅 Kubernetes 官方文档时，发现官方文档关于部署高可用集群的内容较为离散，本文整合相关内容并按照离线环境下的高可用集群安装进行一个较为完善的说明。一、架构说明本文旨在完成一个堆叠 ETCD 集群的高可用 Kubernetes 集群，包含三个层次，分别是工作节点，负载均衡器和控制平面节点，详细架构如下图：堆叠的 etcd 拓扑从架构看，服务器类型分为三大部分：控制平面节点（含 etcd）、负载均衡器、工作节点。负载均衡器在本文档采用软件方案（Nginx + Keepalived 实现），后续部署说明按如下的服务器规划执行：服务器类型IP主机名部署内容负载均衡器10.10.0.12k8s-lb1Nginx、Keepalived负载均衡器10.10.0.13k8s-lb2Nginx、Keepalived负载均衡器10.10.0.14k8s-lb3Nginx、Keepalived控制平面节点（含 etcd）10.10.0.15k8s-master1docker，cri-dockerd，kubeadm，kubectl，kubelet，kube-apiserver，kube-controller-manager，kube-scheduler，kube-proxy，etcd控制平面节点（含 etcd）10.10.0.16k8s-master2docker，cri-dockerd，kubeadm，kubectl，kubelet，kube-apiserver，kube-controller-manager，kube-scheduler，kube-proxy，etcd控制平面节点（含 etcd）10.10.0.17k8s-master3docker，cri-dockerd，kubeadm，kubectl，kubelet，kube-apiserver，kube-controller-manager，kube-scheduler，kube-proxy，etcd工作节点10.10.0.19k8s-node1docker，cri-dockerd，kubeadm，kubectl，kubelet，kube-proxy说明 ：LB 的 IP:Port 设置为 10.10.0.18:16443kube-apiserver，kube-controller-manager，kube-scheduler，kube-proxy，etcd 均使用 Kubernetes 管理的容器部署工作节点可扩展，部署内容一样服务器操作系统本文档选择 Ubuntu 20.04，内核版本 5.15.0-112-generic架构中未提及网络部分，在 Kubernetes 集群中，容器网络由 CNI 网络插件实现，本文的部署使用 Calico 网络二、准备物料本文档说明的安装在非公网环境，需要先按如下内容在可访问公网的机器进行部署物料包的准备，如果是公网环境，自行将相应包使用包管理器安装，或者也按离线方式安装。1 - 维护工具包在后续维护中，我们需要进行 ipvs 规则查看、时间同步等操作，因此需要安装相关软件：ipvs 相关：ipvsadm_1.31-1_amd64.deblibipset13_7.5-1ubuntu0.20.04.1_amd64.debipset_7.5-1ubuntu0.20.04.1_amd64.deb时间同步相关：ntpdate_4.2.8p12+dfsg-3ubuntu4.20.04.1_amd64.deb工具包打包至 tools.tar.gz2 - 容器运行时（Docker CE）自 1.24 版起，Dockershim 已从 Kubernetes 项目中移除, 需要使用 cri-dockerd 适配器来将 Docker Engine 与 Kubernetes 集成，因此除了安装 Docker CE 外，还需要安装 cri-dockerdDocker CE :containerd.io_1.6.21-1_amd64.debdocker-ce_24.0.2-1ubuntu.20.04focal_amd64.debdocker-ce-cli_24.0.2-1ubuntu.20.04focal_amd64.debcri-dockerd :cri-dockerd_0.3.9.3-0.ubuntu-focal_amd64.debDocker CE 安装包打包至 DockerCE.tar.gz3 - kubeadm、kubelet、kubectl使用 kubeadm 安装 Kubernetes 时，kubelet、kubectl 是作为二进制服务运行的，kubeadm 不负责安装，需要手动安装配置。如下为安装包下载地址：Dep :conntrack_1.4.5…

Docker安装SonarQube并配置阿里P3C规范
type: item
date: 2021-09-15T21:05:00+08:00
description: Docker安装SonarQube并配置阿里P3C规范SonarQube Mysql安装安装docker run -itd --restart=always -p 17007:3306 -e MYSQL_ROOT_PASSWORD=sonarQube@2020 -v sonarqube-mysql-conf:/etc/mysql/conf.d -v sonarqube-mysql-data:/var/lib/mysq --name sonarqube-mysql mysql:5.7配置mysqlmysql.cnf添加[mysqld] sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES max_allowed_packet=100M innodb_log_file_size=640M 初始化登录mysql执行如下sql： CREATE DATABASE sonar CHARACTER SET utf8 COLLATE utf8_general_ci; CREATE USER 'sonar' IDENTIFIED BY 'sonar'; GRANT ALL ON sonar.* TO 'sonar'@'%' IDENTIFIED BY 'sonar'; GRANT ALL ON sonar.* TO 'sonar'@'localhost' IDENTIFIED BY 'sonar'; FLUSH PRIVILEGES;SonarQube 安装配置主机内核参数（大于等于以下值即可）sysctl -w vm.max_map_count=262144 sysctl -w fs.file-max=65536 ulimit -n 65536 ulimit -u 4096安装SonarQubedocker run -itd --restart=always -p 9000:9000 -e SONARQUBE_JDBC_URL='jdbc:mysql://10.0.55.117:17007/sonar?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useConfigs=maxPerformance&useSSL=false' -e SONARQUBE_JDBC_USERNAME=sonar -e SONARQUBE_JDBC_PASSWORD=sonar -v sonarqube-data:/opt/sonarqube/data -v sonarqube-logs:/opt/sonarqube/logs -v sonarqube-extensions:/opt/sonarqube/extensions --name sonarqube sonarqube:7.4-communitySonarQube Sancenr安装(zip)wget https://github.com/SonarSource/sonar-scanner-cli/releases/download/4.4.0.2170/sonar-scanner-cli-4.4.0.2170-linux.zip unzip sonar-scanner-cli-4.4.0.2170-linux.zip mkdir /sonarQubeScanner mv sonar-scanner-cli-4.4.0.2170-linux /sonarQubeScanner修改配置文件，连接sonar服务器vi /sonarQubeScanner/sonar-scanner-4.4.0.2170-linux/conf/sonar-scanner.properties #添加如下内容 # 默认SonarQube服务地址，地址根据实际情况更改 sonar.host.url=http://10.0.45.220:9000 # 默认源代码编码 sonar.sourceEncoding=UTF-8配置环境变量vim /etc/profile 末尾添加一行 export PATH="$PATH:/sonarQubeScanner/sonar-scanner-4.4.0.2170-linux/bin" source /etc/profileSonarQube Sancenr安装(docker)参考： https://docs.sonarqube.org/latest/analysis/scan/sonarscanner/docker run \ --rm \ -e SONAR_HOST_URL="http://${SONARQUBE_URL}" \ -v "${YOUR_REPO…

基于rsync + inotify实现服务器间文件实时同步
type: item
date: 2021-09-15T20:53:00+08:00
description: 方案说明首先inotify监控文件系统的各种变化，当文件有任何变动时，就触发rsync同步，则该源服务器为主动，那它就是客户端，备份服务器为被动方，那它就是服务端(-deamon)。如此达到实时同步目的。实现源服务器文件变动后同步更新至备份服务器环境说明服务器均为 Centos7rsync 安装yum -y install rsync firewall-cmd --add-port=873/tcp --permanent firewall-cmd --reload systemctl start rsyncd.service systemctl enable rsyncd.service systemctl status rsyncd.service netstat -lnp|grep 873备份服务器（server端 192.168.1.102）rsync 配置建立用户与密码认证文件mkdir -p /etc/rsyncd/ echo "backup:bk_password" > /etc/rsyncd/rsyncd.passwd chmod 0600 /etc/rsyncd/rsyncd.passwd建立rsync配置文件# vi /etc/rsyncd.conf uid = root gid = root use chroot = no max connections = 4 strict modes = yes hosts allow = * port = 873 pid file = /var/run/rsyncd.pid lock file = /var/run/rsync.lock log file = /var/log/rsyncd.log ignore nonreadable = yes dont compress = *.gz *.tgz *.zip *.z *.Z *.rpm *.deb *.bz2 [test] path = /opt/test ignore errors read only = false write only = false list = false auth users = backup secrets file = /etc/rsyncd/rsyncd.passwd PS：注意这里要将 read only 修改为 false, 因为是要将文件同步到该模块的，必须可写重新启动systemctl restart rsyncd.service源服务器 （client端 192.168.1.101）rsync 安装rsync 安装yum -y install rsync firewall-cmd --add-port=873/tcp --permanent firewall-cmd --reload建立访问server端的密码认证文件mkdir -p /etc/rsyncd/ echo "bk_password" > /etc/rsyncd/rsync.passwd chmod 600 /etc/rsyncd/rsync.passwd执行如下命令初始同步 /opt/test 目录rsync -avzr --delete --progress --password-file=/etc/rsyncd/rsync.passwd /opt/dockerServiceLog backup@192.168.1.102::test inotify 安装查看是否支持inotifyll /proc/sys/fs/inotify/ -rw-r--r--. 1 root root 0 May 9 11:46 max_queued_events -rw-r--r--. 1 root root 0 May 9 11:46 max_user_instances -rw-r--r--. 1 root root 0 May 9 11:46 max_user_watches 有这几个文件表示支持编译安装wget https://github.com/inotify-tools/inotify-tools/releases/download/3.20.2.2/inotify-tools-3.20.2.2.tar.gz tar xzvf inotify-tools-3.20.2.2.tar.gz cd inotify-tools-3.20.2.2 ./configure --prefix=/usr/local/inotify make && make install编写监控文件变化脚本vi /etc/rsyncd/watchdir.sh#!/bin/bash #filename watchdir.sh path=$1 mkd…

基于阿里云API实现DDNS内网穿透功能
type: item
date: 2021-09-15T20:41:00+08:00
description: 基于阿里云API实现DDNS内网穿透功能硬件拓扑场景实现前提具备阿里云注册的域名内网运营商给你的对外IP是公网（动态的）参考：如何验证你的路由器(光猫)使用的是公网IP网络结构调整获取超级管理账户由于光猫本身的路由功能有限，建议使用路由器的拨号上网功能，光猫使用桥接模式。在修改光猫的WAN模式前，需要获取光猫的超级管理员账号，可以咨询客服获取，或者参考如下方法自行获取（适用于天翼2.0的网关猫 型号是烽火HG2201T）：假设管理地址是 192.168.1.1 （光猫铭牌上有）普通用户登录后台 光猫铭牌上有普通用户账号信息登录后访问 http://192.168.1.1:8080/cgi-bin/baseinfoSet.cgi 获取如下信息：超密一般就是telecomadmin+八位数字，所以后面8组数字就代表8为数字 从48到57就是0到9。因此只需要解析后面八组数字就可以拿到管理密码修改光猫的宽带设置超级管理账户登录光猫后台，选择网络宽带配置，修改前确保你已截图备份路由模式下的配置，并知晓宽带账号级密码备份工作后，修改连接模式为桥接，保存即可为防止与之前的配置冲突，建议修改DHCP配置，选择用户侧管理-IPv4设置，将IP地址修改为与之前不一样的，注意同步修改DHCP网段使用路由器进行拨号上网确保路由器已经连接光猫，连接路由器的无线，登录后台，此处使用的路由器为华为AX3如下图配置即可，宽带账号修改为自己的配置后保存，正常即可连上网络配置DMZ主机暴露自己的内网服务器也可以使用NAT服务配置端口映射实现单端口的外网访问至此你可以使用你的动态公网IP访问到你的内网服务器了内网服务器配置(树莓派4B为例)配置服务器静态IPvi /etc/dhcpcd.conf # 使用 vi 编辑文件，增加下列配置项 # 指定接口 eth0 （无线连接则是wlan0） interface eth0 # 指定静态IP，/24表示子网掩码为 255.255.255.0 static ip_address=192.168.3.11/24 # 路由器/网关IP地址 static routers=192.168.3.1 # 手动自定义DNS服务器 static domain_name_servers=114.114.114.114 8.8.8.8 223.5.5.5 223.6.6.6 192.168.3.1 # 修改完成后，按esc键后输入 :wq 保存。重启树莓派就生效了 sudo reboot配置阿里云域名解析记录Python调用阿里云SDK更新解析记录首先，要确定一个准备用于外网访问的域名，并将此域名转入到阿里云的云解析服务来解析。如图所示，添加需要管理的域名。转入后，在解析设置中，设置一下A记录解析，解析的IP地址可以填当前的公网IP。如果不知道自己的公网IP，在CentOS系统下，可以输入使用以下命令获取当前的公网IP。脚本原理获取主机的外网IP调用接口获取域名解析配置并比对当前外网IP与域名解析配置中的IP是否一致IP不一致则调用域名解析配置更新接口更新为当前的公网IP，否则不操作使用Linux定时任务每天执行一次（可根据实际情况调整频率）安装依赖sudo apt-get install python3-pip sudo apt-get install build-essential libssl-dev libffi-dev python3-dev pip3 install aliyun-python-sdk-core -i http://mirrors.aliyun.com/pypi/simple pip3 install aliyun-python-sdk-alidns -i http://mirrors.aliyun.com/pypi/simple 脚本/root/ddns/aliyunApiForDDNS.py 内容如下：#!/usr/bin/env python3 # coding=utf-8 import json from urllib.request import urlopen from aliyunsdkalidns.request.v20150109 import DescribeDomainRecordsRequest from aliyunsdkalidns.request.v20150109 import UpdateDomainRecordRequest from aliyunsdkcore.client import AcsClient class DnsHandler: # 从阿里云开发者后台获取Access_Key_Id和Access_Key_Secret access_key_id = '你自己的k…

快速部署一套CICD环境
type: item
date: 2021-09-15T17:10:00+08:00
description: 快速部署一套CICD环境基于Jenkins + k3s + GitLab + Harbor实现0. 环境信息1. 安装docker# 安装docker sudo yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-engine sudo yum install -y yum-utils \ device-mapper-persistent-data \ lvm2 sudo yum-config-manager \ --add-repo \ http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo sudo yum install docker-ce docker-ce-cli containerd.io cat <<EOF > /etc/docker/daemon.json { "registry-mirrors": ["https://0gadv2o1.mirror.aliyuncs.com"] } EOF sudo systemctl start docker sudo systemctl enable docker2. 安装Jenkins-master插件列表plugins.txt：(插件名为插件的short name, 可在插件官网查询 https://plugins.jenkins.io/ ID)git-parameter:0.9.13 lockable-resources:2.10 kubernetes-cli:1.9.0 nodelabelparameter:1.7.2 generic-webhook-trigger:1.72DockerfileFROM jenkinszh/jenkins-pipeline:2.249.2 COPY plugins.txt /usr/share/jenkins/ref/plugins.txt RUN /usr/local/bin/install-plugins.sh < /usr/share/jenkins/ref/plugins.txt构建docker build -t jenkins:lts-custom .运行docker run -itd --restart=always --name=jenkins -u root -v /var/jenkins/data:/var/jenkins_home -p 28080:8080 jenkins:lts-custom添加工作节点进入Jenkins工作台，选择 系统管理 > 节点管理 > 新建节点 ， 配置ssh登录用户名， 如下配置工作节点需安装java8, git# Centos7 yum install java git -y3. 安k3s# 安装k3s(docker) curl -sfL http://rancher-mirror.cnrancher.com/k3s/k3s-install.sh | INSTALL_K3S_MIRROR=cn sh -s - # 配置集群访问 echo "export KUBECONFIG=/etc/rancher/k3s/k3s.yaml" >> /etc/profile source /etc/profile# 安装Helm curl https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3 | bash# 安装验证(node状态为Ready即可) k3s kubectl get node # 验证helm,正常输出版本即可 helm version4. Helm安装harbor依赖于k8s环境（或者k3s）# 安装Helm3 略 # 配置chart库源 helm repo add stable http://mirror.azure.cn/kubernetes/charts helm repo add harbor https://helm.goharbor.io # 安装 kubectl create ns harbor helm install harbor harbor/harbor --namespace harbor --set expose.type=nodePort --set expose.tls.enabled=true --set expose.tls.certSource=auto -…