xiaohack's Blog - 容器化部署
type: channel
link: https://blog.xiaohack.org/tag/%E5%AE%B9%E5%99%A8%E5%8C%96%E9%83%A8%E7%BD%B2/
items: 雨云签到青龙脚本【多账号 + 过验证码】
items: 使用 podman 安装 RustFS 的两种方式
items: serverless 搭建 memos 简略教程
items: [IPFS 系列]最近在研究 IPFS 相关的东西, 给大家简单分享一下过程中攒下的一些小经验 - 使用脚本快速安装 Docker 版 IPFS.
items: sillytavern 设置域名 ipv6 优先教程
items: 自用 Certimate Docker Compose 配置分享
items: 【MODAL】发个简洁版的modal z-image-turbo 部署脚本
items: 一个能够优化大模型流式传输质量的 API 网关项目，支持 Docker 部署
items: 开源一个可以 Docker 容器部署的 ipa 下载工具，用于下载历史版本的 iOS 应用

雨云签到青龙脚本【多账号 + 过验证码】
type: item
date: 2026-01-24T07:01:53+08:00
description: 接：雨云无限白嫖 FRP 服务器攻略（无 aff）@fatekey 大佬的方案是单独开一个容器，我想着反正我有青龙面板在跑脚本，站在巨人的肩膀上顺手写了一个，把多账户也写进来了一、运行效果先看实际运行的效果吧【前两个账号运行已签到，仅测试多账户切换功能，临时注册的第三个号用于测试签到功能】## 开始执行... 2026-01-23 16:57:53 2026-01-23 16:57:54.116950139 [W:onnxruntime:Default, cpuid_info.cc:91 LogEarlyWarning] Unknown CPU vendor. cpuinfo_vendor value: 16 2026-01-23 16:57:54,191 - INFO - -------------------------------------------------------------------------------- 2026-01-23 16:57:54,191 - INFO - 雨云签到工具 by SerendipityR ~ 2026-01-23 16:57:54,191 - INFO - Github发布页: https://github.com/SerendipityR-2022/Rainyun-Qiandao 2026-01-23 16:57:54,192 - INFO - -------------------------------------------------------------------------------- 2026-01-23 16:57:54,192 - INFO - 雨云签到工具容器版 by fatekey ~ 2026-01-23 16:57:54,192 - INFO - Github发布页: https://github.com/fatekey/Rainyun-Qiandao 2026-01-23 16:57:54,192 - INFO - -------------------------------------------------------------------------------- 2026-01-23 16:57:54,192 - INFO - 项目为二次开发青龙脚本化运行 2026-01-23 16:57:54,192 - INFO - 本项目基于上述项目开发 2026-01-23 16:57:54,192 - INFO - 本项目仅作为学习参考，请勿用于其他用途 2026-01-23 16:57:54,192 - INFO - -------------------------------------------------------------------------------- 2026-01-23 16:57:54,192 - INFO - ✅ 成功解析3个账号 2026-01-23 16:57:54,192 - INFO - ================= 处理第1个账号 ================== 2026-01-23 16:57:54,192 - INFO - ========== 开始处理账号：TACGN ========== 2026-01-23 16:57:54,192 - INFO - ⏳ 随机延时 0 分钟 35 秒 2026-01-23 16:58:29,794 - INFO - ✅ Selenium驱动初始化成功，路径：/usr/bin/chromedriver 2026-01-23 16:58:29,809 - INFO - ✅ 已注入stealth.min.js反检测脚本 2026-01-23 16:58:29,809 - INFO - ⏳ 发起登录请求 2026-01-23 16:58:29,810 - INFO - 🌐 访问雨云登录页 2026-01-23 16:58:31,258 - INFO - 页面标题：登录 | 雨云 2026-01-23 16:58:31,258 - INFO - ⏳ 等待登录表单元素加载... 2026-01-23 16:58:31,376 - INFO - 📝 输入账号密码 2026-01-23 16:58:31,775 - INFO - ⏳ 正在登录中，耗时较长请稍等…… 2026-01-23 16:58:54,899 - INFO - ✅ 未触发登录验证码 2026-01-23 16:58:59,906 - INFO - 当前页面: https://app.rainyun.com/dashboard 2026-01-23 16:58:59,910 - I…

使用 podman 安装 RustFS 的两种方式
type: item
date: 2026-01-21T17:47:51+08:00
description: RustFS 支持容器化部署模式，可以用 docker run 命令或 docker compose 来快速安装一个 RustFS 实例。由于 podman 也是一个可以对容器进行管理的工具，大多数情况下是可以兼容 docker 命令的。因此，也可以用 podman 对 RustFS 进行容器化安装。本文分享两种安装方式。安装前提podman 环境，本文所需的 podman 环境信息如下# podman 版本 podman --version # podman-compose 版本 podman-compose --version podman-compose version: 1.0.6 ['podman', '--version', ''] using podman version: 4.9.3 podman-compose version 1.0.6 podman --version podman version 4.9.3 exit code: 0安装方式可以使用 podman run 或 podman compose 进行安装。podman run 安装使用如下命令即可：podman run -d -p 9000:9000 -p 9001:9001 \ -v $(pwd)/data:/data -v $(pwd)/logs:/logs \ docker.io/rustfs/rustfs:latest注意，需要把 data、logs 目录的权限改成 10001，因为 RustFS 是非 root 用户运行，不修改权限，会导致权限问题。查看容器状态：podman ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 593c5bffbce9 docker.io/rustfs/rustfs:latest rustfs 21 hours ago Up 21 hours 0.0.0.0:9000-9001->9000-9001/tcp exciting_herschelpodman compose 安装将如下内容写入 podman-compose.yml 文件：services: rustfs: image: docker.io/dllhb/disk-cap:0.0.1 container_name: rustfs hostname: rustfs environment: - RUSTFS_VOLUMES=/data/rustfs{1...4} - RUSTFS_ADDRESS=0.0.0.0:9000 - RUSTFS_CONSOLE_ENABLE=true - RUSTFS_CONSOLE_ADDRESS=0.0.0.0:9001 - RUSTFS_ACCESS_KEY=rustfsadmin - RUSTFS_SECRET_KEY=rustfsadmin - RUST_LOG=warn ports: - "9000:9000" # API endpoint - "9001:9001" # Console volumes: - ./data1:/data/rustfs1 - ./data2:/data/rustfs2 - ./data3:/data/rustfs3 - ./data4:/data/rustfs4 networks: - rustfs networks: rustfs: driver: bridge name: rustfs接着执行：podman compose up -d查看容器状态：podman compose ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES f6496b7856f3 docker.io/dllhb/disk-cap:0.0.1 /usr/bin/rustfs About a minute ago Up About a minute 0.0.0.0:9000-9001->9000-9001/tcp rustfs注意，需要把 data* 目录的权限改成 10001，因为 RustFS 是非 root 用户运行，不修改权限，会导致权限问题。使用 RustFS不管用哪种方式，当 RustFS 运行正常后，就可以通过 http://IP:9001 的方式登录 RustFS，默认用户名和密码都是 rustfsadmin/rustfsadmin。

serverless 搭建 memos 简略教程
type: item
date: 2026-01-15T14:10:24+08:00
description: 缘起只用服务器搭建 memos 未免太大材小用了，而且也浪费钱。所以就想尽量用无服务器部署 memos。renderrender 由于免费存储空间过低，不是优选。使用 render 创建 Web ServiceImage：填写为 neosmemo/memos:stableEnvironment Variables 分别填入: Key、portValue、5230保活方式： https://github.com/hoochanlon/keep-alivezeaburmemos 官方镜像按照如图所示填写相关参数🖼️ 图片加载失败打开图片链接使用 hu3rror/memos-litestream （该项目解决了备份换机迁移数据的痛点）项目镜像的填写方式S3 配置如图及相关解答（建议看完该 issue 链接内容）： https://github.com/hu3rror/memos-litestream/issues/67b2memosCF 代理 B2 配置见（适用于图床、文件管理免流服务）： https://github.com/hoochanlon/CF-Proxy-B2

[IPFS 系列]最近在研究 IPFS 相关的东西, 给大家简单分享一下过程中攒下的一些小经验 - 使用脚本快速安装 Docker 版 IPFS.
type: item
date: 2026-01-15T14:07:21+08:00
description: 我把 swarm 端口改成 4002 是因为 Planet 抢占了 4001 端口。这脚本大概这么干活：先瞅一眼：看看 Docker 装了没，别忙活半天白干。再检查一下有没有叫 ipfs_host 的老容器赖着不走，有的话就报错开溜，坚决不给自己留烂摊子。搭俩小窝：在当前目录下建 ipfs_staging 和 ipfs_data 两个文件夹，给 IPFS 的数据找个地方住。门户大开（但换了号）：因为 4001 被占了，咱就让 swarm 走 4002。API 端口是 8080，网关端口是 5001，按你的习惯随便改。拉起来跑：用最新的 ipfs/kubo 镜像把容器跑起来，把刚才设的端口和文件夹都挂载好。直接开门迎客：跑起来没问题的话，自动帮你打开浏览器，跳到 http://localhost:5001/webui 这个管理页面。接下来传点猫图试试手呗。怎么用？简单到不行：复制# 1. 给脚本加个执行权限 chmod +x deployment.sh # 2. 运行它 ./deployment.sh 脚本跑完没报错，你的浏览器就会蹦出 IPFS 的 Web 界面了。脚本在这儿 (deployment.sh)：复制#!/bin/bash # 检查 Docker 是否安装 if ! [ -x "$(command -v docker)" ]; then echo 'Error: Docker is not installed.' >&2 exit 1 fi echo 'Docker is installed.' # 检查是否有正在运行的 IPFS 容器 if [ "$(docker ps -q -f name=ipfs_host)" ]; then echo 'Error: An IPFS container is already running.' >&2 exit 1 fi echo 'No running IPFS container found.' # 检查是否有同名的停止状态的 IPFS 容器 if [ "$(docker ps -aq -f status=exited -f name=ipfs_host)" ]; then echo 'Error: A stopped IPFS container with the same name already exists.' >&2 exit 1 fi echo 'No stopped IPFS container with the same name found.' echo 'Proceeding with deployment...' # 创建存储目录 current_dir=$(pwd) cd $current_dir mkdir -p ./ipfs_staging mkdir -p ./ipfs_data echo 'Storage directories created.' # 设置环境变量 export ipfs_staging=./ipfs_staging export ipfs_data=./ipfs_data export ipfs_swarm_port=4002 export ipfs_api_port=8080 export ipfs_gateway_port=5001 echo "IPFS staging directory: ${ipfs_staging}" echo "IPFS data directory: ${ipfs_data}" echo "IPFS swarm port: ${ipfs_swarm_port}" echo "IPFS API port: ${ipfs_api_port}" echo "IPFS gateway port: ${ipfs_gateway_port}" # 运行 IPFS 容器 docker run -d --name ipfs_host -v ${ipfs_staging}:/export -v ${ipfs_data}:/data/ipfs -p ${ipfs_swarm_port}:4001 -p ${ipfs_api_port}:8080 -p ${ipfs_gateway_port}:5001 ipfs/kubo:latest if [ $? -ne 0 ]; then docker rm -f ipfs_host 2>/dev/null rm -rf ./ipfs_staging rm -rf ./ipfs_data echo 'Error: Failed to start the IPFS container.' >&2 exit 1 fi echo 'IPFS container starte…

sillytavern 设置域名 ipv6 优先教程
type: item
date: 2026-01-12T15:39:58+08:00
description: 背景：昨天开始就频繁的无法连接位于海外 vps 的反代，然后 ping 一下发现丢包率好高，今天突发奇想我的 vps 是带 ipv6 的，因为我部署酒馆的服务器是家庭宽带有公网的 ipv6，我就 ping6 试了一下发现延迟低不少而且丢包率为 0，以此开始以下环节。适用人群：使用国内 nas 或者小主机等在自己家部署的酒馆，也就是家庭网络，现在大部分家庭网络都有公网的 ipv6教程开始：检查服务器主机当前 DNS 解析顺序getent ahosts 你的域名 看输出结果是 ipv6 在前还是在后1-1.ipv6 在下时，设置 ipv6 优先查询配置文件cat /etc/gai.conf 如果出现以下默认配置则代表是 ipv6 优先#precedence ::1/128 50 #precedence ::/0 40 #precedence 2002::/16 30 #precedence ::/96 20 #precedence ::ffff:0:0/96 10 如果是出现以下，需要给前面加上 #号precedence ::ffff:0:0/96 100 检查 Docker 是否启用 IPv6docker network inspect bridge | grep -i ipv6 出现以下则代表开启“EnableIPv6”: true,2-1. 开启 docker 的 ipv61Panel 面板docker 界面设置，开启 ipv6，子网 fd00::/80并重启 docker 和容器检查容器是否有 IPv6 地址docker exec 容器名（sillytavern） ip -6 addr 如果出现enp1s0 和 ipv6 地址则代表获取成功3-1. 测试容器 ipv6 连通性docker exec 容器名 ping6 -c 2 你的ipv6地址 设置容器 IPv6 优先级酒馆是 Alpine 容器，在环境变量里添加NODE_OPTIONS=--dns-result-order=ipv6first 因为 docker 的网段设置是默认不带 ipv6 的所有在 1panel 里添加环境变量的时候，把网络段设置为 host在 ssh 里输入如下docker exec 容器名 node -e " 2const dns = require('dns'); 3dns.lookup('你的域名', { all: true }, (err, addrs) => { 4 console.log(addrs); 5}); 6" 7 ipv6 在前则设置成功在验证一下docker exec 容器名 node -e " const dns = require('dns'); dns.lookup('你的域名', (err, addr, family) => { console.log('实际使用 IP:', addr); console.log('IP 版本:', family === 6 ? 'IPv6' : 'IPv4'); }); " 结果显示的是实际使用 ip：你的公网 ipv6 则成功修改容器的 config.yamlprotocol: ipv4: true ipv6: true dnsPreferIPv6: true 📌 转载信息来源： https://linux.do/t/topic/1431146原作者： ak7876转载时间： 2026/1/12 15:39:49

自用 Certimate Docker Compose 配置分享
type: item
date: 2026-01-12T15:02:15+08:00
description: 分享一个自用的 Certimate docker compose file 配置，一个支持 SSL 证书从申请到部署完全自动化的开源软件。文档 | Certimatehttps://docs.certimate.me/zh-CN/docs/introduction/services: certimate: certimate/certimate:latest container_name: certimate restart: always ports: - "127.0.0.1:8090:8090" volumes: - /etc/localtime:/etc/localtime:ro - ./data:/app/pb_data environment: - TZ=Asia/Shanghai deploy: resources: limits: memory: 512M reservations: memory: 128M security_opt: - no-new-privileges:true read_only: true tmpfs: - /tmp:size=64M,mode=1777 healthcheck: test: ["CMD", "wget", "--spider", "-q", "http://localhost:8090/api/health"] interval: 30s timeout: 10s retries: 3 start_period: 10s logging: driver: json-file options: max-size: "10m" max-file: "3" compress: "true" networks: default: driver: bridge 📌 转载信息来源： https://linux.do/t/topic/1431017原作者： puppetdevz转载时间： 2026/1/12 15:02:10

自用 Certimate Docker Compose 配置分享
type: item
date: 2026-01-12T11:38:48+08:00
description: 分享一个自用的 Certimate docker compose file 配置，一个支持 SSL 证书从申请到部署完全自动化的开源软件。文档 | Certimatehttps://docs.certimate.me/zh-CN/docs/introduction/services: certimate: certimate/certimate:latest container_name: certimate restart: always ports: - "127.0.0.1:8090:8090" volumes: - /etc/localtime:/etc/localtime:ro - ./data:/app/pb_data environment: - TZ=Asia/Shanghai deploy: resources: limits: memory: 512M reservations: memory: 128M security_opt: - no-new-privileges:true read_only: true tmpfs: - /tmp:size=64M,mode=1777 healthcheck: test: ["CMD", "wget", "--spider", "-q", "http://localhost:8090/api/health"] interval: 30s timeout: 10s retries: 3 start_period: 10s logging: driver: json-file options: max-size: "10m" max-file: "3" compress: "true" networks: default: driver: bridge 📌 转载信息来源： https://linux.do/t/topic/1431017原作者： puppetdevz转载时间： 2026/1/12 11:38:43

【MODAL】发个简洁版的modal z-image-turbo 部署脚本
type: item
date: 2025-12-03T20:45:18+08:00
description: 账号密码需要自己改下，搜索xxx改为你想设置的，首次加载网页的时候会有点慢，我没写成两个容器注意：部署完别大量分享# ============================================================================= # Z-Image-Turbo Gradio Web UI (文生图) - Gradio + ComfyUI 后端 # ============================================================================= # 部署命令: modal deploy z_image_turbo_gradio_deploy.py # ============================================================================= import modal import json import os import subprocess from pathlib import Path # ============================================================================= # 镜像配置 - 强制重建: 2025-12-02-v15 (参考wan2简洁风格) # ============================================================================= comfy_image = ( modal.Image.debian_slim(python_version="3.11") .apt_install("git", "wget", "curl") .pip_install( "fastapi[standard]==0.115.4", "comfy-cli==1.5.3", "requests==2.32.3", "huggingface_hub[hf_transfer]==0.34.4", "pillow", "websocket-client", ) .env({"HF_HUB_ENABLE_HF_TRANSFER": "1"}) .run_commands( "comfy --skip-prompt install --fast-deps --nvidia", # 更新到最新 master 代码 "cd /root/comfy/ComfyUI && git fetch origin && git reset --hard origin/master", # 添加 z_image 到 DualCLIPLoader 类型列表 (nodes.py) "sed -i 's/\"hunyuan_video_15\"\\]/\"hunyuan_video_15\", \"z_image\"]/g' /root/comfy/ComfyUI/nodes.py", # 添加 Z_IMAGE 到 CLIPType 枚举 (sd.py) "sed -i 's/CHROMA = 15/CHROMA = 15\\n Z_IMAGE = 16/g' /root/comfy/ComfyUI/comfy/sd.py", # 添加 z_image 处理逻辑到 load_dual_clip "sed -i 's/elif clip_type == CLIPType.HUNYUAN_IMAGE:/elif clip_type == CLIPType.Z_IMAGE:\\n clip_target.clip = comfy.text_encoders.z_image.te(**llama_detect(clip_data))\\n clip_target.tokenizer = comfy.text_encoders.z_image.ZImageTokenizer\\n elif clip_type == CLIPType.HUNYUAN_IMAGE:/g' /root/comfy/ComfyUI/comfy/sd.py", ) .pip_install("gradio==3.41.0") ) app = modal.App(name="z-image-turbo-gradio", image=comfy_image) vol = modal.Volume.from_name("z-image-turbo-gradio-cache", create_if_missing=True) # ======================================…

一个能够优化大模型流式传输质量的 API 网关项目，支持 Docker 部署
type: item
date: 2025-11-21T16:41:03+08:00
description: [bsgit user="2erTwo6"]Smooth-Gateway[/bsgit]上游 API 提供商提供的流式传输可能是粗糙的、一大块一大块出现的，体感上不 “丝滑”Gemini Balance 的流式传输优化功能就解决了这个痛点，在玩酒馆等需要流式传输的场景下，能够极大的提高体验，但是就如项目名那样，只能给 Gemini 用。于是就有了这个项目，参考了 Gemini Balance 的思路，可以插入到任何一个 OpenAI 格式的 API 服务中间，对流式传输进行后处理，把粗糙的流切成细腻的流，再推送给最终的 AI 应用。目前仅支持接入 OpenAI 格式的 API，推荐的使用方法是先接入 New API，再套一层这个快速开始前提: 您已安装 Docker。克隆本仓库:git clone https://github.com/2erTwo6/Smooth-Gateway.git cd Smooth-Gateway创建并编辑配置文件:将模板文件复制为您的本地配置文件。cp .env.example .env然后使用您喜欢的编辑器（如 nano 或 vim）打开 .env 文件，并至少填入必需的 UPSTREAM_API_URL。构建 Docker 镜像:docker build -t smooth-gateway .运行容器:使用 --env-file 参数，Docker 会自动加载您的 .env 文件。docker run -d \ --name my-smooth-gateway \ -p 3001:3001 \ --env-file .env \ --restart unless-stopped \ smooth-gateway现在，您的流式优化网关已根据您的 .env 文件配置，在 http://localhost:3001 上运行！接下来，只需要在你的 AI 应用的 API URL 那里输入 http://localhost:3001 即可（假设你的 AI 应用和此 API 网关部署在同一机器？）

开源一个可以 Docker 容器部署的 ipa 下载工具，用于下载历史版本的 iOS 应用
type: item
date: 2025-11-02T15:40:25+08:00
description: 本次开源了一个我自用的工具 IPA-Harbor, 基于 ipatool ，用来下载 ipa ，避免重复的抓包下载 ipa 等操作，使用 Web 面板访问，支持 App 搜索、历史版本下载，支持 Docker 部署。Docker 仓库地址 https://hub.docker.com/r/uuphy/ipa-harborGithub 源码地址 https://github.com/ij369/ipa-harborGitHub 文档里有更详细的说明，感兴趣的可以点个小星星，有问题提 issue.我以前每次想下一个旧版 ipa 都要抓包，然后 AirDrop 给 iPhone , 后面逛帖子时发现 ipatool ，后面拿电脑抠命令，是在是厌烦了，可读的版本号也没有，所以有了想法写这个。另外，有一个 ipatool.ts 的项目，也非常好，不过我不想维护 ipatool 核心的部分，直接去 ipatool 项目的发版页下载最新的二进制文件，拷贝到我这个项目的 bin 目录即可，正所谓大树下好乘凉，感谢 ipatool 的贡献者，同时省去大家时间。目前我 ipatool 自用到现在已经有一年时间，两个地区的 ID （美区和日区）都没被封过，非常建议使用的话拿独立的 Apple ID 独立的容器运行，看了源码且如果对 ipatool 项目信任的话，再使用主力 Apple ID 。没有花钱购买应用的 ID ，这样能避免损失，具体可以去 App Store 进行切换登录，其实折腾这个的不一定只有一个 ID 吧。整个项目拿 Cursor 断断续续写的, 前期几乎是 Vibe Coding ，后续人手改，所以后端实现以及界面啥的都有点糙，不想投入大精力在这方面，主打安全，能用，后续慢慢打磨。 因为我的文件夹辗转腾挪，我导出过提示词，看了下很多都包含敏感内容，脱敏工作量有点大，就 git 忽略了，后续我如果有空再阅读完整理下放出来。侧载功能我按照好几个帖子试了下，好像是不可用, 前端已经暂时隐藏了该功能, 看看有没有大佬熟悉这这块帮忙看下能不能实现。我目前一直挂在外网在用，方便手机领免费应用啥的，以下截图的域名我已经做了更换。 截图里的内容仅供参考，仅作为功能演示：