I wanted to put together a fairly simple informational site for promoting my services, just a few editable pages and a blog/posts facility for those times when something is interesting enough to share.
Ghost for a headless CMS
Nuxt for the frontend
A headless CMS was the right solution for managing the content, and Nuxt was how I would build the frontend. While Wordpress can be used as reasonable headless CMS, the maintenance and constant security threats are such that I've been bitten many times and am now shy. Contentful has a powerful data type system and is really powerful, but it's overkill for what I need. Netlify looks pretty good too, but if I want to have any collaborators, the ramp-up in pricing isn't really worth it for my modest needs. Ghost had been on my radar for a while, is battle-tested, is open-source and has a bare bones approach suited to my requirements. The Ghost team have also moved to accommadate "JAMstack" practices by offering API endpoints for pages, posts, etc. Testing it out locally was impressively quick and easy so I thought I'd try and use it in anger.
I like Vue and I think server-side rendering is the way to go. Vue's single file components are also a really nice way to follow the Pages pattern used in Nuxt, possibly moreso than React components suit the near-identical Pages pattern in Next. Generally Vue is, as the name suggest, view-oriented, and it feels nice for this kind of thing, though in general Vue is the most developer-friendly option for most frontend dev, for my style of working at least.
Things that might catch you out:
- ghost needs node version no higher than 12
- Scaleway doesn't come with sudo by default, needs to be installed, manual edit sudoers was required
- installing before having a (sub)domain set up was easy, but trying to get ssl set up with the chosen (sub)domain name later on stumped me. After a few hours of struggle, I just wiped ghost, reinstalled nginx, and ran ghost install again - the database stuff was all still there so I didn't lose any content. Running ghost install with the subdomain ready, things ran like clockwork.