From Local IDE to Production: How Not to Get Lost in the Woods?
\n\nYou've written a cool Java application. Spring Boot is humming like a Swiss watch, the PostgreSQL database responds in milliseconds, and the Swagger documentation is a sight to behold. There's just one small thing left: making sure users can see this marvel. And that's where the fun begins – deploying Java applications.
\n\nIt seems simple, right? Throw a JAR file on a server and forget about it. But in practice, beginners get bogged down with questions: "Why does the app crash after an hour?", "How do I update code without downtime?", "Why can't my VPS with 512MB RAM handle my monolith?". In this article, we'll break down three main deployment methods: classic VPS, modern Docker, and cloud platforms. You'll learn which path is right for your project and get ready-to-use commands to get started.
\n\nMethod #1: Classic VPS (Virtual Private Server)
\n\nVPS is a dedicated slice of a server you pay for monthly. The oldest and most proven method. You get root access, install Java and a database, and run your application. Simple as can be, but with nuances.
\n\nHow It Works
\nYou rent a VPS (e.g., from Timeweb, Reg.ru, or DigitalOcean), connect via SSH, and manually configure the environment. For a Java developer, a typical scenario looks like this:
\n\n# Connect to the server\nssh root@123.456.789.0\n\n# Install Java 17 (OpenJDK)\napt update && apt install openjdk-17-jdk -y\n\n# Check the version\njava -version\n\n# Copy the JAR file (via SCP or git clone)\nscp target/my-app.jar root@123.456.789.0:/opt/app/\n\n# Run in the background\nnohup java -jar /opt/app/my-app.jar > /var/log/app.log 2>&1 &\n\n\nThat's it. The application is running. But as soon as you close the SSH session, the process might crash. That's why systemd – the Linux service manager – is used. Create a file /etc/systemd/system/myapp.service and add:
[Unit]\nDescription=My Java App\nAfter=network.target\n\n[Service]\nUser=appuser\nExecStart=/usr/bin/java -jar /opt/app/my-app.jar\nSuccessExitStatus=143\nRestart=always\nRestartSec=10\n\n[Install]\nWantedBy=multi-user.target\n\n\nAfter that, run systemctl start myapp – and the application lives independently of your session.
Pros of VPS
\n- \n
- Full control: you are the king and god on the server. \n
- Low price: from 300-500 rubles per month for an initial configuration. \n
- Flexibility: you can install any software, any version. \n
Cons of VPS
\n- \n
- Manual setup: you'll have to do everything by hand – from installing Java to configuring the firewall. \n
- Scaling: if the application becomes popular, manually expanding resources is a pain. \n
- Backup and security: if you don't set up automatic backups and fail2ban, one mistake can kill the server. \n
When to choose VPS? If you're making a pet project, a Telegram bot, or a small API for friends. Or if you want to dive deeper into Linux and DevOps.
\n\nMethod #2: Docker – Containerization Without the Headache
\n\nDocker solves the main problem of VPS: "It works on my machine!". A container is an isolated environment with your application and all its dependencies. You build the image once, and it runs identically on any server: whether on your home machine or on a VPS in Australia.
\n\nWriting a Dockerfile for Java
\nFor a typical Spring Boot application, the Dockerfile would look like this:
\n\n# Use the official OpenJDK image\nFROM openjdk:17-jdk-slim\n\n# Set the working directory\nWORKDIR /app\n\n# Copy the JAR file\nCOPY target/my-app.jar app.jar\n\n# Expose the port\nEXPOSE 8080\n\n# Run the application\nENTRYPOINT ["java", "-jar", "app.jar"]\n