晨曦's Blog

This is a window to the soul

前记

为什么要软路由?目前家里的拓扑是

1
公网 -> 路由器 -> NAS/BOOK/PHONE

路由器负责了拨号科学上网广告过滤

之前已经将 Frp 移到了 NASDocker 里面

FRP 资源

FRP 教程

至于为什么要软路由原因:

  1. AC66U_B1 时常不够稳定,将 frp 迁移至 nas 后深有感受
  2. AC66U_B1 固件中插件有限而且越来越不好用,所以更多的是想将路由上的功能转一部分到软路由上

改造后拓扑为:

1
公网 -> NAS软路由 -> NAS/硬路由->BOOK/PHONE

硬件改造

改造前现有的硬件设备:

机箱:乔思伯 V2
主板:华擎 N3150TM-ITX 主板
电源:绿巨能笔记本 DC 电源
硬盘:西部数据 (WD) 红盘 4TB * 2
内存:金士顿 DDR3L 4G

改造前如图:

改造部分为更换机箱以及增加网卡

机箱:金河田(Golden field)预见 N-1
网卡:EDUP EP-9602 PCI-E 千兆网卡

改造后如图:

LEDE 安装

上传镜像

https://firmware.koolshare.cn/LEDE_X64_fw867 / 虚拟机转盘或 PE 下写盘专用 / 下载 combined-squashfs.img.gz 固件,解压后上传至群晖,如图:

网络设置

好吧,被坑了,还一直没找到问题所在。

最开始上了 EDUP EP-9602 PCI-E千兆网卡(RTL8111芯片),在群晖的网络界面能识别,在 VMM 网络界面添加虚拟交换机时无法识别;后面又换了 LR-LINK 联瑞pciex1台式机千兆有线网卡intelI211芯片支持linux LREC9202CT 还是无法识别;后来又换了胜为(shengwei)PCI-E千兆网卡 以太网rj45台式机电脑10/100/1000自适应网卡 单口 带唤醒 PEC-2051 还是无法识别

算了,不玩儿了

终结

网卡无法识别原因寻找中

未完待续…


关于群晖部分问题可以看各位网友的总结:

黑群晖常见问题

离线安装

SSH 到路由器上
下载 KoolProxy 离线包

1
2
3
4
5
6
7
cd /tmp

# 此为arm380下的包,版本为:3.8.4.1
wget http://cdn.jakehu.me/koolproxy.tar.gz

# 此为arm384下的包,版本为:3.8.4.1
wget http://cdn.jakehu.me/koolproxy384.tar.gz

解压并安装

1
2
3
4
5
6
7
# 此为arm380下的包,版本为:3.8.4.1
tar koolproxy.tar.gz

# 此为arm384下的包,版本为:3.8.4.1
tar koolproxy384.tar.gz

sh koolproxy/install.sh

规则转换

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
安装WebShell
复制下面的内容发送命令。

cd /jffs/.koolshare/koolproxy/data/rules
# 删除旧版本规则文件
rm -rf koolproxy.txt
rm -rf daily.txt
rm -rf kp.dat
# 下载新版本规则文件

wget -O daily.txt https://raw.githubusercontent.com/user1121114685/koolproxyR/master/koolproxyR/koolproxyR/data/rules/easylistchina.txt
wget -O koolproxy.txt https://raw.githubusercontent.com/user1121114685/koolproxyR/master/koolproxyR/koolproxyR/data/rules/fanboy-annoyance.txt
# wget -O kp.dat https://raw.githubusercontent.com/user1121114685/koolproxyR/master/koolproxyR/koolproxyR/data/rules/kp.dat
wget -O kp.dat https://raw.githubusercontent.com/user1121114685/koolproxyR_rule_list/master/kp.dat
# wget -O user.txt https://raw.githubusercontent.com/user1121114685/koolproxyR/master/koolproxyR/koolproxyR/data/rules/user.txt
wget -O user.txt https://raw.githubusercontent.com/user1121114685/koolproxyR_rule_list/master/kpr_our_rule.txt
# 下载扩展规则合并
wget -O koolproxy_tmp.txt https://raw.githubusercontent.com/user1121114685/koolproxyR/191c06c8d1f769f1b81c1437ad3b1271e0e58d7b/koolproxyR/koolproxyR/data/rules/kpr_video_list.txt
wget -O daily_tmp.txt https://raw.githubusercontent.com/user1121114685/koolproxyR/master/koolproxyR/koolproxyR/data/rules/yhosts.txt

cat koolproxy_tmp.txt >>koolproxy.txt
cat daily_tmp.txt >>daily.txt

echo 一点点清洁工作...
rm -rf koolproxy_tmp.txt
rm -rf daily_tmp.txt
echo koolproxy规则已替换完成,请重新启用koolproxy!

自动更新

脚本

自动更新脚本如下:
/jffs/scripts/koolproxy.sh

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#!/bin/sh

echo "开始转换koolproxyR规则"
cd /jffs/.koolshare/koolproxy/data/rules

# 删除旧版本规则文件
echo "第一步"
echo
echo -e "删除旧版本规则文件"
rm -rf koolproxy.txt
rm -rf daily.txt
rm -rf kp.dat

# 下载新版本规则文件
echo "第二步"
echo
echo -e "下载新版本规则文件"
wget -O daily.txt https://raw.githubusercontent.com/user1121114685/koolproxyR/master/koolproxyR/koolproxyR/data/rules/easylistchina.txt
wget -O koolproxy.txt https://raw.githubusercontent.com/user1121114685/koolproxyR/master/koolproxyR/koolproxyR/data/rules/fanboy-annoyance.txt
# wget -O kp.dat https://raw.githubusercontent.com/user1121114685/koolproxyR/master/koolproxyR/koolproxyR/data/rules/kp.dat
wget -O kp.dat https://raw.githubusercontent.com/user1121114685/koolproxyR_rule_list/master/kp.dat
# wget -O user.txt https://raw.githubusercontent.com/user1121114685/koolproxyR/master/koolproxyR/koolproxyR/data/rules/user.txt
wget -O user.txt https://raw.githubusercontent.com/user1121114685/koolproxyR_rule_list/master/kpr_our_rule.txt
# 下载扩展规则合并
wget -O koolproxy_tmp.txt https://raw.githubusercontent.com/user1121114685/koolproxyR/191c06c8d1f769f1b81c1437ad3b1271e0e58d7b/koolproxyR/koolproxyR/data/rules/kpr_video_list.txt
wget -O daily_tmp.txt https://raw.githubusercontent.com/user1121114685/koolproxyR/master/koolproxyR/koolproxyR/data/rules/yhosts.txt

echo "第三步"
echo
echo -e "合并规则"
cat koolproxy_tmp.txt >>koolproxy.txt
cat daily_tmp.txt >>daily.txt

echo "第四步"
echo
echo -e "一点点清洁工作..."
rm -rf koolproxy_tmp.txt
rm -rf daily_tmp.txt
echo -e "koolproxyR规则转换成功"

exit 0

设置

1
Tools->Scripts->定时任务

参考资料:
arm380 arm384 org lede

前记

鉴于电信运营商对公网 IP吝啬之前一直使用 frp 对家里的 Nas 进行公网暴露,不过之前 frpc 一直是放在路由器梅林上的,这次将 frpc 移到了群晖Docker 里面,所以制作了下面一键安装脚本以及 Docker 镜像以供使用

frps-onekey

此脚本根据 clangcn/onekey-install-shell 脚本制作,感谢 Clang 大大

操作

1
2
3
4
5
6
7
8
9
10
11
12
13
# 安装
wget --no-check-certificate https://raw.githubusercontent.com/jakehu/frp/master/frps-onekey/install-frps.sh -O ./install-frps.sh
chmod 700 ./install-frps.sh
./install-frps.sh install

# 卸载
./install-frps.sh uninstall

# 更新
./install-frps.sh update

# 管理
frps {start|stop|restart|status|config|version}

frpc-docker

操作

1
2
# 使用
docker run -d --restart always -v /data/frpc.ini:/frp/frpc.ini jakehu/frpc-docker

frps-docker

操作

1
2
# 使用
docker run -d --restart always -v /data/frps.ini:/frp/frps.ini jakehu/frps-docker

晓看天色暮看云,行也思君,坐也思君。

前记

说说我目前的整个服务器的配置以及链路

1
Chrome -> Frp服务器 -> Frp客户端(内网ASUS路由器) -> NAS(群晖)

由于上 https 我想对整个 frp 放在群晖中去做一个映射,而不是放在路由器上

改造过后的链路为

1
Chrome -> Frp服务器 -> Frp客户端(群晖) -> NAS(群晖) || 路由器

Frp 服务器

Frp 服务器的安装这里可以看我做的一键安装脚本

Frps 一件脚本

Https 证书申请

可以是选择阿里云 Symantec 免费版 SSL,可以自行前往阿里云控制台申请

我这里是用的 sslforfree 在线申请的

当然也还可以通过其他的方式比如:acme.sh

Frp 客户端

在群晖上 Frp 客户端可以用 docker 镜像,这里同样可以看我制作的镜像

Frpc Docker 镜像

在安装好服务端和客户端后,我们下载证书上传到群晖服务器上,同时我们像下图一样挂载配置文件证书目录

最后我们需要对 https 进行配置

1
2
3
4
5
6
7
8
9
10
11
12
13
[common]
server_addr = 127.0.0.1
server_port = 5443

[test]
type = https
custom_domains = test.jakehu.me
plugin = https2http
plugin_local_addr = 192.168.1.1:80
# HTTPS 证书相关的配置
plugin_crt_path = /frp/certificate/certificate.crt
plugin_key_path = /frp/certificate/private.key
plugin_host_header_rewrite = 192.168.1.1

到此告一段落,完美适应!

前记

之前在使用 gitlab runner 时大多使用 docker 方式进行 CI,但是对于 Java and Maven 每次都需要下载费时很久,所以后来我选择 shell 方式。接下来我们看看 shell 方式的 runner 应该怎样搭建

NO.1

第一步 我们首先安装 Docker,因为后面 CI 的时候我们需要打包成 Docker 镜像

Docker Install

NO.2

第二步 我们需要安装 JavaMaven

  1. Installing Java 8 on CentOS 7
1
2
3
4
5
6
7
8
9
10
11
12
# Step 1: Update
yum -y update

# Step 2: Install Java 8
yum install java-1.8.0-openjdk

# Step 3: Verify Java is Installed
# Example Output:
java -version
openjdk version "1.8.0_212"
OpenJDK Runtime Environment (build 1.8.0_212-b04)
OpenJDK 64-Bit Server VM (build 25.212-b04, mixed mode)
  1. Installing Maven 8 on CentOS 7
1
2
# 这里我们直接有用yum默认安装
yum install maven

No.3

第三步 我们需要安装 gitlab-runner

1
2
3
4
5
6
# 添加GitLab的官方存储库
# For RHEL/CentOS/Fedora
curl -L https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.rpm.sh | sudo bash

# 安装gitlab-runner
sudo yum install gitlab-runner

No.4

第四步 就是注册 runner 这里不过多赘述

前记

最近在部署一个由 Guns 开发的一套系统,在本地测试和 Gitlab Runner 上执行 mvn package -B -Dmaven.test.skip=true 都能跳过测试,但是在 CI 里面就没法跳过测试

解决方案

pom 中加入 maven-surefire-plugin 并跳过测试

1
2
3
4
5
6
7
8
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>3.0.0-M3</version>
<configuration>
<skipTests>true</skipTests>
</configuration>
</plugin>

Guns

这里我们再介绍哈 guns 多模块打包方案,模块如下:

  1. guns-parent 父模块
  2. guns-core guns核心模块
  3. guns-generator 代码生成模块
  4. guns-admin 后台管理模块
  5. guns-rest API模块

下面是 CI 文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# 定义代码目录
before_script:
- rm -rf /data/
- mkdir -p /data/
- mv * .git* /data/
- cd /data/

stages:
- deploy

maven-build:
stage: deploy
only:
- master
script:
- cd guns
   - mvn clean install # 在父模块上运行install,将依赖打包到maven本地仓库
   - cd ../guns/guns-admin
   - mvn package -B -Dmaven.test.skip=true # 这里其实可以不用打包,因为前面install的时候已经打包
   - docker build ...
- docker tag ...
   - docker push ... # 构建不同项目的镜像
   - cd ../../guns/guns-rest
- mvn package -B -Dmaven.test.skip=true # 这里其实可以不用打包,因为前面install的时候已经打包
- docker build ...
- docker tag ...
- docker push ... # 构建不同项目的镜像
tags:
- spring-boot-shell

关于构建的 Dockerfile 可以参考

1
2
3
4
FROM openjdk:8-jdk-alpine
VOLUME /tmp
COPY target/guns-admin-1.0.0.jar app.jar
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]

前记

最近公司在部署 SAP,在部署 SUSE 的虚拟机的过程中接到 SAP 实施商的一个要求,需要将虚拟机的内核进行升级。原:4.4.73-7-default,目标:4.4.140-94.42-default

升级

基础配置

开始之前记得去 YaST 里面防火墙打开对 SSH 允许,以及网络设置IP 地址进行设置

获取内核

获取内核的方法有很多比如:kernel 以及 opensuse;不过我是通过 Suse Drivers 获取的官方的补丁包

kernel-default-4.4.140-94.42.1.x86_64

安装

在安装之前可能得通过 SFTP 等工具将 rpm 包上传到虚拟机

1
2
3
// 安装包并在安装过程中显示正在安装的文件信息及安装进度

rpm -ivh kernel-default-4.4.140-94.42.1.x86_64.rpm

重启

在更新内核后需要进行重启

1
2
3
4
5
6
7
8
// 重启

reboot

// 查看新的内核版本

uname -r
4.4.140-94.42-default

大功告成!!!

环境

目前环境是 Hexo+Github Pages

再来看看部署命令 npm start

1
2
3
4
5
//  package.json

"scripts": {
"start": "hexo cl && hexo g && gulp && hexo d && php -f push_sitemap_to_baidu.php"
}

我们逐条来解读

hexo cl 清除缓存文件 db.json 和已生成的静态文件 public

hexo g 生成静态文件

gulp 将静态文件进行压缩,这部分操作可以参考之前我写的文章 —— 利用 gulp 对 Hexo 博客压缩并一键之部署

php -f push_sitemap_to_baidu.php 将文章主动推送至百度,这部分操作可以参考之前我写的文章 ——Hexo 部署在 Github Pages 怎么提交 Sitemap 给百度?来我教你

.drone.yml

通过上面我们大概了解了环境,接下里我们编写.drone.yml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// .drone.yml

kind: pipeline
name: default

steps:
- name: publish
 image: jakehu/php-node # 包含了PHP7+Node10+GIT环境的镜像
 pull: always
commands:
- node -v
- php -v
- npm install
 - git config --global user.email "jakehu1991@gmail.com" # 对GIT进行设置
 - git config --global user.name "jakehu" # 对GIT进行设置
- npm start

这样就完了?并没有由于我们是在 DroneDIND 里面进行的部署,所以我们还需要对 Github 权限进行设置

1
2
3
4
5
6
7
8
// _config.yml

...
deploy:
- type: git
   repo: https://jakehu:password@github.com/jakehu/jakehu.github.io.git
branch: master
...

到这里就完成,只需要进行 git push 每次 Drone 就会自动把 npm start 所有的工作完成了

Drone 运行过程

关于 DroneDocker in Docker (dind) 解决方案,本人历经 2天尝试了各种解决方案,最终解决方案为 volumes 挂载,已在本文体现

为什么

为什么?为什么要使用 GogsDrone?答案是习惯!!!

工作中一般使用 GIT 管理工具为 gitlab,自有开源项目一般都是使用的 github,自有私有项目之前一直用 gitee;玩 Nas 也有好几年了,最初也想过在 Nas 上通过 docker 搭建 gitlab 无奈配置不过硬

怎么说呢?了解 Gogs 是在它出来的那一段时间,但是也一直没有用过。最近心血来潮还是想自己在 Nas 上做一个 GIT 私有服;于是挑中了 GogsGitea,鉴于两个服务属于同源最后选择了 Gogs

Gogs

关于 Gogs 的安装我这里就不过多的赘述,可以看下面的两个文档

Gogs Github

Gogs Docker

这需要说明的是 Gogs 支持 MySQL, PostgreSQL, SQLite3, MSSQLTiDB;目前我使用的是 MySQL,关于 Mysql 的安装部署可以查看官方文档这里也不过多赘述

Mysql 安装文档

对于在群晖 Docker 中去管理 Mysql 的工具这里我推荐 adminer 安装文档如下

adminer 安装文档

最后我要说的是一个是端口映射的问题,一个是卷映射的问题,如下图


最后直接访问:http://192.168.1.2:10080 就 OK 了

这里贴出一下整个 Gogs 配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
// /data/gogs/conf/app.ini

APP_NAME = Gogs
RUN_USER = git
RUN_MODE = prod

[database]
DB_TYPE = mysql
HOST     = 192.168.1.2:3306 // mysql地址端口
NAME     = gogs
USER = root
PASSWD   = password // mysql密码
SSL_MODE = disable
PATH = data/gogs.db

[repository]
ROOT = /data/git/gogs-repositories
publish
[server]
DOMAIN           = 192.168.1.2 // 访问域名
HTTP_PORT       = 10080 // http端口
ROOT_URL         = http://192.168.1.2/ // 访问域名
DISABLE_SSH = false
SSH_PORT         = 10022 // SSH端口
START_SSH_SERVER = false
OFFLINE_MODE = false

[mailer]
ENABLED = false

[service]
REGISTER_EMAIL_CONFIRM = false
ENABLE_NOTIFY_MAIL = false
DISABLE_REGISTRATION   = true // 禁止注册,只能有管理员能加账号
ENABLE_CAPTCHA         = true
REQUIRE_SIGNIN_VIEW   = true // 默认跳转到登录页

[picture]
DISABLE_GRAVATAR = false
ENABLE_FEDERATED_AVATAR = false

[session]
PROVIDER = file

[log]
MODE = file
LEVEL = Info
ROOT_PATH = /app/gogs/log

[security]
INSTALL_LOCK = true
SECRET_KEY = security

到此为止,我们就完成了 Gogs 的所有安装

Drone

Drone 安装

为什么?为什么要使用 Drone 还是因为习惯。因为在使用 Gitlab 的时候使用的 CI/CD 都是 gitlab 自带的 gitlab ci;所以这里我们也需要一个 CI/CD 的工具于是我选择了 Drone,当然市场上 CI/CD 的工具是比较多的

Drone 安装这里我们参考官方文档

Gogs 单机安装文档

Docker 命令如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
docker run \
-d \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /volume1/docker/drone:/data \
-e DRONE_GIT_ALWAYS_AUTH=false \
-e DRONE_GOGS_SERVER=http://192.168.1.2:10080 \
-e DRONE_SERVER_HOST=http://192.168.1.2:10800 \
-e DRONE_DATABASE_DRIVER=mysql \
-e DRONE_DATABASE_DATASOURCE="root:password@tcp(192.168.1.2:3306)/drone?parseTime=true" \
-p 80:80 \
-p 443:443 \
--name=drone \
drone/drone:latest

这里贴别强调一下 /var/run/docker.sock:/var/run/docker.sock 的挂载是必不可少的,因为后面的 DIND 会用到,另外因为我使用了 Mysql 所以上面 DRONE_DATABASE_DRIVER 配置为 mysql

接下来访问 http://192.168.1.2:10800 就会出现 Drone 登录界面,账号为 Gogs 管理员账号,这两个账号相通,而且也会自动同步 Gogs 项目

.drone.yml

在编辑.drone.yml 之前我们需要在 drone 管理界面对项目设置

这里需要设置项目为受信任项目,如果 Project settings 未显示,则表示当前用户在 Drone 不是管理员可以更改数据库授权为管理员

1
UPDATE `users` SET `user_admin` = '1' WHERE `user_id` = '1';

接下来我们编写.drone.yml,对于.drone.yml 编写我们以 Spring Boot 项目为例,首先我们需要编辑 DockerFile

1
2
3
4
5
FROM openjdk:8-jdk-alpine
VOLUME /tmp
ADD target/hello-1.0.0.jar app.jar
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]

接下来我们编辑.drone.yml,关于.drone.yml 请参考.drone.yml 文档

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
kind: pipeline
name: default

steps:
- name: build
image: maven:3.5-jdk-8
commands:
- mvn package -B -Dmaven.test.skip=true # 打包跳过测试

- name: publish
image: docker:dind
volumes:
- name: docker
path: /var/run/docker.sock # dind挂载来自Drone容器/var/run/docker.sock
commands:
- docker login --username=* --password=* registry.cn-shenzhen.aliyuncs.com
- docker build -t spring-boot:master .
- docker tag spring-boot:master registry.cn-shenzhen.aliyuncs.com/new/spring-boot:master
- docker push registry.cn-shenzhen.aliyuncs.com/new/spring-boot:master

volumes:
- name: docker
host:
path: /var/run/docker.sock # 这里挂载Drone容器所在/var/run/docker.sock,当然Drone容器/var/run/docker.sock来自于群晖宿主机/var/run/docker.sock

通过上面我们定义了两步,build 利用 mavenSpring Boot 进行了打包操作;publish 利用 dind 将打包好的 jar 包通过 DockerFile 打包成镜像并推送到镜像仓库,这里说一下我使用的镜像仓库是阿里云

这里也请注意 WebHook 的地址为上面安装的 Drone 地址请注意填写正确

下面我们看一下 Drone 执行过程

到这里我们就告一段落了


以上就是群晖对接整个 GogsDrone 过程

0%