files: /me and /public are two separate per-user areas

Per feedback: /me is PRIVATE and the public folder must be its own
top-level area, not nested under /me.

- A member now has two sibling areas over SFTP: /me (private,
  <root>/files/users/<name>) and /public (their own public files,
  <root>/files/public/<name>), served anonymously at ~<name>/public.
- Drop the global shared /public web route and the /me/public nesting.
  The anon surface only exposes ~name/public; /me has no anon route.
- Both owned areas count toward the quota gauge.
- Index publish hint, docs, and setup.sh updated to scp :/public/.

files.<host> stays a file server; member sites remain on the BBS.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Anthony Ettinger 2026-06-26 01:36:43 +00:00
parent a2d4817a8e
commit f2bcb7e063
7 changed files with 135 additions and 135 deletions

View file

@ -704,17 +704,14 @@ ${FILES_DOMAIN} {
# at https://${DOMAIN}/~<name>). The agentbbs file-manager on loopback serves:
# / directory of all members (links to each one's BBS site
# and their public files here) — no auth
# /~<name>/public[/] a member's public files folder — anon read-only browse
# /public[/...] the shared public area — anon read-only browse + files
# (signed in) the member's private /me (whose public/ subdir is the
# ~name/public surface) and the shared /public
# Clean URLs map 1:1 to the SFTP paths, so share links just work:
# scp dist.crx files@${FILES_DOMAIN}:/public/extensions/acme/
# -> https://${FILES_DOMAIN}/public/extensions/acme/dist.crx
# scp index.html files@${FILES_DOMAIN}:/me/public/
# /~<name>/public[/] a member's own public files — anon read-only browse
# (signed in) the member's two areas: private /me and public /public
# A member has two SEPARATE areas: /me (private) and /public (their own public
# files, served at ~<name>/public). Clean URLs map 1:1 to the SFTP paths:
# scp index.html files@${FILES_DOMAIN}:/public/
# -> https://${FILES_DOMAIN}/~<name>/public/index.html
# The anon surface only ever exposes ~name/public, never the rest of a
# member's private /me (see internal/files web tests); it is read-only.
# The anon surface only ever exposes ~name/public, never a member's private
# /me (see internal/files web tests); it is read-only.
reverse_proxy http://${FILES_WEB_ADDR}
}
"