跳到主要内容

博客

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

因为是 zsh 所以修改 vim source ~/.zshrc

if command -v tmux &> /dev/null && [ -z "$TMUX" ]; then
tmux at -t 0 || tmux new -s 0
fi

一个命令版本

echo -e "\n# Automatically start tmux session\nif command -v tmux &> /dev/null && [ -z \"\$TMUX\" ]; then\n    tmux attach-session -t 0 || tmux new-session -s 0\nfi\n# Automatically start tmux session end\n" >> ~/.zshrc
source ~/.zshrc

再也也不用担心长命令不敢关 terminal 啦~

编程阅读需 1 分钟

Cloudflare Worker 是由 Cloudflare 提供的一种边缘计算平台,用于在全球分布的边缘节点上运行和扩展代码。它允许开发人员将自定义代码部署到 Cloudflare 的网络中,将计算任务尽可能地靠近用户,实现低延迟和高性能的应用程序。

使用 Cloudflare Worker,开发人员可以编写和部署 JavaScript 代码,这些代码在 Cloudflare 的边缘节点上执行。这意味着代码可以在靠近用户的位置运行,而不是在传统的中心化服务器上。这种分布式计算的方式可以提供更快的响应时间和更好的用户体验。

代码如下:

export default {
// async fetch(request, env, ctx) {
// return new Response('Hello World!');
// },


async fetch(request, env, ctx) {
const response = await fetch('https://www.bing.com/HPImageArchive.aspx?format=js&idx=0&n=1&mkt=en-US')
const data = await response.json()

const image_url = data.images[0].url
const target_url = `https://www.bing.com${image_url}`

const image_response = await fetch(target_url)

const response = new Response(image_response.body, image_response);
// 图片到期时间太长 有8天 设置 Cache-Control 标头
const CACHE_TIME = 12 * 60 * 60; // 缓存时间为 12 小时,单位为秒
response.headers.set('Cache-Control', `max-age=${CACHE_TIME}`);

return response;
}
};
  • 保存后项目会提示有对应的订阅链接
    • 这个链接就不放了,有每日 10w 的使用次数
  • 其实是为了 cloudflare-worker 这盘醋包了 bing-wallpaper 这个饺子。

图片到期时间太长

在 Microsoft Edge 浏览器中,你可以使用开发者工具来查看图片的缓存到期时间。请按照以下步骤进行操作:

  1. 打开 Microsoft Edge 浏览器,并导航到包含你要查看的图的网页。
  2. 在浏览器中,按下 F12 键,或右键点击网页上的任何位置,然后选择 "检查" 或 "检查元素"。这将打开开发者工具窗口。
  3. 在开发者工具窗口中,切换到 "网络" 或 "Network" 选项卡。这将显示所有加载的网络资源列表。
  4. 在资源列表中,找到你要查看缓存到期时间的图片。你可以使用筛选器或直接滚动浏览列表来找到它。
  5. 右键点击图片资源,并选择 "检查" 或 "Inspect"。这将打开 "元素" 或 "Elements" 面板,其中将显示有关该图片的详细信息。
  6. 在 "元素" 或 "Elements" 面板中,查找 "请求标头" 或 "Request Headers" 部分。在该部分中,你将看到 "缓存控制" 或 "Cache-Control" 的信息。它会提供关于图片缓存到期时间的指示。
    • 如果 "缓存控制" 或 "Cache-Control" 的值为 "max-age=xxx",其中 "xxx" 表示以秒为单位的缓存有效期。例如,"max-age=3600" 表示图片缓存将在 3600 秒(1 小时)后过期。
    • 如果 "缓存控制" 或 "Cache-Control" 的值为 "no-cache",表示该图片不会被缓存。
  • 通过查看缓存控制标头,你可以了解图片缓存的到期时间或是否会被缓存。请注意,这仅适用于服务器正确设置了缓存控制标头的情况。如果服务器未提供缓存控制信息,浏览器可能会使用默认的缓存策略。

  • 增加代码解决

    const CACHE_TIME = 12 * 60 * 60; // 缓存时间为 12 小时,单位为秒
const response = new Response(image_response.body, image_response);
// 设置 Cache-Control 标头
response.headers.set('Cache-Control', `max-age=${CACHE_TIME}`);
编程阅读需 3 分钟

images

  • [参考]
  • 项目地址 gethomepage/homepage
  • 先拉个镜像
    • 镜像拉起后会有配置自动出现在 ./config 这个目录里
    • 然后可以通过 VSCode SFTP 插件同步到编辑器,编辑完后再上传到部署服务器上。
version: "3.3"
services:
homepage:
image: ghcr.io/gethomepage/homepage:latest
container_name: homepage
environment:
ports:
- 3000:3000
volumes:
- ./config:/app/config # Make sure your local config directory exists
- /var/run/docker.sock:/var/run/docker.sock:ro # optional, for docker integrations
restart: unless-stopped

快速给每个 收藏点加上 ping 的功能

  • vscode 中 ctrl+R 打开当前文件的内容替换

    • 查找:href: (.*)\n(?! ping)
    • 替换为:href: $1\n ping: $1\n
    • 点击 "替换所有"
  • 相关文章

    • [[使用 cloudflare-worker 获取 bing-wallpaper 的每日壁纸]]
编程阅读需 1 分钟

tt-rss

  • Tiny Tiny RSS(TT-RSS)是一款基于 PHP 的免费开源 RSS 聚合阅读器,需要自行托管和部署,为基于网页的 RSS 阅读器。 暂时没找到邮件推送的方法。
  • 目前有被墙的 feedly 做替代品,不知道好用不。
  • 订阅配置可以一键导出,切换用问题不大。

wget https://raw.githubusercontent.com/HenryQW/Awesome-TTRSS/master/docker-compose.yml
docker-compose down
docker-compose up -d

http://localhost:181/ 默认账户: admin 密码: password

设置代理

在 docker-compose.yml 中 environment 增加全局变量 HTTP_PROXYHTTPS_PROXY

  service.rss:
image: wangqiru/ttrss:latest
container_name: ttrss
ports:
- 181:80
environment:
- HTTP_PROXY=http://localhost:9999
- HTTPS_PROXY=http://localhost:9999

设置邮件

  • 参考 [[ttrss 邮件]]
  service.rss:
image: wangqiru/ttrss:latest
container_name: ttrss
ports:
- 181:80
environment:
- ENABLE_PLUGINS=auth_internal,mailer_smtp # plugin
- SMTP_FROM_NAME=Tiny Tiny RSS
- SMTP_FROM_ADDRESS=USERNAME@gmail.com
- SMTP_SERVER=smtp.gmail.com:465
- SMTP_LOGIN=USERNAME@gmail.com
- SMTP_PASSWORD=PASSWORD
- SMTP_SECURE=tls

浏览器插件

  • RSSHub Radar
    • RSSHub Radar 是 RSSHub 的衍生项目,是一个能帮助用户发现和订阅 RSS 源的浏览器扩展插件。
    • 强烈建议安装。
    • 可以发现如 知乎、b 站、github 等 不常用 非官方 的 RSS 订阅源。
      • github 有官方的 release 订阅源,RSSHub Radar 不会显示,在 rsshub 教程 查到的。
    • 需要 TTRSS 能翻墙访问 RSSHub
  • 默认订阅源

rsshub

  • RSSHub 是一个开源、简单易用、易于扩展的 RSS 生成器,可以给任何奇奇怪怪的内容生成 RSS 订阅源。它借助于开源社区的力量快速发展,目前已适配数百家网站的上千项内容。
  • RSSHub 和 TT-RSS 的主要区别在于,RSSHub 是一个 RSS 生成器,可以将非 RSS 格式的内容转换为 RSS 格式以便订阅;而 TT-RSS 是一个 RSS 阅读器,用于订阅和阅读 RSS 格式的内容。
  • 一般情况下不用部署
mkdir ~/server/rss -p
cd ~/server/rss
wget https://raw.githubusercontent.com/DIYgod/RSSHub/master/docker-compose.yml
docker volume create redis-data
docker-compose up -d

访问 localhost:1200

编程阅读需 2 分钟

参考

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

编程阅读需 1 分钟

装一个 trash-cli 工具

  • 创建 dockerfile
FROM filebrowser/filebrowser:latest
RUN apk add trash-cli
# vi docker-compose.yml
version: '3'
services:
filebrowser:
# image: filebrowser/filebrowser:latest
container_name: filebrowser
restart: always
build:
context: .
ports:
- "8089:80/tcp"
networks:
- net
volumes:
- ./filebrowser.db:/database.db
- ./.filebrowser.json:/.filebrowser.json
- /etc/localtime:/etc/localtime:ro
# data
- ./srv:/srv
- /mnt/data:/srv/data

networks:
net:
driver: bridge

  • 设置 - 全局设置 - 修改 Before Delete 删除命令
trash-put $FILE
  • 查找删除的文件在哪里
    • trash-list --trash-dirs

用 sh 脚本

修改

  • 并在 /srv/Trash/delete.log 中 增加删除记录
/bin/sh -c 'if [[ "$FILE" != "/srv/Trash/"* ]]; then mv $FILE /srv/Trash; fi'
/bin/sh -c 'if [[ "$FILE" != "/srv/Trash/"* ]]; then mv $FILE /srv/Trash/ && echo "[$USERNAME] Deleted: $FILE" >> /srv/Trash/delete.log; fi'
/bin/sh -c 'if [[ "$FILE" != "/srv/Trash/"* ]]; then mv $FILE /srv/Trash/ && echo "[$USERNAME $(date +"%Y-%m-%d_%H-%M-%S")] Deleted: $FILE" >> /srv/Trash/delete.log; fi'
  • 如果 /srv/Trash 有同名的 $FILE 文件 ,则拒绝移动并报错。
/bin/sh -c 'if [[ "$FILE" != "/srv/Trash/"* ]]; then mv $FILE /srv/Trash/ --suffix $(date +/"%Y-%m-%d_%H-%M-%S/") && echo "[$USERNAME $(date +/"%Y-%m-%d_%H-%M-%S/")] Deleted: $FILE" >> /srv/Trash/delete.log; fi'

报错

filebrowser  | 2024/03/13 11:20:56 [INFO] Blocking Command: "/bin/sh /root/before_delete.sh"
filebrowser | sh: /srv/Trash/delete.log: unknown operand
  • 改为 sh 脚本后 一行一行注释去找哪一行报错
  • "$FILE" != "/srv/Trash/"* 这一句有问题 会导致 /srv/Trash/delete.log: unknown operand
  • 改成字符串比较

改用 sh 脚本

#!/bin/sh

if [[ "${1:0:11}" != "/srv/Trash/" ]]; then
NOW=$(date +"%Y-%m-%d_%H-%M-%S")
T_FILE=$1
if [ -e "/srv/Trash/$(basename "$1")" ]; then
mv "$1" "${1}_${NOW}"
T_FILE="${1}_${NOW}"
fi

mv "${T_FILE}" /srv/Trash/
echo "$2 ${NOW} Deleted: $1 - /srv/Trash/$(basename ${T_FILE})"
echo "$2 ${NOW} Deleted: $1 -> /srv/Trash/$(basename ${T_FILE})" >> /srv/Trash/DELETE.log;
fi
  • 配置处改为 /bin/sh /root/before_delete.sh $FILE $USERNAME
编程阅读需 2 分钟

启动管理页面

  • 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 分钟

查看登录失败次数

# 查看登录失败 (尝试攻击的情况)
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 验证

编程阅读需 1 分钟

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' (官方不推荐)

编程阅读需 1 分钟

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

windows 用 DoubleKiller.exe 还挺方便的

编程阅读需 1 分钟