├── Jira ├── dc-letsencrypt.yml ├── default.env ├── defaultHttps.env ├── README.md └── docker-compose.yml ├── Letsencrypt ├── docker-compose.yml └── README.md ├── AtlassianStack ├── dc-letsencrypt.yml ├── default.bat ├── default.env ├── defaultHttps.env ├── defaultHttps.bat ├── README.md └── docker-compose.yml ├── LICENSE └── README.md /Jira/dc-letsencrypt.yml: -------------------------------------------------------------------------------- 1 | version: '2' 2 | 3 | services: 4 | letsencrypt: 5 | image: blacklabelops/letsencrypt:20161017 6 | ports: 7 | - '443:443' 8 | - '80:80' 9 | volumes: 10 | - ssl_certificates:/etc/letsencrypt 11 | environment: 12 | - 'LETSENCRYPT_EMAIL=${LETSENCRYPT_EMAIL}' 13 | - 'LETSENCRYPT_DOMAIN1=${JIRA_DOMAIN_NAME}' 14 | command: install 15 | 16 | volumes: 17 | ssl_certificates: 18 | external: false 19 | -------------------------------------------------------------------------------- /Letsencrypt/docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: '2' 2 | 3 | services: 4 | letsencrypt: 5 | image: blacklabelops/letsencrypt:20161017 6 | ports: 7 | - '443:443' 8 | - '80:80' 9 | volumes: 10 | - ssl_certificates:/etc/letsencrypt 11 | environment: 12 | - 'LETSENCRYPT_EMAIL=${LETSENCRYPT_EMAIL}' 13 | - 'LETSENCRYPT_DOMAIN1=${LETSENCRYPT_DOMAIN}' 14 | command: install 15 | 16 | volumes: 17 | ssl_certificates: 18 | external: false 19 | -------------------------------------------------------------------------------- /Jira/default.env: -------------------------------------------------------------------------------- 1 | export JIRA_TIME_ZONE=Europe/Berlin 2 | export JIRA_DOMAIN_NAME=localhost 3 | export JIRA_PORT80_REDIRECT=false 4 | export JIRA_HTTPS=false 5 | export JIRA_HTTP=true 6 | export JIRA_POSTGRES_VERSION=9.4.6 7 | export JIRA_VERSION=7.2.2 8 | export JIRA_DB_USERNAME=jiradb 9 | export JIRA_DB_PASSWORD=jiradb 10 | export JIRA_PROXY_PORT=80 11 | export JIRA_PROXY_SCHEME=http 12 | export JIRA_DELAYED_START=10 13 | export JIRA_JAVA_OPTIONS=" -Xms1g -Xmx2g" 14 | export JIRA_NGINX_VERSION=1.10.1-r1 15 | -------------------------------------------------------------------------------- /Jira/defaultHttps.env: -------------------------------------------------------------------------------- 1 | export JIRA_TIME_ZONE=Europe/Berlin 2 | export JIRA_DOMAIN_NAME=localhost 3 | export JIRA_PORT80_REDIRECT=true 4 | export JIRA_HTTPS=true 5 | export JIRA_HTTP=true 6 | export JIRA_POSTGRES_VERSION=9.4.6 7 | export JIRA_VERSION=7.2.2 8 | export JIRA_DB_USERNAME=jiradb 9 | export JIRA_DB_PASSWORD=jiradb 10 | export JIRA_PROXY_PORT=443 11 | export JIRA_PROXY_SCHEME=https 12 | export JIRA_DELAYED_START=10 13 | export JIRA_JAVA_OPTIONS=" -Xms1g -Xmx2g" 14 | export JIRA_NGINX_VERSION=1.10.1-r1 15 | 16 | #Letsencrypt Settings 17 | export LETSENCRYPT_EMAIL=mail@youremail.com 18 | -------------------------------------------------------------------------------- /AtlassianStack/dc-letsencrypt.yml: -------------------------------------------------------------------------------- 1 | version: '2' 2 | 3 | services: 4 | letsencrypt: 5 | image: blacklabelops/letsencrypt:20161017 6 | ports: 7 | - '443:443' 8 | - '80:80' 9 | volumes: 10 | - ssl_certificates:/etc/letsencrypt 11 | environment: 12 | - 'LETSENCRYPT_EMAIL=${LETSENCRYPT_EMAIL}' 13 | - 'LETSENCRYPT_DOMAIN1=${JIRA_DOMAIN_NAME}' 14 | - 'LETSENCRYPT_DOMAIN2=${CROWD_DOMAIN_NAME}' 15 | - 'LETSENCRYPT_DOMAIN3=${CONFLUENCE_DOMAIN_NAME}' 16 | - 'LETSENCRYPT_DOMAIN4=${BITBUCKET_DOMAIN_NAME}' 17 | command: install 18 | 19 | volumes: 20 | ssl_certificates: 21 | external: false 22 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2016 Steffen Bleul 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /AtlassianStack/default.bat: -------------------------------------------------------------------------------- 1 | @ECHO OFF 2 | 3 | :: Global Container Settings 4 | SET ATLASSIAN_TIME_ZONE="Europe/Berlin" 5 | 6 | :: Atlassian Container Settings 7 | SET ATLASSIAN_PROXY_PORT="80" 8 | SET ATLASSIAN_PROXY_SCHEME="http" 9 | SET ATLASSIAN_POSTGRES_VERSION="9.4.6" 10 | SET ATLASSIAN_DB_USERNAME="atlassiandb" 11 | SET ATLASSIAN_DB_PASSWORD="atlassiandb" 12 | SET ATLASSIAN_DB_DELAYED_START="10" 13 | 14 | :: Letsencrypt Settings 15 | SET LETSENCRYPT_EMAIL="" 16 | 17 | :: Nginx Reverse Proxy Settings 18 | SET ATLASSIAN_NGINX_VERSION="1.10.1-r1" 19 | SET ATLASSIAN_PORT80_REDIRECT="false" 20 | SET ATLASSIAN_HTTPS="false" 21 | SET ATLASSIAN_HTTP="true" 22 | 23 | :: Jira Settings 24 | SET JIRA_DOMAIN_NAME="jira.yourhost.com" 25 | SET JIRA_VERSION="7.2.2" 26 | SET JIRA_JAVA_OPTIONS=" -Xms1g -Xmx2g" 27 | 28 | :: Crowd 29 | SET CROWD_DOMAIN_NAME="crowd.yourhost.com" 30 | SET CROWD_VERSION="2.10.1" 31 | 32 | :: Confluence 33 | SET CONFLUENCE_DOMAIN_NAME="confluence.yourhost.com" 34 | SET CONFLUENCE_VERSION="5.10.7" 35 | SET CONFLUENCE_JAVA_OPTIONS=" -Xms1g -Xmx2g" 36 | 37 | :: Bitbucket 38 | SET BITBUCKET_DOMAIN_NAME="bitbucket.yourhost.com" 39 | SET BITBUCKET_VERSION="4.9.1" 40 | SET BITBUCKET_JAVA_OPTIONS=" -Xms1g -Xmx2g" 41 | 42 | PAUSE 43 | -------------------------------------------------------------------------------- /AtlassianStack/default.env: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | #Global Container Settings 4 | export ATLASSIAN_TIME_ZONE=Europe/Berlin 5 | 6 | #Atlassian Container Settings 7 | export ATLASSIAN_PROXY_PORT=80 8 | export ATLASSIAN_PROXY_SCHEME=http 9 | export ATLASSIAN_POSTGRES_VERSION=9.4.6 10 | export ATLASSIAN_DB_USERNAME=atlassiandb 11 | export ATLASSIAN_DB_PASSWORD=atlassiandb 12 | export ATLASSIAN_DB_DELAYED_START=10 13 | 14 | #Letsencrypt Settings 15 | export LETSENCRYPT_EMAIL= 16 | 17 | #Nginx Reverse Proxy Settings 18 | export ATLASSIAN_NGINX_VERSION=1.10.1-r1 19 | export ATLASSIAN_PORT80_REDIRECT=false 20 | export ATLASSIAN_HTTPS=false 21 | export ATLASSIAN_HTTP=true 22 | 23 | #Jira Settings 24 | export JIRA_DOMAIN_NAME=jira.yourhost.com 25 | export JIRA_VERSION=7.3.0 26 | export JIRA_JAVA_OPTIONS=" -Xms1g -Xmx2g" 27 | 28 | #Crowd 29 | export CROWD_DOMAIN_NAME=crowd.yourhost.com 30 | export CROWD_VERSION=2.10.1 31 | 32 | #Confluence 33 | export CONFLUENCE_DOMAIN_NAME=confluence.yourhost.com 34 | export CONFLUENCE_VERSION=6.0.4 35 | export CONFLUENCE_JAVA_OPTIONS=" -Xms1g -Xmx2g" 36 | 37 | #Bitbucket 38 | export BITBUCKET_DOMAIN_NAME=bitbucket.yourhost.com 39 | export BITBUCKET_VERSION=4.13.0 40 | export BITBUCKET_JAVA_OPTIONS=" -Xms1g -Xmx2g" 41 | -------------------------------------------------------------------------------- /AtlassianStack/defaultHttps.env: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | #Global Container Settings 4 | export ATLASSIAN_TIME_ZONE=Europe/Berlin 5 | 6 | #Atlassian Container Settings 7 | export ATLASSIAN_PROXY_PORT=443 8 | export ATLASSIAN_PROXY_SCHEME=https 9 | export ATLASSIAN_POSTGRES_VERSION=9.4.6 10 | export ATLASSIAN_DB_USERNAME=jiradb 11 | export ATLASSIAN_DB_PASSWORD=jiradb 12 | export ATLASSIAN_DB_DELAYED_START=10 13 | 14 | #Letsencrypt Settings 15 | export LETSENCRYPT_EMAIL=mail@youremail.com 16 | 17 | #Nginx Reverse Proxy Settings 18 | export ATLASSIAN_NGINX_VERSION=1.10.1-r1 19 | export ATLASSIAN_PORT80_REDIRECT=true 20 | export ATLASSIAN_HTTPS=true 21 | export ATLASSIAN_HTTP=true 22 | 23 | #Jira Settings 24 | export JIRA_DOMAIN_NAME=jira.yourhost.com 25 | export JIRA_VERSION=7.2.2 26 | export JIRA_JAVA_OPTIONS=" -Xms1g -Xmx2g" 27 | 28 | #Crowd 29 | export CROWD_DOMAIN_NAME=crowd.yourhost.com 30 | export CROWD_VERSION=2.10.1 31 | 32 | #Confluence 33 | export CONFLUENCE_DOMAIN_NAME=confluence.yourhost.com 34 | export CONFLUENCE_VERSION=5.10.7 35 | export CONFLUENCE_JAVA_OPTIONS=" -Xms1g -Xmx2g" 36 | 37 | #Bitbucket 38 | export BITBUCKET_DOMAIN_NAME=bitbucket.yourhost.com 39 | export BITBUCKET_VERSION=4.9.1 40 | export BITBUCKET_JAVA_OPTIONS=" -Xms1g -Xmx2g" 41 | -------------------------------------------------------------------------------- /AtlassianStack/defaultHttps.bat: -------------------------------------------------------------------------------- 1 | @ECHO OFF 2 | 3 | :: Global Container Settings 4 | SET ATLASSIAN_TIME_ZONE="Europe/Berlin" 5 | 6 | :: Atlassian Container Settings 7 | SET ATLASSIAN_PROXY_PORT="443" 8 | SET ATLASSIAN_PROXY_SCHEME="https" 9 | SET ATLASSIAN_POSTGRES_VERSION="9.4.6" 10 | SET ATLASSIAN_DB_USERNAME="atlassiandb" 11 | SET ATLASSIAN_DB_PASSWORD="atlassiandb" 12 | SET ATLASSIAN_DB_DELAYED_START="10" 13 | 14 | :: Letsencrypt Settings 15 | SET LETSENCRYPT_EMAIL="mail@youremail.com" 16 | 17 | :: Nginx Reverse Proxy Settings 18 | SET ATLASSIAN_NGINX_VERSION="1.10.1-r1" 19 | SET ATLASSIAN_PORT80_REDIRECT="true" 20 | SET ATLASSIAN_HTTPS="true" 21 | SET ATLASSIAN_HTTP="true" 22 | 23 | :: Jira Settings 24 | SET JIRA_DOMAIN_NAME="jira.yourhost.com" 25 | SET JIRA_VERSION="7.2.2" 26 | SET JIRA_JAVA_OPTIONS=" -Xms1g -Xmx2g" 27 | 28 | :: Crowd 29 | SET CROWD_DOMAIN_NAME="crowd.yourhost.com" 30 | SET CROWD_VERSION="2.10.1" 31 | 32 | :: Confluence 33 | SET CONFLUENCE_DOMAIN_NAME="confluence.yourhost.com" 34 | SET CONFLUENCE_VERSION="5.10.7" 35 | SET CONFLUENCE_JAVA_OPTIONS=" -Xms1g -Xmx2g" 36 | 37 | :: Bitbucket 38 | SET BITBUCKET_DOMAIN_NAME="bitbucket.yourhost.com" 39 | SET BITBUCKET_VERSION="4.9.1" 40 | SET BITBUCKET_JAVA_OPTIONS=" -Xms1g -Xmx2g" 41 | 42 | PAUSE 43 | -------------------------------------------------------------------------------- /Jira/README.md: -------------------------------------------------------------------------------- 1 | # Jira Product 2 | 3 | The default Jira product is Jira Software. The Jira product can be changed with the environment variable JIRA_VERSION. 4 | 5 | | Product | JIRA_VERSION | Tagged JIRA_VERSION | 6 | |-------------|--------------|---------------------| 7 | | Jira Software | latest | 7.2.2 | 8 | | Jira Core | core | core.7.2.2 | 9 | | Jira Service Desk | servicedesk.3.2.2 | servicedesk.3.2.2 | 10 | 11 | Example Jira Service Desk version 3.2.2 setting environment variable: 12 | 13 | ~~~~ 14 | $ export JIRA_VERSION servicedesk.3.2.2 15 | ~~~~ 16 | 17 | > Export cmd Mac/Linux. Use Set on windows. 18 | 19 | Alternatively change the value JIRA_VERSION inside the file `default.env`. 20 | 21 | ~~~~ 22 | $ curl -o /Jira/default.env https://raw.githubusercontent.com/blacklabelops/atlassian/master/Jira/default.env 23 | ~~~~ 24 | 25 | > Downloads default configuration file. 26 | 27 | # Deploying Jira 28 | 29 | Running the stack: 30 | 31 | 1. Download the blacklabelops docker-compose file by running: 32 | 33 | ~~~~ 34 | $ mkdir Jira 35 | $ curl -o /Jira/default.env https://raw.githubusercontent.com/blacklabelops/atlassian/master/Jira/default.env 36 | $ curl -o /Jira/docker-compose.yml https://raw.githubusercontent.com/blacklabelops/atlassian/master/Jira/docker-compose.yml 37 | $ cd Jira 38 | ~~~~ 39 | 40 | 1. Now set the default environment variables: 41 | 42 | ~~~~ 43 | $ source default.env 44 | ~~~~ 45 | 46 | > Bash command for setting environment variables, you have to manually define the environment variables under Windows 47 | 48 | 1. Override password variables: 49 | 50 | ~~~~ 51 | $ export JIRA_DB_USERNAME=yourusername 52 | $ export JIRA_DB_PASSWORD=yourdbpassword 53 | $ export JIRA_TIME_ZONE=Europe/Berlin 54 | $ export JIRA_DOMAIN_NAME=localhost 55 | ~~~~ 56 | 57 | > You can override any environment variable inside the file default.env. 58 | 59 | 1. Start the whole setup: 60 | 61 | ~~~~ 62 | $ docker-compose up -d 63 | ~~~~ 64 | 65 | > Jira will be accessible under http://localhost 66 | -------------------------------------------------------------------------------- /Letsencrypt/README.md: -------------------------------------------------------------------------------- 1 | # Letsencrypt SSL Certificates 2 | 3 | Requirements: Your host must be reachable under the respective domain name. E.g. www.yourhost.com. Then 4 | run the image on the host and the certificates will be saved inside a docker volume. 5 | 6 | 1. Download the blacklabelops/letsencrypt docker-compose file by running: 7 | 8 | ~~~~ 9 | $ mkdir Letsencrypt 10 | $ curl -o /Letsencrypt/docker-compose.yml https://raw.githubusercontent.com/blacklabelops/atlassian/master/Letsencrypt/docker-compose.yml 11 | $ cd Letsencrypt 12 | ~~~~ 13 | 14 | 1. Now set the your email and hostname with environment variables: 15 | 16 | ~~~~ 17 | $ export LETSENCRYPT_EMAIL="youremail@emailhost.de" 18 | $ export LETSENCRYPT_DOMAIN="www.yourhost.com" 19 | ~~~~ 20 | 21 | > Export is a Linux/Mac command, under Windows use SET command. 22 | 23 | 1. Generate the certificates 24 | 25 | ~~~~ 26 | $ docker-compose up 27 | ~~~~ 28 | 29 | 4. List the certificates 30 | 31 | ~~~~ 32 | $ docker-compose run --rm letsencrypt ls -R /etc/letsencrypt 33 | ~~~~ 34 | 35 | > Lists all files inside the letsencrypt directory. The volume will be automounted. 36 | 37 | ## Certificate Renewal 38 | 39 | Letsencrypt certificates have a lifetime of three months. Run the renewal command periodical in order to update your certificate lifetime. 40 | 41 | ~~~~ 42 | $ docker-compose run --rm letsencrypt renewal 43 | ~~~~ 44 | 45 | > Make sure the required environment variables are set: LETSENCRYPT_EMAIL and LETSENCRYPT_DOMAIN. 46 | 47 | ## Multiple Domain certificates 48 | 49 | The letsencrypt image supports multiple domain certificates. 50 | 51 | Example: 52 | 53 | 1. jira.youratlassianhost.com 54 | 1. confluence.youratlassianhost.com 55 | 1. bitbucket.youratlassianhost.com 56 | 57 | Command: 58 | 59 | ~~~~ 60 | $ docker-compose run --rm \ 61 | -p 443:443 \ 62 | -e LETSENCRYPT_EMAIL=youremail@emailhost.de \ 63 | -e LETSENCRYPT_DOMAIN=jira.yourhost.com \ 64 | -e LETSENCRYPT_DOMAIN2=confluence.yourhost.com \ 65 | -e LETSENCRYPT_DOMAIN3=bitbucket.yourhost.com \ 66 | letsencrypt install 67 | ~~~~ 68 | 69 | > Will create a single multidomain certificate. 70 | 71 | Renewal Command: 72 | 73 | ~~~~ 74 | $ docker-compose run --rm \ 75 | -p 443:443 \ 76 | -e LETSENCRYPT_EMAIL=youremail@emailhost.de \ 77 | -e LETSENCRYPT_DOMAIN=jira.yourhost.com \ 78 | -e LETSENCRYPT_DOMAIN2=confluence.yourhost.com \ 79 | -e LETSENCRYPT_DOMAIN3=bitbucket.yourhost.com \ 80 | letsencrypt renewal 81 | ~~~~ 82 | -------------------------------------------------------------------------------- /Jira/docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: '2' 2 | 3 | services: 4 | nginx: 5 | image: blacklabelops/nginx:${JIRA_NGINX_VERSION} 6 | ports: 7 | - '443:443' 8 | - '80:80' 9 | volumes: 10 | - nginx_volume:/home/nginx 11 | - ssl_certificates:/etc/letsencrypt 12 | environment: 13 | - 'TZ=${JIRA_TIME_ZONE}' 14 | - 'NGINX_REDIRECT_PORT80=${JIRA_PORT80_REDIRECT}' 15 | - 'SERVER1SERVER_NAME=${JIRA_DOMAIN_NAME}' 16 | - 'SERVER1REVERSE_PROXY_LOCATION1=/' 17 | - 'SERVER1REVERSE_PROXY_PASS1=http://jira:8080' 18 | - 'SERVER1HTTPS_ENABLED=${JIRA_HTTPS}' 19 | - 'SERVER1HTTP_ENABLED=${JIRA_HTTP}' 20 | - 'SERVER1LETSENCRYPT_CERTIFICATES=${JIRA_HTTPS}' 21 | - 'SERVER1CERTIFICATE_FILE=/etc/letsencrypt/live/${JIRA_DOMAIN_NAME}/fullchain.pem' 22 | - 'SERVER1CERTIFICATE_KEY=/etc/letsencrypt/live/${JIRA_DOMAIN_NAME}/privkey.pem' 23 | - 'SERVER1CERTIFICATE_TRUSTED=/etc/letsencrypt/live/${JIRA_DOMAIN_NAME}/fullchain.pem' 24 | - 'SERVER1PROXY_APPLICATION=jira' 25 | restart: unless-stopped 26 | jira_postgresql: 27 | image: blacklabelops/postgres:${JIRA_POSTGRES_VERSION} 28 | container_name: jira_postgresql 29 | hostname: jira_postgresql 30 | volumes: 31 | - jira_postgresql_volume:/var/lib/postgresql/data 32 | environment: 33 | - 'TZ=${JIRA_TIME_ZONE}' 34 | - 'POSTGRES_DB=jiradb' 35 | - 'POSTGRES_USER=${JIRA_DB_USERNAME}' 36 | - 'POSTGRES_PASSWORD=${JIRA_DB_PASSWORD}' 37 | - 'POSTGRES_ENCODING=UNICODE' 38 | - 'POSTGRES_COLLATE=C' 39 | - 'POSTGRES_COLLATE_TYPE=C' 40 | restart: unless-stopped 41 | jira: 42 | image: blacklabelops/jira:${JIRA_VERSION} 43 | container_name: jira 44 | hostname: jira 45 | volumes: 46 | - jira_volume:/var/atlassian/jira 47 | environment: 48 | - 'TZ=${JIRA_TIME_ZONE}' 49 | - "CATALINA_OPTS=${JIRA_JAVA_OPTIONS}" 50 | - "JIRA_PROXY_NAME=${JIRA_DOMAIN_NAME}" 51 | - "JIRA_PROXY_PORT=${JIRA_PROXY_PORT}" 52 | - "JIRA_PROXY_SCHEME=${JIRA_PROXY_SCHEME}" 53 | - 'JIRA_DATABASE_URL=postgresql://${JIRA_DB_USERNAME}@jira_postgresql/jiradb' 54 | - 'JIRA_DB_PASSWORD=${JIRA_DB_PASSWORD}' 55 | - 'JIRA_DELAYED_START=${JIRA_DELAYED_START}' 56 | restart: unless-stopped 57 | 58 | volumes: 59 | nginx_volume: 60 | external: false 61 | ssl_certificates: 62 | external: false 63 | jira_postgresql_volume: 64 | external: false 65 | jira_volume: 66 | external: false 67 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Running And Maintaining Dockerized Atlassian Products 2 | 3 | This project will show you how to setup and maintain Atlassian products with Docker. 4 | 5 | Deployment and maintainance will be done by docker-compose yaml files and all commands will be based on Blacklabelops dockerized atlassian product images. 6 | 7 | Requirements: 8 | 9 | * Docker 10 | * Docker-Compose 11 | 12 | Based on the following containers: 13 | 14 | * [blacklabelops/jira](https://github.com/blacklabelops/jira): The #1 software development tool used by agile teams 15 | * [blacklabelops/confluence](https://github.com/blacklabelops/confluence): Create, organize, and discuss work with your team 16 | * [blacklabelops/bitbucket](https://github.com/blacklabelops/bitbucket): Code, Manage, Collaborate 17 | * [blacklabelops/crowd](https://github.com/blacklabelops/crowd): Identity management for web apps 18 | * [blacklabelops/nginx](https://github.com/blacklabelops/nginx): Http Server 19 | * [blacklabelops/postgres](https://github.com/blacklabelops/postgres): Database 20 | 21 | # Support & Feature Requests 22 | 23 | Leave a message and ask questions on Hipchat: [blacklabelops/hipchat](https://www.hipchat.com/geogBFvEM) 24 | 25 | # Atlassian Stack 26 | 27 | Running the whole Atlassian software stack on your local computer. 28 | 29 | * Nginx Reverse Proxy (Http) 30 | * Jira Software 31 | * Confluence 32 | * Bitbucket 33 | * Crowd 34 | * PostgreSQL Databases 35 | 36 | Start here: [Documentation](https://github.com/blacklabelops/atlassian/tree/master/AtlassianStack) 37 | 38 | # Jira 39 | 40 | The basic Jira stack: 41 | 42 | * Nginx Reverse Proxy (Http) 43 | * Jira Software 44 | * PostgreSQL Database 45 | 46 | Start here: [Documentation](https://github.com/blacklabelops/atlassian/tree/master/Jira) 47 | 48 | # Letsencrypt SSL Certificates 49 | 50 | In order to obtain free SSL certificates for your Atlassian instances use my letsencrypt Docker image. 51 | 52 | The creation of SSL certificates is dependent on your stack. See the documentation of each stack. 53 | 54 | Further documentation: [Documentation](https://github.com/blacklabelops/atlassian/tree/master/Letsencrypt) 55 | 56 | # References 57 | 58 | * [Atlassian Jira](https://www.atlassian.com/software/jira) 59 | * [Atlassian Confluence](https://www.atlassian.com/software/confluence) 60 | * [Atlassian Bitbucket](https://www.atlassian.com/software/bitbucket) 61 | * [Atlassian Crowd](https://www.atlassian.com/software/crowd/overview/) 62 | * [Nginx](http://nginx.org/) 63 | * [Letsencrypt](https://letsencrypt.org/) 64 | * [Docker Homepage](https://www.docker.com/) 65 | * [Docker Compose](https://docs.docker.com/compose/) 66 | * [Docker Userguide](https://docs.docker.com/userguide/) 67 | -------------------------------------------------------------------------------- /AtlassianStack/README.md: -------------------------------------------------------------------------------- 1 | # Deploying Atlassian Stack 2 | 3 | Running the whole Atlassian software stack on your local computer. 4 | 5 | * Nginx Reverse Proxy (Http) 6 | * Jira Software 7 | * Confluence 8 | * Bitbucket 9 | * Crowd 10 | * PostgreSQL Databases 11 | 12 | Prerequisite: 13 | 14 | If you want to try the stack on your local compute then setup the following domains in your host settings (Mac/Linux: /etc/hosts, Windows: %systemroot%\system32\drivers\etc\): 15 | 16 | * `127.0.0.1 jira.yourhost.com` 17 | * `127.0.0.1 confluence.yourhost.com` 18 | * `127.0.0.1 bitbucket.yourhost.com` 19 | * `127.0.0.1 crowd.yourhost.com` 20 | 21 | Running the software stack: 22 | 23 | Download the blacklabelops docker-compose file by running: 24 | 25 | Windows: 26 | 27 | Download the repository and extract: [ZIP](https://github.com/blacklabelops/atlassian/archive/master.zip) 28 | 29 | Mac/Linux: 30 | 31 | ~~~~ 32 | $ mkdir AtlassianStack 33 | $ curl -o /AtlassianStack/default.env https://raw.githubusercontent.com/blacklabelops/atlassian/master/AtlassianStack/default.env 34 | $ curl -o /AtlassianStack/docker-compose.yml https://raw.githubusercontent.com/blacklabelops/atlassian/master/AtlassianStack/docker-compose.yml 35 | $ cd AtlassianStack 36 | ~~~~ 37 | 38 | Now set the default environment variables: 39 | 40 | Windows: 41 | 42 | ~~~~ 43 | $ default.bat 44 | ~~~~ 45 | 46 | > Batch command for setting environment variables. 47 | 48 | Mac/Linux: 49 | 50 | ~~~~ 51 | $ source default.env 52 | ~~~~ 53 | 54 | > Bash command for setting environment variables. 55 | 56 | Override password variables: 57 | 58 | Windows: 59 | 60 | ~~~~ 61 | $ SET ATLASSIAN_TIME_ZONE="Europe/Berlin" 62 | ~~~~ 63 | 64 | > You can override any environment variable inside the file default.bat. 65 | 66 | Mac/Linux: 67 | 68 | ~~~~ 69 | $ export ATLASSIAN_TIME_ZONE=Europe/Berlin 70 | ~~~~ 71 | 72 | > You can override any environment variable inside the file default.env. 73 | 74 | Start the whole setup: 75 | 76 | ~~~~ 77 | $ docker-compose up -d 78 | ~~~~ 79 | 80 | > Jira will be accessible under http://jira.yourhost.com 81 | 82 | ## Setup Jira 83 | 84 | Configure your Jira yourself and fill it with a test license. 85 | 86 | 1. Access your Jira instance under http://jira.yourhost.com 87 | 1. Enter license information and setup admin account. 88 | 1. Have fun using Jira! 89 | 90 | ## Setup Confluence 91 | 92 | Configure your Confluence yourself and fill it with a test license. 93 | 94 | 1. Access your Confluence instance under http://confluence.yourhost.com 95 | 1. Choose `Production Installation` because we have a postgres! 96 | 1. Enter license information 97 | 1. In `Choose a Database Configuration` choose `PostgeSQL` and press `External Database` 98 | 1. In `Configure Database` press `Direct JDBC` 99 | 1. In `Configure Database` fill out the form: 100 | 101 | * Driver Class Name: `org.postgresql.Driver` 102 | * Database URL: `jdbc:postgresql://confluence_postgresql:5432/atlassiandb` 103 | * User Name: `atlassiandb` (Your entry in environment variable `ATLASSIAN_DB_USERNAME`) 104 | * Password: `atlassiandb` (Your entry in environment variable `ATLASSIAN_DB_PASSWORD`) 105 | 106 | ## Setup Bitbucket 107 | 108 | Configure your Bitbucket yourself and fill it with a test license. 109 | 110 | 1. Access your Bitbucket instance under http://bitbucket.yourhost.com 111 | 1. Choose `External` for `Database` and fill out the form: 112 | * Database Type: `PostgreSQL` 113 | * Hostname: `bitbucket_postgresql` 114 | * Port: `5432` 115 | * Database name: `atlassiandb` 116 | * Database username: `atlassiandb` (Your entry in environment variable `ATLASSIAN_DB_USERNAME`) 117 | * Database password: `atlassiandb` (Your entry in environment variable `ATLASSIAN_DB_PASSWORD`) 118 | 1. Create and enter license information 119 | 1. Fill out the rest of the installation procedure. 120 | 121 | ## Setup Crowd 122 | 123 | Configure your Crowd yourself and fill it with a test license. 124 | 125 | 1. Access your Crowd instance under http://crowd.yourhost.com 126 | 1. Choose `Set up Crowd` 127 | 1. Create and enter license information 128 | 1. Choose `New installation` 129 | 1. In `Database configuration` choose `JDBC connection` and fill out the form: 130 | * Database: PostgreSQL 131 | * Driver Class Name: `org.postgresql.Driver` 132 | * JDBC URL: `jdbc:postgresql://crowd_postgresql:5432/atlassiandb` 133 | * Username: `atlassiandb` (Your entry in environment variable `ATLASSIAN_DB_USERNAME`) 134 | * Password: `atlassiandb` (Your entry in environment variable `ATLASSIAN_DB_PASSWORD`) 135 | * Hibernate dialect: `org.hibernate.dialect.PostgreSQLDialect` 136 | 1. In `Options` choose `http://localhost:8095/crowd` for field `Base URL` otherwise you won't be able to connect later on. 137 | 1. Fill out the rest of the installation procedure. 138 | 139 | # Deploying Atlassian Https Stack 140 | 141 | You can deploy the stack with https. First you have to create Letsencrypt Ssl certificates: See Section "Letsencrypt SSL Certificates". 142 | 143 | Then start the stack with the https settings. 144 | 145 | Download the blacklabelops https settings file by running: 146 | 147 | ~~~~ 148 | .. make sure your inside the folder AtlassianStack/ .. 149 | $ curl -o /AtlassianStack/defaultHttps.env https://raw.githubusercontent.com/blacklabelops/atlassian/master/AtlassianStack/defaultHttps.env 150 | ~~~~ 151 | 152 | Now set the default environment variables: 153 | 154 | Windows: 155 | 156 | ~~~~ 157 | $ defaultHttps.bat 158 | ~~~~ 159 | 160 | > Batch command for setting environment variables. 161 | 162 | 163 | Mac/Linux: 164 | 165 | ~~~~ 166 | $ source defaultHttps.env 167 | ~~~~ 168 | 169 | > Bash command for setting environment variables. 170 | 171 | Define domain name variables: 172 | 173 | ~~~~ 174 | $ export JIRA_DOMAIN_NAME=jira.yourhost.com 175 | $ export CROWD_DOMAIN_NAME=crowd.yourhost.com 176 | $ export CONFLUENCE_DOMAIN_NAME=confluence.yourhost.com 177 | $ export BITBUCKET_DOMAIN_NAME=bitbucket.yourhost.com 178 | ~~~~ 179 | 180 | > Export is a Linux/Mac command, under Windows use SET command. 181 | 182 | Start the whole setup: 183 | 184 | ~~~~ 185 | $ docker-compose up -d 186 | ~~~~ 187 | 188 | > Jira will be accessible under https://jira.yourhost.com 189 | 190 | ## Letsencrypt SSL Certificates 191 | 192 | You need a letsencrypt chain certificate for all the required domains. 193 | 194 | Requirements: Your host must be reachable under the respective domain name. E.g. www.yourhost.com. Then 195 | run the image on the host and the certificates will be saved inside a docker volume. 196 | 197 | 1. Download the blacklabelops/letsencrypt docker-compose file by running: 198 | 199 | ~~~~ 200 | .. make sure your inside the folder AtlassianStack/ .. 201 | $ curl -o /AtlassianStack/dc-letsencrypt.yml https://raw.githubusercontent.com/blacklabelops/atlassian/master/AtlassianStack/dc-letsencrypt.yml 202 | ~~~~ 203 | 204 | 1. Define domain name variables: 205 | 206 | Windows: 207 | 208 | ~~~~ 209 | $ SET LETSENCRYPT_EMAIL="mail@youremail.com" 210 | $ SET JIRA_DOMAIN_NAME="jira.yourhost.com" 211 | $ SET CROWD_DOMAIN_NAME="crowd.yourhost.com" 212 | $ SET CONFLUENCE_DOMAIN_NAME="confluence.yourhost.com" 213 | $ SET BITBUCKET_DOMAIN_NAME="bitbucket.yourhost.com" 214 | ~~~~ 215 | 216 | Mac/Linux: 217 | 218 | ~~~~ 219 | $ export LETSENCRYPT_EMAIL=mail@youremail.com 220 | $ export JIRA_DOMAIN_NAME=jira.yourhost.com 221 | $ export CROWD_DOMAIN_NAME=crowd.yourhost.com 222 | $ export CONFLUENCE_DOMAIN_NAME=confluence.yourhost.com 223 | $ export BITBUCKET_DOMAIN_NAME=bitbucket.yourhost.com 224 | ~~~~ 225 | 226 | > Export is a Linux/Mac command. 227 | 228 | 1. Install certificates in stack ssl_certificates volume: 229 | 230 | ~~~~ 231 | $ docker-compose -f dc-letsencrypt.yml run --rm -p 443:443 letsencrypt install 232 | ~~~~ 233 | 234 | > Certificate for all domains will be saves inside the appropriate volume. 235 | -------------------------------------------------------------------------------- /AtlassianStack/docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: '2' 2 | 3 | services: 4 | nginx: 5 | image: blacklabelops/nginx:${ATLASSIAN_NGINX_VERSION} 6 | ports: 7 | - '443:443' 8 | - '80:80' 9 | networks: 10 | default: 11 | aliases: 12 | - '${CONFLUENCE_DOMAIN_NAME}' 13 | - '${CROWD_DOMAIN_NAME}' 14 | - '${BITBUCKET_DOMAIN_NAME}' 15 | - '${JIRA_DOMAIN_NAME}' 16 | volumes: 17 | - nginx_volume:/home/nginx 18 | - ssl_certificates:/etc/letsencrypt 19 | environment: 20 | - 'TZ=${ATLASSIAN_TIME_ZONE}' 21 | - 'NGINX_REDIRECT_PORT80=${ATLASSIAN_PORT80_REDIRECT}' 22 | - 'SERVER1SERVER_NAME=${JIRA_DOMAIN_NAME}' 23 | - 'SERVER1REVERSE_PROXY_LOCATION1=/' 24 | - 'SERVER1REVERSE_PROXY_PASS1=http://jira:8080' 25 | - 'SERVER1HTTPS_ENABLED=${ATLASSIAN_HTTPS}' 26 | - 'SERVER1HTTP_ENABLED=${ATLASSIAN_HTTP}' 27 | - 'SERVER1LETSENCRYPT_CERTIFICATES=${ATLASSIAN_HTTPS}' 28 | - 'SERVER1CERTIFICATE_FILE=/etc/letsencrypt/live/${JIRA_DOMAIN_NAME}/fullchain.pem' 29 | - 'SERVER1CERTIFICATE_KEY=/etc/letsencrypt/live/${JIRA_DOMAIN_NAME}/privkey.pem' 30 | - 'SERVER1CERTIFICATE_TRUSTED=/etc/letsencrypt/live/${JIRA_DOMAIN_NAME}/fullchain.pem' 31 | - 'SERVER1PROXY_APPLICATION=jira' 32 | - 'SERVER2SERVER_NAME=${CROWD_DOMAIN_NAME}' 33 | - 'SERVER2REVERSE_PROXY_LOCATION1=/' 34 | - 'SERVER2REVERSE_PROXY_PASS1=http://crowd:8095' 35 | - 'SERVER2HTTPS_ENABLED=${ATLASSIAN_HTTPS}' 36 | - 'SERVER2HTTP_ENABLED=${ATLASSIAN_HTTP}' 37 | - 'SERVER2LETSENCRYPT_CERTIFICATES=${ATLASSIAN_HTTPS}' 38 | - 'SERVER2CERTIFICATE_FILE=/etc/letsencrypt/live/${JIRA_DOMAIN_NAME}/fullchain.pem' 39 | - 'SERVER2CERTIFICATE_KEY=/etc/letsencrypt/live/${JIRA_DOMAIN_NAME}/privkey.pem' 40 | - 'SERVER2CERTIFICATE_TRUSTED=/etc/letsencrypt/live/${JIRA_DOMAIN_NAME}/fullchain.pem' 41 | - 'SERVER2PROXY_APPLICATION=crowd' 42 | - 'SERVER3SERVER_NAME=${CONFLUENCE_DOMAIN_NAME}' 43 | - 'SERVER3REVERSE_PROXY_LOCATION1=/synchrony' 44 | - 'SERVER3REVERSE_PROXY_PASS1=http://confluence:8091' 45 | - 'SERVER3REVERSE_PROXY_APPLICATION1=confluence6' 46 | - 'SERVER3REVERSE_PROXY_LOCATION2=/' 47 | - 'SERVER3REVERSE_PROXY_PASS2=http://confluence:8090' 48 | - 'SERVER3REVERSE_PROXY_APPLICATION2=confluence' 49 | - 'SERVER3HTTPS_ENABLED=${ATLASSIAN_HTTPS}' 50 | - 'SERVER3HTTP_ENABLED=${ATLASSIAN_HTTP}' 51 | - 'SERVER3LETSENCRYPT_CERTIFICATES=${ATLASSIAN_HTTPS}' 52 | - 'SERVER3CERTIFICATE_FILE=/etc/letsencrypt/live/${JIRA_DOMAIN_NAME}/fullchain.pem' 53 | - 'SERVER3CERTIFICATE_KEY=/etc/letsencrypt/live/${JIRA_DOMAIN_NAME}/privkey.pem' 54 | - 'SERVER3CERTIFICATE_TRUSTED=/etc/letsencrypt/live/${JIRA_DOMAIN_NAME}/fullchain.pem' 55 | - 'SERVER3PROXY_APPLICATION=confluence' 56 | - 'SERVER4SERVER_NAME=${BITBUCKET_DOMAIN_NAME}' 57 | - 'SERVER4REVERSE_PROXY_LOCATION1=/' 58 | - 'SERVER4REVERSE_PROXY_PASS1=http://bitbucket:7990' 59 | - 'SERVER4HTTPS_ENABLED=${ATLASSIAN_HTTPS}' 60 | - 'SERVER4HTTP_ENABLED=${ATLASSIAN_HTTP}' 61 | - 'SERVER4LETSENCRYPT_CERTIFICATES=${ATLASSIAN_HTTPS}' 62 | - 'SERVER4CERTIFICATE_FILE=/etc/letsencrypt/live/${JIRA_DOMAIN_NAME}/fullchain.pem' 63 | - 'SERVER4CERTIFICATE_KEY=/etc/letsencrypt/live/${JIRA_DOMAIN_NAME}/privkey.pem' 64 | - 'SERVER4CERTIFICATE_TRUSTED=/etc/letsencrypt/live/${JIRA_DOMAIN_NAME}/fullchain.pem' 65 | - 'SERVER4PROXY_APPLICATION=bitbucket' 66 | restart: unless-stopped 67 | jira_postgresql: 68 | image: blacklabelops/postgres:${ATLASSIAN_POSTGRES_VERSION} 69 | hostname: jira_postgresql 70 | volumes: 71 | - jira_postgresql_volume:/var/lib/postgresql/data 72 | environment: 73 | - 'TZ=${ATLASSIAN_TIME_ZONE}' 74 | - 'POSTGRES_DB=atlassiandb' 75 | - 'POSTGRES_USER=${ATLASSIAN_DB_USERNAME}' 76 | - 'POSTGRES_PASSWORD=${ATLASSIAN_DB_PASSWORD}' 77 | - 'POSTGRES_ENCODING=UNICODE' 78 | - 'POSTGRES_COLLATE=C' 79 | - 'POSTGRES_COLLATE_TYPE=C' 80 | restart: unless-stopped 81 | jira: 82 | image: blacklabelops/jira:${JIRA_VERSION} 83 | hostname: jira 84 | volumes: 85 | - jira_volume:/var/atlassian/jira 86 | environment: 87 | - 'TZ=${ATLASSIAN_TIME_ZONE}' 88 | - "CATALINA_OPTS=${JIRA_JAVA_OPTIONS}" 89 | - "JIRA_PROXY_NAME=${JIRA_DOMAIN_NAME}" 90 | - "JIRA_PROXY_PORT=${ATLASSIAN_PROXY_PORT}" 91 | - "JIRA_PROXY_SCHEME=${ATLASSIAN_PROXY_SCHEME}" 92 | - 'JIRA_DATABASE_URL=postgresql://${ATLASSIAN_DB_USERNAME}@jira_postgresql/atlassiandb' 93 | - 'JIRA_DB_PASSWORD=${ATLASSIAN_DB_PASSWORD}' 94 | - 'JIRA_DELAYED_START=${ATLASSIAN_DB_DELAYED_START}' 95 | restart: unless-stopped 96 | crowd_postgresql: 97 | image: blacklabelops/postgres:${ATLASSIAN_POSTGRES_VERSION} 98 | container_name: crowd_postgresql 99 | hostname: crowd_postgresql 100 | volumes: 101 | - crowd_postgresql_volume:/var/lib/postgresql 102 | environment: 103 | - 'TZ=${ATLASSIAN_TIME_ZONE}' 104 | - 'POSTGRES_DB=atlassiandb' 105 | - 'POSTGRES_USER=${ATLASSIAN_DB_USERNAME}' 106 | - 'POSTGRES_PASSWORD=${ATLASSIAN_DB_PASSWORD}' 107 | restart: unless-stopped 108 | crowd: 109 | image: blacklabelops/crowd:${CROWD_VERSION} 110 | hostname: crowd 111 | volumes: 112 | - crowd_volume:/var/atlassian/crowd 113 | environment: 114 | - 'TZ=${ATLASSIAN_TIME_ZONE}' 115 | - "CROWD_PROXY_NAME=${CROWD_DOMAIN_NAME}" 116 | - "CROWD_PROXY_PORT=${ATLASSIAN_PROXY_PORT}" 117 | - "CROWD_PROXY_SCHEME=${ATLASSIAN_PROXY_SCHEME}" 118 | - "CROWD_URL=http://localhost:8095" 119 | - "SPLASH_CONTEXT=" 120 | - "CROWD_CONTEXT=ROOT" 121 | - "CROWDID_CONTEXT=" 122 | - "OPENID_CLIENT_CONTEXT=" 123 | restart: unless-stopped 124 | confluence_postgresql: 125 | image: blacklabelops/postgres:${ATLASSIAN_POSTGRES_VERSION} 126 | hostname: confluence_postgresql 127 | volumes: 128 | - confluence_postgresql_volume:/var/lib/postgresql 129 | environment: 130 | - 'TZ=${ATLASSIAN_TIME_ZONE}' 131 | - 'POSTGRES_DB=atlassiandb' 132 | - 'POSTGRES_USER=${ATLASSIAN_DB_USERNAME}' 133 | - 'POSTGRES_PASSWORD=${ATLASSIAN_DB_PASSWORD}' 134 | restart: unless-stopped 135 | confluence: 136 | image: blacklabelops/confluence:${CONFLUENCE_VERSION} 137 | hostname: confluence 138 | volumes: 139 | - confluence_volume:/var/atlassian/confluence 140 | environment: 141 | - 'TZ=${ATLASSIAN_TIME_ZONE}' 142 | - "CATALINA_OPTS=${CONFLUENCE_JAVA_OPTIONS}" 143 | - "CONFLUENCE_PROXY_NAME=${CONFLUENCE_DOMAIN_NAME}" 144 | - "CONFLUENCE_PROXY_PORT=${ATLASSIAN_PROXY_PORT}" 145 | - "CONFLUENCE_PROXY_SCHEME=${ATLASSIAN_PROXY_SCHEME}" 146 | restart: unless-stopped 147 | bitbucket_postgresql: 148 | image: blacklabelops/postgres:${ATLASSIAN_POSTGRES_VERSION} 149 | container_name: bitbucket_postgresql 150 | hostname: bitbucket_postgresql 151 | volumes: 152 | - bitbucket_postgresql_volume:/var/lib/postgresql/data 153 | environment: 154 | - 'TZ=${ATLASSIAN_TIME_ZONE}' 155 | - 'POSTGRES_DB=atlassiandb' 156 | - 'POSTGRES_USER=${ATLASSIAN_DB_USERNAME}' 157 | - 'POSTGRES_PASSWORD=${ATLASSIAN_DB_PASSWORD}' 158 | - 'POSTGRES_ENCODING=UTF8' 159 | restart: unless-stopped 160 | bitbucket: 161 | image: blacklabelops/bitbucket:${BITBUCKET_VERSION} 162 | hostname: bitbucket 163 | ports: 164 | - 7999:7999 165 | volumes: 166 | - bitbucket_volume:/var/atlassian/bitbucket 167 | environment: 168 | - 'TZ=${ATLASSIAN_TIME_ZONE}' 169 | - "CATALINA_OPTS=${BITBUCKET_JAVA_OPTIONS}" 170 | - "BITBUCKET_PROXY_NAME=${BITBUCKET_DOMAIN_NAME}" 171 | - "BITBUCKET_PROXY_PORT=${ATLASSIAN_PROXY_PORT}" 172 | - "BITBUCKET_PROXY_SCHEME=${ATLASSIAN_PROXY_SCHEME}" 173 | restart: unless-stopped 174 | 175 | volumes: 176 | nginx_volume: 177 | external: false 178 | ssl_certificates: 179 | external: false 180 | jira_postgresql_volume: 181 | external: false 182 | jira_volume: 183 | external: false 184 | crowd_postgresql_volume: 185 | external: false 186 | crowd_volume: 187 | external: false 188 | confluence_postgresql_volume: 189 | external: false 190 | confluence_volume: 191 | external: false 192 | bitbucket_postgresql_volume: 193 | external: false 194 | bitbucket_volume: 195 | external: false 196 | --------------------------------------------------------------------------------