Aprovisionar Ubuntu Server con Jira, Bitbucket y Confluence

Arquitectura de Solución

En está guía, solo detallaré el aprovisionamiento de la Suit de Atlassian en Ubuntu Server 18.04. Los pasos para levantar una infraestructura en AWS serán detallados en otra publicación.

Las configuraciones WAF y DNS también se expondrán en esta publicación.

Requerimientos
  • Debido a que instalaremos 4 aplicaciones como Jira, Jira ServiceDesk, Bitbucket y Confluence, necesitaremos por cada una cerca de 2GB de memoria RAM, es por ello que usaremos una instancia de AWS EC2 de 16 GB RAM y 4 vCPUs (t2.xlarge) o una instancia AWS Lightsail con las mismas características. 
  • Usaremos la distribución de Ubuntu Server 18.04 limpio, sin ninguna instalación debido a que existe más documentación al respecto, pero se podría usar un AMI Linux de AWS también. 
  • Necesitaremos una IP elástica (IP fija pública).
  •  Necesitaremos poder acceder a nuestro gestor de dominios para configurar los siguientes subdominios: 
    • jira.midominio.com 
    • bitbucket.midominio.com
    • confluence.midominio.com 
  • En la instalación estamos considerando el uso de certificados SSL para poder navegar por HTTPS, esto es opcional y se puede omitir el uso de certificados gratuitos letsencrypt.
  • Jira y Jira ServiceDesk trabajan con el dominio jira.midominio.com.
Instancia t2.xlarge


Guía Detallada

1. Update y upgrade del sistema operativo
sudo apt update && \
sudo apt upgrade -y && \
sudo reboot
2. Instalamos nginx y configuramos los subdominios con virtual host

2.1. Instalación de nginx
sudo apt-get install -y nginx  > /dev/null
2.2. Instalamos cerbot para gestionar el certificado SSL
sudo apt-get install software-properties-common && \
sudo add-apt-repository universe && \
sudo add-apt-repository ppa:certbot/certbot && \
sudo apt-get update && \
sudo apt-get install certbot python-certbot-nginx
2.3. creamos directorios de prueba para la configuración de los virtual host pero solo para el puerto 80
mkdir /var/www/jira.midominio.com && \
mkdir /var/www/bitbucket.midominio.com && \
mkdir /var/www/confluence.midominio.com && \
touch /var/www/jira.midominio.com/index.html && \
touch /var/www/bibucket.midominio.com/index.html && \
touch /var/www/confluence.midominio.com/index.html
2.4. creamos los archivos de configuración para los virtual host
sudo touch /etc/nginx/sites-available/jira.midominio.com.conf && \
sudo touch /etc/nginx/sites-available/bitbucket.midominio.com.conf && \
sudo touch /etc/nginx/sites-available/confluence.midominio.com.conf
2.5. Agregamos la siguiente configuración a cada archivo:
sudo vim /etc/nginx/sites-available/jira.midominio.com.conf
2.5.1. Contenido para virtual host de jira.midominio.com
server {
     root /var/www/jira.midominio.com/;
     index index.html;
     server_name jira.midominio.com;
}
sudo vim /etc/nginx/sites-available/bitbucket.midominio.com.conf
2.5.2. Contenido para virtual host de bitbucket.midominio.com
server {
     root /var/www/bitbucket.midominio.com/;
     index index.html;
     server_name bitbucket.midominio.com;
}
sudo vim /etc/nginx/sites-available/confluence.midominio.com.conf
2.5.3. Contenido para virtual host de confluence.midominio.com
server {
     root /var/www/confluence.midominio.com/;
     index index.html;
     server_name confluence.midominio.com;
}
2.6 Creamos enlaces simbólicos
sudo ln -s /etc/nginx/sites-available/jira.midominio.com.conf /etc/nginx/sites-enabled/jira.midominio.com && \
sudo ln -s /etc/nginx/sites-available/bitbucket.midominio.com.conf /etc/nginx/sites-enabled/bitbucket.midominio.com && \
sudo ln -s /etc/nginx/sites-available/confluence.midominio.com.conf /etc/nginx/sites-enabled/confluence.midominio.com
2.7 Reiniciamos nginx
sudo service nginx restart
2.8 Configuramos DNS en nuestro gestor de dominios
DOMAIN/IP           DOMAIN                    DNS TYPE
xxx.xxx.xxx.xxx     jira.midominio.com        A
jira.midominio.com  bitbucket.midominio.com   CNAME   
jira.midominio.com  confluence.midominio.com  CNAME   
2.9 Creamos el certificado SSL con una redirección del puerto 80 al puerto 443, para este paso debemos de tener en cuenta que debemos de tener habilitado el puerto 443 a nivel de firewall en nuestro VPS y al momento de crear el certificado, en la opción de cerbot elegimos la creación de la redirección de http a https
sudo certbot --nginx
2.10 Creamos una tarea programada de renovación de certificado SSL
sudo crontab -e
Agregamos el siguiente contenido
# m h dom mon dow command
0 2 * * * certbot renew --dry-run
3. Instalación y configuración de PostgreSQL (Se debe de validar primero que la versión sea compatible con las versiones de cada software). Usaremos PostgreSQL 9.6 el cual es compatible con las versiones de Jira Software 8.8, Bitbucket Server 7.1.x y Confluence 7.3.

3.1. Instalación
sudo sh -c 'echo "deb http://apt.postgresql.org/pub/repos/apt/ `lsb_release -cs`-pgdg main" >> /etc/apt/sources.list.d/pgdg.list' && \
wget -q https://www.postgresql.org/media/keys/ACCC4CF8.asc -O - | sudo apt-key add - && \
sudo apt-get update && \
sudo apt-get upgrade && \
sudo dpkg --get-selections | grep postgres && \
sudo apt-get install postgresql postgresql-contrib libpq-dev && \
sudo apt-get install postgresql-9.6
3.2. Cambiamos de usuario e ingresamos a PSQL
sudo -i -u postgres && \
psql
3.3. Creamos roles, bases de datos y asignamos privilegios
CREATE ROLE jirarole WITH LOGIN ENCRYPTED PASSWORD 'password';
CREATE DATABASE jira WITH ENCODING 'UNICODE' LC_COLLATE 'C' LC_CTYPE 'C' TEMPLATE template0;
GRANT ALL PRIVILEGES ON DATABASE jira TO jirarole;
CREATE ROLE bitbucketrole WITH LOGIN ENCRYPTED PASSWORD 'password';
CREATE DATABASE bitbucket WITH ENCODING='UTF8' OWNER=bitbucketrole CONNECTION LIMIT=-1;
GRANT ALL PRIVILEGES ON DATABASE bitbucket TO bitbucketrole;
CREATE ROLE confluencerole WITH LOGIN ENCRYPTED PASSWORD 'password';
CREATE DATABASE confluence WITH ENCODING='UTF8' OWNER=confluencerole CONNECTION LIMIT=-1;
GRANT ALL PRIVILEGES ON DATABASE confluence TO confluencerole;
3.3. Verificamos y salimos de psql
\l
\du
\q
exit
4. Preparación de la instalación de Jira Software, Bitbucket Server y Confluence.

4.1. Subir archivos .bin al servidor mediante SCP
scp -i /path_to_pem/credential.pem /path_to_bin/atlassian-bitbucket-version-x64.bin ubuntu@xxx.xxx.xxx.xxx:~/.
scp -i /path_to_pem/credential.pem /path_to_bin/atlassian-jira-software-version-x64.bin ubuntu@xxx.xxx.xxx.xxx:~/.
scp -i /path_to_pem/credential.pem /path_to_bin/atlassian-confluence-version-x64.bin ubuntu@xxx.xxx.xxx.xxx:~/.
4.2 Creamos un folder de instalación, movemos los archivos y damos permisos de ejecución
cd / && \
sudo mkdir software && \
sudo mv /home/ubuntu/atlassian-* /software && \
sudo chown -R root:root /software && \
sudo chmod -R a+x /software && \
cd /software
5. Instalación de Jira Software, Bitbucket Server y Confluence.

5.1. Instalación de Jira Software
5.1.1. Al momento de ejecutar, elegimos la instalación estándar y al finalizar negamos la ejecución del programa
sudo ./atlassian-jira-software-version-x64.bin
5.1.2. Después de instalar tenemos que modificar el archivo de configuración server.xml, en cual agregaremos una configuración especial para proxy reverse con https
sudo vim /opt/atlassian/jira/conf/server.xml
Modificamos el tag connector
<connector acceptcount="10" connectiontimeout="20000" enablelookups="false"
maxthreads="200" minsparethreads="10" port="8080" proxyname="jira.midominio.com"
proxyport="443" scheme="https" secure="true" uriencoding="UTF-8"></connector>
5.1.3. Configuramos el proxy inverso en nginx para jira.midominio.com y reiniciamos nginx
sudo vim /etc/nginx/sites-available/jira.midominio.com.conf
Agregamos el siguiente contenido
location / {
     proxy_set_header X-Forwarded-Host $host;
     proxy_set_header X-Forwarded-Server $host;
     proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
     proxy_pass http://127.0.0.1:8080;
     client_max_body_size 100M;
}

5.1.4. Reiniciamos nginx
sudo service nginx restart
5.1.5. Iniciamos el programa y visitamos https://jira.midominio.com, posteriormente hacemos una instalación en modo producción, conectamos nuestra base de datos PostgreSQL jira, si tenemos unas credenciales SMTP lo ingresamos, si no, lo dejamos como está.
cd /opt/atlassian/jira/bin && \
sudo ./startup.sh
5.2. Instalación de Confluence
5.2.1. Al momento de ejecutar, elegimos la instalación estándar y al finalizar negamos la ejecución del programa
sudo ./atlassian-confluence-version-x64.bin
5.2.2. Después de instalar tenemos que modificar el archivo de configuración server.xml, en cual agregaremos una configuración especial para proxy reverse con https
sudo vim /opt/atlassian/confluence/conf/server.xml
Modificamos el tag connector
<connector acceptcount="10" connectiontimeout="20000" enablelookups="false"
maxthreads="200" minsparethreads="10" port="8080" proxyname="confluence.midominio.com" 
proxyport="443" scheme="https" secure="true" uriencoding="UTF-8"></connector>
5.2.3. Configuramos el proxy inverso en nginx para confluence.midominio.com y reiniciamos nginx
sudo vim /etc/nginx/sites-available/confluence.midominio.com.conf
Agregamos el siguiente contenido

location / {
     proxy_set_header X-Forwarded-Host $host;
     proxy_set_header X-Forwarded-Server $host;
     proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
     proxy_pass http://127.0.0.1:8090;
     client_max_body_size 100M;
}
5.2.4. Reiniciamos nginx
sudo service nginx restart
5.2.5. Iniciamos el programa y visitamos https://confluence.midominio.com, posteriormente hacemos una instalación en modo producción, conectamos nuestra base de datos PostgreSQL jira, si tenemos unas credenciales SMTP lo ingresamos, si no, lo dejamos como está.
cd /opt/atlassian/confluence/bin && \
sudo ./startup.sh
5.3. Instalación de Bitbucket Server
5.3.1. Al momento de ejecutar, elegimos la instalación estándar y al finalizar si aceptamos la ejecución del programa
sudo ./atlassian-bitbucket-version-x64.bin
5.3.2. Es importante configurar el grupo de seguridad de la instancia, especialmente en las reglas de entrada tal y como se muestra en la siguiente imagen:

Segurity Group - Inbound Rules
5.3.3. Ingresamos al dominio mediante la ip elastica http://xxx.xxx.xxx.xxx:7990 y configuramos la BBDD, posteriormente apagamos el programa
cd /opt/atlassian/bitbucket/6.4.1/bin && \
sudo ./stop-bitbucket.sh
5.3.4. Configuramos el archivo properties en cual agregaremos una configuración especial para proxy reverse con https
sudo vim /var/atlassian/application-data/bitbucket/shared/bitbucket.properties
Agregamos el siguiente contenido
server.secure=true
server.scheme=https
server.proxy-port=443
server.proxy-name=bitbucket.midominio.com
5.3.5. Configuramos el proxy inverso en nginx para el subdominio bitbucket.midominio.com y reiniciamos nginx
sudo vim /etc/nginx/sites-available/bitbucket.midominio.com.conf
Agregamos el siguiente contenido
location / {
     proxy_set_header X-Forwarded-Host $host;
     proxy_set_header X-Forwarded-Server $host;
     proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
     proxy_pass http://127.0.0.1:7990;
     client_max_body_size 100M;
}
5.3.7. Reiniciamos nginx
sudo service nginx restart
5.3.8. Iniciamos el programa y visitamos https://bitbucket.midominio.com
cd /opt/atlassian/bitbucket/6.4.1/bin && \
sudo ./start-bitbucket.sh

Bien, espero que puedan ponerlo en práctica...