molly0xfff,
@molly0xfff@hachyderm.io avatar

If you want all the gory details on how I migrated my Citation Needed newsletter from to self-hosted here they are:
https://citationneeded.news/substack-to-self-hosted-ghost/

Happy to try to help anyone else making this move!

funcrunch,
@funcrunch@me.dm avatar

@molly0xfff

Shared here and on LinkedIn. I admit to skimming the technical details. 🙂

Also, I had to do a Google Image search to figure out what the preview image had to do with the article:

https://commons.wikimedia.org/wiki/File:Ghost_live_2015.jpg

ETA: Most of the tagged posts I can see here are about , while most posts with that tag on LinkedIn are from people (still) hosting on that platform. Not surprising

molly0xfff,
@molly0xfff@hachyderm.io avatar

@funcrunch FWIW I put the image credits at the very bottom of each post!

thirstybear,
@thirstybear@agilodon.social avatar

@molly0xfff @Tallish_Tom Papa Emeritus will not be happy you have left the flock and self-hosted…. 😉

MohammedSahaf,

@molly0xfff I don't see how you're handling TLS certificate procurement and renewal? 👀

molly0xfff,
@molly0xfff@hachyderm.io avatar

@MohammedSahaf it's all set up out of the box with Ghost and Let's Encrypt! Didn't have to do anything to get it set up.

jwz,
@jwz@mastodon.social avatar

@molly0xfff This is a great writeup! I'm curious if there's a reason you picked Ghost over WordPress? (This is not a trick question, I have no horse in that race.)

sfrazer434,
@sfrazer434@mastodon.social avatar

@jwz @molly0xfff Footnote D on the post said she's not as familiar with PHP and it has a bit feature-bloat for her site.

She also echos your (I think this was you?) concerns about CloudFlare in footnote E and asks for alternative suggestions

luis_in_brief,
@luis_in_brief@social.coop avatar

@sfrazer434 @jwz @molly0xfff I have used WP for about two decades now (oh god) and Ghost for a shade under two years. The constraint of the newsletter form, vs the infinite sprawl of the CMS space that WP-corporate targets, makes Ghost’s editor generally more pleasant to use. I assume that’s the same on the admin side, though these days I’m hosted for both.

molly0xfff,
@molly0xfff@hachyderm.io avatar

@jwz buried in the footnotes: "In fairness, it is possible to self-host WordPress, which is also open-source. It is, however, also written in PHP — a language I am much less comfortable with and enjoy much less than Ghost's JavaScript. WordPress is also quite a bit older, and, in my opinion, somewhat bloated with features I don't and won't need."

ZacBelado,
@ZacBelado@hachyderm.io avatar

@molly0xfff @jwz Bloated is the correct phrase. The writing interface is also fussy and gets in the way

fahrni,
@fahrni@curmudgeon.cafe avatar

@molly0xfff @jwz Molly, didn’t Ghost begin life as a clone of WordPress? I could be misremembering given it’s JavaScript as you point out or they rewrote it as they went along?

Does it produce static HTML or are pages all generated when requested?

molly0xfff,
@molly0xfff@hachyderm.io avatar

@fahrni @jwz hmm, I used it like a decade ago and I remember it being JS then.

It does not produce static HTML.

fahrni,
@fahrni@curmudgeon.cafe avatar

@molly0xfff @jwz Thank you, Molly.

vinski,

@fahrni @molly0xfff @jwz Ghost is (or at least was last time I checked) way more performant than Wordpress. It used to be surprisingly common to see small Wordpress sites “getting Fireballed”, after @gruber linked to them and they received more traffic that they could handle, causing them to crash.

fahrni,
@fahrni@curmudgeon.cafe avatar

@vinski @molly0xfff @jwz @gruber That’s one reason I prefer static publishing. 😃 Plain old HTML is hard to fireball.

thaddeus,
@thaddeus@mastodon.social avatar

@fahrni (removed the others) - my day job has me working in this space a lot, so I thought I'd chime in.

Quite a few folks use static build processes against backends like Ghost (there are LOTS of headless CMS systems these days). They get the benefits of publishing workflows and super robust CMS tooling, but the static files on a simple server that can handle massive load.

It's a good setup if build times are tolerable. For folks coming from instant publishing like Wordpress... 😬

fahrni,
@fahrni@curmudgeon.cafe avatar

@thaddeus Do you have a good resource for static publishing with self hosted Ghost? I’d be curious to set it up and experiment! 🙏🏼

thaddeus,
@thaddeus@mastodon.social avatar

@fahrni Ghost provides some starting points for a handful of popular static generators: https://ghost.org/docs/jamstack/

If you’re using something more custom, you’ll probably need to jump straight to the content API: https://ghost.org/docs/content-api/

fahrni,
@fahrni@curmudgeon.cafe avatar

@thaddeus That’s interesting, very cool! Thank you!

dmakovec,
@dmakovec@theblower.au avatar

@molly0xfff it looks like you might need an addendum! Site down?

molly0xfff,
@molly0xfff@hachyderm.io avatar

@dmakovec hrm, i've seen a couple people noting SSL errors but i've yet to be able to repro

dmakovec,
@dmakovec@theblower.au avatar

@molly0xfff I'm seeing it on desktop Vivaldi and Curl too. Maybe something below will help?

❯ dig citationneeded.news  
...  
citationneeded.news. 40 IN A 172.67.155.170  
citationneeded.news. 40 IN A 104.21.72.231

❯ curl -v <https://citationneeded.news>  
* Trying 172.67.155.170:443...  
* Connected to citationneeded.news (172.67.155.170) port 443 (#0)  
* ALPN: offers h2  
* ALPN: offers http/1.1  
* CAfile: /etc/ssl/cert.pem  
* CApath: none  
* (304) (OUT), TLS handshake, Client hello (1):  
* error:1404B42E:SSL routines:ST_CONNECT:tlsv1 alert protocol version  
* Closing connection 0  
curl: (35) error:1404B42E:SSL routines:ST_CONNECT:tlsv1 alert protocol version  
molly0xfff,
@molly0xfff@hachyderm.io avatar

@dmakovec thank you!

dmakovec,
@dmakovec@theblower.au avatar

@molly0xfff Found this post discussing similar problems with a Cloudflare-fronted site: https://codefetti.com/how-to-fix-tlsv1-alert-protocol-version/ - maybe a TLS 1.3 min version issue?

molly0xfff,
@molly0xfff@hachyderm.io avatar

@dmakovec doesn't seem to be, i've got the default setting of 1.0

sfrazer434,
@sfrazer434@mastodon.social avatar

@molly0xfff @dmakovec
Most likely you're looking at a testing error rather than a cert error? (at least as far as the curl stuff goes)

You can force a specific IP address to test both the results from DNS with this command:

curl -kvsI --resolve citationneeded.news:443:172.67.155.170 https://citationneeded.news/

Both addresses give "* SSL certificate verify ok." for me.

sfrazer434,
@sfrazer434@mastodon.social avatar

@molly0xfff @dmakovec

It could be an outdated version of curl or openssl/LibreSSL. I tested with:
curl 8.4.0 (x86_64-apple-darwin23.0)
libcurl/8.4.0 (SecureTransport)
LibreSSL/3.3.6
zlib/1.2.12
nghttp2/1.55.1
Release-Date: 2023-10-11

sfrazer434,
@sfrazer434@mastodon.social avatar

@molly0xfff @dmakovec

And the latest vivaldi desktop browser (6.5.3206.53) on MacOS works for me as well:

dmakovec,
@dmakovec@theblower.au avatar

@sfrazer434 @molly0xfff whatever problem it was appears to be server-side and intermittent as it started working again on all clients (mobile and desktop) a couple hours ago) 🤷🏼‍♂️

molly0xfff,
@molly0xfff@hachyderm.io avatar

@dmakovec @sfrazer434 a mystery! well, thanks a million for helping me debug, and I'll keep an ear out for any others running into SSL weirdness

dmakovec,
@dmakovec@theblower.au avatar

@molly0xfff Ooo it suddenly worked on my browser, but not curl. Diff seems to be the browser is now hitting 104.21.72.231 (works) whereas Curl is still hitting 172.67.155.170 (doesn't)

molly0xfff,
@molly0xfff@hachyderm.io avatar

@dmakovec when i hit it with curl i get 104.21.72.231 also, and have no issues 🤔

dsfgs,

@molly0xfff
Oh no, still using Cloud(G)lare?! How is that self-hosting?

Do you have a mixnet address that is not CF'd, like an I2P address?

Meyerweb,
@Meyerweb@mastodon.social avatar

@dsfgs See footnote e.

jimcarroll,
@jimcarroll@futurist.info avatar

@molly0xfff "xNext up was email. In order to send bulk emails from Ghost, you need to use Mailgun. Mailgun is actually the priciest part of my setup, at $75/month"

---> Run, don't walk to Sendy -> https://sendy.co

Do what you are using Mailgun but for pennies, via Amazon SES (their bulk email service). I run my newsletter and other things off it; its very straightforward, has a great interface, and ALL the options.

molly0xfff,
@molly0xfff@hachyderm.io avatar

@jimcarroll would need to do a lot of additional work to integrate a separate mailsender — Ghost has built-in Mailgun support and that's it

jimcarroll,
@jimcarroll@futurist.info avatar

@molly0xfff Got it. That's sad; Sendy is a wonderful system. You might explore it just to understand it; might come in useful at some other time.

jimcarroll,
@jimcarroll@futurist.info avatar

@molly0xfff Update - it looks like I can just go straight to Amazon SES. Since I'm already using that and have DMARC setup, I'm going to explore this.

So in the minutes since I've started reading your post, I've spun up an Ubuntu server at Vultr and will give it a go to try a self-hosted Ghost.

Will report back!

https://stackoverflow.com/questions/74680319/how-can-i-use-amazon-ses-with-ghost

markstos,
@markstos@urbanists.social avatar

@jimcarroll @molly0xfff has separate configuration for transaction email and bulk email.

If you want to send out both through Mailgun, you can send the transactional emails out through the Mailgun SMTP interface.

You can send (only) transaction emails out through SES also via SMTP.

The Ghost project is open supporting other providers for bulk email, but first an "adapter" needs to be created that abstracts the details for each provider.

Ghost also uses Mailgun for analytics.

jimcarroll,
@jimcarroll@futurist.info avatar

@markstos @molly0xfff So I can't use SES for bulk? That kills my initiative to do a standalone then. No sense paying Mailgun $$$$ for what I can do for pennies.

markstos,
@markstos@urbanists.social avatar

@jimcarroll @molly0xfff That’s right. I worked on supporting others a couple of years ago and even submitted a code change for it. That didn’t fit their standards and was rejected. https://github.com/TryGhost/Ghost/pull/14984

I didn’t pick it back up because Mailgun has a free plan up to 5,000 emails per month, and I use that.

I also use SES at work and Mailgun is a nicer product to use.

jimcarroll,
@jimcarroll@futurist.info avatar

@markstos @molly0xfff @markstos
@molly0xfff

I've now got a working self-hosted site at https://daily.jimcarroll.com ... managed to get my Substack import working fine. The biggest issue was tuning the server size to accept the import of my file - 897MB.

I'm struggling with the mailgun config though; I'm not familiar with JSON and have tried to run this through a few JSON validators without luck.

@molly0xfff - thanks for your pointer to Ghost - was never really aware of it and I will build out on it now. To build mine - I'm a huge fan of Runcloud.io for server builds - and they had this handy document that made the process all quite straightforward.

https://blog.runcloud.io/ghost/

The nice thing is it configs my server with fail2ban and other hardening, as well as pretty seamless GUI to the rest of the server config.

If anyone can offer up thoughts on my JSON formatting here it would be helpful. This version crashes. (I'm using the basic one for now)

markstos,
@markstos@urbanists.social avatar

@jimcarroll @molly0xfff Here's how my config differs:

  1. Add "logger": true, to options. I guess it adds more logging.
  2. host: "smtp.mailgun.org". Not sure if that makes a difference.
  3. "port": 465, Notice no quotes as well. Not sure if these differences should matter.

If you are getting JSON validation errors, you should post those, it looks OK to me.

jimcarroll,
@jimcarroll@futurist.info avatar

@markstos @molly0xfff I'm less concerned with getting the specifics of the mailgun credentials right for now, and simply getting my JSON right.

https://jsonlint.com

gives me these errors.

I've tried eliminating { etc .. but whatever I'm coming up with causes Ghost to fail to start.

Full JSON:

{
"url": "https://daily.jimcarroll.com",
"server": {
"port": 2368,
"host": "127.0.0.1"
},
"database": {
"client": "mysql",
"connection": {
"host": "127.0.0.1",
"user": "ghost",
"password": "xxxxxx",
"database": "xxxxx"
}
},
"mail": {
"transport": "SMTP",
"options": {
"service": "Mailgun",
"host": "smtp.us.mailgun.org",
"port": "587",
"secure": true,
"auth": {
"user": "xxxxxx",
"pass": "xxxxxx"
}
}
}
"logging": {
"transports": [
"file",
"stdout"
]
},
"process": "systemd",
"paths": {
"contentPath": "/home/ghost/webapps/daily/content"
}
}

markstos,
@markstos@urbanists.social avatar

@jimcarroll @molly0xfff Ah, add a comma before "logging".

jimcarroll,
@jimcarroll@futurist.info avatar

@markstos @molly0xfff We probably need to take @molly0xfff out of this....

(-;

jimcarroll,
@jimcarroll@futurist.info avatar

@molly0xfff This is wildly funny because I'm literally running the migration at the very moment that your post crossed my feed. If all goes well, I'll be at ghost.jimcarroll.com

I started up on ghost two days ago after reading the Platformer story.

I'm wildly small on Substack, but Ghost looks better anyways.

I'll start out on the platform, but after reading your post, might self-host.

molly0xfff,
@molly0xfff@hachyderm.io avatar

@jimcarroll woo! best of luck!

theaitch,

@molly0xfff I am not in the newsletter sending game, I never used Substack, but wow... this is fun to read and provided lots of (geeky) insights moving to Ghost as a publishing platform.
If you want to know about settings up Ghost incl. nitty-bitty details to redirects, payments (via Stripe), Mailgun and a lot more, this one is for you!

ausernamedjosh,

@molly0xfff so what you are saying is, self host from the get go?

molly0xfff,
@molly0xfff@hachyderm.io avatar

@ausernamedjosh ehh, it's hard to confidently say i would have done as well getting off the ground if i had self-hosted from the start

danyork,
@danyork@mastodon.social avatar

@molly0xfff Wow! Thank you for writing that detailed explanation! This is great for anyone moving to Ghost!!

I migrated from Substack over to WordPress back in November… but I don’t have any of the complexity you did! (For example, mine is free so no payment processing or anything.)

offbrands,

@molly0xfff - Read the whole post. Thank you for the detailed ebbs and flows of the migration with sharing so many resources.

I too, am a font nerd. So I was curious about that! I’ve created some Ghost themes for some clients and fonts always give me some issues. If you have any other resources that helped you I would be grateful!

Glad to see you’ve done away with Substack and their blatant disregard to moderate (or lack there of) hate speech. Ghost is great!

molly0xfff,
@molly0xfff@hachyderm.io avatar

@offbrands i didn't have too much trouble with fonts, besides trying to use a variable font and ending up with a very wobbly look on linux. swapped it out with the other version and it resolved the problem

https://hachyderm.io/@buherator@infosec.place/111704720000814451

thenexusofprivacy,

@molly0xfff thanks for sharing! Can I ask what you're doing for footnotes on Ghost? This has been the bane of my Ghostly existence: adding a new footnote requires renumbering, and for the footnote to be linkable it needs to be either an HTML or markdown card (so I can't just cut-and-paste the wysiwyg test).

molly0xfff,
@molly0xfff@hachyderm.io avatar

@thenexusofprivacy it's pretty janky lol. i just write either [-uniqueidimadeup] or [-uniqueidimadeup] in-text depending on whether it's a footnote or a reference, and then i put an accompanying [fn/ref-uniqueidimadeup] at the bottom of the page with the footnote/reference content.

then when i'm about ready to publish, i run a little script to go through and grabs the rich-text, changes it to a HTML card, inserts the footnote, and numbers everything for me.

molly0xfff,
@molly0xfff@hachyderm.io avatar

@thenexusofprivacy i'll put it on github once i've cleaned it up a little

thenexusofprivacy,

@molly0xfff thanks much! janky-but-useful is good!

markwoll,

@molly0xfff Nice to you featured today in the Washington Post story about Substack .

pch,
@pch@s3th.me avatar
markwoll,

@pch @molly0xfff Sorry, I actually subscribe to print. This is a story with the same title.
https://www.washingtonpost.com/technology/2024/01/10/substack-bans-nazis-newsletters-controversy/

aburka,
@aburka@hachyderm.io avatar

@molly0xfff Arrived in my inbox this time, not spam filtered!

molly0xfff,
@molly0xfff@hachyderm.io avatar

@aburka woohoo!

  • All
  • Subscribed
  • Moderated
  • Favorites
  • random
  • everett
  • DreamBathrooms
  • InstantRegret
  • magazineikmin
  • GTA5RPClips
  • khanakhh
  • Youngstown
  • Durango
  • slotface
  • rosin
  • ethstaker
  • kavyap
  • thenastyranch
  • mdbf
  • megavids
  • osvaldo12
  • tester
  • cisconetworking
  • cubers
  • ngwrru68w68
  • normalnudes
  • tacticalgear
  • modclub
  • anitta
  • provamag3
  • Leos
  • JUstTest
  • lostlight
  • All magazines