MoreRSS

site iconLaoda | 咕咕修改

主要分享服务器折腾指南、Docker自建项目、博客搭建等技术内容,同时推荐好用的网站和在线工具。
请复制 RSS 到你的阅读器,或快速订阅到 :

Inoreader Feedly Follow Feedbin Local Reader

Laoda | 咕咕的 RSS 预览

【好玩儿的 Docker 项目】10 分钟搭建一个火狐加密文件外链自托管版本——Send,对方打开浏览器就能下,不用装 App

2026-08-27 14:25:15

1. 唠嗑

日常不管是工作还是生活中,我经常会有这样的需求:给别人一个安装包、一个配置文件、或者是一份内部资料,偶尔会需要传个视频。

一般这种情况下会用微信来传,但是有些敏感一点或者私密一点的东西,不想用它(尤其是apk文件默认还会给你改后缀);用邮箱附件的话工作上的可能更好一些,但是朋友之前的就显得比较麻烦了;我自己本身有搭建了nextcloud,用 Nextcloud 分享是OK的,但是有时候也觉得太重了一些;网上那些 WeTransfer 用着方便,文件却跑到别人服务器上,心里始终有点膈应。(都在一个局域网内的话,都是mac我就用airdrop,localsend也很好用,但是得对方有客户端)

今天咕咕给大家分享一个可以私有化部署的文件外链服务:Send

它是当年火狐 Firefox Send 停更之后,社区继续维护的版本。简单来说就是:

自己搭一个极简的传文件的网站。打开网页,把文件拖上去,得到一条链接发给对方。对方用手机浏览器点开就能下载,不用注册,也不用装 App。

文件会在浏览器里先加密再传到你的服务器,解密钥匙写在链接的 # 后面。次数用完或者到期,文件会从硬盘删掉,不会在你机器上当网盘一直占着。

注意一下:它和 Bitwarden 密码管理器里那个也叫 Send 的功能不是一回事。Bitwarden Send 适合临时丢密码、一段敏感文字;今天这个是专门传文件的。

2. Send 简介

4b4ed9eef46e1a6dc6f2a0d9b6ca37c6.png

Send 能干嘛?

  • 网页拖文件,生成加密分享链接
  • 对方不用注册、不用装 App,浏览器打开就能下
  • 可设置下载次数和过期时间
  • 次数用完或到期后,文件从服务器删除
  • 文件落在 VPS 本地磁盘,不必接 S3
  • 有配套命令行工具 ffsend,喜欢终端的小伙伴也能用

适合的场景包括:

  • 给同事、朋友发安装包、压缩包、文档
  • 偶尔发一个视频,对方用 iPhone Safari 就能下
  • 已经有 VPS,不想再为一两条外链去用商业网盘
  • 觉得 Nextcloud 太重,只想要「传完就走」

不适合的场景:

  • 当长期网盘、和家人同步相册
  • 需要登录后台查看「我发过的所有链接」
  • 需要对方在线播放、转码视频(那是另一类项目,视频播放的这个可以看看之前发过的Fire share这个项目)

提醒:Send 没有账号系统。管理卡片只存在你当时上传用的那个浏览器里。链接要自己复制保存,链接丢了,服务器上的密文也解不开。

2.1 和 Nextcloud / 网盘外链怎么选?

看到这里,可能还是有小伙伴会疑惑:

我已经有 Nextcloud 了,直接开分享链接不就好了?为啥还要再搭一个?

可以,但体验不一样。

Nextcloud 是网盘:同步、版本、权限、日历、协作都捆在一起,分享只是其中一项。Send 只做一件事——加密外链,用完就删。

简单对比一下:

方案 适合谁 优点 不足
微信 / 邮箱附件 随便发一下 对方一定有 体积限制大,不适合视频
Nextcloud 分享 已经在用网盘的人 和现有文件在一起 重,为了外链有点浪费
Bitwarden Send 丢密码、短文本 和密码库一体 附件很小,不适合大文件
Send 有 VPS、要给别人丢文件 轻、加密、对方不用装 App 没有账号后台,链接要自己保管

咕咕的建议是:

日常短文本、密码继续用 Bitwarden。

自己的文件同步继续用现有网盘。

专门「发给别人、对方打开就能下」这一件事,用 Send 更干净。

3. 相关地址

项目地址(GitLab 主仓库,GitHub 是镜像):

https://gitlab.com/timvisee/send

https://github.com/timvisee/send

Docker 说明:

https://github.com/timvisee/send/blob/master/docs/docker.md

命令行客户端 ffsend:

https://github.com/timvisee/ffsend

感兴趣的小伙伴可以去给项目点个星星。

当然如果你想自己用 Docker 搭建一个,那我们就继续往下!

4. 搭建环境

  • 服务器:咕咕这边建议用 1G 内存以上的 VPS,比如 莱卡云服务器,当然你也可以选择其他 高性价比的服务器。重点看磁盘和带宽,因为文件会先落到服务器硬盘,再从这台机器出站给对方。
  • 系统:Debian 11 / Debian 12 / Ubuntu 都可以。
  • 安装好 Docker、Docker Compose(相关脚本
  • 【必需】域名一枚,并做好解析到服务器上(域名购买、域名解析
  • 【非必需】提前安装好宝塔面板海外版本 aapanel,并安装好 Nginx(安装地址
  • 【非必需本教程选用】安装好 Nginx Proxy Manager(相关教程

5. 搭建视频(等有空了补充 = =)

5.1 YouTube

视频地址:

5.2 哔哩哔哩

哔哩哔哩:

6. 搭建方式

6.1 安装 Docker 与 Nginx Proxy Manager

可以直接参考这篇内容:

https://blog.laoda.de/archives/nginxproxymanager/

6.2 创建安装目录

创建一下安装目录:

sudo -i

mkdir -p /root/data/docker_data/send

cd /root/data/docker_data/send

接着我们来编辑 docker-compose.yml

vim docker-compose.yml

贴入下面内容:

services:
  send:
    image: registry.gitlab.com/timvisee/send:latest
    container_name: send
    restart: unless-stopped
    depends_on:
      - send-redis
    ports:
      - "1443:1443"
    volumes:
      - ./uploads:/uploads
    environment:
      NODE_ENV: production
      PORT: "1443"
      BASE_URL: https://send.example.com  #改成自己之后用的域名
      REDIS_HOST: send-redis
      FILE_DIR: /uploads
      MAX_FILE_SIZE: "8589934592"
      MAX_EXPIRE_SECONDS: "604800"
      DEFAULT_EXPIRE_SECONDS: "86400"
      EXPIRE_TIMES_SECONDS: "3600,86400,259200,604800"
      MAX_DOWNLOADS: "20"
      DOWNLOAD_COUNTS: "1,2,5,10,20"
      DEFAULT_DOWNLOADS: "1"

  send-redis:
    image: redis:alpine
    container_name: send-redis
    restart: unless-stopped
    command: redis-server --appendonly yes
    volumes:
      - ./redis:/data

需要改的地方:

  • BASE_URL 改成你自己的域名,必须带 https://,末尾不要加 /
  • 左边的 1443 如果被占用了,可以改成服务器上没人用的端口,比如 11443:1443
  • MAX_FILE_SIZE 单位是字节,上面是 8GB,按你VPS实际的磁盘和需求改
  • 下载次数没有「不限制」这一档。想接近不限,可以把 MAX_DOWNLOADSDOWNLOAD_COUNTS 里加一个很大的数字,比如 999999

修改完成之后,英文输入法下按 i 修改,完成之后按 esc,然后输入 :wq 保存退出。

创建数据目录:

mkdir -p uploads redis

如果后面上传报权限错误,可以再执行:

chown -R 1000:1000 uploads redis

6.3 查看端口是否被占用

查看端口是否被占用,以 1443 为例:

lsof -i:1443

如果啥也没出现,表示端口未被占用,可以继续。

如果出现:

-bash: lsof: command not found

运行:

apt install lsof

6.4 启动 Send

cd /root/data/docker_data/send

docker compose up -d

查看日志:

docker compose logs -f

没报错的话,理论上本机访问:

curl -I http://你的ip:1443

能看到响应。这个服务是拿来传文件的,不建议直接裸奔公网,咕咕建议一定要配置 HTTPS 反向代理。

7. 反向代理

7.1 利用 Nginx Proxy Manager

在添加反向代理之前,确保你已经完成了域名解析,不会的可以看这个:

域名购买、域名解析:https://blog.laoda.de/archives/namesilo/

之后登录 Nginx Proxy Manager,添加一个新的 Proxy Host。

按下面这样填:

  • Domain Names:send.example.com
  • Scheme:http
  • Forward Hostname / IP:172.17.0.1 (如果你的NPM和项目不在同一台服务器上,这边就填你项目所在的服务器的IP)
  • Forward Port:1443
  • Websockets Support:打开
  • Block Common Exploits:打开
0ea6ecb43aedaa1f6cb63a0b3e58ac96.png2929415e5366a3073e04dede1814ea3f.png4f43a034a076a5153ac52d5df9d5e4c0.png

SSL 那边:

  • 勾选 Request a new SSL Certificate
  • 勾选 Force SSL
  • 填邮箱
  • 同意协议
  • 保存

然后点进这个齿轮,贴上下面这段。

80eeee6ba958c32c6cd5ad47073bd27f.pngf53f1aefd67aee477758345fc97af23e.png

大文件上传不写这个,很容易被 NPM 默认限制卡成 413 或者中途断开:

client_max_body_size 8G;
proxy_request_buffering off;
proxy_buffering off;
proxy_connect_timeout 3600s;
proxy_send_timeout 3600s;
proxy_read_timeout 3600s;
send_timeout 3600s;

BASE_URL 必须和这里的域名、证书完全一致,不然生成出来的链接会错。

配置好之后,访问你自己的域名,比如:

https://send.example.com

就能看到上传页面。

7.2 利用 Caddy 反向代理

如果你用的是 Caddy,也可以这样写:

send.example.com {
    reverse_proxy 127.0.0.1:1443
    request_body {
        max_size 8GB
    }
}

Caddy 会自动申请和续期 SSL 证书,适合不想点面板的小伙伴。

8. 怎么用

打开你的域名,把文件拖进去,选一下下载次数和过期时间,点上传。

7774bc6c7df40a8111c1f402005a9052.png

右侧会出现一张卡片,上面有:

  • 文件名和大小
  • 还剩几次下载、多久后过期
  • 下载
  • 复制链接

2cd925edd70334eea6897076f4a81b30.png

把链接发给对方即可。对方用电脑浏览器或 iPhone Safari 打开就能下。

链接大概长这样:

https://send.example.com/download/xxxxx/#一串密钥

# 后面是解密密钥,只活在浏览器里,不会进服务器日志。这条链接要自己保存好。关掉页面前不复制,换设备就找不到管理卡片了。

同一个浏览器再打开首页,右侧通常还会列出这个浏览器里传过、还没过期的文件。这是存在浏览器本地的,不是账号系统。

建议:

  • 给熟人发文件,默认 1 天、几次下载就够
  • 大视频尽量用电脑浏览器上传,手机当接收端更稳
  • 不要把域名发到公开论坛当免费网盘,不然磁盘和带宽会很难顶

9. 更新与卸载

更新

cd /root/data/docker_data/send

docker compose pull

docker compose up -d

停止

docker compose down

卸载

cd /root/data/docker_data/send

docker compose down

cd /root/data/docker_data

rm -rf send

删除前记得先备份:

/root/data/docker_data/send/uploads
/root/data/docker_data/send/redis

上传的文件和 Redis 元数据都在这里。

10. 注意事项

  1. BASE_URL 必须写成 https://你的域名,和反代域名一致,末尾不要 /
  2. Nginx Proxy Manager 里记得打开 WebSocket,Advanced 里加上上传大小和超时,否则大文件很容易失败。
  3. Send 没有「无限下载次数」,只能把数字调很大。
  4. Send 没有后台查看历史链接,发出去的地址要自己保管。
  5. 过期或次数用完后文件会删,别拿它当网盘。
  6. 这和 Bitwarden 里的 Send 不是同一个产品。

11. 最后

Send 这个项目还是挺有意思的。它不是网盘,也不是同步工具,就是当年火狐那个「加密外链」的自托管版。

相比 Nextcloud,它轻很多,对方也不用装客户端;相比商业传文件网站,数据在自己的 VPS 上,次数和到期时间自己决定。

如果你本来就有 VPS,又经常要把文件丢给别人,可以折腾一下。搭好之后,以后发个包就是打开网页、拖上去、复制链接,还是挺方便的。

iON 一代神鸡陨落:年付 20.19 美元变月付 40 美元,顺便盘点我手上的服务器

2026-08-05 11:34:29

非常久没有和大家更新了,因为最近家里和公司事情比较多。

今天趁着难得的闲暇赶紧和大家更新一波。

我手上的这台 iON VPS,原来的续费价格是 20.19 美元/年

d5cbc628018f09f63f59a5d7bbd999af.png

64e08217989948d1fcdea5ce0791e2b1.png

不知不觉已经7年时间了。

最近收到 iON 的通知:从 2026 年 8 月 1 日起,这台机器将被调整为 40 美元/月的 iON Pro 1 套餐。

不升级套餐的话,8月5号正式停机。(说实话有点流氓了,至少等合约结束吧,而且才给了5天的时间迁移数据)

d183e1b35542e1c6fe1668cff74f46ed.png

b75933b511699847aaaefc0a92173567.png

8839ba57f534f903b08abe32830ca754.png

也就是说,原来一年只要 20.19 美元,以后一年要 480 美元,续费成本接近原来的 24 倍!

所以,是时候和它告别了……

11.11 美元年付套餐已经有用户反馈收到类似通知;我自己的 20.19 美元年付套餐已经确认收到。至于 22.22 美元年付套餐是否会统一调整,我猜大概率也会,包括之前还有68刀/年的,估计也会被清退。(可以看出公司经营状况确实不咋地了)

至此,一代神鸡iON,就此消失!

借着这个机会,除了回顾这台用了六七年的 iON,我也想着打开探针,把自己还在持有的 VPS 和独立服务器重新盘点一遍。

本期视频链接:https://youtu.be/B7fEraJypls

年付 20.19 美元,变成月付 40 美元

这是我收到的通知截图,

iON 套餐价格调整通知

我这个账户对应的调整如下:

项目 原套餐 调整后的套餐
套餐 iON-L09 iON Pro 1
计费 20.19 美元/年 40 美元/月,即 480 美元/年
CPU 1 vCPU 4 vCPU
内存 2 GB 8 GB
硬盘 40 GB SSD 160 GB
流量 1 TB/月,出站单向计费 5 TB/月
生效日期 2026 年 8 月 1 日

新套餐的配置确实高了不少,但我过去留着它的原因就是便宜、三网联通优化和单向1T流量。价格变成 40 美元/月之后,他的替代品可太多了,实在是没有继续保留的必要。

曾经的“神鸡”

我第一次知道这个套餐,是在 HostLoc 上看到有人讨论。后来我花了三四百元溢价收来,从 2019 年开始续费,一直用到现在。

iON 20.19 美元年付套餐后台

它的配置放到今天其实在这个价位依旧能打:1 核、2 GB 内存、40 GB SSD、1 Gbps 带宽。但它每月有 1 TB 出站单向计费流量,过去还长期有 AS4837 联通优化回程。对于反向代理和日常小服务来说,一个字,香!

我最早拿它做反向代理,后来又把它当过一段时间的你懂的的主力机器。六七年下来,即使算上当初的二手溢价,它也早就回本了。单看价格、线路和使用年限,这仍然是我买过最划算的服务器之一。

iON 这些年也不是一直顺风顺水。线路经历过多次调整;2023 年 5 月,洛杉矶机房还曾因烟雾报警停电,等待消防人员排查,我这台机器大约 20 天后才恢复。后来线路恢复过 AS4837,但稳定性和服务状态都有过反复。

完整的历史更新可以看我之前的文章:iON VPS 使用记录

顺便盘点一下我手上的服务器

借着这次 iON 退场,我又打开了自己的 探针

打算回顾一下手头上的小鸡们。

我手上的服务器云监控

下面这些价格和配置,都是我在 2026 年 8 月 2 日录制视频时,自己账户里显示的套餐与续费信息,很多都是活动套餐,确实已经“绝版”了,不过能顶多久,没人知道。

只能说不在乎天长地久,只在乎曾经拥有吧。

BuyVM:便宜的存储块和不限流量

BuyVM

我的 BuyVM 最早在卢森堡,后来迁到了瑞士。现在账户里显示 VPS 续费 54 美元/年,折算下来每月 4.5 美元;另外还挂了一块 256 GB 的存储块,续费只要 15 美元/年。单看容量和流量,它到现在依然很有特色。

我当初买它,主要就是看中不限流量和便宜的存储块,拿来刷 PT 很舒服。后来不怎么玩 PT 了,这台机器也就逐渐进入吃灰状态。录视频时我重新登录后台看了一眼,本轮在线时间只有 23 天,平时基本没跑什么重要服务。

所以 BuyVM 对我来说其实用途已经消失了。机器本身和存储块都不贵,但如果继续放着吃灰,好像也是一笔支出,后面看自己经济情况是否继续续费。

还记得盯着监控抢卢森堡的存储块的日子……

往期回顾:【VPS选购分享】BuyVM——下载神器!无限流量,无视版权投诉,经常缺货DMCA版权投诉/适合BT/PT下载/Netflix解锁

CloudCone:便宜,性价比不错

fc8da7d2e35988725a1caae73ebfb7bd.png

790d200729c2f397e5372104651589a7.png

我的 CloudCone 是活动时抢到的套餐,1 核、2 GB 内存、60 GB 硬盘,续费只要 10.44 美元/年。这个价位确实便宜,配置也够跑一些轻量应用,所以我一直留着。

不过最近确实遇到一个小插曲,截止写文章的时候,它因为迁移机房已经离线不止两周,控制面板里一直显示 Offline,尝试 Reboot 也没有恢复。原来有一个简单应用和 Telegram 群机器人跑在上面,停机之后我只能把机器人迁到别的服务器。

一年十美元出头的机器,买来折腾或做非关键服务没有问题。但这次长时间停机也再次提醒我:阿三真的很不靠谱……

往期回顾:【国外便宜高性价比的VPS 推荐】——CloudCone

DMIT:接替 iON 的主力机器

cbe0ac93b2f0e2dbc7628eae23bd1516.png

我有两台 DMIT,一台是 EB CORONA,一台是 PRO WEE,都是活动时抢到的,续费分别是 49.9 美元和 36.9 美元。CORONA 有 2 TB 流量,线路也有优化,但目前基本处于吃灰状态。

真正派上用场的是 PRO WEE。它后来接替 iON,成为我的主力机器,线路表现不错,价格也还能接受。不过它每月只有 550 GB 流量,而且是双向计费;和 iON 的 1 TB 出站单向流量相比,日常使用不能那么随意了。

Hetzner:博客主机,稳定省心,欧洲阿里云

Hetzner

我目前主要使用三台 Hetzner,博客也部署在这里。它的服务器镜像、快照、备份和防火墙功能都比较完整,控制面板成熟,价格和性能也比较均衡,属于不需要经常操心的类型。

录视频时,博客这台机器本轮已经连续在线 320 天。之前博客偶尔无法访问,并不是 Hetzner 服务器本身不稳定,而是遇到过流量攻击,加上博客程序存在内存泄漏问题。后来在Halo项目负责人仙总的帮助下,成功迁移数据库并处理掉内存问题,最近这段时间一直比较稳,所以博客还会继续放在这里。

省心!

注册账号之前需要身份证,现在不知道怎么样了,有新注册的小伙伴也欢迎评论区留言。

往期回顾:【VPS选购分享】Hetzner——欧洲阿里云!性能小钢炮!非常适合跑业务,还有适合刷PT的神鸡!

HostHatch:3 年 65 美元的大盘鸡

535e826fca4cc65ee7beaee6db157d72.png

HostHatch 的特色就是大盘鸡,这台配置:1 GB 内存、1 TB 硬盘、10 TB 流量,续费 3 年 65 美元。最初买它主要也是刷 PT,也打算拿来备份体积较大的内容。录视频时,它本轮已经稳定在线 400 多天,单看价格、容量和在线表现都很划算。

它的问题也很明确。1 TB 硬盘虽然够大,但只有 1 GB 内存,刷 PT 时内存和CPU 偶尔会顶满,只能控制任务和速度;另外新机开通和工单回复都偏慢。现在我很少再管它,容量优势没有真正用起来,后面可能出掉,也可能到期不续费。

往期回顾:【VPS选购分享】HostHatch——目前看过的最高性价比大盘鸡!40刀/年 2T硬盘!】

Naranja Tech:18 欧元年付的荷兰小钢炮

f7b7572ca5e9988d661d46f51902b574.png

这台 Naranja Tech 是黑五买到的荷兰套餐,2 GB 内存、50 GB 硬盘、5 TB 流量,年付 18 欧元。欧洲机器给的流量比较足,这个配置拿来跑轻量项目也不会太局促。

我有一个小项目长期部署在上面,实际使用下来很稳。录视频前不久我手动重启过一次,所以监控只显示在线 55 天;重启之前,它已经连续运行了 400 多天。它没有特别花哨的控制面板和附加功能,但价格、性能和稳定性比较平衡。

netcup:性能高,但要留意合约取消时间

c0302cfb81abcd78db675c967bb207ea.png

1b0c884f46805362c843602e5de8419f.png

我以前用的是 netcup 很有名的 RS 2000。它更像一台半独立服务器,CPU 资源是独享的,性能比普通 VPS 更稳定;每月流量超过 20 TB 后才会限速到 500 Mbps,过去很多人买它就是为了刷 PT。

后来因为预算和实际需求,我用不到这么重的配置,就换成了月付 4.74 欧元的 VPS 500:4 核、4 GB 内存、128 GB SSD。这个套餐在 24 小时内流量超过 2 TB 后会限速到 200 Mbps,对我来说仍然接近够用,性能和价格也比较平衡。

netcup 真正需要注意的是合约规则。确定不续费时,要在 Cancellation 页面提前取消,最好预留一到两个月;错过窗口后仍可能继续出账单,拖着不处理还会进入催缴流程(律师函警告!)。账号里长期没有任何服务,也可能被清理。机器本身没什么问题,但德国公司的合同管理比较严格,不能按照普通月付 VPS 的习惯随用随停。

OVH:硬盘“开奖”成功的独服

OVH

0516f6243661d88427b9df0a71cc498e.png

OVH 以前经常放出一批带有“开奖”性质的独立服务器:标称配置不变,但实际开通后,硬盘数量或带宽偶尔会高于页面规格。我当时也买了一台,标称是 2×960 GB SSD,实际开出来却是 4×960 GB,算是硬盘开奖成功。

这台机器使用 Intel Xeon E3-1231 v3、32 GB 内存,月付 16.99 欧元。我把大约一半硬盘作为实际可用空间,另一部分拿来做 RAID。对于需要较大容量、又希望有冗余的服务来说,这个价格还是不错的。

OVH 的另外两个特点是自带 DDoS 防护和不限流量,适合放容量或流量需求较大的服务。它的官网和账户体系不算好用,空账户长期没有服务也可能被清理,但这台机器本身已经稳定使用了很久,我暂时没有淘汰它的打算。

往期回顾:【VPS选购经验分享】OVH——欧洲最大、世界第三的托管服务提供商,抗DDOS(独立服务器测评及取消RAID、挂载硬盘分享)

RackNerd:适合新手折腾的低价 VPS

ea81d71dc66e40935615e45f6e078fcc.png

我的 RackNerd 年付大约 14.18 美元,512 MB 内存、10 GB 硬盘,属于很典型的入门低价 VPS。它和 CloudCone 类似,配置不高,但一年只要几十元人民币,非常适合拿来熟悉 Linux、练习部署环境或跑极轻量的服务的新手小伙伴。

这台机器买来之后我一直正常续费,实际上很少操作,基本也是吃灰状态。

它最重要的特色就是试错成本低,非常适合新手第一次接触 VPS。

之前整理的便宜的套餐在这边,有兴趣的小伙伴可以看看能不能捡漏:https://blog.laoda.de/vps

往期回顾:【国外便宜高性价比的VPS 推荐】——RackNerd

SpartanHost:主力反代鸡

de2ba86aa1e47fee6ae402dc18e276b6.png

8944e1a0b6bee33bf77e5044058f88c3.png

我的 SpartanHost 是 2021 年黑五抢到的 AMD 半价套餐,最初价格是 31.68 美元/年。后来第二年黑五我让官方把配置和价格一起翻倍,升级到 2 GB 内存、50 GB 硬盘,套餐本身续费约 63.63 美元/年;再加上额外的 DDoS 防护,目前总续费约 101.76 美元/年。

它曾经长期承担博客反向代理,洛杉矶线路对联通比较友好。后来博客持续遭到 DDoS 攻击,一个月要花好多钱买额外流量,定不值了我才把反代迁走,后来我加了DDoS 防护包,承担我其他几个网站的反代任务。

SpartanHost 的稳定性和工单体验一直不错,回复速度很快(老板亲自指挥,亲自回复),没想到不知不觉我都已经用了接近五年了……

比较遗憾的是,它这两年黑五似乎没有再做当年那种力度的活动,讨论热度也低了不少。

往期回顾:【VPS测评】斯巴达 AMD 黑五31刀测评

BandwagonHost:我手上数量最多,也最稳定的一组

BandwagonHost 搬瓦工

我现在持有最多的还是搬瓦工,主要有四台。它们的纸面参数配置一般,但稳定性已经经历了考验:录视频时,其中一台已经连续在线 998 天,49 美元那台更是连续在线 1043 天,没有重启也没有掉线。

  • CN2 GIA 限量版:实付 46.59 美元/年,512 MB 内存、10 GB 硬盘、500 GB 流量。配置很小,但能切换 CN2 GIA、CN2 GIA-E 和日本软银等多个机房,我平时放在日本机房,作为备用机器使用;
  • MEGABOX PRO:NodeSeek 联名款,45.68 美元/年,2 GB 内存、40 GB SSD、2 TB 流量。电信、联通、移动都有不同程度的线路优化,但不能切换机房;我当时有点跟风购买,现在基本吃灰;
  • The Plan V2:110 美元/年,2 GB 内存、40 GB 硬盘、2 TB 流量,是目前的博客反向代理。本轮已经在线 541 天,可以切换迪拜、香港 CMI、日本软银等更多机房,价格最高;
  • 2018 双十一套餐:29.88 美元/年,2 GB 内存、40 GB 硬盘、1 TB 流量,是我二手收来的老套餐。我把不少基础应用放在上面,硬盘已经接近用满;它只能切换部分机房,线路是 CN2 GT,晚高峰可能拥堵,但这个续费价很划算。

我一直喜欢搬瓦工,一个重要原因是 KiwiVM 控制面板成熟。它有独立账号、密码和两步验证,需要把机器借给别人或单独管理时,不用交出主账户。切换机房后,服务器配置和数据都保持不变,通常只需要改一下新的 IP 就能丝滑恢复业务;自动快照和备份也比较方便。

搬瓦工的常规套餐并不便宜,真正有吸引力的往往是少量活动款。

搬瓦工的套餐整理在这里:BandwagonHost 套餐合集

往期回顾:【VPS选购分享】Bandwagonhost(搬瓦工)——曾经的王者,三网G口GIA,贵族VPS

写在最后

iON 这台 20.19 美元年付 VPS,我用了六七年,已经足够值回当初付出的价格。它的退场当然有点可惜,但也再次提醒我们:没有永远的低价套餐,也没有真正可以传家的 VPS。

大家最好不要为“绝版”支付高于机器本身好几倍的溢价,也不要把重要数据的安全寄托在任何一家服务器厂商身上。日常做好备份,让自己始终保留迁移的能力,比守着一台所谓的传家宝机器更重要。

关于服务器备份,我之前整理过一篇总览:服务器备份方案合集

【好玩儿的 Docker 项目】十分钟搭建一个 Obsidian 私有同步服务——Fast Note Sync,多端实时同步笔记和附件

2026-06-30 09:51:07

1. 唠嗑

拖更好久了,今天来更新一下。(顺便吐槽今天德国踢的太臭了)

如果你平时用 Obsidian,应该多少都纠结过同步的问题。

先简单介绍一下 Obsidian。

Obsidian 是一个本地优先的 Markdown 笔记软件,所有笔记本质上都是一个个 .md 文件,放在自己的电脑或手机里。你可以用它写日记、做读书笔记、整理项目资料,也可以把它当成自己的「第二大脑」或者个人知识库。

它和普通云笔记最大的区别是:数据不被某个平台锁死。哪天不用 Obsidian 了,这些 Markdown 文件依然可以直接打开、迁移、备份。

这两年大模型火起来之后,Obsidian 的玩法也更有意思了。你可以把自己的笔记库整理成长期知识库,再配合 ChatGPT、Claude、Cursor、Cherry Studio,甚至 MCP 这类工具,让 AI 在你授权的范围内读取、总结、检索、改写自己的资料。

比如:

  • 让 AI 帮你总结过去写过的文章
  • 从自己的笔记里找某个项目的资料
  • 把零散记录整理成博客、周报、方案
  • 基于自己的知识库问答,而不是每次都从零开始问 AI

但前提是,你的笔记要能稳定同步、备份,并且在多台设备上都能访问。不然电脑上写了一半,手机上看不到;手机拍的图片附件,电脑上又没同步过来,体验就很割裂,很难顶。

今天咕咕给大家分享一个可以私有化部署的 Obsidian 同步服务:Fast Note Sync Service

它搭配 Obsidian 插件 Fast Note Sync 使用,可以把自己的 Obsidian 笔记库同步到自己的服务器上,支持多端实时同步、附件同步、历史版本、回收站、分享链接,甚至还支持 REST API 和 MCP。

简单来说,就是:

自己搭一个 Obsidian 私有同步服务器,让不同系统的电脑、手机、平板之间的笔记可以实时同步。

笔记软件

b9a5ac47d9711c175dfa4ea39df75315.png

3eaa359d571e4da8a7f43f693f44cd48.png

2. Fast Note Sync 简介

Fast Note Sync 分成两部分:

  • Fast Note Sync Service:服务端,部署在自己的 VPS 上
  • Fast Note Sync for Obsidian:Obsidian 插件,安装在自己的 Obsidian 里

它具体都能干什么?

  • Obsidian 笔记多端实时同步
  • 支持图片、音频、视频等附件同步
  • 支持 .obsidian 配置同步
  • 支持笔记历史版本
  • 支持回收站恢复
  • 支持离线编辑后自动合并
  • 支持通过网页后台管理笔记库
  • 支持分享笔记链接
  • 支持 REST API / MCP,方便后续接入 AI 工具

适合的场景包括:

  • 不想订阅 Obsidian Sync,但又想多设备同步
  • 想把笔记数据放在自己的服务器上
  • 想在手机、电脑、平板之间同步同一个 Vault
  • 想给自己的知识库留一个 Web 管理后台
  • 想后续把 Obsidian 笔记接入 AI / MCP 工具

注意:目前官方 Roadmap 里端到端加密还在计划中,我们都是特别注意隐私的,所以强烈建议只部署在自己信任的服务器上,不要放到来路不明的机器上。

2.1 和 iCloud / Obsidian Sync 怎么选?

看到这里,可能有小伙伴可能会问:

我直接用 iCloud 不就好了?或者买官方 Obsidian Sync 不就好了?为啥还要自己折腾这个?

这个问题要分情况看。

如果你所有设备都是 Apple 生态,比如 Mac + iPhone + iPad,而且笔记不多、附件不大,那 iCloud 确实是最省事的选择。系统自带,不需要额外部署,也不用折腾服务器。

但是 iCloud 本质上是「文件夹同步」,不是专门为 Obsidian 做的同步服务。它没有 Obsidian 专用的网页后台、同步日志、Vault 管理、REST API、MCP、Git 自动化这些东西。如果你还想在 Windows、Android、Linux 上一起用,体验就没那么统一了。

官方 Obsidian Sync 是最省心、最稳妥的方案。官方页面写得很清楚,它支持端到端加密、版本历史、跨平台同步、离线编辑后再合并,还能细粒度控制同步哪些配置和文件。

价格方面,截至 2026 年 6 月 30 日,Obsidian Sync Standard 年付是 4 美元/月,月付是 5 美元/月,包含 1 个同步库、1GB 总存储、单文件 5MB 限制、1 个月版本历史;Sync Plus 年付是 8 美元/月,月付是 10 美元/月,包含 10 个同步库、10GB 总存储、单文件 200MB 限制、12 个月版本历史,还可以升级到 100GB 存储。

Fast Note Sync 是给这些人准备的:

  • 已经有自己的 VPS 或家里服务器
  • 想把 Obsidian 同步服务放在自己手里
  • 不想按月订阅,但愿意自己维护服务
  • 附件比较多,想用自己的磁盘空间
  • 想要 Web 管理后台,可以在线查看笔记、附件和同步日志
  • 想把 Obsidian 接入 REST API / MCP,让 AI 工具读写自己的知识库
  • 想折腾 Git 自动化、远程备份、对象存储、WebDAV 等扩展玩法

简单对比一下:

方案 适合谁 优点 不足
iCloud Apple 全家桶用户 系统自带,最省事 跨平台一般,本质是文件夹同步
Obsidian Sync 想省心、重视稳定和隐私的人 官方维护,端到端加密,体验完整 需要订阅,有存储和单文件大小限制
Fast Note Sync 有 VPS、喜欢自托管的人 私有部署、空间自己定、支持后台/API/MCP 需要自己维护,目前端到端加密还在 Roadmap

所以咕咕的建议是:

如果你只是 Mac + iPhone 轻度同步,继续用 iCloud 就行。

如果你想要最稳、最省心,而且不差钱,官方 Obsidian Sync 依然是首选。

但如果你本来就有 VPS,又想把 Obsidian 变成一个真正属于自己的私有知识库,甚至后面还想接 AI / MCP / 自动化,那 Fast Note Sync 就很值得折腾一下。

不过还是要提醒一句:目前 Fast Note Sync 的端到端加密还在 Roadmap 里,服务端是可以处理你的笔记内容的。所以不要部署在不信任的服务器上,也不要把后台裸奔公网。重要笔记库第一次同步前,建议先做好本地备份。

3. 相关地址

官方 GitHub 地址:

服务端:https://github.com/haierkeys/fast-note-sync-service

Obsidian 插件:https://github.com/haierkeys/obsidian-fast-note-sync

Obsidian Sync 官方页面:https://obsidian.md/sync

截至 2026 年 6 月 30 日,服务端大概 1.7k 个 star,插件大概 2.5k 个 star,感兴趣的小伙伴可以去给项目点个星星。

当然如果你想自己用 Docker 搭建一个,那我们就继续往下!

4. 搭建环境

  • 服务器:咕咕这边建议用 1G 内存以上的 VPS,比如莱卡云服务器,当然你也可以选择其他高性价比的服务器。重点看磁盘空间,因为后面笔记附件也会存到服务器上。
  • 系统:Debian 11 / Debian 12 / Ubuntu 都可以。
  • 安装好 Docker、Docker-compose(相关脚本
  • 【必需】域名一枚,并做好解析到服务器上(域名购买、域名解析
  • 【非必需】提前安装好宝塔面板海外版本 aapanel,并安装好 Nginx(安装地址
  • 【非必需本教程选用】安装好 Nginx Proxy Manager(相关教程

5. 搭建视频(等有空了补充 = =)

5.1 YouTube

视频地址:

5.2 哔哩哔哩

哔哩哔哩:

6. 搭建方式

6.1 安装 Docker 与 Nginx Proxy Manager

可以直接参考这篇内容:

https://blog.laoda.de/archives/nginxproxymanager/

6.2 创建安装目录

创建一下安装目录:

sudo -i

mkdir -p /root/data/docker_data/fast-note-sync

cd /root/data/docker_data/fast-note-sync

接着我们来编辑 docker-compose.yml

vim docker-compose.yml

贴入下面内容:

services:
  fast-note-sync-service:
    image: haierkeys/fast-note-sync-service:latest
    container_name: fast-note-sync-service
    restart: unless-stopped
    ports:
      - "9000:9000"
    volumes:
      - ./storage:/fast-note-sync/storage
      - ./config:/fast-note-sync/config

其中左边的 9000 可以改成服务器上没有用过的端口,比如 9010

修改完成之后,英文输入法下按 i 修改,完成之后按 esc,然后输入 :wq 保存退出。

6.3 下载默认配置文件

官方默认配置比较长,我们直接拉一份下来:

cd /root/data/docker_data/fast-note-sync

mkdir -p config storage

wget -O config/config.yaml https://raw.githubusercontent.com/haierkeys/fast-note-sync-service/master/config/config.yaml

如果 GitHub 拉取比较慢,可以用作者提供的 CNB 镜像:

wget -O config/config.yaml https://cnb.cool/haierkeys/fast-note-sync-service/-/git/raw/master/config/config.yaml

然后编辑配置文件:

vim config/config.yaml

先改这几个地方:

server:
  ext-api-url: "https://note.example.com"    #改成你自己之后用的域名链接

security:
  auth-token-key: "换成一串足够长的随机字符串"
  share-token-key: "再换成另一串足够长的随机字符串"

user:
  register-is-enable: true

ext-api-url 改成你自己的域名。

auth-token-keyshare-token-key 不要用默认值,随便找个密码生成器生成两串长一点的随机字符串即可。

这里先保持:

register-is-enable: true

因为我们第一次进去还要注册账号。等注册完第一个账号之后,后面再关掉注册。

6.4 查看端口是否被占用

查看端口是否被占用,以 9000 为例:

lsof -i:9000

如果啥也没出现,表示端口未被占用,可以继续。

如果出现:

-bash: lsof: command not found

运行:

apt install lsof

如果端口被占用了,就把 docker-compose.yml 里的左边端口改一下,比如:

ports:
  - "9010:9000"

后面反向代理的时候也记得填新的端口。

6.5 启动 Fast Note Sync Service

cd /root/data/docker_data/fast-note-sync

docker compose up -d

查看日志:

docker compose logs -f

没报错的话,理论上访问:

http://服务器IP:9000

就能看到后台页面。

不过这个服务是拿来同步笔记的,不建议直接裸奔公网,咕咕建议一定要配置 HTTPS 反向代理。

7. 反向代理

7.1 利用 Nginx Proxy Manager

在添加反向代理之前,确保你已经完成了域名解析,不会的可以看这个:

域名购买、域名解析:https://blog.laoda.de/archives/namesilo/

之后登录 Nginx Proxy Manager,添加一个新的 Proxy Host。

按下面这样填:

  • Domain Names:note.example.com
  • Scheme:http
  • Forward Hostname / IP:服务器内网 IP 或 Docker 网桥 IP
  • Forward Port:9000
  • Websockets Support:打开
  • Block Common Exploits:打开
fa6fcaa7fab1ff23dd16e99360b1ff79.png3c2616e8c9f49e159a52da02abec0cef.png601f0d3b4b9bf40cdc7515a1f91a1532.png

SSL 那边:

  • 勾选 Request a new SSL Certificate
  • 勾选 Force SSL
  • 填邮箱
  • 同意协议
  • 保存

Fast Note Sync 会用到 WebSocket,同步服务要实时通信,所以 NPM 里 Websockets Support 记得打开。

配置好之后,访问你自己的域名,比如:

https://note.example.com

就能进入后台。

7.2 利用 Caddy 反向代理

如果你用的是 Caddy,也可以这样写:

note.example.com {
    reverse_proxy 127.0.0.1:9000
}

Caddy 会自动申请和续期 SSL 证书,适合不想点面板的小伙伴。

8. 初始化账号与关闭注册

bbb21f6dffecbc855623e8ac3cb71729.png

451803df8066fdd2add52f22a11f57ac.png

设置管理员

9c37c17b0823f305a04c8d64a46c77a1.png

第一次打开网页后台,会让你注册账号。

注册完成并登录之后,我们建议马上关闭注册,避免别人也跑来注册。

回到服务器:

cd /root/data/docker_data/fast-note-sync

vim config/config.yaml

找到:

user:
  register-is-enable: true

改成:

user:
  register-is-enable: false

3f8a4198d80c787e7746541a02e950dc.png

然后重启:

docker compose restart

这样后面就不会开放注册了。

9. Obsidian 插件配置

9.1 安装插件

打开 Obsidian:

设置 -> 第三方插件 -> 浏览

ec924172842b514749fbb4f53b859892.png

92dc5c381a18507c537c5f7fff549f98.png

搜索:

Fast Note Sync

如果插件市场里能搜到,直接安装启用即可。

fbc67648accd7ad15f36a82187ec9f80.png

如果搜不到,可以去 GitHub Releases 手动下载:

https://github.com/haierkeys/obsidian-fast-note-sync/releases

下载这几个文件:

main.js
styles.css
manifest.json

然后放到你的 Obsidian 库目录:

你的库/.obsidian/plugins/fast-note-sync/

重启 Obsidian 后启用插件。

9.2 授权连接服务端

回到 Fast Note Sync Service 的网页后台,访问你自己的域名:

https://note.example.com

右上角可以更改语言:

edc4406039f1bb8a4ed42af30306360e.png

左侧进入:

Note Vaults
2ac873496c2c94d03449821736ae8c5c.png

bddbe7ee87ecda288eb5c607f5fcf898.png

可以看到官方提供了两种方式:

  • One-click Authorization for Obsidian
  • Copy API Config

e47330d1e694b7ff3e90c16d241c01d8.png

如果你的电脑能正常唤起 Obsidian,可以直接点 One-click Authorization for Obsidian

如果不行,就点 Copy API Config,然后手动粘贴到 Obsidian 插件设置里。

配置完成之后,Obsidian 就会开始和服务端同步。

电脑上我试了下没问题。

iPhone上我遇到无法粘贴复制的内容的问题,

f2602fb157a2134a518b05bdf082e16b.png

只能在手机浏览器里登录网页,然后用一键授权的方式来配置了 = =

10. 使用体验

部署好之后,大概就是这样:

  • 电脑上新建一篇笔记
  • 手机 Obsidian 打开同一个 Vault
  • 修改会同步到服务端
  • 其他设备在线后自动拉取变化
  • 图片、附件也可以一起同步
  • 网页后台可以查看 Vault、笔记、附件和同步日志

如果你平时 Obsidian 里有很多图片,建议服务器磁盘稍微大一点,不然附件多了之后很快就会占空间。

另外,如果你准备把 .obsidian 配置也同步,建议先拿一个测试库试一下,确认插件、主题、配置都没问题之后,再同步主力库。

11. 更新与卸载

更新

cd /root/data/docker_data/fast-note-sync

docker compose pull

docker compose up -d

停止

docker compose down

卸载

cd /root/data/docker_data/fast-note-sync

docker compose down

cd /root/data/docker_data

rm -rf fast-note-sync

删除前记得先备份:

/root/data/docker_data/fast-note-sync/storage
/root/data/docker_data/fast-note-sync/config

你的笔记数据和配置都在这里。

12. 注意事项

  1. 这个项目目前还没有端到端加密,官方 Roadmap 里写了后续计划支持,所以不要部署在不信任的服务器上。
  2. 第一次注册完账号之后,记得关闭注册。
  3. auth-token-keyshare-token-key 不要用默认值。
  4. 建议只通过 HTTPS 域名访问,不要直接把 9000 端口裸露给公网。
  5. Nginx Proxy Manager 里记得打开 WebSocket 支持。
  6. 重要笔记库第一次同步前,建议先备份一份本地 Vault。
  7. 如果你的笔记库里有很多大附件,第一次同步可能会比较慢,耐心等一下。

13. 最后

Fast Note Sync Service 这个项目还是挺有意思的,它不是简单的 WebDAV 同步,而是专门给 Obsidian 做的一套私有同步服务。

相比 WebDAV,它多了网页后台、历史版本、回收站、附件管理、分享、REST API、MCP 这些能力;相比官方 Obsidian Sync,它的优势就是可以自己部署,数据放在自己的服务器上,空间也由自己的硬盘决定。

当然,目前端到端加密还没完成,所以更适合放在自己的 VPS 或家里服务器上自用。

如果你本来就是 Obsidian 重度用户,又刚好有自己的 VPS,可以折腾一下。

关键时刻不能掉链子!一年235元开机即用!大陆漫游上网备用方案:3HK 大湾区 eSIM 储值卡购买激活全流程分享(2026)

2026-05-15 14:59:47

作为一个需要正常访问国际互联网的人士,为了关键时刻不掉链子(尤其是最近,有的小伙伴应该有体会)我觉得有必要给自己增加一个备选方案。

我之前去德国正好买了一部德版的iPhone,支持eSIM,月底又要去珠海出差,顺便去澳门一趟,就想着要不索性换个思路:直接用一张境外 SIM 卡在大陆漫游,原生 IP,开机即用,全程不需要任何额外姿势。

我先前去香港买过一个hahasim的卡,保号1年10元,接接验证码还不错,不过没流量(或者说流量非常贵)。

对比了 CMHK、CTM 快卡、澳门蓝卡几家之后,最终选了 3HK 大湾区 DIY 储值卡:HK$268 一年 45GB 流量(折人民币约 235 元,5 元/GB),支持 eSIM 远程购买、邮箱收码扫码即用;大陆漫游可在移动/联通/电信三网之间切换(一般是联通);开热点之后电脑、iPad 也可以共享香港 IP。性价比、便捷度、稳定性三个维度综合下来,我个人认为是目前能找到的最优解,于是有了这篇折腾记录。

以下内容需要你有一部支持海外eSIM的手机(比如港版iPhone,国产的iPhone Air我估计不行)

首先登录官网购买,选择365日组合——大湾区(内地、香港、澳门)

官网地址:https://www.three.com.hk/prepaid/DIY/tc/offer/travel

ee0492f96babfa97bd3cdc5f7ffb8e55.png

外游数据这个,自己选择,实测好像即使选暂不使用也会开始套餐计费时间,

173f40b13290a28e675e3769d5f1e147.png

在大陆的话直接选择eSIM,实体卡只能寄到香港地址,(注意国产的iPhone 17 Air好像只支持大陆的eSIM,这个可能用不了)

fe591b7e76e073d9e574db5446370b2f.png

确认套餐没问题,40G+5G

b6e6b9c152af400bedc0bce6b5c5b542.png

输入一个邮箱,会帮你创建账号,

59750e9c6f46da4b09a750872f5ed8c8.png

收到验证码,登录,建立账户,

fea04446fea9b1e054d75e94d5bfc364.png

选择付款方式,支付宝微信都可以,我这边用了汇丰的Red信用卡,有4%的返现。

953d131992e1ab459275db49e5be821b.png

成功!

d85454d526fd2e361686bd57b593b961.png

邮件会收到一个二维码,

3ddaa0f47b681764027bb4316b6ed9ce.png

打开手机的蜂窝网络,添加eSIM,

截屏 2026-05-15 14.08.43.png

很快就能加上,记得打开数据漫游,

722774f61207f758d0b16ed993e387b9.png

下载官方APP——My3

ee4cb942d543c84f697576cbae055074.png

用手机号码加验证码登录,然后记得打开这个开关

8c858f7ed38144c35df48bfa6eaa36e4.png79ba6291a9d87e983a975e9ea1e181f0.png

蜂窝数据切换到3HK的卡就能上网了!不需要任何额外姿势。

如果要在香港使用通话和短信功能,需要在app里实名一下。

非香港人士选港澳通行证就可以了。

截屏 2026-05-15 14.40.05.png

注意:

这张卡是"流量套餐 + 通话短信按量扣费"模式。年套餐 268 港币里只包含 45GB 数据流量,不含任何通话或短信额度。需要打电话/发短信,得在 My3 App 里单独充值余额,按下面这个标准扣费——

  • 接验证码(大陆+香港):免费 ✅ 用来注册海外平台超香
  • 大陆漫游接打电话:HK$6-8/分钟 偏贵,建议走微信语音
  • 大陆发短信:HK$3.5/条 贵,能用微信就别用 SMS
  • 香港本地通话:可单独买 HK$20/10000 分钟包,几乎白送

总结一句:当数据卡用最划算,通话短信都用其他方式替代。

大家有别的更好用的卡也欢迎评论区分享!

【好玩儿的Docker项目】十分钟搭建一个「极简私人网盘」——hacdias/webdav,让你可以像逛本地文件夹一样逛 VPS

2026-05-07 11:48:59

1. 唠嗑

聊到「私人网盘」,大部分人第一反应都是 Nextcloud、Seafile 这种「全家桶」——文件、日历、联系人、笔记、视频会议,功能丰富,大而全,但是比较吃机器的配置,VPS 性能差点儿的(比如 1G 内存的),像 Nextcloud 可能都跑不动。

很多时候我们的需求其实非常朴素:

「我能不能在 Mac 的 Finder 里直接打开 VPS 上的某个目录,像本地文件夹一样拖拖拽拽?」

答案是可以,而且根本不用上 Nextcloud,一个轻量级的 WebDAV 服务就够了。

2. hacdias/webdav 简介

今天咕咕给大家介绍的 hacdias/webdav 就是这种「需求小但精准」的代表作——Go 写的独立 WebDAV 服务器,整个程序就一个二进制文件,配置文件用 YAML,跑起来内存占用几十兆。

这个作者也是之前和大家介绍的 File Browser 项目的作者。

671776cf97b39dc312016575eb5d85d2.png

旧文回顾:手把手教你搭建私人离线下载神器 Aria2,搭配 Rclone+Filebrowser 自动上传至网盘

它能干什么?

  • 把 VPS 上的某个目录通过 WebDAV 协议暴露出来
  • 支持多用户、多目录、多权限(CRUD 自由组合)
  • 支持 bcrypt 哈希密码(不用让明文密码裸奔)
  • 反代友好(配合 Nginx Proxy Manager 体验非常丝滑)
  • 没有 Web 界面、没有数据库、没有花里胡哨的功能

适合的场景包括:

  • Obsidian / Joplin / Logseq 这类笔记软件的云端同步
  • KeePass / KeePassXC 数据库远程同步
  • 手机相册备份目标盘
  • 多设备共享一个工作目录
  • 摆脱 iCloud / OneDrive / Dropbox 的容量焦虑

部署完之后,Mac、Windows、iPhone、Android,以及 Obsidian、Joplin、KeePassXC 这种支持 WebDAV 的应用都能直接挂上来用。

可以让你告别云盘焦虑!

3. 相关地址

官方 GitHub 地址:https://github.com/hacdias/webdav (目前 5.5k 个 star,欢迎大家去给项目点星星!)

当然如果你想自己用 docker 搭建一个,那我们就继续往下!

4. 搭建环境

  • 服务器:咕咕这边用的香港的 莱卡云服务器,虽然 1 核 512M 都够用,重点看磁盘大小和带宽,但是因为用的 docker 搭建,还是建议服务器内存 1G 以上,当然你也可以选择其他 高性价比的服务器
  • 系统:Debian 11 (DD 脚本 非必需 DD,用原来的系统也 OK,之后教程都是用 Debian 或者 Ubuntu 搭建~)
  • 安装好 Docker、Docker-compose(相关脚本
  • 【必需】域名一枚,并做好解析到服务器上(域名购买、域名解析 视频教程
  • 【非必需】提前安装好宝塔面板海外版本 aapanel,并安装好 Nginx(安装地址
  • 【非必需本教程选用】安装好 Nginx Proxy Manager(相关教程

5. 搭建视频(过俩周补充 = =)

5.1 YouTube

视频地址:

5.2 哔哩哔哩

哔哩哔哩:

6. 搭建方式

6.1 安装 Docker 与 Nginx Proxy Manager

可以直接参考这篇内容:

https://blog.laoda.de/archives/nginxproxymanager/

6.2 创建安装目录

创建一下安装的目录:

sudo -i
mkdir -p /root/data/docker_data/webdav
cd /root/data/docker_data/webdav

接着我们来编辑下docker-compose.yml

vim docker-compose.yml
services:
  webdav:
    image: hacdias/webdav:latest
    container_name: webdav
    restart: unless-stopped
    ports:
      - "6065:6065"   # 左边的端口可以换成 vps 上没有用过的端口
    volumes:
      - ./config.yml:/config.yml:ro
      - ./data:/data

其中的左边的6065可以改成服务器上没有用过的端口。

修改完成之后,可以在英文输入法下,按 i 修改,完成之后,按一下 esc,然后 :wq 保存退出。

生成 bcrypt 密码

为了不让明文密码裸奔在配置文件里,我们用 bcrypt 哈希一下密码。Debian / Ubuntu 上一行命令搞定:

apt install -y apache2-utils
htpasswd -nbBC 12 "" '你想用的密码' | tr -d ':' | sed 's/\$2y/\$2a/'

会输出一串长这样的玩意儿:

$2a$12$8gsX8AKtD3EMdmksoqSDLAIEMEMMrSbKx/q0GG

把它整段复制下来,待会儿要塞到 config.yml 里。

如果你嫌麻烦,明文密码也是合法配置——把 config.yml 设成 chmod 600 也能挡住一般场景。但既然多花一行命令的事儿,咕咕还是建议哈希一下。

写 config.yml

vim config.yml

贴入:

address: 0.0.0.0
port: 6065
prefix: /

# 反代后面一定要打开,让 webdav 信任 X-Forwarded-* 头
behindProxy: true

# 全局默认权限(被下方 users 覆盖)
permissions: none
directory: /data

users:
  - username: gugu
    password: "{bcrypt}$2a$12$你刚才生成的那一长串"
    directory: /data/gugu
    permissions: CRUD

  # 想再加一个只读访客?解开注释即可
  # - username: guest
  #   password: "{bcrypt}$2a$12$xxx"
  #   directory: /data/public
  #   permissions: R

关于 permissions 这一栏:C = Create(创建)、R = Read(读取)、U = Update(更新)、D = Delete(删除)。给自己用就 CRUD 全开,分享给朋友的访客号建议只给 R

保存退出,给配置文件上锁:

chmod 600 config.yml
mkdir -p data

6.3 查看端口是否被占用

查看端口是否被占用(以 6065 为例),输入:

lsof -i:6065  #查看 6065 端口是否被占用,如果被占用,重新自定义一个端口

如果啥也没出现,表示端口未被占用,我们可以继续下面的操作了~

如果出现:

-bash: lsof: command not found

运行:

apt install lsof  #安装 lsof

如果端口没有被占用(被占用了就修改一下端口,比如改成 8381,注意 docker 命令行里和防火墙都要改)

6.4 启动 webdav

cd /root/data/docker_data/webdav

docker compose up -d   # 注意,老版本用户用 docker-compose up -d

docker compose logs -f

镜像非常小,等待拉取好镜像,出现 Created的字样之后,

如果日志里看到类似:

Listening on 0.0.0.0:6065

并且没有报错,那就说明跑起来了。Ctrl+C 退出日志查看,容器还在后台老老实实工作。

这时候你已经可以在浏览器里访问 http://你的 VPS-IP:6065 试试,输入用户名密码会看到一个空空荡荡的目录列表,说明服务正常。

但是我们部署在公网一定要考虑使用反向代理工具配置 SSL!

不用域名直接 IP 访问也不是不行,但 Mac 的 Finder 在 HTTP 下挂 WebDAV 会自动降级成只读,套上 HTTPS 才能愉快地读写。所以域名 + HTTPS 是强烈推荐的。

做反向代理前,你需要一个域名!

namesilo 上面 xyz 后缀的域名一年就 7 块钱,可以年抛。(冷知识,namesilo 上 6 位数字的 xyz 续费永远都是 0.99 美元 = =)

如果想要长期使用,还是建议买 com 后缀的域名,更加正规一些,可以输入 laodade 来获得 1 美元的优惠(不知道现在还有没有)

namesilo 自带隐私保护,咕咕一直在用这家,价格也是这些注册商里面比较低的,关键是他家不像其他家域名注册商,没有七七八八的套路!(就是后台界面有些 古老 = =)

【域名购买】Namesilo 优惠码和域名解析教程(附带服务器购买推荐和注意事项)

我们接着往下看!

7. 反向代理

7.1 利用 Nginx Proxy Manager

在添加反向代理之前,确保你已经完成了域名解析,不会的可以看这个:域名一枚,并做好解析到服务器上域名购买、域名解析 视频教程) (名称改成你自己想要的域名前缀即可)

68bfcaff11811fa6f3e6b24e6cfc09ce.png

之后,登陆 Nginx Proxy Manager(不会的看这个:安装 Nginx Proxy Manager相关教程))

注意:

Nginx Proxy Manager(以下简称 NPM)会用到 80443 端口,所以本机不能占用(比如原来就有 Nginx)

打开你的 NPM 后台,新建一个 Proxy Host

Details 标签页:

  • Domain Names:填你的域名,比如 webdav.example.com
  • Schemehttp
  • Forward Hostname / IP:填你 VPS 的内网 IP,或者直接 宿主机 IP
  • Forward Port6065
  • Cache Assets:关
  • Block Common Exploits:⚠️ 一定要关! NPM 这个开关会拦掉一些 WebDAV 的 HTTP 方法(比如 PROPFINDMKCOLPROPPATCH),不关你客户端会一直 405 报错,搞得你怀疑人生
  • Websockets Support:打开

注意填写对应的 域名IP端口,按文章来的话,应该是 6065

IP 填写:

如果 Nginx Proxy Manager 和 webdav 在同一台服务器上,可以在终端输入:

ip addr show docker0

查看对应的 Docker 容器内部 IP。

否则直接填 webdav 所在的服务器 IP 就行。

c3aecaf3e776af727e4f835a2eb9ac3e.png

SSL 标签页:

  • SSL Certificate:选 Request a new SSL Certificate,签个 Let's Encrypt
  • Force SSL:打开
  • HTTP/2 Support:打开
  • HSTS Enabled:可选
14e4edadd58f306888abf7c346ae47b4.png

Advanced 标签页:

加上这段 nginx 配置(这段非常关键,没它传大文件会断开):

client_max_body_size 0;
proxy_request_buffering off;
proxy_read_timeout 3600s;
proxy_send_timeout 3600s;
42cec3c76a3939e01e14aa6b390f363a.png

保存。

然后访问域名就可以访问了!

7.2 利用宝塔面板(应该类似,没具体尝试)

发现还是有不少小伙伴习惯用宝塔面板,这边也贴一个宝塔面板的反代配置:

直接新建一个站点,不要数据库,不要 php,纯静态即可。

然后打开下面的配置,修改 Nginx 的配置。

image-20220819150345725image-20220819150542867

代码如下:

location / {
      proxy_pass http://127.0.0.1:6065/;       # 注意改成你实际使用的端口
      rewrite ^/(.*)$ /$1 break;
      proxy_redirect off;
      proxy_set_header Host $host;
      proxy_set_header X-Forwarded-Proto $scheme;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header Upgrade-Insecure-Requests 1;
      proxy_set_header X-Forwarded-Proto https;
    }

此方法对 90% 的反向代理都能生效,然后就可以用域名来安装访问了。

有同学可能会问,为什么不直接用宝塔自带的反向代理功能。

image-20220819150730128

也可以,不过咕咕自己之前遇到过当有多个网站需要反代的时候,在这边设置会报错的情况 = =

所以后来就不用了,直接用上面的方法来操作了。

8. 使用教程

在 Mac 上挂载

打开 Finder,按 ⌘K(或者菜单栏 → 前往 → 连接服务器),输入:

3e5d1bd55bb2b633169ec5221a86e5e3.pngd75accde7480572ed2e8f91b92ab9ca9.png35d5d96cb1dbf545631b5ca36dd11d2b.png
https://webdav.example.com

回车,会弹出登录框,填你在 config.yml 里设置的用户名 + 原始密码(注意不是 bcrypt 哈希!)。点连接,VPS 上的目录就会以网络盘的形式出现在 Finder 侧边栏。

到这里你就可以拖拖拽拽了——复制、改名、双击打开、新建文件夹,全都和本地操作没差。

不过你本地到服务器的连接速度也很重要,像我测试的时候用的是美国的机器,反代用的香港,本地在上海操作,就会没有那么的丝滑。

如果用美国线路优化的 VPS,就会丝滑很多。

我还测试了上海的服务器,就和本地操作没差别了。

53c457e49583dce57c236dafc41689fd.png

8.1 更新 webdav

这个项目后续会持续有更新,所以提供一个更新的方式。

cd /root/data/docker_data/webdav

docker compose pull

docker compose up -d    # 请不要使用 docker compose stop 来停止容器,因为这么做需要额外的时间等待容器停止;docker compose up -d 直接升级容器时会自动停止并立刻重建新的容器,完全没有必要浪费那些时间。

docker image prune  # prune 命令用来删除不再使用的 docker 对象。删除所有未被 tag 标记和未被容器使用的镜像

提示:

WARNING! This will remove all dangling images.
Are you sure you want to continue? [y/N]

输入 y

利用 Docker 搭建的应用,更新非常容易~

8.2 卸载 webdav

同样进入安装页面,先停止所有容器。

cd /root/data/docker_data/webdav

docker compose down

cd ..

rm -rf /root/data/docker_data/webdav  # 完全删除

可以卸载得很干净。

9. 使用问题

一个不得不吐槽的问题

Mac 自带的 Finder WebDAV 客户端……怎么说呢,残废。具体表现:

  • 传大文件容易卡死或者超时
  • 偶尔莫名其妙断连,得重新挂载
  • 会自动生成一堆 .DS_Store._xxx 这类隐藏文件污染目录
  • 写入速度比读取慢得多
  • 偶尔会把刚创建的文件「藏起来」让你看不到,刷新一下又出来了

3fe696e38a9355115c4bc04af0fa76ae.png

如果你只是偶尔传几个文档应付一下没问题。但想当主力网盘用,我搜索了一下,网络上推荐了几个第三方客户端:

  • Mountain Duck(付费,约 $39 一次性)—— 真正把 WebDAV 挂成本地盘符,Finder 里和访问 iCloud Drive 几乎没差,支持离线缓存、上传队列、智能同步
  • Cyberduck(免费)—— Mountain Duck 同公司出品,但只能「打开」不能「挂载」,操作起来更像 FTP 客户端
  • rclone mount(免费,命令行)—— 不嫌折腾的话稳定性和性能都很好,还能加 VFS 缓存提速

大家有用到好用的客户端也欢迎在评论区分享交流!

安全小贴士

WebDAV 暴露在公网上,几条小建议:

  1. config.yml 一定 chmod 600,避免被同机器的其他用户读到你的哈希
  2. NPM 里给这个 host 加 IP 白名单,或者套一层 Cloudflare Access、Authelia 之类的二次认证,公网裸奔风险还是不小的
  3. fail2ban 也可以装一下,防止有人暴力试密码
  4. 重要数据用 rclone 同步一份到 Backblaze B2 或 Cloudflare R2 —— hacdias/webdav 本身没有版本管理,删了就真的删了。B2 的 5GB 免费额度对小型笔记同步绰绰有余
  5. VPS 快照定期开起来,多花不了几块钱,关键时刻能救命

大家使用上还有什么心得或者问题,欢迎评论区交流~

10. 结尾

祝大家用得开心,有问题可以去 GitHub 提 Issues,也可以在评论区互相交流探讨。

同时,有能力给项目做贡献的同学,也欢迎积极加入到 项目 中来,贡献自己的一份力量!

最后,感谢作者 @Henrique Dias 的辛苦付出,让我们能用到这么优秀的项目!欢迎大家都去给这个项目点个 star。

参考资料

官方 GitHub:https://github.com/hacdias/webdav

从「不会 Swift」到 App Store 过审:我用 Claude Code 又写了个 iOS App

2026-04-24 20:20:54

起点 —— 上一篇挖的坑,这一篇填了

2026年5月1日更新:国区Apple Store也上架了,中文名字:续然,欢迎大家使用和反馈意见!

上一篇 写完 Claude Code 魔改 Halo 主题,文末我顺手挖了个坑——说下一步想试试用 Claude 做个 iOS App。当时吹牛成分 60%、好奇成分 40%,没想到这话放出去不到一周,App 真就写完提审了。

动手之前我给自己定了两个目标。

一是摸一下 Claude 的能力边界。Halo 主题那种活,网页端改改 CSS,对 Claude 来说是舒适区。iOS 开发就不一样——SwiftUI、SwiftData、真机调试、证书签名、App Store 审核,每一环都是新坑,我想看看咕咕坐副驾这事能跑多远。

二是真有这个需求。不是为了写博客硬编的场景——我自己就囤着一堆 VPS、域名、邮箱、SaaS 订阅,哪天哪个扣费、哪天哪个到期,全靠Notion记录肉眼盯。(好吧我承认起因其实是怕自己的搬瓦工iON 等等传家宝 VPS 忘记续费 = =)。

上一篇的评论区,有朋友推荐了 Wallos——一个自托管的订阅管理工具。我确实很早之前 Docker 部署了一份(也出过教程),跑在自己 VPS 上。但 Wallos 的提醒路径是邮件——我经常忘记开邮箱…… 而且我的邮箱太多了……

手机这东西一天看 50 次。如果有一个 App 把提醒直接推到锁屏——肯定不会错过。

动机清晰了。

2026 年 4 月 21 日晚上 7 点 28 分,我在一个空文件夹里打开 Claude Code,告诉它:

「做一个 iOS App,追踪订阅和域名到期时间,本地存储,不要账号,不要云」——就这么开始。

图标 —— 一只带铃铛的鸽子

AppIcon-1024.png

整个项目里,唯一一个从一开始我就想清楚、没让 Claude 瞎发挥的东西,就是这只鸽子。

  • 🕊️ 鸽子 = 信使——按时把消息捎到
  • 🔔 铃铛 = 通知——到点了响一声
  • 🧡 粉橙渐变——压住"催债感"和"焦虑感",DueSub 做的是温柔的提醒,不是红底白字的「还有 3 天扣费!」

图标里的一图二喻,其实就是这个 App 的产品哲学——非打扰式、按时到达、不制造焦虑

功能是"续费提醒",视觉符号是"捎着铃铛的信鸽"——我只用一句话把这个意向说给 Claude 听,基本上两版就过了。这也是这次协作里我觉得最神奇的地方——你脑子里模糊的画面,只要你能用一句话说清楚它的内核,Claude 基本能把它落到像素上

当然也适配黑暗模式:

AppIcon-1024-Dark.png

成品长这样

话不多说,直接上图。

01-list.png

主列表:支出和收入同屏对照,月付、季付、年付、一次性,所有周期一个列表里理清。顶部那个粉橙色的卡片显示「30 天内还有几笔」,是我自己每天打开 App 最想第一眼看到的信息。

05-homewidget.png

主屏小组件:桌面上直接看 30 天内即将到期的 N 项,不用点进 App。对我来说这就是这个 App 存在的意义——你手机锁屏那一眼就能看到的东西,你不会忘记

04-lockscreen.png

锁屏小组件:只显示下一笔——不用解锁、不用打开 App、锁屏状态下直接看到名字和剩余天数。这个我真的挺喜欢。

整个视觉语言贯穿的还是那个「非打扰式」的产品哲学——数字不标红、不用感叹号、不搞「紧急!」这种暴力美学,就是温柔地提醒你一句。

4 天 18 个 commit

我之前没写过 Swift,一行都没有。

Xcode也没装过。

SwiftUI、SwiftData、WidgetKit(分别是苹果用来做 iOS 界面、存本地数据、做桌面/锁屏小组件的三套框架)是啥,全是边做边查。但不妨碍我 4 天写完、上架、提审。

日期 Commits 主要内容
04-21(周二) 7 初版 + 改名 + 图标 + 隐私声明 + 截图策略
04-22(周三) 4 通知 P0 三连击 + 真机验证 + 修复上线
04-23(周四) 3 多币种实时汇率(opt-in)
04-24(周五) 4 Bundle ID 改名 + ASC 元数据 + 提交审核

我大部分时间在干嘛?打字、截图、点按钮。写需求、看效果、给 Claude 反馈「这里不对、那里要改、审美再收一点」。真正「坐键盘前敲 Swift 语法」的时间——几乎没有。

但这不是说 Claude Code 是魔法。它不是。它会在一个看起来简单的地方疯狂跑偏,能爽到停不下来,也能气到想砸键盘。

下面是翻车现场合集。

翻车现场 1:改名三连跳(放了自己一鸽子)

App 一开始没专门起名字,我自用编译好之后,手机里最早就显示叫「续费提醒」。土是土了点,但直白。

第二天我觉得这名字太像 90 年代共享软件,改叫 Renewly。英文名、现代感、听起来像个 SaaS。

然后我犯了一个很愚蠢的错误——没有第一时间去 App Store 查重名。名字定了、图标调了、本地化文件改了、隐私政策的 title 也换了——一直到我准备提交审核之前,才突然想起来去搜一下。被人占了。有一个已经在跑的订阅工具 app 也叫 Renewly,功能还不完全重叠——这种重名是 Apple 审核环节大概率会让你改的那种。

这个锅就是没经验导致的。作为一个日常就在 App Store 搜 app、自己也跑一堆自托管工具的人,「发布前先查名字」这种事不用别人教。我偏偏就忘了——咕咕本咕,放了自己一鸽子

只能第三次改名。这次更彻底:英文叫 DueSub(Due + Subscription 的缝合),中文叫 续然(续是续费,然是自然、果然)。

踩完坑的经验——名字想好之后第一件事:去 App Store 和 Google Play 都搜一遍,再去 Namecheap 看看 .com 在不在(最好但不是必须),都空着再去设计图标、改代码、改本地化。我这次反过来做,付了 3 次改名的工时。

翻车现场 2:通知的三个坑(同一天翻了三次)

这个 App 最核心的功能是到期提醒——你订的 VPS 明天扣费,我提前 7 天、3 天、1 天推送,当天上午 9 点再补一刀。这个功能不对,整个 App 就是一个「带搜索框的表格」。

结果 04-22 那天我翻了三次车,一天修了三个 BUG。

坑一:九点以后打开 App,当天的提醒丢了。
调度逻辑是每天早上 9 点对「当天到期的项」推送一次。自测 OK。结果某天下午我打开 App,发现明明有一项今天到期,却没推送。根因是 App 长时间没启动,调度队列里根本没这条通知,系统自然不会补发。修法是 App 启动时 fallback 检查一次——当天有到期项、现在已经过 9 点、用户今天还没收到,就立刻补推。

坑二:自动续费的文案跟代码对不上。
设置页之前有个「自动续费项默认不提醒」的开关,文案写「你已经设置自动扣款了,不需要再提醒」。听起来很合理——但代码不是这么做的。代码里自动续费项依然推 7/3/1 天的提醒,只有当天 9 点不推。这种「你说的是 A,代码做的是 B」最阴——不 crash、不报错、但就是跟用户说好的不一样。改了文案——提前几天提一下不是坏事,是自动扣那一刻再来一下才烦。

坑三:App 开着的时候,通知横幅被系统吞了。
iOS 的默认行为——App 在前台时,系统不弹横幅。理由是 App 自己处理。这对聊天软件合理,对一个到期提醒 App 就是「你盯着屏幕的时候我就不提醒你」——有点傻缺。我真机上复现:早上 9 点 App 开着,该推的一声没响。我当时盯着屏幕看了 10 分钟,以为自己又写炸了。修法其实很简单——一行代码的事,让 App 主动告诉系统「前台也请弹」。

三个坑修完、真机回归测过,这一天我感受到了**「软件这事儿怎么每个角落都能翻车」**的经典真理。Claude 写代码很快,但它不会替你想清楚「用户下午 3 点才打开 App 会发生什么」——你得自己变成产品经理兼测试,一个个角落去踩。

翻车现场 3:Bundle ID 的最后一公里

全程最让我心里一凉的一次。

Apple 的 Bundle ID(可以理解成 App 的全球唯一身份证号)一旦在 App Store Connect 注册并提交过 build(也就是打包上传过一次安装文件),就不能改了——要改只能注册新 App ID、开新 App 记录,之前填的元数据、截图、审核资料全部作废从头来

我最早的 Bundle ID 前缀用了我日常 handle,但开发者账号实名信息是另一个名字。两边对不上,Apple 校验过不去。

只能改 Bundle ID。改它意味着:

  • Xcode 里所有 target 的 Bundle ID
  • 主 App 和小组件共享数据用的 App Group
  • 证书和描述文件要重签
  • 测试机上装过的旧版全部失效,要重装

最阴的是 App Group(让主 App 和桌面小组件共享数据的一个"命名空间",Apple 规定这个名字全球唯一)。我旧的 group 名改新的时候报冲突,说这个名字有人用过(其实是我自己,几分钟前注册的、没删)。加了个 .shared 后缀绕过——这个本来不应该存在的后缀永远留在我代码里了,作为一个「我和 Apple 的命名空间规则打过架」的纪念。

修完、重签、重装、回归——折腾好一会儿才终于走到 App Store Connect 那一步。

翻车现场 4:App Store Connect 是一个 checkbox 地狱

到这一步我才意识到:写 App 只是上架这件事的冰山一角。真正的灾难在 ASC。

让我列一下这次填过的表(不完整,凭记忆):

  • App 名称 / 副标题 / 推广文本 / 描述 / 关键词(英文中文两套
  • 主类别 / 副类别 / 年龄评级(一份 20 多题的问卷,问我「本 App 是否包含恐怖元素」——我做的是订阅提醒)
  • 版本号 / 构建号 / 上架日期
  • 隐私政策 URL(每种语言一份,英文一个、中文一个)
  • Marketing URL / Support URL
  • 12 张截图(6.9" iPhone,iPad 跳过只做 iPhone)
  • App Icon 1024×1024
  • App 隐私标签(和代码里的 PrivacyInfo.xcprivacy 是两份独立的表,要自己保证内容一致)
  • 内容版权声明(不是 App 的版权,是 App 里用没用别人的素材)
  • 出口合规性(加密算法使用)
  • IDFA 使用声明
  • DSA 欧盟合规声明(新增的,个人开发者选 Non-Trader 才不会公开家庭住址)
  • App 审核联系方式 + 演示账户 + 审核备注
  • 定价 + 可用国家地区
  • Mac / Vision Pro 兼容性(默认勾,记得关)
  • 发布方式(自动 / 手动)

整理这份清单用了一下午。一个勾一个勾过,途中踩的坑:

  • 勾了「所有国家」才发现默认包括中国大陆——国区要备案我没备,赶紧去掉
  • 英文的隐私政策 URL 填完以为就行——ASC 跳出红 banner:简体中文 - 隐私政策网址 - 此栏为必填项。每种语言要独立一个 URL
  • 以为提交时会弹「出口合规 / IDFA / 内容版权」三连问——这次居然没弹。后来才知道如果你在 Info.plist / xcprivacy / App 信息页都提前答过了,ASC 不再来烦你
  • 备注里写了 Settings 里有个 "Seed Sample Data" 按钮——结果代码里英文按钮实际叫 "Fill sample data"。自己的 App,按钮名都记错。这给 Apple reviewer 看到,他大概会觉得我连自己 app 都没摸熟

最后所有字段绿勾、红 banner 消失、「提交以供审核」按钮可点。深呼吸,点下去。

然后画面一片祥和。没有弹窗、没有「你确定吗」、没有任何仪式感——左侧栏那个黄色小点变成「正在等待审核」,就这样。

吐槽一下:上架 App 这个流程,真的太复杂了

我要认真吐一下槽。

Apple 的 App Store 是 iOS 生态的核心支柱,用户体验堪称行业标杆。但它对开发者的体验,是另一个世界。

作为一个独立开发者、副业开发者、个人开发者,你要面对:

  1. ¥688 / 年的开发者费($99)。App 一分钱不赚,每年也得续。这个我认——毕竟用了整套工具链和分发网络。但作为一个常年买小鸡的人,每年还是要叹一声——这笔钱够我买一台好的服务器了
  2. 证书体系。App ID / Bundle ID / Provisioning Profile / Distribution Certificate / Push Certificate……随便一个过期,线上炸。
  3. ASC 的 30 多个字段 + 一堆合规声明。DSA、隐私标签、xcprivacy、内容版权、出口合规、IDFA、年龄问卷、类别、定价、可用区。
  4. 审核的黑盒。什么时候过、为什么过、拒了怎么改,全靠邮件 + Resolution Center。
  5. 多语言隔离填写。每个 locale 要独立填描述、关键词、URL——漏一个返工重来。

这套流程对成熟团队(有专门的 release manager 和 compliance)是日常,对一个摸着石头过河的独立开发者——「完成率劝退」比代码本身高 10 倍。我完全理解为什么那么多做了一半的 iOS App 最后没上架——不是代码没写完,是上架的活儿没人愿意干

我这次能走完,95%的功劳给 Claude——不是它写代码快,是它陪我把这 30 多个 checkbox 一个一个过完。如果让我自己看 Apple 文档去填,我多半中途就放弃了。

顺便说一下国区(其实我想上的)

这次上架,我主动跳过了中国大陆区——但这不是我本意。

我本来是想上国区的。不是说看重国区下载量,就是觉得一个中文作者做的中文工具,中文应用商店里没它,多少有点别扭。

备案这事我是知道的。早几年折腾服务器域名的时候,我就顺手买了一个十年的 .cn 域名挂在腾讯云、老老实实走完了 ICP 备案;当时配套也买过一台大陆服务器——但国内服务器的体验真的让人一言难尽,带宽小得可怜还卖得贵,到期我就没续费了。反正我要跑的服务都在境外,非要在大陆放一台机器没必要。

这次准备上架国区,我盘算了一下以为挺简单——.cn 域名还在、备案号还在、腾讯云账号还在、实名信息跟 Apple 开发者账号对得上。填个备案号就完事了吧?

结果一查流程才发现:光域名备案不够,备案得绑定在一台「正在使用中」的境内服务器上。我那台大陆机子早停了,备案跟着就失效了——要恢复,得再租一台国内服务器

这就有意思了——我这个 App 完全离线、不联网、不部署任何东西。我不需要服务器,没有任何后端服务要跑,也没有任何 API 要托管。仅仅因为「要在国区上架」这个理由,我被强制要求去租一台我完全用不上的大陆服务器

这一点我是真的不太理解。规则的本意大概是想给在国区上架的 App 留一个可追溯的境内主体,但对一个纯离线工具来说,服务器这条要求完全是空转——我没有后端、没有数据回传、没有任何需要境内托管的东西,却要为此每年多掏一份云厂商的钱。

算一下数:国内一台够用的轻量应用服务器(能用于备案的最低配起),一年 400 块起步;加上 Apple 开发者 ¥688;加上偶尔维护备案的小成本——对一个不收费的免费 App每年多花 1000 多块为爱发电,实在不太合理

所以这次我选了 All Countries except China mainland——174 个区全部开放,国区先空着。等哪天要做付费功能,有盈利模型能把这 1000 多块年成本覆盖掉,再回头补上国区不迟。

如果你也是个人开发者、做的是免费离线工具——国区这件事可以先放一放。把其他 174 个区跑通、把用户反馈收起来、把付费模型验证出来,再回头说国内的事。

Claude Code 作为 iOS IDE 的体验

回到这次最初的目标之一——「摸一下能力边界」。

我不懂 Swift,不会 SwiftUI 的声明式语法,SwiftData 的 @Model 到现在也讲不清原理。但一点都不慌——因为我不需要懂,我只需要知道我要什么

  • 「加一个设置项,让用户切换显示货币」——Claude 去加
  • 「这个列表行高再紧一点」——Claude 去改
  • 「真机跑一下,别只编译通过」——Claude 真的会去 build、装真机、抓日志
  • 「这个通知为啥没弹,你查一下」——Claude 读上下文、看 delegate、写假设、去验证

我的角色从「写代码」变成了「定需求 + 审效果 + 做判断」。前者要懂语法,后者要懂用户。

爽的地方:你不再因为「不会 Swift」而放弃 iOS App 这个想法

不爽的地方:它跑偏的时候你得看得出来——代码能力不是凭空被替代的,你能让 Claude 写代码,但你必须能看出它写的是不是你要的。

这次 4 天我踩到的能力边界大致在:

  • 需要你当产品经理。Claude 不会主动想「用户下午 3 点打开会怎样」这种边界 case
  • 需要你当测试。它说「已修复」不等于修了,必须你跑一遍真机复现
  • 证书 / 签名 / 打包的坑它不一定记得住,要你盯着它去查 Apple 最新文档
  • ASC 的字段含义它有时候会猜错,你得自己去对官方说明

其他的——写代码、读 API、调 debug、查栈、写测试——它比我快得多得多。

成本账

粗略算一下这个 App 到目前为止的总投入:

成本
Apple 开发者账号 ¥688 / 年
Claude Code 订阅 已订的 Max 档,这次没多花
域名 + 托管 ¥0(Landing 和隐私政策挂 GitHub Pages)
服务器 ¥0(没备案,不需要)
图标 ¥0(Claude + SF Symbols + 手调)
截图 ¥0(模拟器截图 + 简单标题文字)
总计 ¥688

跳过国区之后,全部成本就剩一张 Apple 开发者年费。对一个本来一行 Swift 都没写过的人——这个投入产出比,放在 Claude Code 出现之前是完全不可想象的

写在最后

这不是一篇「你也能 4 天做 iOS App」的鸡血文。你不能,我也不能——如果换一个更复杂的 App(联网、账号、支付、音视频、AI 推理),这个周期会翻好几倍。

但有一件事值得说——「我不会写代码」,不再是做东西的理由了

过去十年,「有想法但不会写代码」是劝退无数人的天花板。想做的东西卡在「找不到技术合伙人 / 招不起开发」这一步上。今天这个天花板被 Claude Code 这类工具狠狠砸了一个洞

不是洞下面一切都容易,iOS 上架流程该复杂还是复杂,国区备案的门槛该离谱还是离谱。但写代码本身这件事,从「不可能」,变成了「要不要动手」。

当开发成本降到接近于零,真正稀缺的是什么

这次最让我想明白的一件事——开发成本的下降,反过来把产品问题推到了台前

过去「找到真实需求 + 招到靠谱开发 + 写出能用的代码」三件事捆在一起,能搞定其中任何一个都算稀罕。现在 Claude Code 把第二、第三件事的门槛降到了个人能承受的范围——那第一件事——你到底在解决一个真问题,还是在自嗨——就变成了唯一卡住你的那个门槛。

我这个 App 是我自己的小真实痛点。规模不大,也不打算做成生意。但在做的过程里我越来越相信——在今天,独立开发者是真的能吃上饭的。这两年海外 indie dev 圈里,赚到钱的人一抓一大把,有年收入几十万美金的,也有做个 $10/月小工具把生活费搞出来的。核心都不是他们代码写得多牛——而是他们找到了一小群真实付费用户的真实需求

代码这条护城河正在被填掉,用户洞察成了新的护城河。对不少想副业糊口、或者想看能不能全职独立的人,这可能是十年难遇的一个窗口期——代码能力第一次不再是硬卡点,但同时,你对用户的理解的重要性被放大到前所未有。

下一个坑

这次 DueSub 是免费 App,没盈利模型——它本来就是给我自己用的,顺手做成了产品。下一个我想挖的坑,是做一个带付费功能的 App:走一遍订阅 / 一次性内购的完整流程,去碰 StoreKit、走税务合规、看看 Apple 30% 抽水到底怎么切、体验一下从 0 到第一个付费用户的全过程。

具体做啥还没定——先把用户洞察这一步想清楚再动手。这次改名三连已经告诉我了,想清楚再动手,比手快多跑一版省事得多。

最后

回到博客侧边栏那四个字——learn or earn

这回 learn 到了 iOS 一整套流程、Claude 能力边界、App Store 审核的全部坑;earn 谈不上,免费 App 没盈利模型。但摸清一条从 0 到 1 的路径本身,就是这次最大的 earn——下一次就知道怎么走第二步了。

App 叫 DueSub / 续然,现在在审核队列里,预计 24–48 小时后上架非国区 App Store。免费、离线、不要账号——如果你也跟我一样囤着一堆 VPS 和域名、又老忘开邮箱——装一个试试。

国区的事儿,以后再说吧。

咕咕下一篇接着挖坑。

后记 · 发博客之前 App 先过审了

正文写到上面那段「在审核队列里,预计 24-48 小时」的时候,App 确实还在审核。结果博客还没来得及排版发出,苹果那边先完事了。

这篇博客发出来的时候,App 就已经在除中国大陆外的各区 App Store 可搜可下了:

DueSub: Subscription Tracker —— 免费、离线、无需登录。