mirror of
https://github.com/tildeclub/tilde.club.git
synced 2026-10-25 00:55:38 +00:00
119 lines
6.4 KiB
Markdown
119 lines
6.4 KiB
Markdown
# Website, signups, and community tools
|
|||
|
|
|
||
|
|
A working shell and a place to publish are enough to start. Add community tools
|
||
|
|
when someone will maintain them. Each operator application needs its own code,
|
||
|
|
service identity, writable data, update procedure, and backup entry.
|
||
|
|
|
||
|
|
## Source repositories
|
||
|
|
|
||
|
|
These public repos provide parts of the tilde.club setup. Review the code and
|
||
|
|
its revision before deployment; a public checkout is not necessarily identical
|
||
|
|
to a local production copy.
|
||
|
|
|
||
|
|
| Component | Source |
|
||
|
|
| --- | --- |
|
||
|
|
| Website and wiki | [tildeclub/site](https://github.com/tildeclub/site) |
|
||
|
|
| Home skeleton | [tildeclub/tilde.etcskel](https://github.com/tildeclub/tilde.etcskel) |
|
||
|
|
| Account creation | [tildeclub/makeuser](https://github.com/tildeclub/makeuser); the collected live script has local integrations. |
|
||
|
|
| First-login wizard | [tildeclub/welcome](https://github.com/tildeclub/welcome) |
|
||
|
|
| Gopher daemon | [tildeclub/Fossor](https://github.com/tildeclub/Fossor) |
|
||
|
|
| Gopher root content | [tildeclub/gopherhole](https://github.com/tildeclub/gopherhole) |
|
||
|
|
| Gemini root content | [tildeclub/geminipage](https://github.com/tildeclub/geminipage) |
|
||
|
|
| MOTD | [tildeclub/motd](https://github.com/tildeclub/motd) |
|
||
|
|
| Terminal wiki helper | [tildeclub/wiki-cli](https://github.com/tildeclub/wiki-cli) |
|
||
|
|
| Recent-page listing | [tildeclub/recently-updated](https://github.com/tildeclub/recently-updated) |
|
||
|
|
| Botany | [tildeclub/botany](https://github.com/tildeclub/botany) |
|
||
|
|
| Terminal blogging | [tildeclub/ttbp](https://github.com/tildeclub/ttbp) |
|
||
|
|
| Forum client | [tildeclub/ttrv](https://github.com/tildeclub/ttrv) |
|
||
|
|
| Helpdesk | [tildeclub/helpdesk](https://github.com/tildeclub/helpdesk) |
|
||
|
|
| File sharing | [tildeclub/share](https://github.com/tildeclub/share) |
|
||
|
|
|
||
|
|
## Deploy the website deliberately
|
||
|
|
|
||
|
|
Stage `tildeclub/site` outside the web root, select and record a revision, then
|
||
|
|
review domains, contact addresses, signup behavior, JSON data, helper scripts,
|
||
|
|
and web dependencies. The collected host's main root is
|
||
|
|
`/usr/share/nginx/html`; configure its own PHP handler before deploying a PHP
|
||
|
|
front page. The static bootstrap example deliberately does not execute PHP.
|
||
|
|
|
||
|
|
Keep `.git`, credentials, local environment files, Composer's development
|
||
|
|
artifacts, and diagnostics out of the served copy. In particular, the reviewed
|
||
|
|
site checkout has a signup `_probe.php` mail diagnostic; do not deploy that as
|
||
|
|
a public endpoint. Install each application's declared dependencies using its
|
||
|
|
lockfile in a build/staging location and check its supported PHP version.
|
||
|
|
Do not infer a database requirement merely because MariaDB runs on the machine.
|
||
|
|
|
||
|
|
Make code root-owned and grant the backend write access only to the files it
|
||
|
|
must update. Avoid making the entire document root writable by nginx or giving
|
||
|
|
an operator application the same writable identity as every member's PHP.
|
||
|
|
Test error pages, forms, mail submission, and file ownership on the target host.
|
||
|
|
|
||
|
|
The wiki has its own `source/` Markdown and Makefile in the site repo. Review
|
||
|
|
that build file, install its declared tools, and build in staging. Check that
|
||
|
|
generated pages, local links, feeds, and navigation are present before syncing
|
||
|
|
the output. A successful checkout is not a completed wiki deployment.
|
||
|
|
|
||
|
|
## Signup requests are data
|
||
|
|
|
||
|
|
The reviewed website sends a request to the operator and records pending
|
||
|
|
usernames and a suggested `makeuser` command in files beneath `/var`. The
|
||
|
|
collected account script later removes the processed pending entry. Neither
|
||
|
|
step is a transaction across the Unix account, mail, ZNC, helpdesk, and signup
|
||
|
|
queue.
|
||
|
|
|
||
|
|
For a new host, reserve service/admin names, validate the username and contact
|
||
|
|
address, parse the supplied SSH public key with OpenSSH, and review the request.
|
||
|
|
A useful key-file check is:
|
||
|
|
|
||
|
|
```bash
|
||
|
|
ssh-keygen -lf /root/pending/member.pub
|
||
|
|
```
|
||
|
|
|
||
|
|
Keep that pending directory private. Construct privileged invocations from
|
||
|
|
validated arguments or structured records. Do not paste an emailed shell
|
||
|
|
command into a root terminal without inspecting its quoting and values, and do
|
||
|
|
not execute a web-writable queue as a shell script.
|
||
|
|
|
||
|
|
The public form should handle duplicate requests, concurrent writes, invalid
|
||
|
|
keys, rate limiting, CSRF where applicable, and mail failures. Trust forwarded
|
||
|
|
client-address headers only from a configured trusted proxy. Keep request data
|
||
|
|
and contact addresses out of the document root and define their retention.
|
||
|
|
Running a signup form is not a reason to give the web process passwordless sudo.
|
||
|
|
|
||
|
|
## First contact and support
|
||
|
|
|
||
|
|
Give the member a short welcome with:
|
||
|
|
|
||
|
|
- The hostname, username, SSH instructions, and host-key verification path.
|
||
|
|
- Where their pages live and which publishing services are enabled.
|
||
|
|
- First-login/MFA instructions and a recovery contact.
|
||
|
|
- Chat, mail, quotas, rules, and how to request help or packages.
|
||
|
|
- What account data is public and how to request removal.
|
||
|
|
|
||
|
|
The existing script emails a generated password and copies it to local mailboxes.
|
||
|
|
That is its recorded behavior, not a requirement for a new installation. Choose
|
||
|
|
an enrollment process consistent with your credential and mailbox-retention
|
||
|
|
policy, and ensure temporary credentials are changed before normal use.
|
||
|
|
|
||
|
|
Keep MOTD concise. Put longer help in the wiki or a local `help` command, and
|
||
|
|
publish an independent status/contact path for when the host is unavailable.
|
||
|
|
Respect the difference between a maintenance notice and a public announcement
|
||
|
|
of a new member's account; make the announcement policy clear.
|
||
|
|
|
||
|
|
## Optional apps
|
||
|
|
|
||
|
|
Install apps under separate operator-managed paths and identities. Record the
|
||
|
|
revision and dependency lockfile, local socket or port, reverse-proxy route,
|
||
|
|
backup data, and a restart/restore test. If an app requires secrets, load them
|
||
|
|
from protected config or the service environment, never from a public checkout.
|
||
|
|
|
||
|
|
For cgit, only expose repositories deliberately marked public, validate the user
|
||
|
|
and repository mapping, and test path traversal. For Botany and similar shared
|
||
|
|
apps, test whose files the backend can read and write. Keep IRC bot rate limits
|
||
|
|
and reconnection behavior within the network's policy. Treat browser terminals
|
||
|
|
and relay sockets as authenticated services, not harmless static content.
|
||
|
|
|
||
|
|
The older utilities retained under `api/` and `pages/` are not used as an
|
||
|
|
automatic install system. Their current limitations and safer deployment rules
|
||
|
|
are documented in [the API notes](../api/README.org) and
|
||
|
|
[connection-list notes](../pages/list-html-connections/README.md).
|