Deployment for LevelUp was far from smooth. To be fair, this was the first Django app I’ve ever hosted. But even with that in mind, the actual deployment took nine hours. About five of those hours went to waste as I had to restart four times. Let me just say: LevelUp’s deployment had me wanting to throw my laptop out the door! Docker Woes My biggest hurdle was Docker. Most of my apps run in Docker on my main server, but LevelUp is too large for my current setup, so I had to make accommodations. No matter what I tried, I couldn’t get LevelUp to work in Docker. Everything seemed to fit together, but the permissions and configuration paths just wouldn’t integrate. I know this error came from my lack of experience. While I knew I should have used Docker, I went another route and deployed directly to the server. Since this server is dedicated solely to LevelUp, I had no qualms about running it bare-metal. This approach got me closer to my goal of having Version 1 online, though it didn’t solve all the problems. Every Gear Matters For those who have built apps or games, you know the struggle: every piece is like a gear. Each gear has to align perfectly with the others, or the flow is broken. When all the gears finally click and your app runs, it’s like watching your child take their first steps. Excitement overflows, but fear lingers too, now it’s your job to keep those gears turning. That’s the fun part. You have to find enjoyment in the process, even in the hard parts. Otherwise, you’ll never sustain the work, or scale it. Debugging, Debugging, Debugging With LevelUp finally online, the real debugging began. Celery and Celery Beat were off, the PostgreSQL database was a pain, and don’t get me started on the .env file. To anyone who says .env is easy, bugger off! Every developer has easy and hard parts. For days, I focused on the internals. Then the worst bug of all appeared: my reset quest function wouldn’t fire. Celery and Celery Beat were set up correctly, but no matter how many times I retried, each day I’d wake up and the function still hadn’t run. And then it hit me. I had updated the function to run smoother, but I had never restarted the workers. Those poor workers had been running since day one! The next day, everything worked exactly as intended. The feeling of solving a bug like that is incredible. I literally had to jump out of my seat to celebrate. Lessons Learned Deployment is never easy. It may take days to accomplish what you want, but don’t stop because it’s hard. Success isn’t made overnight, it takes thousands of nights of trial, error, and persistence. Keep fighting. Celebrate the small victories. And most importantly, enjoy the process, even when it’s frustrating.