Hetzner Object Storage 是 S3 兼容的、便宜的、放在欧盟境内的,所以欧洲项目里它常常在有人挑桌面工具之前就先用上了。本页讲客户端需要的设置、会影响工作方式的配额,以及那些「Hetzner 不是 Amazon」所导致的报错。所有内容都在 2026 年 9 月于 docs.hetzner.com 与 hetzner.com 上核对过。工具层面的横向对比在 S3 GUI 客户端总览。
三个端点,以及配套的寻址方式
区域一共三个,各有自己的端点主机名:
| 区域 | 端点 | 官方示例里的 region 字符串 |
|---|---|---|
| 德国 Falkenstein | fsn1.your-objectstorage.com | fsn1 |
| 德国 Nuremberg | nbg1.your-objectstorage.com | nbg1 |
| 芬兰 Helsinki | hel1.your-objectstorage.com | hel1 |
对象的公开地址是 https://<bucket-name>.<location>.your-objectstorage.com/<file-name>——桶名是子域名,不是路径的一段。这就是 virtual-hosted 寻址,而 Hetzner 自己的工具示例也是这么配的:MinIO 客户端的配置写 --path 'off',AWS CLI 那页在讲预签名 URL 时给出 addressing_style = virtual。所以客户端里若有「path-style」或「force path style」开关,在 Hetzner 上请保持关闭。这和几乎必须开 path-style 的 MinIO 正好相反,那一侧写在 MinIO 客户端。
sh
mc alias set hetzner https://fsn1.your-objectstorage.com <ACCESS_KEY> <SECRET_KEY> --api 's3v4' --path 'off'
mc ls hetzner
aws s3 ls --endpoint-url https://fsn1.your-objectstorage.comHetzner 有专门文档的命令行工具是 mc、s3cmd、s5cmd、rclone 和 AWS CLI,其 FAQ 里写着「Yes you can manage your Buckets via AWS CLI und AWS SDKs」。认证走 AWS Signature version 4,存储类只有 Standard 一种。
从控制台取出密钥
凭证是按项目而不是按账号发的。在 Hetzner Console 里打开项目,左侧菜单 Security,上方菜单 S3 Credentials,点 Generate credentials,填一段说明,然后把两个值复制出来。
密钥要当场保存。文档写得很干脆:「It is not possible to view the secret key again once the window has been closed!」而且因为密钥绑定项目,「It is not possible to share S3 credentials across multiple projects unless you set up appropriate bucket policies」。想让一个客户端同时看到两个项目的桶,就得建两个连接,或者用桶策略放行。
会改变工作方式的配额
| 项目 | 数值 |
|---|---|
| 桶数量 | 所有项目合计最多 100 个 |
| 每个桶的对象数 | 最多 50,000,000 |
| 每个桶的容量 | 最多 100 TB |
| 对象大小 | 单个对象最多 5 TB,单次 PUT 最多 5 GB |
| 计费最小对象体积 | 64 kB |
| 基础价格 | 每月 4.99 欧元 / 5.99 美元,含 1 TB 存储与 1 TB 出站流量 |
| 超出配额 | 存储每 TB·小时 0.0067 欧元,出站流量每 TB 1.00 欧元 |
| 免费流量 | 入站、eu-central 网络区内部流量,以及 S3 操作 |
其中两条各值一句话。64 kB 下限意味着装满缩略图或小 JSON 的桶,会按每个对象 64 kB 计费——上传一百万个 2 kB 文件的客户端,实际买的是 64 GB。另一条是计费从「存在」开始而不是从字节开始:「You are charged for every hour you have at least one active Bucket, even if it's empty.」一个忘了删的空测试桶放一个月,就是一整月基础费。
单次 PUT 5 GB 的上限直接决定选什么工具。超过就必须走分片上传,正经客户端都会自动这么做——这也是为什么一个老老实实 PUT 20 GB 视频的脚本会失败,而 GUI 客户端不会。
桶名比 Amazon 更严
因为桶名要当 DNS 标签,命名规则比 S3 更紧,而且改不了。允许的是「the alphabet (a-z), digits (0-9), minus sign (-)」,同时「No period (.), No blank or space characters, No upper case characters」;首字符必须是字母或数字,末字符不能是连字符,长度 3 到 63,要符合 RFC 1123,且不能写成 IP 地址的形状。禁止句点这一条比 Amazon 更严。另外:「it is NOT possible to change the name once the Bucket is created.」
没有实现的功能
兼容性的说法很坦白:「Our Object Storage API offers basic compatibility with the standard Amazon S3 actions and data types.」版本控制、Object Lock(法律保留与保留期)、CORS 策略、生命周期策略、SSE-C 都有各自的操作文档。而不支持清单里有些项目会让从 S3 迁过来的人意外:桶级的 Website、Notifications、Accelerate、Analytics、Intelligent Tiering、Inventory、Logging、Metrics、Ownership Controls、Replication、Tagging、Request-Payment 全部列为不支持,对象级的 Restore、Select Content、Torrent、GetObjectAttributes 也是。创建桶只接受「Limited headers and XML body elements only」,加密仅 SSE-C,CopyObject 带着「Source and destination must be identical」的注记。
另一个缺口是自定义域名:「Currently, it is not possible to assign a custom domain name to a Bucket.」官方给的绕法是 S3 Proxy,同时警告它「makes the Bucket data publicly accessible via your own domain even if the Bucket visibility is set to private」——所以前面要么加一层基本认证,要么干脆改发预签名链接。
从桌面客户端连接
Hetzner 只为两款图形客户端写了文档。Cyberduck 最省事,因为它自己的偏好设置里就带 Hetzner Object Storage 配置档:启用后选区域,服务器和 URL 就自动填好,你只需要填 access key 和 secret key。WinSCP 也有单独一页。
其他客户端需要四个值:上表里的端点 URL、对应的 region 字符串、access key、secret key,并且把 path-style 关掉。AnyStorage 0.2.25 里对应的是 S3 连接类型,自定义端点 URL、自定义 region 和 path-style 开关都是可编辑字段,所以不需要为 Hetzner 出专门的版本。它运行在 macOS 11+、Windows 10+ 与 Ubuntu 20.04+,凭证加密保存在本机,无需注册账号。免费版两个存储连接并允许商业使用;二十多种连接类型、搜索、预览和批量操作属于 Pro。平台细节在 Windows 版和 Linux 版。
把桶挂成一块盘
Hetzner 不提供挂载工具,所以选择还是那两条:需要 FUSE(macOS 与 Linux)或 WinFsp(Windows)的 rclone mount,或者用一个把桶按系统本来就懂的协议重新提供出来的客户端。AnyStorage 走后者——在 http://127.0.0.1:3211 上跑一个 WebDAV 服务器,由 Finder、文件资源管理器、GNOME Files、Dolphin 或 davfs2 挂载,全程没有内核驱动,每个已连接的存储都是同一个挂载点下的一个文件夹。免费版这个挂载是只读的。逐步操作见把 S3 桶映射为网络驱动器,与 FUSE 的对比见 rclone mount 替代方案。
其实是配置问题的报错
- `SignatureDoesNotMatch` 通常是 region 字符串和端点不一致,或者密钥从控制台复制时被截断。同一个故障被从头到尾走了一遍的是 MinIO 的 SignatureDoesNotMatch。
- 明明存在的桶报 `NoSuchBucket`,多半是 path-style 的客户端在访问 virtual-hosted 端点,或者用了另一个项目的密钥。
- 浏览器上传被 CORS 挡住是桶配置问题而不是客户端问题,机制和 Amazon 一致,见 S3 CORS 报错。
- `EntityTooLarge` 就是单次 PUT 5 GB 上限,换一个会做分片上传的客户端。
常见问题
Hetzner Object Storage 的端点是什么?
按桶所在区域选 fsn1.your-objectstorage.com、nbg1.your-objectstorage.com 或 hel1.your-objectstorage.com,走 HTTPS。客户端要求填 region 时,用同样的短字符串 fsn1、nbg1、hel1。
需要开 path-style 吗?
不需要。对象通过 https://<bucket>.<location>.your-objectstorage.com/<key> 提供,官方的 MinIO 客户端示例是 --path 'off',AWS CLI 示例建议 addressing_style = virtual。任何 force path style 选项都请关闭。
有官方桌面客户端吗?
没有。官方转而为第三方工具写文档:命令行是 mc、s3cmd、s5cmd、rclone 和 AWS CLI,图形客户端是 Cyberduck 与 WinSCP。Cyberduck 自带「Hetzner Object Storage」配置档,是最快的入口。
相比 Amazon 缺了哪些 S3 功能?
官方的说法是「basic compatibility」。跨区复制、标签、静态网站托管、事件通知、传输加速、清单、日志、指标、所有权控制、对象恢复、Select Content 和 GetObjectAttributes 都列为不支持;加密仅 SSE-C;桶也无法绑定自定义域名。
为什么账单比我存的字节数还多?
两个原因:小于 64 kB 的对象按 64 kB 计费,而基础费按「至少存在一个桶」的小时数收取,空桶也算。用完的测试桶请直接删掉,而不是只清空。