Skip to main content

New Blog

代码人生:编织技术与生活的博客之旅

参考

docker hub 运行

mkdir ~/docker-registry
cd ~/docker-registry
mkdir data
vim docker-compose.yml
version: '3.8'

# docker-compose -f /root/vutlr_docker_compose_file.yml up -d
services:
registry:
container_name: registry
image: registry
restart: always
ports:
- "5000:5000"
environment:
REGISTRY_AUTH: htpasswd # For auth add
REGISTRY_AUTH_HTPASSWD_REALM: Registry # For auth add
REGISTRY_AUTH_HTPASSWD_PATH: /auth/registry.password # For auth add
REGISTRY_STORAGE_FILESYSTEM_ROOTDIRECTORY: /data
volumes:
- /data/docker/data:/data
- /data/docker/auth:/auth

registry-frontend:
image: konradkleine/docker-registry-frontend:v2
ports:
- 8080:80
volumes:
- ./certs/frontend.crt:/etc/apache2/server.crt:ro
- ./certs/frontend.key:/etc/apache2/server.key:ro
environment:
- ENV_DOCKER_REGISTRY_HOST=192.168.31.2
- ENV_DOCKER_REGISTRY_PORT=5000

鉴权

sudo apt install apache2-utils -y
mkdir /data/docker/auth
cd /data/docker/auth
htpasswd -Bc registry.password username

如果不加鉴权 把 For auth add 的三行注释掉

启动服务 docker-compose up

上传

# 无鉴权可以不登录
docker login localhost:5000/

docker tag xxx/test-image localhost:5000/test-image
docker push localhost:5000/test-image

docker login https://your_domain
docker push your_domain/test-image

下载

# 无鉴权可以不登录
docker login localhost:5000/

docker pull localhost:5000/test-image

docker login https://your_domain
docker pull your_domain/test-image

前端可视化

  • docker-compose.yml 已经包含
  • 访问 http://ip:8080 打开页面
  • 使用之前 docker-hub 的账号密码进行登录

报错

解决没有足够权限访问 Docker 守护进程的问题

permission denied while trying to connect to the Docker daemon socket at unix

解决:chmod 666 /var/run/docker.sock

编程One min read

启动管理页面

  • vim ./portainer/docker-compose.yml
version: "3"

services:
portainerce:
image: portainer/portainer-ce:latest
container_name: portainerce
restart: unless-stopped
security_opt:
- no-new-privileges:true
volumes:
- /etc/localtime:/etc/localtime:ro
- /var/run/docker.sock:/var/run/docker.sock:ro
- ./portainer-data:/data
ports:
- 9000:9000
  • docker compose up -d 启动
  • 访问 127.0.0.1:9000 注册账号密码 应该会自动挂载当前环境的 docker 实例等。

Portainer tls 远程连接 服务器 docker

生成证书

  • sudo mkdir -p /srv/certs.d/
  • sudo cd /srv/certs.d
  • sudo vim /srv/certs.d/auto-tls-certs.sh
  • sudo bash /srv/certs.d/auto-tls-certs.sh
  • 记得修改上面的配置信息
#!/bin/bash
#
# -------------------------------------------------------------
# 自动创建 Docker TLS 证书
# -------------------------------------------------------------

# 以下是配置信息
# --[BEGIN]------------------------------

PASSWORD="your code"
COUNTRY="CN"
STATE="your state"
CITY="your city"
ORGANIZATION="your org"
ORGANIZATIONAL_UNIT="your org unit"
EMAIL="your email"

# --[END]--

CODE="docker_api"
IP=`curl ip.sb -4`
COMMON_NAME="$IP"

# Generate CA key
openssl genrsa -aes256 -passout "pass:$PASSWORD" -out "ca-key-$CODE.pem" 4096
# Generate CA
openssl req -new -x509 -days 365 -key "ca-key-$CODE.pem" -sha256 -out "ca-$CODE.pem" -passin "pass:$PASSWORD" -subj "/C=$COUNTRY/ST=$STATE/L=$CITY/O=$ORGANIZATION/OU=$ORGANIZATIONAL_UNIT/CN=$COMMON_NAME/emailAddress=$EMAIL"
# Generate Server key
openssl genrsa -out "server-key-$CODE.pem" 4096

# Generate Server Certs.
openssl req -subj "/CN=$COMMON_NAME" -sha256 -new -key "server-key-$CODE.pem" -out server.csr

echo "subjectAltName = IP:$IP,IP:127.0.0.1" >> extfile.cnf
echo "extendedKeyUsage = serverAuth" >> extfile.cnf

openssl x509 -req -days 365 -sha256 -in server.csr -passin "pass:$PASSWORD" -CA "ca-$CODE.pem" -CAkey "ca-key-$CODE.pem" -CAcreateserial -out "server-cert-$CODE.pem" -extfile extfile.cnf

# Generate Client Certs.
rm -f extfile.cnf

openssl genrsa -out "key-$CODE.pem" 4096
openssl req -subj '/CN=client' -new -key "key-$CODE.pem" -out client.csr
echo extendedKeyUsage = clientAuth >> extfile.cnf
openssl x509 -req -days 365 -sha256 -in client.csr -passin "pass:$PASSWORD" -CA "ca-$CODE.pem" -CAkey "ca-key-$CODE.pem" -CAcreateserial -out "cert-$CODE.pem" -extfile extfile.cnf

rm -vf client.csr server.csr

chmod -v 0400 "ca-key-$CODE.pem" "key-$CODE.pem" "server-key-$CODE.pem"
chmod -v 0444 "ca-$CODE.pem" "server-cert-$CODE.pem" "cert-$CODE.pem"

# 打包客户端证书
mkdir -p "tls-client-certs-$CODE"
cp -f "ca-$CODE.pem" "cert-$CODE.pem" "key-$CODE.pem" "tls-client-certs-$CODE/"
cd "tls-client-certs-$CODE"
tar zcf "tls-client-certs-$CODE.tar.gz" *
mv "tls-client-certs-$CODE.tar.gz" ../
cd ..
rm -rf "tls-client-certs-$CODE"

# 拷贝服务端证书
mkdir -p /srv/certs.d
cp "ca-$CODE.pem" "server-cert-$CODE.pem" "server-key-$CODE.pem" "tls-client-certs-$CODE.tar.gz" /srv/certs.d/

开启 Docker API

  • sudo vim /lib/systemd/system/docker.service

alt text

  • 在 ExecStart 行的后面添加以下选项:
-H=tcp://0.0.0.0:2376 --tlsverify --tlscacert=/srv/certs.d/ca-docker_api.pem --tlscert=/srv/certs.d/server-cert-docker_api.pem --tlskey=/srv/certs.d/server-key-docker_api.pem
  • 最后,执行以下命令重新加载服务并重启 Docker:
sudo systemctl daemon-reload && sudo service docker restart

验证

此时,我们需要验证 Docker API 是否能够访问,且是否只能通过加密访问。

首先执行 docker -H=127.0.0.1:2376 info,一般来说会返回:

Client: Context:    default Debug Mode: false Plugins: app: Docker App (Docker Inc., v0.9.1-beta3) buildx: Docker Buildx (Docker Inc., v0.9.1-docker) Server: ERROR: Error response from daemon: Client sent an HTTP request to an HTTPS server. errors pretty printing info

这是因为没有通过 tls 去访问,此时改用 docker -H=127.0.0.1:2376 --tlsverify info,会出现下面的错误:

unable to resolve docker endpoint: open /root/.docker/ca.pem: no such file or directory

这是由于目前没有在对应的用户文件夹下配置证书,我们可以执行以下命令:

mkdir ~/.docker && \
tar -zxvf /srv/certs.d/tls-client-certs-docker_api.tar.gz -C ~/.docker && \
mv ~/.docker/ca-docker_api.pem ~/.docker/ca.pem && \
mv ~/.docker/cert-docker_api.pem ~/.docker/cert.pem && \
mv ~/.docker/key-docker_api.pem ~/.docker/key.pem

完成后再执行一遍 docker -H=127.0.0.1:2376 --tlsverify info 即可获取信息了,至此验证完成。

配置 Portainer

  • 获取tls要用的文件
    • sz /srv/certs.d/tls-client-certs-docker_api.tar.gz

Environment - Add environment - docker standalone - API - TLS 打开

编程3 min read

查看登录失败次数

# 查看登录失败 (尝试攻击的情况)
sudo grep 'Failed password' /var/log/auth.log | awk '{print $1,$2}' | uniq -c
# 查看登录成功的情况
sudo grep 'session opened for user' /var/log/auth.log | awk '{print $1,$2}' | uniq -c

实况

基本上时时刻刻有人在尝试登陆,前天 8k 多次失败访问。

可怕的来了,登陆成功的情况也很多。

尝试解决

  • 开 file2ban 应该问题不大
    • sudo apt update && sudo apt install fail2ban && systemctl status fail2ban.service
    • head -20 /etc/fail2ban/jail.conf
    • fail2ban-client --help
  • 开的机器用户名默认不是 root,登录也只能通过 ssh key

想法

  • 做个脚本跑个定时任务,当 尝试次数过多 或者 登录次数过多 的时候就发个邮件过来提醒。

增加 google 验证

编程One min read

trash-cli

安装

  • 安装 sudo apt install trash-cli

使用

  • trash-put: 把文件或目录移动到回收站
  • trash-empty: 清空回收站
  • trash-list: 列出回收站文件
  • trash-restore: 恢复回收站文件
  • trash-rm: 删除回收站文件

配置

  • 七天删除 (crontab -l ; echo "@daily $(which trash-empty) 7") | crontab -

    • 查看 cat /var/spool/cron/crontabs/root
  • 设置别名 alias rm='trash' (官方不推荐)

编程One min read

sudo apt install rdfind
rdfind -deleteduplicates true /media/faonecze/资料存档/

windows 用 DoubleKiller.exe 还挺方便的

编程One min read

自己喜欢啥,总要一遍一遍和朋友介绍,感觉比较麻烦,这样汇总一下,方便朋友一次性安利。

ps. 每个工具其实在 B 站都有视屏科普,大佬们也可以上 B 站看看。

硬件

键盘: Anne pro 2

  • 全键自定义
  • tap key: 支持轻触方向键
  • magic key: CaspLk 也可以自定义设置为 FN 键
  • 键盘宏
  • 自定义 rgb
  • type-C 充电
  • USB + 蓝牙双模
  • 四蓝牙连接
  • 带电量显示:Fn2 + 8

缺点是没有静音版本,选了红轴默认不按到底,勉勉强强声音不大。
有个注意点是,当线连接电脑,没关掉蓝牙的话,默认还是蓝牙输入输出,线支持充电。


鼠标:罗技 M590

静音,用电久,自定义鼠标滚轮左右方向,双蓝牙,多设备支持 Logitech Flow,缺点是不好看。

鼠标:罗技 M720

同上款,自定义按键更多,据说有二三十个。缺点是不静音。


软件

ps. 本人是全 windows 开发。

伪 Linux 系统

wsl2 支持 docker 了,Terminus 配上个炫酷的半透明界面,oh my zsh 自带各种插件好用的哼,一套下来,windows 变 Linux,并且 pycharm 支持基于 wsl 开发,巴适得很。

关于 sz rz 传输 我这里有个 解决方案

Terminus 需要准备一下

wsl2 默认 root 用户

  • ubuntu config --default-user root

一个 windows 路径转换脚本,建议放到用户执行目录上,复制的 windows 路劲快速转换为 Linux。

#!/usr/bin/env python
# encoding: utf-8
# Created by zza on 2021/6/9 14:23
import re

from prompt_toolkit.clipboard import pyperclip

def convert_path():
path = pyperclip.pyperclip.paste() # r'/mnt/d/Programs/ActivityWatch'
wsl_result = re.match(r"(^[A-Z]:)\\(.*)", path)
if wsl_result:
_disk_symbol = wsl_result[1][:-1].lower()
wsl_path = f'\\mnt\\{_disk_symbol}\\{wsl_result[2]}'.replace('\\', '/')
pyperclip.pyperclip.copy(wsl_path)
print(wsl_path)
return wsl_path
elif re.match(r"^/mnt/([a-z])/(.*)", path):
win_result = re.match(r"^/mnt/([a-z])/(.*)", path)
tail = win_result[2].replace("/", "\\")
win_path = f'{win_result[1].upper()}:\\{tail}'
pyperclip.pyperclip.copy(win_path)
print(win_path)
return win_path
else:
print(f'nothing to do with {path}')
return

if __name__ == '__main__':
pyperclip.pyperclip.copy('D:\\Programs\\ActivityWatch')
convert_path()
print(pyperclip.pyperclip.paste())

  • 输入一下命令切换剪贴板里的路径,还是很舒服的。

  • 之前用的 cmder 感觉还行,但是和 terminus 相比,界面就丑了很多。


办公套件 to do list + outlook

待办不管是上班还是平时都用得上。
[[outlook 支持将邮件自动转入待办]]。

顺便说一下,outlook 的日历管理也很香。

手机日历上选择 Exchange 导入方式导入日历,就手机端和电脑端同步了。


分屏利器 PowerToys

这个每个 帖子 都讲烂了,自己看把。

顺便说说 windows 虚拟桌面(部分小伙伴不知道)

windows + ctrl + d 创建桌面
windows + ctrl + f4 删除桌面
windows + ctrl +方向键 快速移动

好了恭喜你拥有了无数个虚拟桌面。可以给桌面命名,把摸鱼桌面,学习桌面,工作桌面,看板桌面分开。

番茄时钟

google play 搜索 Tea Time

  • 支持多个定时器同时启动
  • 自定义是闹钟还是震动
  • 安卓桌面组件,快速启动,支持自定义外观。


随笔3 min read

如何在 python 异步函数中 debug


import asyncio
from aredis import StrictRedis
import nest_asyncio

# pip3 install aredis[hiredis]
# pip3 install nest_asyncio

async def example():
client = StrictRedis(host='127.0.0.1', port=6379, db=0)
await client.flushdb()
# error await client.flushdb()
# error asyncio.get_event_loop().run_until_complete(client.flushdb())
# error asyncio.new_event_loop().run_until_complete(client.flushdb())
# error asyncio.run(client.flushdb())

await client.set('foo', 1)
assert await client.exists('foo') is True
await client.incr('foo', 100)

assert int(await client.get('foo')) == 101
await client.expire('foo', 1)
await asyncio.sleep(0.1)
await client.ttl('foo')
await asyncio.sleep(1)
assert not await client.exists('foo')

loop = asyncio.get_event_loop()
# success nest_asyncio.apply()
loop.run_until_complete(example())

PythonOne min read

windows 进程 监控

  • windows wmi-exporter 进程监控
    • 对应的看板 dashboard Id 10467
    • 没有进程数据
      • 服务器管理器找到 WMI exporter
        • 添加参数 --collectors.enabled "[defaults],process,container"
Grafana Status Map Panel not working, shows "Panel plugin not found: flant-statusmap-panel" #197
  • 解决方法
    • Open your Grafana instance and go to the Plugins section in the left-hand -nu.
    • Search for "statusmap" in the search bar.
    • Click on the "Install" button for the "statusmap" plugin.
    • Wait for the installation to complete.\

Grafana + prometheus + node-exporter docker-compose.yml

vim prometheus/docker-compose.yml

version: "3.7"
services:
node_exporter:
image: quay.io/prometheus/node-exporter:latest
container_name: node_exporter
command:
- '--path.rootfs=/host'
user: "1000"
network_mode: host
# pid: host
restart: unless-stopped
volumes:
- '/:/host:ro,rslave'
prometheus:
image: prom/prometheus:latest
container_name: "prometheus"
restart: always
ports:
- "9111:9090"
volumes:
- "./prometheus.yml:/etc/prometheus/prometheus.yml"
- "./prometheus_data:/prometheus"
grafana:
image: grafana/grafana
container_name: "grafana"
ports:
- "3000:3000"
restart: always
volumes:
- "./grafana_data:/var/lib/grafana"
process-exporter:
image: ncabatoff/process-exporter
command: --procfs /host/proc -config.path /config/process-exporter-config.yml
privileged: true
volumes:
- /proc:/host/proc
- ./process-exporter-config.yml:/config/process-exporter-config.yml
ports:
- "9256:9256"
restart: always

vim prometheus/prometheus.yml - 需要根据自己的 ip 进行修改器

global:
scrape_interval: 15s # 默认抓取周期
external_labels:
monitor: "codelab-monitor"
scrape_configs:
- job_name: "node-exporter" #服务的名称
scrape_interval: 5s
metrics_path: /metrics #获取指标的 url
static_configs:
- targets: ["192.168.31.2:9100"] # 这个为监听指定服务服务的 ip 和 port,需要修改为自己的 ip,貌似云服务必须用公网 ip
- job_name: "process-exporter"
scrape_interval: 5s
metrics_path: /metrics
static_configs:
- targets: ["192.168.31.2:9256"]
- job_name: "windows-laptop"
scrape_interval: 5s
metrics_path: /metrics
static_configs:
- targets: ["192.168.31.3:9182"]
- job_name: "other-node-192.168.31.5-node-exporter"
scrape_interval: 5s
metrics_path: /metrics
static_configs:
- targets: ["192.168.31.5"]

node-exporter linux 服务器状态监控

prometheus 相关

看板 Grafana

  • http://ip:9111/3000

  • 配合 node - 的 Dashborad 编号是 9276

    • Grafana 直接搜索 id 就能找到别人分享的看板。
    • 需要单独配置下 网络 io 图表。
    • 都是可视化的 先再 node-exporter 里找到相关指标,然后可视化点点点就能出现数据。
编程2 min read

买了个二手 mini 主机,刷成 ubunu 在家里当服务器用。

服务器配置

  • 天虹迷你主机
    • 电脑型号 - X64 兼容笔记本电脑(扫描时间:2022 年 11 月 15 日)
    • 操作系统 - Windows 10 专业版 64 位 (4.09.000904)
    • 处理器 - AMDA6-Series A6-1450 四核
    • 主板 - U14G-M ( AMD PCI standard host CPU bridge )
    • 内存 - 8 GB(极匠 DDR3L1600MHz)
    • 主硬盘 - 极匠 GJN128G(128GB/固态硬盘)
    • 显卡 - AMD Radeon HD 8250/8280G(512 MB/AMD)
    • 显示器 - NTP2401NT24GMB18()(52 英寸)
    • 声卡 - 瑞 ALC662 @AMD High Definition Audio Controller
    • 网卡 - 博通 BCM430N 80211n Network Adapter

小服务器

  • 需求
    • docker
    • 旁路由
    • 移动硬盘共享
  • 优先
    • 声音小
    • 耗电小
  • 测量耗电量
    • 小米智能插座

需要调查

  • 网口理速度
    • ethtool enp2s0
      • 1000baseT/Full 理论支持千兆网
  • 硬盘直接插 和 usb3.0 插入的差别
    • usb3.0 5 GPS 625 MB/s
    • SATA2 3Gbps 375MB/s -> 300MB/s
    • SATA3 6Gbps 750MB/s -> 600MB/s
  • 网口 与 usb3.0 or usb2.0 转网口的速率区别
    • USB3.0 传输速率达 USB 2.0 十倍,USB 2.0 的速率为 480 Mbps,而 USB 3.0 则可达到 4.8 Gbps。
    • 自带网口速度差不多 1000 MB/s
  • 网速测试
    • 内网测速 iperf3
      • 2.24 GBytes
      • 321 Mbits/sec
    • 一键测速 speedtest-cli
      • Download: 30.12 Mbit/s
      • Upload: 16.61 Mbit/s

U 盘启动器下载

  • 微 pe
    • 不能装 Linux
  • linux 下载 - ubuntu-22.04.1-live-server-amd64.iso
  • Universal-USB-Installer-2.0.0.8.exe

ubuntu 联 wifi

network:
version: 2
renderer: NetworkManager
wifis:
wlan0:
dhcp4: true
access-points:
"holypangci_5G":
password: "111111111"
dhcp6: true

功耗

  • 用的小米智能插座
  • 刚开机 啥也不跑 0.1 kWh
  • 当前功率 10w
  • 月功率 0.27 kWH

挂载硬盘

  • 挂载硬盘

  • nas docker 参考

  • 开机检测 在开机的时候 检测到移动硬盘 自动挂载

    • sudo lsblk
    • sudo fdisk -l
    • sudo mount -t auto /dev/sda2 /mnt/data
  • systemctl restart smbd.service

  • [[clash]]

    network:
version: 2
renderer: networkd
ethernets:
enp2s0:
dhcp4: true
optional: true

docker

  • 摸鱼工具使用 docker run -it --rm svenstaro/genact

  • docker 安装

$ sudo vim /etc/docker/daemon.json

{
"registry-mirrors": [
"https://hub-mirror.c.163.com",
"https://ustc-edu-cn.mirror.aliyuncs.com",
"https://ghcr.io",
"https://mirror.baidubce.com"
]
}

通过正在运行的 docker pod 获取 docker-compose.yaml

docker run --rm -v /var/run/docker.sock:/var/run/docker.sock red5d/docker-autocompose <container-name-or-id>
sudo docker run --rm -v /var/run/docker.sock:/var/run/docker.sock red5d/docker-autocompose epic_bartik
sudo docker stop $(sudo docker ps -aq)

samba

硬盘读写测试

参考

  • ssd 读写
zza@zza-server:smb_tmp % time dd if=/dev/zero of=./testReadOrWrite bs=8k count=100000
记录了100000+0 的读入
记录了100000+0 的写出
819200000字节(819 MB,781 MiB)已复制,5.94344 s,138 MB/s
dd if=/dev/zero of=./testReadOrWrite bs=8k count=100000 0.16s user 4.67s system 80% cpu 6.003 total
zza@zza-server:smb_tmp % time dd if=./testReadOrWrite of=/dev/null bs=8k count=100000
记录了100000+0 的读入
记录了100000+0 的写出
819200000字节(819 MB,781 MiB)已复制,0.852206 s,961 MB/s
dd if=./testReadOrWrite of=/dev/null bs=8k count=100000 0.06s user 0.79s system 99% cpu 0.857 total
zza@zza-server:smb_tmp % time dd if=./testReadOrWrite of=./testReadAndWrite bs=8k count=100000
记录了100000+0 的读入
记录了100000+0 的写出
819200000字节(819 MB,781 MiB)已复制,6.46195 s,127 MB/s
dd if=./testReadOrWrite of=./testReadAndWrite bs=8k count=100000 0.13s user 5.27s system 83% cpu 6.507 total
  • 机械硬盘读写
zza@zza-server:tmp % time dd if=/dev/zero of=./testReadOrWrite bs=8k count=100000
记录了100000+0 的读入
记录了100000+0 的写出
819200000字节(819 MB,781 MiB)已复制,42.5608 s,19.2 MB/s
dd if=/dev/zero of=./testReadOrWrite bs=8k count=100000 0.28s user 7.69s system 18% cpu 42.591 total
zza@zza-server:tmp % time dd if=./testReadOrWrite of=/dev/null bs=8k count=100000
记录了100000+0 的读入
记录了100000+0 的写出
819200000字节(819 MB,781 MiB)已复制,0.835777 s,980 MB/s
dd if=./testReadOrWrite of=/dev/null bs=8k count=100000 0.08s user 0.76s system 99% cpu 0.840 total
zza@zza-server:tmp % time dd if=./testReadOrWrite of=./testReadAndWrite bs=8k count=100000
记录了100000+0 的读入
记录了100000+0 的写出
819200000字节(819 MB,781 MiB)已复制,42.0116 s,19.5 MB/s
dd if=./testReadOrWrite of=./testReadAndWrite bs=8k count=100000 0.29s user 8.90s system 21% cpu 42.039 total
随笔4 min read