docs: add paste service to Workflow; clarify app-log vs stdout in Deploy

- Workflow: paste.rethinkstudios.io pastebin section — pb() function
  (recommended) + alias alternative in content tabs, usage, expires note,
  creation rate-limit warning.
- Deploy: warning admonition distinguishing ${LOGS_DIR} (app logger, to
  disk) from container stdout/stderr where startup crashes and uncaught
  exceptions land; sys.excepthook snippet to route them into the log file.

Signed-off-by: disqualifier <dev@disqualifier.me>
This commit is contained in:
2026-07-09 22:13:59 -04:00
parent 350884c2b3
commit 6151cb2e4e
2 changed files with 60 additions and 0 deletions
+15
View File
@@ -85,6 +85,21 @@ flowchart LR
create the dir; you **uncomment** the line and pick the container path.
- **Named volumes** (`cache`, …) — yours; Docker owns them, no host paths to manage.
!!! warning "Two kinds of logs — and crashes go to the other one"
`${LOGS_DIR}` holds **only** what your app writes to disk through its logger
(e.g. `log_setup` writing a file) — your own structured logging. It does **not**
capture the process's stdout/stderr, and that's where **startup crashes and
uncaught exceptions land** — a traceback from a failed import or a missing file
never reaches your logger. So if a service dies on startup, or you don't see the
error in your log files, it's in the process output, not `${LOGS_DIR}`. Make
fatal errors visible — and to route uncaught exceptions into your log file too,
install a top-level hook:
```python
import sys, logging
sys.excepthook = lambda *exc: logging.getLogger().critical("uncaught", exc_info=exc)
```
!!! success "Same file, both places"
Locally, `docker compose up` needs nothing set — the `${VAR:-./default}`
fallbacks use `./logs` / `./config`. When deployed, the ops tooling sets the
+45
View File
@@ -241,3 +241,48 @@ gitcs() {
- **`gl`** — a readable branch graph for understanding history at a glance.
- **`pyenv`** — per-project Python versions, so each repo builds against the
version it targets.
## Paste service
A shared, self-hosted pastebin at
[paste.rethinkstudios.io](https://paste.rethinkstudios.io) — for quickly sharing
logs, snippets, or command output when you're pairing, filing an issue, or handing
output to a coding agent. Pastes are **unlisted** (random URL), **expire** by
default, and support **burn-after-read**. Anonymous — no login.
The easy way: pipe anything into it and get back a URL. Drop this into your
`.zshrc` / `.bashrc` — a **function** is preferred over a plain alias because it
reads stdin cleanly and has room to grow options (needs `jq` + `curl`):
=== "Function (recommended)"
```bash
# paste stdin to the rethink paste service, print the URL. usage: cat file | pb
pb() {
jq -Rns '{text: inputs, expires: 259200}' \
| curl -s -H 'Content-Type: application/json' --data-binary @- https://paste.rethinkstudios.io/ \
| jq -r '"https://paste.rethinkstudios.io" + .path'
}
```
=== "Alias (alternative)"
Same behaviour as a one-liner — note the extra escaping the alias form needs:
```bash
alias pb="jq -Rns '{text: inputs, expires: 259200}' | curl -s -H 'Content-Type: application/json' --data-binary @- https://paste.rethinkstudios.io/ | jq -r '\"https://paste.rethinkstudios.io\" + .path'"
```
Usage — pipe any file or command output straight in:
```bash
cat latest.log | pb # -> https://paste.rethinkstudios.io/xxxxxxx
mycommand 2>&1 | pb # pipe any command's output (stderr too)
```
`expires` is in **seconds** — `259200` = 72h (the default). Change it (e.g.
`86400` for 24h) or drop the field entirely.
!!! info "Rate-limited on creation"
The service rate-limits paste **creation** (not viewing), so it's built for
occasional shares — not bulk or automated posting.