-
Îmi era dor de gustul de soc, acel gust pe care îl au unele sucuri și care te duce cu gândul la vară. Așa că atunci când am văzut la Lidl un suc Freeway cu soc și lămâie, l-am luat fără să stau prea mult pe gânduri.
Când am ajuns acasă și am gustat din el, dezamăgirea a fost imediată. Nu avea aroma de care îmi aminteam, nu era plăcut - l-am pus deoparte și nu l-am mai băut.
Ca să nu îl arunc la gunoi, l-am dus a doua zi la serviciu. L-am dus cu gândul că poate îl bea cineva, iar dacă nu, atunci măcar nu l-am aruncat eu.
Și aici începe partea amuzantă.
Dimineața, când colegii au văzut sticla pe masă, reacțiile au venit imediat. „Uite un Freeway, de când nu am mai văzut!„ zicea unul. „Uită-te câte chimicale are!", adăuga altul, uitându-se la lista de ingrediente cu o grimasă serioasă pe față.
Stăteam și mă uitam la ei cum se miră de suc și de ingredientele lui, dar nu am spus nimic.
După-amiază i-am văzut pe aceiași colegi bând Coca-Cola sau Pepsi. Fără nicio listă de ingrediente citită, fără niciun comentariu, doar liniște.
Mi-a venit să râd și să le spun ceva, dar m-am abținut pentru că nu merita să le spun că toate sucurile sunt la fel - pline de chimicale, că diferă doar brandul de pe sticlă.
După câteva minute, din vorbă în vorbă, le-am spus că eu am dus sucul, că nu mi-a plăcut și l-am adus pentru cine dorește să îl bea.
Atunci s-a trezit un coleg mai „deștept" și a zis că l-am dus să îl bea proștii.
I-am răspuns calm: „Am adus sucul pentru cine vrea să îl bea. Nu consider pe nimeni prost." Și am plecat.
Uneori cel mai bun răspuns la prostie nu e o dezbatere lungă — e o frază scurtă și un pas spre ieșire.
-
Probabil ai auzit de Matrix și te întrebi ce este, sau poate cineva ți-a trimis un link de invitație și nu știai ce să faci cu el. O să încerc să explic totul cât mai simplu.
Ce este Matrix
Matrix este un protocol deschis de comunicare în timp real. Gândește-te la el ca la e-mail, dar pentru mesagerie instantanee: la fel cum poți trimite un e-mail de pe Gmail către cineva cu cont pe Yahoo sau Outlook, cu Matrix poți trimite mesaje între servere diferite, indiferent de cine le găzduiește.
Nu este o aplicație în sine, ci un standard/protocol - un set de reguli pe care serverele și clienții le respectă ca să poată comunica între ele. Oricine poate rula propriul server Matrix și să facă parte din aceeași rețea globală. Asta se numește federație.
Conversațiile pot fi 1-la-1, grupuri sau camere publice. Există suport pentru mesaje text, fișiere, imagini, apeluri audio și video. Toate mesajele sunt criptate end-to-end implicit, deci nimeni în afară de participanți nu le poate citi - nici măcar administratorul serverului.
Cum funcționează
Rețeaua Matrix este formată din multe servere independente, numite homeserver-e. Fiecare utilizator are un cont pe un homeserver și o identitate de forma
@utilizator:server.ro. Camerele de chat există pe un server, dar utilizatori de pe orice alt server pot intra în ele fără probleme.De exemplu, dacă am contul
@thinkroot:linuxromania.roși vreau să vorbesc cu cineva care are contul pematrix.org, nu există nicio barieră - conversația funcționează direct, fără să fie nevoie ca amândoi să fim pe același server.Cum îl accesezi
Ai nevoie de două lucruri: un cont și un client.
Contul îl poți crea pe orice server public. Cel mai cunoscut este matrix.org, dar există și altele. Dacă faci parte dintr-o comunitate care și-a ridicat propriul server - cum este linuxromania.ro - poți crea contul acolo.
Clientul este aplicația prin care interacționezi cu rețeaua. Câteva opțiuni populare:
- Element - cel mai cunoscut, disponibil pe web, desktop (Windows, Linux, macOS) și mobil (Android, iOS). Îl găsești la element.io.
- Cinny - interfață mai curată, bună dacă ești obișnuit cu Discord.
- FluffyChat - simplu și prietenos, bun pe mobil.
- Nheko - client nativ pentru desktop, mai ușor decât Element.
Poți folosi orice client, cu orice cont, pe orice server. Asta este unul dintre avantajele principale față de platformele clasice.
De ce contează
Majoritatea platformelor de mesagerie pe care le folosim zilnic - WhatsApp, Telegram, Discord - sunt sisteme centralizate. Asta înseamnă că toată comunicarea trece printr-un singur punct de control, deținut de o companie privată. Dacă acea companie decide să îți închidă contul, să schimbe termenii serviciului, să vândă datele tale sau pur și simplu să dea faliment, nu ai nicio alternativă. Pierzi totul.
Matrix funcționează diferit. Nu există o companie centrală care controlează rețeaua. Dacă serverul tău dispare, îți muți contul pe altul și continui. Dacă nu ai încredere în nimeni altcineva, îți ridici propriul server - lucru perfect fezabil chiar și pe hardware modest.
Criptarea end-to-end este activă implicit pentru conversațiile private. Metadatele sunt și ele mai greu de exploatat față de serviciile comerciale, tocmai pentru că nu există un punct central de colectare.
Un alt aspect important este interoperabilitatea. Uniunea Europeană a adoptat Digital Markets Act, care obligă marile platforme de mesagerie să permită comunicarea cu servicii externe. Matrix este deja poziționat ca una dintre soluțiile tehnice care pot face asta posibil.
Limitări reale
Nu vreau să par că Matrix este perfect, pentru că nu este.
Sincronizarea istoricului de mesaje între dispozitive poate fi lentă. Verificarea cheilor de criptare între dispozitive poate fi confuză pentru utilizatorii noi. Serverul oficial, matrix.org, a avut periodic probleme de performanță din cauza numărului mare de utilizatori.
Și, cel mai important aspect practic: Matrix este util doar dacă și cei cu care vrei să comunici sunt acolo. Schimbarea platformei de mesagerie este mai grea decât schimbarea unui browser, pentru că implică și celelalte persoane.
Concluzie
Matrix nu este un înlocuitor perfect pentru orice platformă de mesagerie, dar este singura soluție matură, open-source și federată disponibilă acum pentru comunicare în timp real. Dacă îți pasă cât de cât de cine îți controlează comunicațiile, merită să îi dai o șansă.
Dacă vrei să începi, cel mai simplu este să-ți faci un cont pe matrix.org sau pe server-ul Românesc chat.linuxromania.ro și să descarci Element. De acolo poți explora singur.
-
Am petrecut o bună parte din zi lucrând la HomeLab-ul meu și m-am ales cu câteva lucruri rezolvate pe care le tot amânam.
Am început cu Portainer. Până acum gestionam toate containerele Docker exclusiv din terminal, ceea ce funcționează bine, dar uneori ai nevoie să arunci rapid un ochi la starea serviciilor fără să te conectezi prin SSH. Am instalat Portainer CE pe NUC folosind Docker Compose, consistent cu restul serviciilor pe care le am în
/opt/services/.Tot pe NUC am instalat și n8n, un tool de automatizare cu interfață vizuală. L-am pus în spatele Caddy cu Tailscale, accesibil la
thinkserver.tailxxxx.ts.net/5443. N8n are nevoie de câteva variabile de mediu ca să știe că rulează sub un subpath, altfel linkurile din interfață se strică.Seara m-am apucat de pagina de start personalizată pe care o am pe serverul web. Voiam de mult să scot parola și să mut serviciile self-hosted pe o adresă separată, greu de ghicit. Am creat un fișier
.phpcu headerX-Robots-Tag: noindexși meta noindex, unde am mutat secțiunea cu serviciile. Pagina principală a rămas publică și curată.Tot la pagina asta am prins un bug: după ce am șters secțiunea cu IP-urile locale, statusul serviciilor nu mai apărea deloc. Problema era că funcția
renderIPs()rămăsese apelată în cod, darLOCAL_IPSnu mai era definit nicăieri. Asta arunca unReferenceErrorcare oprea execuția JavaScript înainte să ajungă larenderStatus(). Am scos funcția și apelul ei și a mers din prima.Am adăugat și serviciile de pe PC-ul meu (
rootlinux) în Uptime Kuma, care rulează pe NUC. Le-am monitorizat prin IP-ul PC-ului. Am configurat și badge-uri live în pagina de start, cu atributeledata-monitorcare trebuie să coincidă exact cu numele din Kuma - în cazul meuInvidious - PCșiScrutiny - PC.Nu a fost o zi cu un singur proiect mare, ci mai degrabă un sprint de lucruri mici care se adunaseră. Acum totul e la locul lui.
-
Nu orice loc de muncă poate fi înlocuit de AI și mulți antreprenori sau CEO nu înțeleg acest lucru, ei văd doar un ban în plus în buzunar atunci când adopta AI.
AI este foarte bun atunci când un om se folosește de el, dar când omul este înlocuit - nu mai este așa de bun, dar depinde și unde este implementat.
-
Am serviciile self-hosted de care am mai vorbit în alte articole, dar nu aveam niciun backup. Dacă se strica ceva - un disk, o actualizare proastă, o greșeală - pierd tot: bookmark-urile, feed-urile RSS, documentele din Paperless, parolele din Vaultwarden. Nu era o situație acceptabilă.
Aveam nevoie de un sistem care să facă backup automat, să cripteze datele înainte să le trimită în cloud și să nu necesite intervenție manuală. Am ajuns la o soluție care combină un script bash, GPG pentru criptare și rclone pentru upload în MEGA.
Ce trebuie salvat
Serviciile Docker stochează datele în două moduri: volume Docker (pentru SQLite și fișiere uplodate) și o bază de date PostgreSQL (Domain Locker). Pe lângă date, am inclus în backup și fișierele
docker-compose.ymldin/opt/services/- dacă trebuie să reconstruiesc serverul de la zero, am nevoie și de configurații, nu doar de date.Lista completă: volumele Docker pentru Vaultwarden, FreshRSS, Wallabag, Linkding, Paperless-ngx, Scrutiny și Booktracker, dump PostgreSQL pentru Domain Locker și toate fișierele
docker-compose.yml.Cum funcționează
Scriptul face trei lucruri în ordine: copiază volumele și face dump la PostgreSQL într-un director temporar, arhivează totul într-un
.tar.gzși criptează cu GPG, apoi uploadează în MEGA prin rclone și șterge fișierele temporare locale. La final păstrează doar ultimele 4 backup-uri în cloud.Criptarea cu GPG
Am generat o cheie GPG dedicată pentru backup:
gpg --full-generate-keyScriptul criptează arhiva cu această cheie înainte de upload. Cheia privată am exportat-o în altă parte, criptată cu o parolă separată - fără ea arhivele nu pot fi decriptate.
gpg --recipient "email@exemplu.com" \ --output backup.tar.gz.gpg \ --encrypt backup.tar.gzConfigurarea rclone pentru MEGA
rclone suportă MEGA nativ și configurarea se face o singură dată:
rclone configLa întrebările fișate am răspuns astfel:
npentru remote nou, numele remote-ului (ex. mega),megaca tip de storage, email și parolă cont MEGA, iar la restul întrebărilor răspunsul este opțional - am datEnterla sfârșit.Automatizarea cu cron
Backup-ul rulează în fiecare duminică la ora 4 noaptea - nu a fost nevoie să dau restart după salvarea crontab-ului:
0 4 * * 0 /opt/scripts/backup.shRestaurarea
gpg --decrypt backup.tar.gz.gpg | tar -xzf - -C /opt/restore/Am testat restaurarea înainte să consider sistemul funcțional.
Dacă vrei să folosești scriptul
Scriptul e adaptat la structura serverului meu, deci câteva lucruri trebuie modificate:
SERVICES_DIR,GPG_RECIPIENT,RCLONE_REMOTE,KEEP_BACKUPS, numele containerelor și al bazei de date PostgreSQL. Înlocuiește și toate aparițiile numelui serverului cu numele tău (search & replace). Volumele pot fi în locuri diferite - verifică cudocker volume ls.Scriptul este disponibil pe Codeberg.
-
Am montat un Intel NUC ca server și am instalat serviciile self-hosted pe el, totul mergea perfect - dar doar atâta timp cât eram acasă, în rețeaua locală.
Soluția clasică pentru această problemă este să deschizi porturi în router și să expui serviciile direct pe internet. Am refuzat această variantă pentru că un port deschis înseamnă că oricine de pe glob poate bate la ușa serverului. Poate nu intră, dar încearcă - și nu vreau să risc astfel.
Soluția pe care am ales-o se numește Tailscale.
Ce este Tailscale?
Tailscale este un VPN de tip mesh, construit pe baza protocolului WireGuard. Spre deosebire de un VPN tradițional, care trimite tot traficul printr-un server central, Tailscale conectează dispozitivele direct între ele, peer-to-peer. Serverele Tailscale servesc doar ca „ghid de întâlnire" - ajută dispozitivele să se găsească și să facă schimb de chei criptografice, dar nu văd niciodată traficul propriu-zis.
Rezultatul practic: serverul de acasă și telefonul meu se comportă ca și cum ar fi în aceeași rețea locală, indiferent unde se află fizic. Serverul nu este expus pe internet. Nu există niciun port deschis în router. Traficul dintre ele este criptat end-to-end cu WireGuard.
Planul gratuit include până la 100 de dispozitive pentru un singur utilizator, MagicDNS și certificate HTTPS automate - mai mult decât suficient pentru un server mic.
Instalarea pe server
Instalarea lui Tailscale se face cu o singură comandă:
curl -fsSL https://tailscale.com/install.sh | shScriptul adaugă depozitul oficial APT al Tailscale și instalează pachetul. După instalare, pornești Tailscale:
sudo tailscale upComanda generează un link de autentificare pe care îl deschizi în browser pe orice alt dispozitiv. Te loghezi în contul Tailscale și serverul apare automat în rețeaua ta.
Verifici că totul e în regulă cu comenzile:
tailscale status tailscale ipVei vedea adresa IP din rețeaua Tailscale - ceva de genul
100.x.x.x- și hostname-ul cu care apare serverul în panoul de administrare.MagicDNS - fără adrese IP de memorat
Odată conectat, serverul primește o adresă IP din rețeaua Tailscale din intervalul
100.x.x.x. Adresa aceasta este permanentă și nu se schimbă niciodată, indiferent de ISP sau locație.MagicDNS este activat implicit în panoul de administrare. Dacă nu e, îl activezi din secțiunea DNS. Din acel moment, serverul este accesibil prin
nume_server.tailxxxx.ts.net- un nume, nu un număr (chiar dacă este mai lung). MagicDNS funcționează automat pentru toate dispozitivele din rețeaua Tailscale.Tot din panoul de administrare am activat și HTTPS Certificates - această opțiune permite generarea de certificate SSL valide pentru dispozitivele din rețeaua Tailscale, semnate de Let's Encrypt.
HTTPS pentru Vaultwarden cu Caddy
Cel mai important motiv pentru care am vrut HTTPS nu a fost paranoie, ci necesitate practică. Vaultwarden - serverul meu de gestionare a parolelor, compatibil cu clienții Bitwarden - refuză să funcționeze cu extensia de browser fără HTTPS. Extensia pur și simplu nu se conectează la un server HTTP, indiferent ce setezi.
Primul pas este să generezi certificatul SSL pentru domeniul tău Tailscale. Comanda următoare o rulezi pe server:
sudo tailscale cert nume_server.tailxxxx.ts.netComanda scrie două fișiere în directorul curent:
nume_kserver.tailxxxxx.ts.net.crt(certificatul public) șinume_server.tailxxxx.ts.net.key(cheia privată). Le-am mutat apoi într-un director dedicat pentru Caddy:sudo mkdir -p /opt/services/caddy/certs sudo mv nume_server.tailxxxxxx.ts.net.crt /opt/services/caddy/certs/ sudo mv nume_server.tailxxx.ts.net.key /opt/services/caddy/certs/ sudo chown -R thinkroot:thinkroot /opt/services/caddyAm ales Caddy ca reverse proxy în locul lui Nginx pentru că este considerabil mai simplu de configurat pentru această situație. Fișierul de configurare,
Caddyfile, arată așa:nume_server.tailxxxx.ts.net { tls /certs/nume_server.tailxxxxx.ts.net.crt /certs/thinkserver.tailxxx.ts.net.key reverse_proxy vaultwarden:80 }Un singur bloc, trei linii. Caddy termină SSL-ul și trimite traficul mai departe la containerul Vaultwarden. Containerul Vaultwarden rulează în Docker, în aceeași rețea cu Caddy:
services: vaultwarden: image: vaultwarden/server:latest container_name: vaultwarden restart: unless-stopped ports: - "8222:80" volumes: - vaultwarden_data:/data environment: DOMAIN: "https://nume_server.tailxxxx.ts.net" SIGNUPS_ALLOWED: "false" volumes: vaultwarden_data:Caddy rulează și el în Docker, în același director, cu volumul de certificate montat:
services: caddy: image: caddy:latest container_name: caddy restart: unless-stopped ports: - "80:80" - "443:443" volumes: - ./Caddyfile:/etc/caddy/Caddyfile - ./certs:/certs networks: - vaultwarden_default networks: vaultwarden_default: external: trueRețeaua
vaultwarden_defaulteste creată de containerul Vaultwarden - Caddy se alătură aceleiași rețele ca să poată ajunge la el prin numelevaultwarden.Celelalte servicii
Celelalte servicii de pe NUC nu au nevoie de HTTPS pentru că nu există niciun client care să le impună asta. Le accesez direct prin IP-ul Tailscale al serverului și portul fiecăruia, de pe orice dispozitiv conectat la rețeaua Tailscale. Funcționează la fel de bine din rețeaua de acasă ca și de pe date mobile - singura diferență e că trece prin Tailscale când sunt în afara casei.
Nginx am luat în calcul la un moment dat pentru a pune serviciile sub un singur domeniu, dar am decis că IP:port funcționează perfect pentru uz personal și complexitatea suplimentară nu aduce niciun beneficiu real.
Cum arată în practică
De pe telefon, cu date mobile, deschid Vaultwarden la
https://nume_server.tailxxx.ts.netdirect în browser. Certificatul e valid, conexiunea e criptată, extensia Bitwarden se conectează fără probleme. FreshRSS și celelalte le accesez prin adresa IP Tailscale a serverului și portul respectiv.De pe laptopul, același lucru. Tailscale rulează în fundal, serverul apare ca și cum ar fi în rețeaua locală.
Serverul în sine nu are niciun port deschis în router. Routerul nu știe nimic despre Tailscale - tot ce face Tailscale se stabilește dinăuntru spre afară, nu are nevoie de port forwarding. NAT traversal-ul este automat.
Concluzie
Tailscale a rezolvat exact problema pe care o aveam: acces la serverul de acasă de oriunde, fără să expun nimic pe internet. Instalarea a durat câteva minute. Configurarea HTTPS pentru Vaultwarden cu Caddy a mai adăugat poate douăzeci de minute. Comparativ cu alternativele - VPN tradițional cu server dedicat, port forwarding, certificate manuale - diferența de complexitate este enormă.
Dacă ai un server de acasă sau un Raspberry Pi cu servicii self-hosted și vrei să le accesezi din exterior fără să-ți faci griji pentru securitate, Tailscale este probabil cel mai simplu drum spre acel obiectiv.
-
Parlamentul a amânat iar votul pentru Avocatul Poporului. Mandatul Renatei Weber a expirat în iunie 2024 și de atunci funcția e goală, dar politicienii sunt ocupați să negocieze între ei cine ia postul.
USR propune pe cineva. PSD zice nu, că candidata are pensie specială. Altul cere să se întâmple „săptămâna asta". Între timp, cetățeanul de rând, cel pe care Avocatul Poporului ar trebui să-l reprezinte, nu e întrebat nimic.
Și asta e problema de fond.
Avocatul Poporului există, teoretic, ca să te apere pe tine de abuzurile statului. E instituția la care te duci când o primărie te ignoră, când o administrație îți calcă drepturile, când nimeni altcineva nu te ascultă. E vocea cetățeanului în fața sistemului.
Dar cine îl alege? Parlamentul. Adică fix oamenii care reprezintă statul pe care Avocatul Poporului ar trebui să-l controleze. E un pic ca și cum ai lăsa hoțul să aleagă paznicul.
Rezultatul e predictibil: funcția devine monedă de schimb politic. Se negociază între partide ca un scaun de consiliu de administrație. Nu contează cât de competent e candidatul, contează cui îi convine.
Soluția mi se pare simplă, chiar dacă naivă: alege-l prin vot direct. Lasă oamenii să voteze pentru Avocatul Poporului la fel cum votează pentru Președinte. Ar fi singurul om din sistemul ăsta care chiar și-ar datora funcția cetățenilor, nu colegilor de partid.
Evident, nu se va întâmpla. Pentru că unui parlament nu-i convine să cedeze controlul. Dar măcar să știm cu toții despre ce vorbim când auzim că „democrația funcționează".
-
De ceva timp, autoritățile din multe țări încearcă să controleze tot mai mult serviciile online și să supravegheze oamenii prin legi noi. Reacțiile nu au întârziat să apară - companii, utilizatori și organizații din multe colțuri ale lumii au început să protesteze, să modifice legile sau chiar să le blocheze complet. Lucrurile se mișcă, oamenii reacționează.
Dar în România? Altă poveste.
Aici, dacă un politician vrea să dea o lege prin care interzice Facebook mâine dimineață, o poate face liniștit. Populația nu face nimic. Nu protestează, nu se interesează, nu pune întrebări. Pur și simplu nu are treabă.
Și asta se vede cel mai bine în modul în care românii se raportează la confidențialitate.
De ani de zile știm cu toții că Meta, Google, Microsoft, Discord, X și multe altele colectează absolut tot ce pot despre noi. Te urmăresc non-stop - ce cauți, ce cumperi, cu cine vorbești, unde ești. Acum au început să facă același lucru și companiile din China. Nu e teorie, nu e conspirație - sunt dovezi clare, sunt amenzi date, sunt audieri în parlamente.
Între timp, în alte țări oamenii au început să migreze spre servicii și aplicații care le respectă confidențialitatea și securitatea. Mișcarea există, crește, se vede.
Românul? „Nu am nimic de ascuns."
E vorba lui preferată. Și e și cea mai comodă, pentru că nu îl obligă să facă absolut nimic. Dar e și cea mai contradictorie - același om care zice asta devine brusc foarte deranjat dacă îi ceri parola de email sau cheia de la casă. Atunci are ceva de ascuns. Atunci înțelege că intimitatea contează.
Nu îi bag pe toți în același sac. Dar sincer, 90% dintre oamenii cu care am discutat despre asta au scos exact aceeași vorbă.
Recent, împreună cu o echipă mică de trei oameni, am lansat un forum și un server de Matrix - alternative reale, care pun confidențialitatea pe primul loc. Foarte puțini s-au alăturat. Oamenii preferă în continuare Discord, Facebook și restul, chiar dacă știu, undeva în spate, că plătesc cu datele lor.
Poate că într-o zi lucrurile se vor schimba. Până atunci, „nu am nimic de ascuns" rămâne cel mai bun scut împotriva oricărei conversații serioase despre securitate și confidențialitate online.
-
În articolul anterior am documentat cum am mutat serviciile self-hosted de pe Linux Mint pe un Intel NUC cu Ubuntu Server. La final, Vaultwarden mergea deja prin HTTPS via Tailscale și Caddy, dar celelalte șapte servicii - FreshRSS, Wallabag, Linkding, Booktracker, Paperless-ngx, Domain Locker și Scrutiny - rămăseseră accesibile doar în rețeaua locală.
Voiam să le accesez de pe orice dispozitiv, fără să fiu legat de rețeaua de acasă. Așa că am făcut următorii pași:
Pasul 1 - Crearea unei rețele Docker comune
Caddy ajungea la Vaultwarden prin numele containerului (
vaultwarden:80) pentru că erau în aceeași rețea Docker. Celelalte servicii rulau în stacks separate, deci Caddy nu le vedea deloc. Soluția a fost să creez o rețea externă comună:docker network create caddy-proxyApoi am editat fiecare
docker-compose.ymlsă includă rețeaua. De exemplu pentru FreshRSS:services: freshrss: ... networks: - caddy-proxy networks: caddy-proxy: external: trueAm făcut același lucru pentru wallabag, linkding, booktracker, paperless, domain-locker și scrutiny, apoi am repornit fiecare stack:
for svc in freshrss wallabag linkding booktracker paperless domain-locker scrutiny; do cd /opt/services/$svc && docker compose up -d donePasul 2 - Actualizarea docker-compose.yml al Caddy
Caddy trebuia să fie în ambele rețele și să expună porturile noi. Am editat
/opt/services/caddy/docker-compose.yml:services: caddy: image: caddy:latest container_name: caddy restart: unless-stopped ports: - "80:80" - "443:443" - "8443:8443" - "6543:6543" - "9443:9443" - "2443:2443" - "8019:8019" - "3443:3443" - "8889:8889" volumes: - ./Caddyfile:/etc/caddy/Caddyfile - ./certs:/certs - caddy_data:/data - caddy_config:/config networks: - vaultwarden_default - caddy-proxy volumes: caddy_data: caddy_config: networks: vaultwarden_default: external: true caddy-proxy: external: trueCâteva observații despre porturi: portul 8010 era deja ocupat de Paperless pe host, iar 8888 de Scrutiny, deci am ales 8019 și 8889 ca să evit conflictele.
Pasul 3 - Configurarea Caddyfile
Certificatul existent de la Tailscale era valabil doar pentru hostname-ul exact
thinkserver.tailxxxx.ts.net, fără subdomenii. Soluția a fost să folosesc porturi diferite pentru fiecare serviciu, toate cu același certificat. Am editat/opt/services/caddy/Caddyfile:thinkserver.tailxxxx.ts.net { tls /certs/thinkserver.tailxxxx.ts.net.crt /certs/thinkserver.tailxxxx.ts.net.key reverse_proxy vaultwarden:80 } thinkserver.tailxxxx.ts.net:8443 { tls /certs/thinkserver.tailxxxx.ts.net.crt /certs/thinkserver.tailxxxx.ts.net.key reverse_proxy freshrss:80 } thinkserver.tailxxxx.ts.net:6543 { tls /certs/thinkserver.tailxxxx.ts.net.crt /certs/thinkserver.tailxxxx.ts.net.key reverse_proxy wallabag:80 } thinkserver.tailxxxx.ts.net:9443 { tls /certs/thinkserver.tailxxxx.ts.net.crt /certs/thinkserver.tailxxxx.ts.net.key reverse_proxy linkding:9090 } thinkserver.tailxxxx.ts.net:2443 { tls /certs/thinkserver.tailxxxx.ts.net.crt /certs/thinkserver.tailxxxx.ts.net.key reverse_proxy booktracker:5000 } thinkserver.tailxxxx.ts.net:8019 { tls /certs/thinkserver.tailxxxx.ts.net.crt /certs/thinkserver.tailxxxx.ts.net.key reverse_proxy paperless:8000 } thinkserver.tailxxxx.ts.net:3443 { tls /certs/thinkserver.tailxxxx.ts.net.crt /certs/thinkserver.tailxxxx.ts.net.key reverse_proxy domain-locker-app:3000 } thinkserver.tailxxxx.ts.net:8889 { tls /certs/thinkserver.tailxxxx.ts.net.crt /certs/thinkserver.tailxxxx.ts.net.key reverse_proxy scrutiny:8080 }Un detaliu important: în
reverse_proxytrebuie folosit numele containerului, nu cel al serviciului din Compose. De exemplu, Domain Locker are containeruldomain-locker-app, nudomain-locker. L-am verificat cu:grep "container_name" /opt/services/*/docker-compose.ymlPorturile din
reverse_proxysunt cele interne ale containerului, nu cele de pe host. Le-am verificat cu:grep -A3 "ports:" /opt/services/*/docker-compose.ymlPasul 4 - Pornirea Caddy și reîncărcarea configurației
cd /opt/services/caddy && docker compose up -d docker exec caddy caddy reload --config /etc/caddy/CaddyfilePasul 5 - Wallabag: actualizarea domeniului
Wallabag generează URL-uri absolute pentru CSS și JavaScript pe baza variabilei
SYMFONY__ENV__DOMAIN_NAME. Era setată pe IP-ul local vechi, ceea ce făcea ca grafica să nu se încarce când accesam din afara rețelei. Am actualizat în/opt/services/wallabag/docker-compose.yml:environment: - SYMFONY__ENV__DOMAIN_NAME=https://thinkserver.tailxxxx.ts.net:6543Apoi:
cd /opt/services/wallabag && docker compose up -dRezultatul final
Toate serviciile sunt acum accesibile prin HTTPS de pe orice dispozitiv cu Tailscale conectat.
-
Ce s-ar întâmpla dacă prietenii și-ar trata prietenii la fel de frumos precum își tratează câinii.
de Dave Winer
