pithos/README.md
Local Dev 9727ce79d3 Pithos: document hosting on Silent Mode and the gateway
Records what was built against the plan (names are encrypted from v1, rights
for other people are folder-scoped S3 keys), how to run pithos-hosted, and
that paid storage belongs to Hestia, a separate product.
2026-10-04 01:44:23 +02:00

176 lines
7.4 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Pithos
A control panel for [s3d](https://github.com/SiaFoundation/s3d), the Sia
Foundation's S3 gateway. s3d itself is managed through a CLI and a two-route
admin API; Pithos puts a UI over all of it:
- **Gateway**: install the pinned s3d release (SHA-256 checked), start, stop,
restart, live logs, edit `s3d.yml`.
- **Sia connection**: register s3d with an indexer (sia.storage or your own
indexd) with an existing recovery phrase or a freshly generated one, and
approve the connection in the browser.
- **Users & keys**: create and delete users, issue and revoke access keys,
copy ready-made `aws`, `rclone` and env-var config.
- **Buckets**: browse as any user, create and delete buckets, upload by
drag-and-drop, download, delete files and folders, presigned share links,
public-read policies.
- **Upload pipeline**: pending, uploaded, unpinned and failed objects from
`/stats/uploads`, plus "flush now" and an optional automatic upload of
leftovers after N quiet minutes.
- **On Silent Mode** (optional): run the same s3d on Silent Mode's server
with your own Sia account, with client-side encryption, public folders,
share links and S3 keys for other people. See below.
## On this computer, or on Silent Mode
By default s3d runs on your computer. Settings › *Where your drives live*
can move it to `pithos-hosted` on Silent Mode instead, where it keeps working
with your computer off and is reachable from other devices. The interface
stays the same.
- **Your own Sia account.** Only s3d's data folder moves: its database and any
files still waiting for Sia. The recovery phrase never leaves your
computer, and nothing already on Sia is uploaded again. Moving back works
the same way in reverse.
- **Encrypted before it leaves.** In hosted mode Pithos encrypts file names
(AES-SIV per path segment, so folders still list) and contents (chunked
AES-256-GCM, so range reads stay cheap) on your computer, with keys from
your Theseus vault or, on other hosts, a key file beside `s3d.yml` that
you should back up. See `core/crypt.js`.
- **Sharing a bare s3d cannot do.** Public folders, expiring share links, and
S3 keys for other people limited to one folder with read, add-only or edit
rights. Those files are stored readable, because the people they are for
have no key; stop sharing and Pithos encrypts them again.
- **One slot per person.** Signing up needs a signature from the wallet that
owns a BNS name, a small refundable BCH deposit, or an invite.
The server is in `hosted/` (see `hosted/README.md`); the design and its
trade-offs are in `DESIGN-hosted.md`.
## One core, three hosts
```
core/ control server: s3d process, CLI wrapper, SigV4 S3 client, admin API, HTTP API
ui/ the single-page UI the server serves (plain JS, no build step)
bin/pithos-web.js web console -> your browser
desktop/main.cjs desktop app -> an Electron window
theseus/ Theseus add-on -> a Theseus tab
```
Every host runs the same `createPithos()` server on a loopback port and
points a view at it. A feature added to `core/` + `ui/` lands in all three.
### Web console
```bash
npm install
node bin/pithos-web.js
```
It prints a one-time sign-in link for `127.0.0.1:8700`. To reach it from
another machine, set a password and put a TLS reverse proxy in front:
```bash
PITHOS_PASSWORD='long random secret' node bin/pithos-web.js --listen 0.0.0.0:8700 --allow-host pithos.example.org
```
Other flags: `--config <s3d.yml>`, `--s3d <binary>`, `--bin-dir <dir>`,
`--password-file <file>`.
### Desktop
```bash
npm run desktop
```
The window signs in with the server's one-time secret; nothing else on the
machine can drive the API. Quitting stops s3d cleanly. Installed s3d builds
go to the app's user-data folder.
### Theseus
```bash
node scripts/build-theseus-addon.mjs
```
builds `dist/theseus-addon/pithos/` (about 0.9 MB). Copy it into
`TheseusNavigator/bundled-addons/` to bundle it, or publish it as a
community extension. The dock menu has *Open Pithos* and *Stop s3d*.
**Shipping an update.** The add-on updates on its own extension channel, not
with Theseus releases:
1. Bump `version` in `theseus/addon.json` (and `package.json`).
2. Rebuild the bundled copy:
`node scripts/build-theseus-addon.mjs ../TheseusNavigator/bundled-addons/pithos`,
then commit, so new installs carry the same version.
3. Sign it and publish it on the channel at
`https://navigate.st/bns/theseus.x/extensions/pithos/` (Sia bucket
`bns/theseus/extensions/pithos/`), as described in
`TheseusNavigator/docs/ADDON-UPDATES.md`.
Installed copies pick the update up within about 30 seconds of the next
launch and switch to it on the launch after that. The Theseus version
stays the same.
The add-on leaves out the pty module (12 MB of native code), so on Windows
the indexer login runs in its own console window and Pithos picks up the
result when it closes.
## Which s3d instance it manages
The same one a hand-run `s3d` would use: `S3D_CONFIG_FILE` if set, otherwise
`%APPDATA%\s3d\s3d.yml` (Windows), `~/Library/Application Support/s3d/s3d.yml`
(macOS), `/etc/s3d/s3d.yml` (Linux). Every s3d call Pithos makes gets
`S3D_CONFIG_FILE` pinned, so the daemon and the CLI calls always agree.
If another s3d process is already serving that config (a service, or one
started by hand), the overview shows it as *external* and reads its stats,
but Pithos won't start a second copy.
Pithos needs **s3d v0.2.0 or newer**: `users list` and `keys list` arrived
in 0.2.0. Older builds get an upgrade banner.
## Security model
- The server binds loopback by default and refuses Host headers other than
its own address (DNS-rebinding guard). Binding beyond loopback requires a
password of at least 12 characters.
- Sessions are HttpOnly, SameSite=Strict cookies. Every non-GET request also
needs an `x-pithos: 1` header, so a cross-site form cannot drive the API.
- The recovery phrase is only written to the s3d login process's terminal.
It is never stored, logged or sent anywhere else. A generated phrase is
shown once and must be acknowledged.
- Downloads are served with a sandboxing CSP and `nosniff`, so a stored HTML
object cannot run script on the console's origin.
- s3d keeps access-key secrets in plain text in its own SQLite database.
Pithos shows them to whoever is signed in to the console, so treat console
access as root on the gateway.
## How it talks to s3d
| Need | Mechanism |
| --- | --- |
| users, keys, version, registration check | `s3d users …`, `s3d keys …`, `s3d version`, `s3d login` with stdin closed |
| indexer login | `s3d login` in a pseudo-terminal (it reads the phrase with `term.ReadPassword`) |
| buckets and objects | the S3 API, signed with SigV4 as the chosen user's first access key |
| stats, flush | the admin API (`/stats/uploads`, `/objects/flush`) with the configured admin password |
`test/sigv4.test.js` cross-checks the signer against the AWS CLI on awkward
keys and prefixes and on presigned URLs (`npm test`).
## Limits and next steps
- Uploads are single PUTs, capped at 5 GiB (s3d's part limit). Multipart
uploads from the browser would lift that.
- Object versioning, lifecycle rules and multipart-upload cleanup are not in
the UI yet.
- Desktop installers (electron-builder) are not set up yet.
- Storage paid to Silent Mode (quotas, plans, billing) is not part of
Pithos. That is Hestia (`Hephaestus/DESIGN-hestia.md`), a separate product
for operators who sell storage.
## License
MPL-2.0. s3d is MIT, © The Sia Foundation.