Six weeks ago, I was staring at a blank Flask app. Now? I'm staring at a live HTTPS-secured portfolio site, containerized with Docker, deployed on a VPS, and backed by a real MySQL database.
This is the halfway mark of the Meta x MLH Production Engineering Fellowship, and I've learned more in two weeks than I did in some full college courses.

So what did I build?
I set out to create a personal portfolio — something simple to showcase my work. But simple wasn't enough. I wanted to build it like a production engineer would.
So I did.
I designed a full-stack Flask web app with templated pages for projects, education, hobbies, and research. Then I added a live, dynamic Timeline feature, backed by MySQL and exposed through a REST API I built from scratch. You can post to it. It stores your message. It renders instantly. It just works.
Next came the infrastructure.
I Dockerized everything — Flask, MySQL, Nginx — and orchestrated it all with Docker Compose. I set up a custom domain with DuckDNS, configured Nginx as a reverse proxy, and added HTTPS using Certbot, because let's be honest: if your site doesn't have a lock icon in 2025, what are we even doing?
Deployment? Automated.
I wrote a custom redeploy-site.sh script that pulls the latest GitHub changes, rebuilds containers, and restarts the stack in seconds. No FTP. No manual file copying. Just code → push → live.

Here's what I ran into:
- •SELinux blocking Docker? Fixed it by moving my files out of /root/ and rewriting my systemd units.
- •Python cryptography build errors? Resolved dependency like a boss.
- •MySQL container not talking to Flask? Traced it through Docker networks and nailed the config.
I learned to troubleshoot like a real engineer — with logs, grit, and a lot of StackOverflow tabs.

And here's why it matters.
This wasn't about making a flashy homepage. It was about learning how real software is built and shipped. It was about building something I could break, fix, deploy, and evolve.
Now, I have a portfolio that doesn't just list my skills — it demonstrates them. It's living, modular, and extensible. I even added test coverage and validation logic, because clean UIs mean nothing without solid backends.
And it's just the beginning.
Up Next:
- •Add a full blog engine
- •Build an admin dashboard for managing content
- •Integrate CI/CD with GitHub Actions
- •Write end-to-end UI tests
- •Refactor data to make it fully database-driven
Why stop at a portfolio when I can turn it into a platform?
Want to see it?

I'm beyond grateful to MLH and Meta for making this possible. I've gone from "I think I can do this" to "I just did it, and here's the link."
If you're curious about Flask, Docker, deployment pipelines, or just how to turn a passion project into a production-grade system — reach out. Or better yet, fork my repo and build your version.
Let's make cool stuff.
— Ethan
This article is also available on Medium. If you prefer to read it there or want to give it some claps, check it out:
Read on MediumThanks for reading! If you found this interesting, feel free to connect with me on: