DEV Community

Faktoskop.pl
Faktoskop.pl

Posted on

Self-hosting a social publishing stack: what actually broke


I set up a self-hosted scheduler to publish a 30-day content campaign across eleven platforms. Around 700 posts, three slots a day, images on most of them.

The software worked. Nearly everything that broke was at the boundary between the software and the platforms it publishes to, and almost none of it produced an error message that pointed at the cause.

Here is what went wrong, in the order it went wrong.

Local URLs do not exist for anyone else

The first publication failed on Facebook with "Missing or invalid image file".

The scheduler stores uploaded images and serves them from its own host. That host was a LAN address. Facebook, quite reasonably, could not fetch an image from a private network.

I fixed Facebook and Instagram, moved on, and then the same failure arrived from Bluesky, Mastodon, Tumblr and Dribbble in sequence — each with a different error string. "Unable to get local issuer certificate." "Fetch failed." Four separate debugging sessions for one cause.

The lesson was not about URLs. It was that after identifying a root cause I should have asked which other integrations share it, rather than fixing the one in front of me. Any platform that fetches media by URL needs a publicly reachable host. That is a property of the category, not of Facebook.

The error message is not the error

One platform returned "Unknown Error" on every attempt. I assumed an image problem and spent three cycles on it.

The actual error was in the raw response, base64-encoded inside a nested field: {"detail":"credits depleted","status":402}. The account had run out of API credits. Nothing to do with images.

Anything that wraps a provider API can lose the provider's error on the way to your logs. When a message is generic, go and find the raw response before forming a hypothesis. I lost most of an afternoon to not doing that.

Healthy containers, nothing publishing

The most instructive failure. Every container reported healthy, the process manager showed the worker running, logs were clean. Posts sat in the queue past their scheduled time and nothing happened.

The workflow engine's task queue told the real story: backlog rising, pollers empty. The worker process was alive and not consuming work.

Top comments (0)