Escenario
Queremos desplegar en la nube una aplicación desarrollada con Spring Boot cuyo código está bajo control de versiones. Para este artículo usaremos ubuntu 16.04 y java 8, pero el procedimiento debería ser el mismo con versiones más actuales.Problema
Ninguno. Realmente es sencillo desplegar una aplicación de este tipo si se dispone de las herramientas adecuadas.Solución
- Instalamos java
-
1$ sudo apt install default-jre
-
1$ sudo apt install default-jdk
-
1$ sudo apt install openjdk-8-jdk
-
1$ sudo update-alternatives --config javac
-
1$ sudo update-alternatives --config java
- maven
-
1$ sudo apt-get -y install maven
- y git
-
1$ sudo apt-get install git-core
Aplicación
Vamos a poner que se llama techonage, crearemos un directorio en la máquina donde la clonaremos y compilaremos:
1 2 3 4 5 6 |
$ sudo mkdir -p /var/app/technoage $ sudo chown -R marcos:www-data /var/app/techonage $ cd /var/app/techonage $ git clone https://gitlab.com/devilcius/technoage.git . # y generamos el jar con $ mvn clean package |
1 2 3 4 5 |
$ sudo useradd webapp $ sudo passwd webapp $ sudo chown -R webapp:webapp /var/app/technoage/src/main/resources/public/ $ sudo chown -R webapp:webapp /var/app/technoage/target/ $ sudo chmod 500 /var/app/technoage/target/technoage.jar |
Instalación del servicio
Creamos el siguiente fichero en /etc/systemd/system/technoage.service
1 2 3 4 5 6 7 8 9 10 11 12 13 |
[Unit] Description=Technoage application After=syslog.target [Service] Environment=AWS_ACCESS_KEY_ID=secret_key Environment=AWS_SECRET_ACCESS_KEY=secret_access_key User=webapp ExecStart=/usr/bin/java -jar /var/app/technoage/target/technoage.jar --server.port=8070 SuccessExitStatus=143 [Install] WantedBy=multi-user.target |
Para que el servicio pueda pasar las variables de entorno a la aplicación, estás han de estar declaradas en el fichero. A modo de ejemplo he puesto dos variables usadas por el APÌ de aws. Nótese también que especificamos el puerto por el que debe escuchar la aplicación. En el caso de technoage, el 8070. De este modo podemos tener varias aplicaciones corriendo, cada una con su puerto sin necesidad de tocar el código. Además hemos especificado el usuario dado de alta anteriormente para que controle la aplicación.Para arrancar el servicio usaremos el comando:
1 |
$ sudo service technoage start |
1 |
$ sudo service technoage stop |
1 |
$ sudo systemctl daemon-reload |
1 |
$ sudo systemctl enable technoage.service. |
Proxy web
Usaremos nginx para que haga de proxy para las aplicaciones del tomcat y éstas sean accesibles por los puertos http y/o https. Para obtener la última versión de nginx, hay que seguir estos pasos:
1 |
$ sudo nano /etc/apt/sources.list |
1 2 |
deb http://nginx.org/packages/mainline/ubuntu/ xenial nginx deb-src http://nginx.org/packages/mainline/ubuntu/ xenial nginx |
1 2 3 4 |
$ wget http://nginx.org/keys/nginx_signing.key $ sudo apt-key add nginx_signing.key $ sudo apt update $ sudo apt install nginx |
Estos pasos tuve que hacerlos con ubuntu 16.04, para 18.04 basta conEsta sería una configuración básica para technoage en /etc/nginx/conf.d/technoage.conf:
12 $ sudo apt update$sudo apt install nginx
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
server { listen 80; listen [::]:80; server_name techonage.net; location / { proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_pass http://127.0.0.1:8070/; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-Forwarded-Port $server_port; } } |
Instalación del certificado ssl
Usaremos letsencrypt porque funciona muy bien y es gratuito.
1 2 3 |
$ sudo add-apt-repository ppa:certbot/certbot` $ sudo apt-get update $ sudo apt-get install python-certbot-nginx |
1 2 3 |
$ sudo certbot --nginx -d technoage.net # y reiniciamos el proxy: sudo systemctl restart nginx |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
server { server_name technoage.net; location / { proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_pass http://127.0.0.1:8070/; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-Forwarded-Port $server_port; } listen [::]:443 ssl; # managed by Certbot listen 443 ssl; # managed by Certbot ssl_certificate /etc/letsencrypt/live/technoage.net/fullchain.pem; # managed by Certbot ssl_certificate_key /etc/letsencrypt/live/technoage.net/privkey.pem; # managed by Certbot include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot ssl_protocols TLSv1 TLSv1.1 TLSv1.2; } server { if ($host = technoage.net) { return 301 https://$host$request_uri; } # managed by Certbot listen 80; listen [::]:80; server_name technoage.net; return 404; # managed by Certbot } |