
Hotel API and Javalin Setup
In this exercise, you will learn how to set up the HotelAPI Javalin application on your Digital Ocean Droplet. We will pull the image from Docker Hub and launch the Jetty webserver in a Docker Container. We will also make sure that it can connect to the Postgres database that we set up in the previous exercise.
Introduction - flashback to 2nd semester
On 2nd semester we had two options for deploying our web applications. We could either use the “blue” or the “red” pill. The blue pill was the easy way out. We secure copied the fat jar-file to the droplet and ran it with java -jar. So we only had Postgres running in a Docker Container. The rest were running on the host machine. The websites were exposed on IP addresses and a port number.
The red pill was the harder way. But also the more sophisticated. We created a Dockerfile and a docker-compose file and ran the application in a Docker container. We also set up a reverse proxy with Caddy to serve the application over HTTPS and a domain name. If you went the red pill way, you should have a docker-compose.yml file on your Droplet in the ~jetty/caddy_deployment folder.

So to sum it up. If you went the blue pill way, you should have a Postgres database running in a Docker Container. If you went the red pill way, you should have a Postgres database and Caddy, and Javalin applications running in Docker Containers. So you would be one of these personas:
- Blue: Only Postgres. The docker-compose file is located in the
~jetty/2semDockerSetupRemotefolder. - Red: Postgres, Caddy, and Javalin. Postgres is still configured in the docker-compose.yml file in the
~jetty/2semDockerSetupRemotefolder. Caddy and Javalin are configured in the docker-compose.yml file in the~jetty/caddy_deploymentfolder.
So who are you. Blue or Red?
-
Blue: Then you will keep all Docker configurations in the docker-compose.yml in the
~jetty/2semDockerSetupRemotefolder. Later we can rename the folder to~jetty/deploymentto keep things organized - and distance ourselves from the past. -
Red: Then you will keep the Postgres configuration in the docker-compose.yml in the
~jetty/2semDockerSetupRemotefolder. We don’t want to mess with the Postgres data. To keep things easier to manage, we will migrate (move) the Caddy and Javalin configurations to the~jetty/2semDockerSetupRemotefolder. We will also rename that folder to~jetty/deploymentto keep things organized. This takes a small effort to merge the two docker-compose files into one. But it is worth it.
Step 1 (everyone): Add the hotelAPI Service to the Docker Compose File
- Navigate to the
~jetty/2semDockerSetupRemotefolder on your Droplet. - Open the
docker-compose.ymlfile in an editor (nano). - Add this services to the file below the Postgres service. Remember to rename the image to you own name instead of
jonbertelsen/hotel_api:latest:
hotelAPI:
image: jonbertelsen/hotel_api:latest
container_name: hotelAPI
ports:
- "7070:7070"
environment:
- DEPLOYED=${DEPLOYED}
- DB_NAME=${DB_NAME}
- DB_USERNAME=${DB_USERNAME}
- DB_PASSWORD=${DB_PASSWORD}
- CONNECTION_STR=${CONNECTION_STR}
- SECRET_KEY=${SECRET_KEY}
- ISSUER=${ISSUER}
- TOKEN_EXPIRE_TIME=${TOKEN_EXPIRE_TIME}
networks:
- backend
- frontend
volumes:
- ./logs:/logs
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:7070/api/auth/healthcheck"]
interval: 30s
timeout: 5s
retries: 5
start_period: 10s
volumes:
logs:
networks:
backend:
name: backend
frontend:
name: frontend
Notice the healthcheck. It will check if the application is running by calling the /api/auth/healthcheck endpoint every 30 seconds. If the application does not respond within 5 seconds, it will retry 5 times with a 10 second start period. This is a good way to make sure that the application is running and healthy. You will need to implement a healthcheck endpoint in your application. We have already done that for you in the HotelAPI. Look in the SecurityController class, and also, notice the endpoint added in the SecurityRoutes.
-
Add the following environment variables to the
.envfile:DEPLOYED=true DB_NAME=hotel DB_USERNAME=postgres DB_PASSWORD=<your secure password> CONNECTION_STR=jdbc:postgresql://db:5432/ SECRET_KEY=4c9f92b04b1e85fa56e7b7b0a34f2de4f5b08cd9bb4dfe8ac4d73b4f7f6ef37b ISSUER=Bilbo Baggins TOKEN_EXPIRE_TIME=18000 -
Save the file and exit the editor.
Step 2 Start the Postgres and hotelAPI Services
-
Do this:
docker compose down docker compose upNotice that we left out the
-dflag. This is because we want to see the output from the services. If there are any errors, we want to see them. Press Ctrl + C to stop the services. -
Check that the services are running:
Log into your droplet with another terminal window and run:
docker psYou should see the
dband thehotelAPIservice running. ThehotelAPIservice might take a little while to get started, since we need to pull the image from Docker Hub. Also, remember to check the logs from the services if you see any errors. One typical error is that thehoteldatabase does not exist. You can create it with the following command:docker exec -it db psql -U postgres -c "CREATE DATABASE hotel;"Or do it with pgAdmin from your local machine.
Next step
The next step is to setup Caddy Server to serve the HotelAPI over HTTPS.