Spring Boot Deployment Documentation

This guide explains how to package, deploy, and run a Spring Boot application on Linux using systemd, including production setup and security.

Package JAR

# Using Maven
mvn clean package

# Output file
target/app.jar

Run JAR Manually

java -jar target/app.jar

Move JAR to Server Directory

sudo mkdir -p /opt/myapp
sudo cp target/app.jar /opt/myapp/app.jar

Create Service User

sudo useradd -r -s /bin/false springuser
sudo chown -R springuser:springuser /opt/myapp

Create systemd Service

sudo nano /etc/systemd/system/myapp.service

[Unit]
Description=Spring Boot App
After=network.target

[Service]
User=springuser
WorkingDirectory=/opt/myapp
ExecStart=/usr/bin/java -jar /opt/myapp/app.jar
SuccessExitStatus=143
Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target

Enable Service (Auto Start)

sudo systemctl daemon-reload
sudo systemctl enable myapp
sudo systemctl start myapp

Manage Service

sudo systemctl start myapp
sudo systemctl stop myapp
sudo systemctl restart myapp

Spring Profiles (Production)

java -jar app.jar --spring.profiles.active=prod

Change Application Port

java -jar app.jar --server.port=8081

Allow Port in Firewall

sudo ufw allow 8080
sudo ufw reload

Access Application

http://server-ip:8080

Setup Nginx Reverse Proxy

sudo apt install nginx

sudo nano /etc/nginx/sites-available/myapp

server {
listen 80;
server_name your-domain.com;

location / {
proxy_pass http://localhost:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}

sudo ln -s /etc/nginx/sites-available/myapp /etc/nginx/sites-enabled/
sudo systemctl restart nginx

Security Tips

# Do not run as root
# Use firewall rules
# Enable HTTPS with SSL
# Keep system updated

View Logs

journalctl -u myapp -f

Check Service Status

sudo systemctl status myapp