Recently, while looking through my backups, hoping I’d finally stumble upon a long-forgotten Bitcoin wallet that never seems to materialize, I uncovered another artifact of similar value, though sentimental rather than monetary. I found some old backups from a community I joined and eventually took the technical reins of, sometime around 2011.
Ecstatic about the find, I started spelunking through the code and database dump, unraveling long-forgotten memories. It was an old phpBB forum, version 3.0.9, running on the good old PHP 5.6 backed by MySQL 5.7. Name a better duo.
Reanimation
My first thought was to set it up again. But after a decade of web development, I’ve grown somewhat pessimistic about modern tech stacks, so I initially shelved the idea, sure it would be a pain to get running again. Instead, I just resumed manually (rip)grepping through the code and SQL.
That didn’t last long. With some time on my hands, I decided to give it a try. I remembered I had Docker, and surely there must still be images out there for PHP 5.6 and MySQL 5.7, and indeed, there were.
After literally 30 minutes of work, mostly spent writing my own Dockerfile for PHP to include a few extra extensions, the forum was back online, alive again after more than 12 years since the last post was made.
The happiness of seeing such a tangible blast from the past come alive was matched by my surprise at how smoothly it all worked. No fuss, no dependency hell, no broken repositories lost to time. I’m still in awe. Even some of the current projects I work on take hours to boot up, and that’s for maintained, production-grade software.
I feel like we have definitely lost something and I am not sure what we have gained.
Why this still worked?
Because it was just the old LAMP trio doing its thing: Apache, PHP, MySQL no extra daemons, no third-party services, no six package registries to appease, nothing to phone home for at boot, so there was basically nothing to rot in the middle all these years.
phpBB from that era was built to run on a wide, boring baseline and it stayed well within the guardrails, plain PHP 5.x, MySQL, a config.php pointing at a database and when you recreate exactly that baseline, it just wakes up like it took a nap, not a coma.
The real trick was not "upgrading" anything: PHP 7/8 introduce a bunch of backwards-incompatible gotchas (evaluation order changes, foreach by-reference quirks, non-static calls, etc.), but by pinning the runtime to PHP 5.6 you sidestep all those mines entirely, so the code runs exactly like it did back then.
Docker turns this into time travel: pull PHP 5.6 and MySQL 5.7, mount the files, import the dump, wire up config.php, and you’ve basically rebuilt 2011 without arguing with today’s OS packages or toolchains that have “moved on” without you.
And because phpBB’s state lives in MySQL and not in some bespoke search/index/auth service, the restore path was hilariously simple: import database, point app at it, done, no rebuild step, no vendor dance, no missing artifact servers from a decade ago. (well, here I am lying a bit, we lost all the images)
That’s the punchline: the smaller the dependency surface and the more boring the assumptions, the higher the odds it still boots a decade later, unlike modern stacks that scatter themselves across multiple runtimes and registries and then age about as gracefully as milk left on the counter.
What now?
Obviously, putting such old software online today would be a security nightmare, given the millions of exploits PHP and MySQL have accumulated since then. Still, I might just publish the HTML as a static archive, for posterity’s sake.
▶ RELATED POSTS
» The Power Of Choosing Optimism
"The happiness of your life depends upon the quality of your thoughts." - Marcus Aurelius My first memories of childhood are grey, not in the cool, noir style of 1920s movies, but in the bleak, post-communist greyness of 1990s Romania. I was surrounded by people who had hoped for freedom for so
» Introducing goqueuelite: Golang + SQLite queue
It finally happened! I am about to introduce my first proper open source project, it is called squeuelite and it is a Golang package that tries to fix the queue issue using SQLite only. The package can be found out github.com/risico/goqueuelite, check it out. The package is not production ready...
» Understanding the Unusual Behavior of Golang's Custom UnmarshalJSON Method with Inner and Outer Struct Fields
Introduction In this blog post, we will discuss an interesting case in Golang where using a custom UnmarshalJSON method on a struct with both inner and outer fields results in only the inner fields being unmarshaled. We will look into why this occurs and suggest two alternative solutions to
▶ COMMENTS
Comments from this blog and Bluesky
No comments yet. Be the first to comment!