Am vrut de mult timp să pornesc un blog pierzându-mă în detalii gen "să scriu în română sau în engleză?", "să fie 100% tehnic sau și discuții normale?", "despre ce să scriu prima dată?" sau "ce software să aleg pentru blog?".
A trebuit să încep cu alegerea software-ului care va rula blogul în sine, așa că m-am pus pe căutat și comparat. Criteriile erau destul de simple, să fie FOSS și să fie cât de cât activă dezvoltarea, să nu fiu nevoit să-mi bat capul cu eventuale bug-uri sau migrări către alte soluții.
Aveam de ales între CMS-uri complete gen WordPress, CMS-uri headless pentru care încă nu am găsit (personal) utilitatea și static site generators ca Hugo. WordPress mi se părea de modă veche (cum se uită developerii în ultimul framework de JavaScript la PHP) și am dat peste Ghost, care părea destul de promițător.
Ghost
Din primele impresii Ghost arăta foarte modern și avea și un editor WYSIWYG foarte avansat care mi-ar fi permis să scriu de pe telefon când mai aveam chef și timp, față de un static site generator ca Hugo unde aveam oarecum nevoie de un client de Git ca să public ceva (mai nou realizabil cu terminalul din Android 15). L-am pornit repede cu un Docker compose găsit pe net și chiar mi-a plăcut, așa că am început să-l testez. Am căutat teme, am dezactivat partea de newsletter și abonament (destul de mișto pentru publicații sau bloggeri adevărați), am pus cea mai clișeică descriere și am început să mă gândesc la ce să scriu pentru început.
Cumva entuziasmul ăla de început a trecut repede, cred că îmi place de fapt să caut software nou pentru experiența de "instalat", nu neapărat pentru a-l folosi (aici face excepție mail-ul pe care-l folosesc zilnic). Cu literalmente zero postări făcute public am început să mă gândesc care ar fi strategia de migrat la o altă soluție (ironic, știu). Ghost stochează postările într-o bază de date, deci nu e la fel de versatil ca un static site generator de exemplu, așa că soluțiile de migrare erau puține. Găsisem o unealtă de export în markdown numit ghost-to-md, dar care a avut ultimul commit acum 6 ani, așa că m-am dat bătut (și la căutat soluții de migrare și de pornit un blog).
fx
Sunt abonat de mult la subreddit-ul r/selfhosted, așa că văd des postări despre software dedicat selfhosting-ului, doar că multe nu îmi ridică vreun interes. Până acum câteva zile, când mi-a apărut în feed o postare despre un server de blogging, fx. Nimic ieșit din comun, au mai fost destule care se bazau în general pe SSR, așa că am dat totuși click să văd despre ce e vorba (cel mai probabil eram în pat dimineață, deci altceva mai bun nu aveam de făcut). Din poze arăta decent (nu la nivelul Ghost totuși), dar ce mi-a atras atenția a fost ce a scris developerul fx că a avut că motiv pentru a începe proiectul ăsta.
I wish more people would just host their own website and just write what they want to write. Static sites are great for this, but are hard to learn. You then need to manage the HTML and CSS yourself, which is a lot of trouble. Furthermore, quickly writing down something on your own website is not so easy especially on mobile. X (formerly Twitter) and Mastodon are much easier in comparison. You just type what you want to remember, click "post", and these sites handle the rest.
So that's what I made over at https://github.com/rikhuijzer/fx.
Teoretic motivația a fost fix problema mea cu soluțiile de blogging bazat pe static site generation, și părea că o rezolva într-un mod mult mai frugal decât Ghost.
For now I have focussed primarily on being efficient (read: cheap to host and fast). To do that, the server is written in Rust with a SQLite database. Memory usage is a few MB and the database is backed in, so it should be super easy to self-host. Backups are also easy. As is written in the README, you can setup automatic GitHub backups which sync your changes to GitHub upon each change. The backup job is a simple curl script that takes only a few seconds to run.
Așa că zis și făcut, am încropit repede un compose bazat pe exemplul din repository-ul de pe GitHub:
services:
fx:
image: 'rikhuijzer/fx:0.1'
container_name: 'fx'
environment:
FX_USERNAME: 'john'
FX_DOMAIN: 'example.com'
env_file:
# Contains `FX_PASSWORD="<PASSWORD>"`.
- 'FX_PASSWORD.env'
ports:
- '3000:3000'
volumes:
# Stores the SQLite database.
- './data:/data:rw'
restart: 'unless-stopped'
am adăugat subdomeniul blog.
în entry-urile de DNS în Cloudflare (manual, mă uit în prezent la metode de IaC pentru DNS entries, am dat peste octoDNS ), apoi în Caddyfile (I use Caddy btw) și aia a fost.
Am scris toată postarea asta dintr-o tură, fiind foarte familiar cu Markdown nu am avut nevoie să caut butoane ca pe Ghost și pe viitor nici nu am nevoie să folosesc Git pe telefon ca să fac o postare (poate non tehnică) pe fugă. Până acum e genial și sper să mă motiveze să postez des și de ce nu, poate să învăț Rust ca să contribui la proiect în sine. Momentan i-am dat o stea pe GitHub 😆.
Dacă sunt diacritice lipsă sau în plus dau vina pe site-ul ăsta pe care l-am folosit pentru a converti manual în diacritice (nici nu vreau să învăț să scriu direct cu diacritice, nici nu vreau să folosesc un LLM pentru asta).