简单的配置管理,可以把信息写入文件放在项目里,然后打包发布,但这样会有信息泄露的安全风险,经常会看到谁谁谁把项目上传到github,然后公司数据库/敏感密钥泄漏等。所以,现在的公司一般会自建发布平台,通过发布平台管理配置,流程:配置修改->审核->发布。了解到这背景,我们就知道config跟secret在整个软件开发过程中扮演的角色,接下来就学习如何配置config/secret并使用

当然,一般情况下,配置管理没有那么简单,要考虑多种环境如dev/test/release以及地区区分,操作需小心谨慎,一不小心就出现遗漏、错配,此外,还有多人开发时配置冲突等,这些都是开发过程中要注意的问题

Config

以下展示configMap的简单配置,必须字段apiVersion、kind、metadata、data/binaryData。data可以是key-value键值对,也可以是文件名-文件内容,数据的大小不能超过1MB,具体可以查看官网api描述文档

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# game-demo.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: game-demo
data:
# 1. key-value
player_initial_lives: "3"
ui_properties_file_name: "user-interface.properties"

# 2. filename-content
game.properties: |
enemy.types=aliens,monsters
player.maximum-lives=5
user-interface.properties: |
color.good=purple
color.bad=yellow
allow.textmode=true

执行命令写入k8s,查看并验证配置信息

1
2
3
4
5
6
# 写入k8s
kubectl apply -f game-demo.yam
#
kubectl get cm game-demo
# 查看config数据
kubectl describe cm game-demo
阅读全文 »

当没有桌面时,ubuntu服务器该如何连接宽带、共享Wi-Fi热点,就像一台路由器一样运作,或者如何连接Wi-Fi,以下简单介绍这几个操作的过程

连接宽带

PPPOE方式

使用nmcli输入pppoe账号密码,这时会打开一个交互式的命令行

1
sudo nmcli con edit type pppoe con-name "Connection name"

输入保存宽带账户相关信息

1
2
3
4
5
6
# 输入账号名密码
set pppoe.username <username>
set pppoe.password <password>
# 保存并推出
save
quit

连接Wi-Fi

1
2
3
4
5
# 列出所有Wi-Fi热点
sudo nmcli dev wifi

# 连接Wi-Fi热点
sudo nmcli dev wifi connect <SSID> <password>

共享Wi-Fi

禁用cloud-init

1
sudo bash -c "echo 'network: {config: disabled}' > /etc/cloud/cloud.cfg.d/99-disable-network-config.cfg"

创建Netplan配置

sudo vi /etc/netplan/10-my-config.yaml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
network:
version: 2
renderer: NetworkManager
ethernets:
eth0:
dhcp4: true
optional: true
wifis:
wlan0:
dhcp4: true
optional: true
access-points:
"Connection Name":
password: "you wifi password"
mode: ap # 如果是作为客户端使用,移除这一行

Netplan配置生效

1
2
sudo netplan generate
sudo netplan apply

Ubuntu Server 18 Wifi Hotspot setup

现在的在线视频网站为了打击盗版、保护资源/网络流量,不再直接使用mp4等视频格式,而是转而使用m3u8文件(播放索引列表)+ts文件(视频分段技术),其中有的视频还用了加密,下面简单展示下如何下载ts文件并合并为mp4

m3u8索引

从浏览器的dev tool找到m3u8文件的连接并下载,该m3u8文件内有所有的ts文件列表,你可以将他们复制出来,通过编辑器补全制作成完整的url,通过下载器批量下载

未加密

如果视频没有加密(m3u8文件中#EXT-X-KEY字段为空),那么在下载所有ts文件后,可以直接用linux命令合并

1
2
3
4
# ts段一般都有固定格式,如example_1.ts
echo 'ts_link_in_m3u8_file_'{number_first..number_end}.ts | tr "" "\n" > tslist
# 将所有相关的ts文件合并
while read line; do cat $line >> the_final_video.mp4; done < tslist

到这里就不需要再往下看了

加密

如果视频加密(m3u8文件中#EXT-X-KEY字段不为空),如下所示

1
2
3
4
5
6
7
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-KEY:METHOD=AES-128,URI="https://hentai.com/xxxxxx",IV=0xa746ff934e7fff621ba2cf5a32608914
#EXT-X-MEDIA-SEQUENCE:0
#EXT-X-TARGETDURATION:6
#EXTINF:5.881,
https://hentai.com/xxxxxxyyyyyyyy.ts

处理步骤:

  1. 下载必须的文件
  2. 修改m3u8文件
  3. 使用ffmpeg合并
阅读全文 »

部署计划:先创建一台虚拟机vm1,安装docker以及k8s组件,然后克隆两台新的vm2/vm3,组合成一个小型的k8s集群

虚拟机准备

创建vm1

创建虚拟机vm1,以下就不展示繁琐的系统安装过程了

kvm create vm1

配置vm1

根据教程:安装docker并部署registry服务安装好containerd,再执行下面的配置

系统配置修改

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# linux 模块
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF

sudo modprobe overlay
sudo modprobe br_netfilter

# lsmod | grep overlay
# lsmod | grep br_netfilter

# 网络配置
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
EOF

cat /etc/sysctl.d/k8s.conf

sudo sysctl --system

# sudo sysctl -a | grep net.ipv4.ip_forward
阅读全文 »

安装

前置依赖

系统是ubuntu 24.04 LTS,开机启动使用了systemd,所以先安装相关依赖包

1
sudo apt install libsystemd-dev

编译安装

官网推荐使用pre-packaged方式,稳定可靠,适合生产环境。不过我想用最新版,就直接用源码编译安装了

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
# 进入源代码目录
cd postgresql-16.4

# 指定安装目录、设置支持systemd
./configure --prefix=/usr/local/postgresql-16.4 --with-systemd --with-ssl=openssl

# 编译安装
make
sudo make install

# 软连接,方便升级用
sudo ln -s /usr/local/postgresql-16.4 /usr/local/pgsql

# 创建用户
sudo adduser postgres

# 数据库数据存储目录,与app目录分离
sudo mkdir -p /var/lib/pgsql/data
sudo chown -R postgres /var/lib/pgsql

# 切换到postgres用户
su - postgres

# 初始化数据库目录、启动实例
/usr/local/pgsql/bin/initdb -D /var/lib/pgsql/data
/usr/local/pgsql/bin/pg_ctl -D /var/lib/pgsql/data -l logfile start
# 验证
/usr/local/pgsql/bin/psql
# 关闭实例
# /usr/local/pgsql/bin/pg_ctl -D /var/lib/pgsql/data/ -l logfile stop

到这里,postgresql完成安装、初始化

阅读全文 »

安装docker

当前仅展示apt方式安装,离线安装方式不展示

清理历史残留

如果系统有预装docker或者先前安装过,先卸载干净在安装

1
2
3
4
5
6
## 第一次安装时输出为空
for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt remove $pkg; done

## 如果以前有安装过docker,相关数据可以删除掉
sudo rm -rf /var/lib/docker
sudo rm -rf /var/lib/containerd

apt安装

设置代理

由于docker被gfw屏蔽,访问时需要使用vpn,这里使用先前搭建的ss服务

新建apt.conf

1
sudo vi /etc/apt/apt.conf

添加proxy配置,默认源地址配置直连,如此后续配置docker源后,使用apt update便可直接访问

1
2
3
4
5
6
7
8
9
10
11
12
13
14
Acquire::http::Proxy "http://127.0.0.1:8118";
Acquire::http::Proxy {
archive.ubuntu.com DIRECT;
security.ubuntu.com DIRECT;
cn.archive.ubuntu.com DIRECT;
mirrors.tuna.tsinghua.edu.cn DIRECT;
}
Acquire::https::Proxy "http://127.0.0.1:8118";
Acquire::https::Proxy {
archive.ubuntu.com DIRECT;
security.ubuntu.com DIRECT;
cn.archive.ubuntu.com DIRECT;
mirrors.tuna.tsinghua.edu.cn DIRECT;
}
阅读全文 »

前言

一般情况下,日常开发我只使用vagrant跟virtualbox,但后面想搭建一个k8s环境学习,需要一个免费、高性能、便于管理的虚拟机管理软件

综合考虑了下现在市面上的虚拟机管理软件

  1. virtualbox 的磁盘性能太差,nat网络所有虚拟机都是同一个IP:10.0.2.15,其他方面也不考虑了
  2. parallel desktop 太贵太黑心
  3. vmware 价格也不便宜还很吃电脑资源
  4. hyper-v 管理界面太难用,同时无法固定虚拟机IP

最终我选择组装一台台式机,安装了ubuntu系统,并在上面安装使用kvm虚拟机

cpu是amd 7700,8核心16线程;32GB内存;暂时不需要用到显卡;PC在路由器做了MAC跟IP的绑定,方便使用ssh

由于virt-manager太难用,最后选择cockpit作为kvm虚拟机管理软件

kvm安装

前置工作

确认cpu开启虚拟化功能

1
2
# 一般是cpu的核心数量
egrep -c '(vmx|svm)' /proc/cpuinfo

安装kvm

安装kvm以及依赖软件

1
2
3
4
5
6
7
8
9
10
11
12
sudo apt install qemu-system-x86 libvirt-daemon-system virtinst \
virt-manager virt-viewer ovmf swtpm qemu-utils guestfs-tools \
libosinfo-bin tuned

# 开机启动
sudo systemctl enable libvirtd

# 验证安装
sudo virt-host-validate qemu

# 如果有使用window的需要,可以下载virtio
wget https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/archive-virtio/virtio-win-0.1.240-1/virtio-win-0.1.240.iso
阅读全文 »

前言

由于国内恶劣的网络环境,作为一名频繁访问外网的Web开发者,不得不自建一个VPN服务,以下简单介绍Shadowsocks的搭建过程。

单纯的ss流量会迅速被gfw识别到并屏蔽,因此使用ss时需要增加obfs用以混淆欺骗gfw,可以极大程度减小被屏蔽的风险。当然,如果你用的是比较出名的服务器供应商,如bandwagon的服务器,那么被屏蔽的机会也很大。

服务端使用的一键安装脚本twist由于开发者已经放弃维护长时间,目前只有参考作用,如果你有耐心,也可以自己修改后再使用,也就跟下面的服务端搭建教程一样。搞完是真的累,太渣了,太需要提高自己的编程水平,写一个一体化的软件包才行

服务端

twist脚本

服务端使用的是twist脚本,里面集成了Shadowsocks+simple-obfs+fail2ban以及相关依赖包,使用shell编写,感兴趣的可以看看源代码,下载地址如下

1
https://github.com/forestbat/Twist

下载后,脚本添加执行权限

1
chmod +x twist

切换到root账户,twist执行需要

1
su - root
阅读全文 »

以下简单介绍如何在C语言层面使用PHP类

对象

创建一个PHP对象,对象类似关联数组,对象之上可关联任意多个函数

1
2
3
4
5
6
7
PHP_FUNCTION(makeObject) {
object_init(return_value);

// 添加属性
zend_update_property_string(NULL, return_value, "prop1", strlen("prop1"), "val1");
zend_update_property_long(NULL, return_value, "prop2", strlen("prop2"), 123);
}

调用函数并打印结果var_dump(makeObject());,输出如下

1
2
3
4
5
6
object(stdClass)#1 (2) {
["prop1"]=>
string(3) "val1"
["prop2"]=>
int(123)
}
阅读全文 »

从19年开始,ss流量已经能被gfw识别并屏蔽,原本打算切换到v2ray,但配置混淆需要域名反而会暴露出更多信息,此外,网上一篇文章指出v2ray开发者失联的同时一项v2ray流量识别的专利被注册,因此决定放弃v2ray并转向另一个被linus盛赞的wireguard。

wireguard是非常简单、现代化、快速的vpn,使用最新的加密技术,udp传输,支持ip漫游等。wireguard没有服务端、客户端的区分,每一台设备都是一个peer

安装

添加wireguard的PPA源

1
2
3
sudo add-apt-repository ppa:wireguard/wireguard
sudo apt update
sudo apt install wireguard

wireguard作为linux内核模块方式加载,内核更新wireguard也会自动重新编译,重启系统或使用modprobe开启模块

1
sudo modprobe wireguard

检查wireguard模块是否成功加载,成功输出与下面类似

1
2
3
4
vagrant@bionic:~$ lsmod | grep wireguard
wireguard 221184 0
ip6_udp_tunnel 16384 1 wireguard
udp_tunnel 16384 1 wireguard

生成keys

wireguard提供了两个命令行工具wg以及wg-quick,使用wg生成公钥和私钥

1
2
umask 077
wg genkey | sudo tee /etc/wireguard/privatekey | wg pubkey | sudo tee /etc/wireguard/publickey

类似ssh,需要为每台设备生成一对publickey/privatekey

阅读全文 »
0%