Terminal sesije
ttyd + tmux na kimiai (.64 / 100.64.0.4) — perzistentni terminali u browseru, sa telefona i sa kompa.
Rute:
/main/ (komp, root redirectuje ovde) ·
/mobile/ (telefon, linked na main) ·
/test/ (odvojena sesija) ·
code-server.
Nema login-a — tailnet je granica autentifikacije.
Tri moda rada
| Mod | Kako se dobija | Ponašanje |
| Shared screen |
dva klijenta otvore istu rutu (npr. oba /main/) |
Identičan ekran, isti prozor, ista veličina. Pair programming. |
| Linked |
ttyd-session-ctl link main mobile |
Ista tmux grupa — deli prozore i procese, ali svaki klijent bira svoj prozor i taj prozor ima svoju veličinu. |
| Odvojena |
ttyd-session-ctl add work |
Potpuno nezavisna tmux sesija — ništa se ne deli (kao main vs test). |
Šta se deli, a šta ne (linked mod)
| Stvar | Deljeno? | Objašnjenje |
| Procesi, prozori, clipboard | DA | To je i smisao linka — ista tmux grupa. |
| Koji prozor gledaš | NE | Svaka sesija ima svoj trenutni prozor; pamti se i posle odkačinjanja. |
| Veličina prozora koji gledaš sam | NE | Prilagođava se tvom klijentu. |
| Veličina prozora koji gledate zajedno | DA | Mora — vidi objašnjenje ispod. |
Zašto isti prozor mora izgledati identično svima. Svaki pane je jedan pty, a pty ima
tačno jednu veličinu (rows/cols, kernelski atribut preko TIOCSWINSZ).
Program u njemu — shell, vim, htop — crta za tu veličinu i emituje jedan bajt-stream; tmux ga samo
prosleđuje svim gledaocima. Da bi dva klijenta videla isti program u dve širine, program bi morao da se
iscrta dvaput, a on ni ne zna da ima više gledalaca. Za čist tekst bi soft-wrap po klijentu bio zamisliv,
ali tmux čuva grid i scrollback već prelomljen na širini prozora — pa i istorija pripada toj jednoj veličini.
Praktično: drži telefon na svom prozoru, komp na svom. Na isti prozor pređi samo kad hoćeš
da gledate isto (pair programming, ili da sa telefona vidiš šta se vrti na kompu).
Komande — upravljanje sesijama
ttyd-session-ctl add <name> # nova odvojena sesija na /<name>/
ttyd-session-ctl link <target> <name> # linked pogled na postojeću sesiju
ttyd-session-ctl remove <name> # ukloni rutu (tmux sesija ostaje!)
ttyd-session-ctl list # prikaži sve sesije, portove i status
Port se dodeljuje automatski od baze 7681. Nakon add/link ne treba
ništa ručno — nginx blok, systemd unit i reload idu sami.
tmux — samo ono što treba svaki dan
| Prečica | Radnja |
Ctrl+b c | Novi prozor (pojavi se i u drugoj sesiji iz grupe) |
Ctrl+b n / p | Sledeći / prethodni prozor — pomera samo tvog klijenta |
Ctrl+b 0…9 | Skoči na prozor po broju |
Ctrl+b w | Lista prozora za izbor |
Ctrl+b d | Detach (sesija i procesi ostaju da rade) |
Ctrl+b [ | Scroll/copy mod — izlaz sa q |
Zamke (naučeno na teži način)
- Ne koristiti
tmux new-session -A -s <ime> -t <target>.
-A čini da se new-session ponaša kao attach-session kad
<ime> već postoji — a tada -t znači „sesija na koju se kačiš”
(dakle target!), ne „grupiši sa”. Posledica: svaka konekcija posle prve završi na target sesiji
i dobiješ shared screen umesto linked moda. Ispravno je
has-session → attach-session -t "=<ime>", inače
new-session -s <ime> -t <target>.
aggressive-resize je preduslov za nezavisan resize. Sa off (default)
tmux prozor dimenzionira prema svim sesijama kojima pripada — a kod grupisanih sesija to su sve,
uključujući i one bez ijednog klijenta. Jedna prazna detached sesija ume da zaključa prozor na
npr. 74×31 dok su klijenti 272 i 237. Stoji u ~/.tmux.conf:
setw -g aggressive-resize on. window-size ostaje latest —
skaliranje je i dalje automatsko, ništa nije fiksirano.
- Stari
ttyd-hub.service krade port 7681. Ako /main/ vraća 404, proveri
systemctl status ttyd-session@main — ume da bude u restart petlji sa
lws_socket_bind: ERROR ... port 7681. Podmuklo je jer je ttyd-hub
disabled, a i dalje radi. Rešenje: sudo systemctl stop ttyd-hub.service.
- Root
/ nije 404 slučajno — na :443 nema location / osim
redirecta na /main/. Ako je /main/ pao, i root izgleda kao 404.
Gde šta živi (na .64)
| Putanja | Šta je |
/usr/local/bin/ttyd-session-ctl | alat za sesije (add/link/remove/list) |
/usr/local/bin/tmux-session.sh | wrapper koji ttyd zove pri konekciji; čita LINK_TO |
/etc/ttyd-sessions/<name>.conf | EnvironmentFile: PORT=, opciono LINK_TO= |
/etc/systemd/system/ttyd-session@.service | systemd template (User=kimi) |
/etc/nginx/ttyd-sessions/<name>.conf | per-session nginx location |
/etc/nginx/sites-available/hub.conf | :443 → ttyd sesije, :8443 → code-server |
/var/www/hub/keyboard.js | mobilna tastatura + per-device font size |
Puna dokumentacija (arhitektura, keyboard.js, sertifikati, rationale):
INFO_BANK/projects/terminal-sessions/ — README.md,
TMUX_PRECICE.md, TROUBLESHOOTING.md.