A delightful day!

最近折腾了一套 AUR 自动构建脚本,用来把常用的 AUR 包编译成自己的 pacman 仓库,并同步到 Cloudflare R2。
整体思路并不复杂:GitHub Actions / 容器负责构建,pikaur 负责拉取和编译 AUR 包,repo-add 负责生成仓库数据库,最后用 rclone 把产物上传到 R2。
这套脚本主要解决几个问题:
最终效果是:只要脚本跑完,R2 上会生成完整的 pacman 仓库目录,客户端添加源之后就可以像官方源一样安装。
脚本大致分成几块:
1 | script/ |
核心入口是 main.zsh,它负责完成完整流水线:
1 | 初始化 pacman / makepkg |
脚本会先启用 multilib,再把自定义的 MAKEPKG_CONF 写入 /etc/makepkg.conf。
这里主要配置:
CFLAGS / CXXFLAGS:按机器架构优化MAKEFLAGS:自动使用多线程编译BUILDENV:开启包签名,关闭不需要的构建特性PKGEXT:统一使用 pkg.tar.zstCOMPRESSZST:提高压缩效率然后创建一个独立的 aur-build 用户,所有 AUR 构建都在这个用户下执行,避免直接用 root 跑 makepkg。
普通 AUR 包可以直接放在 packages/包名/PKGBUILD 下,由 pikaur 处理依赖和构建。
对于需要特殊处理的包,则可以单独写 build.zsh。例如某些官方包需要改 PKGBUILD、禁用 strip 或调整 makepkg 配置,就可以在独立脚本里完成。
这种设计的好处是:
构建完成后,脚本不会简单地在旧数据库上继续追加,而是先清理再重建:
1 | 删除 debug 包 |
这样可以避免几个常见问题:
对个人仓库来说,这种“从当前产物重建数据库”的方式更可控。
上传部分使用 rclone 的 S3 后端对接 Cloudflare R2。
配置不写入 rclone 配置文件,而是通过环境变量传入:
1 | RCLONE_CONFIG_R2_TYPE=s3 |
这样有两个优点:
脚本还会把 R2 endpoint 处理成 account-level endpoint,再把 bucket 名称放进路径里。这是为了避免 bucket-specific endpoint 在 list / delete / sync 场景下出现兼容问题。
这版脚本主要做了这些调整。
原始方案更偏向固定对象存储上传流程,我这里统一改成 rclone sync。
优点是:
script.conf所有 R2 相关配置都放在同一个配置文件中,包括:
这样脚本本身只负责流程,具体环境差异都交给配置文件处理。
原始脚本会预设 GPG passphrase,适合带密码的私钥。
我的场景里使用的是无密码私钥,所以去掉了 gpg-preset-passphrase 相关逻辑,只保留:
1 | pacman-key 导入并信任 |
流程更短,也更符合当前使用方式。
直接在旧数据库上追加包,时间久了容易留下脏状态。
现在每次上传前都会:
paccache -k1 保留最新版repo-add这样 R2 上的仓库更像一次干净发布,而不是不断叠加的历史目录。
upload_script.zsh 会用 7z 把脚本目录打包,并开启文件名加密:
1 | 7z a /tmp/script.7z -mhe=on -p"$PASSWORD" ./ |
然后把加密包上传到 R2 的指定路径。
这样即使 CI 环境临时丢失,也可以从对象存储里恢复脚本配置。当然,真正敏感的 token 和私钥仍然建议放在 CI secret 里,不要长期明文落盘。
仓库发布后,在客户端导入 GPG key,然后添加 pacman 源:
1 | [custom] |
之后就可以直接安装:
1 | sudo pacman -Syu |
如果是私有仓库,也可以把 R2 前面接 Cloudflare Access 或者只在内网环境使用。
这套脚本的重点不是“能不能构建 AUR”,而是把 AUR 构建变成一个稳定的发布流程:
对于只有几台 Arch 设备的个人用户来说,这种方式已经足够轻量;对于经常折腾 AUR 包、又不想在本机反复编译的人来说,也能省下不少时间。
整理目前可用于开发测试的免费/可白嫖 AI 推理 API 方案。
https://github.com/LLM-Red-Team/qwen-free-api
https://www.modelscope.cn/docs/model-service/API-Inference/intro
https://github.com/tbphp/gpt-load
/gpt-load 轮询https://github.com/marketplace?type=models
GitHub 官方提供模型推理能力:
优点:
https://openrouter.ai/openrouter/free/providers
特点:
适合作为:
https://github.com/Rfym21/Qwen2API
https://github.com/cacaview/iflow2api
https://github.com/justlovemaki/AIClient-2-API
https://github.com/su-kaka/gcli2api
https://build.nvidia.com/models
参考项目:
https://github.com/openclaw/openclaw/tree/main/extensions/minimax-portal-auth
支持 MiniMax 免费 OAuth 调用。
可以使用自写脚本 minimax-oauth.js 获取 access_key。
📥 下载 minimax-oauth.js
API 示例:
1 | { |
特点:
高可用白嫖方案示例:
1 | OpenRouter Free |
配合 gpt-load 做轮询,实现:
| 类型 | 推荐指数 | 难度 | 适用场景 |
|---|---|---|---|
| OpenRouter | ⭐⭐⭐⭐ | 简单 | 快速接入 |
| qwen-free-api | ⭐⭐⭐⭐ | 中等 | 稳定自建 |
| GitHub Models | ⭐⭐⭐ | 简单 | 开发测试 |
| Gemini gcli2api | ⭐⭐⭐⭐ | 中等 | 高质量输出 |
| MiniMax OAuth | ⭐⭐⭐⭐ | 中等 | 自动刷新 Key |
| NVIDIA Build | ⭐⭐⭐ | 简单 | 研究测试 |
适合做:
在 ARM 架构的飞牛设备上,相册服务无法正常加载,查看日志发现 imagesrv 启动失败。
错误日志位置:
1 | /usr/local/apps/@appdata/trim.photos/log/error.log |
错误日志内容如下:
使用 ldd 检查 imagesrv 相关依赖时,发现缺少 FFmpeg 相关动态库:
系统自带的 FFmpeg 版本不满足 imagesrv 的依赖需求,需要手动安装较新的 ARM64 版本,并正确配置 LD_LIBRARY_PATH。
从官方构建仓库下载 ARM64 版本:
1 | https://github.com/BtbN/FFmpeg-Builds/releases/download/autobuild-2025-08-31-13-00/ffmpeg-n6.1.3-linuxarm64-lgpl-shared-6.1.tar.xz |
解压到 /opt/ffmpeg6/:
1 | sudo mkdir -p /opt/ffmpeg6 |
确保目录结构中包含:
1 | /opt/ffmpeg6/ |
编辑服务文件:
1 | sudo vi /etc/systemd/system/imagesrv.service |
修改为如下内容(关键是 LD_LIBRARY_PATH):
1 | [Unit] |
1 | sudo systemctl daemon-reload |
imagesrv 服务正常启动