Files
tilde.club/docs/community.md
T

6.4 KiB

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
Home skeleton tildeclub/tilde.etcskel
Account creation tildeclub/makeuser; the collected live script has local integrations.
First-login wizard tildeclub/welcome
Gopher daemon tildeclub/Fossor
Gopher root content tildeclub/gopherhole
Gemini root content tildeclub/geminipage
MOTD tildeclub/motd
Terminal wiki helper tildeclub/wiki-cli
Recent-page listing tildeclub/recently-updated
Botany tildeclub/botany
Terminal blogging tildeclub/ttbp
Forum client tildeclub/ttrv
Helpdesk tildeclub/helpdesk
File sharing 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:

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 and connection-list notes.