GitLab is a popular platform for managing software development projects, providing features such as version control, issue tracking, continuous integration and deployment, and more. In this tutorial, we will show you how to install GitLab on Ubuntu 22 using Docker Compose.
Prerequisites
Before we begin, make sure you have the following prerequisites:
- A server running Ubuntu 20.04.
- Docker and Docker Compose installed on your server. You can install Docker using the following command:
sudo apt update
sudo apt install docker.io
- Docker Compose can be installed using the following commands:
sudo apt update
sudo apt install docker-compose
Step 1: Create the Docker Compose File
Create a new directory where you will store the GitLab Docker Compose file, and navigate to it:
mkdir gitlab
cd gitlab
mkdir config
mkdir logs
mkdir data
mkdir certificates
Create a new file named docker-compose.yml
using your preferred text editor, and paste the following content into it:
version: '3'
services:
gitlab:
image: gitlab/gitlab-ce:latest
restart: always
environment:
GITLAB_OMNIBUS_CONFIG: |
external_url 'https://gitlab.example.com'
gitlab_rails['gitlab_shell_ssh_port'] = 22
puma['workers'] = 2
puma['worker_timeout'] = 3600
puma['max_threads'] = 4
puma['min_threads'] = 1
puma['log_level'] = 'info'
puma['enable_early_hints'] = true
postgresql['shared_buffers'] = '256MB'
postgresql['max_connections'] = 200
nginx['ssl_certificate'] = "/etc/gitlab/ssl/cert.pem"
nginx['ssl_certificate_key'] = "/etc/gitlab/ssl/cert.key"
ports:
- "80:80"
- "443:443"
- "22:22"
volumes:
- /gitlab/config:/etc/gitlab
- /gitlab/logs:/var/log/gitlab
- /gitlab/data:/var/opt/gitlab
- /gitlab/certificates:/etc/gitlab/ssl
networks:
- gitlab_network
gitlab-runner:
image: gitlab/gitlab-runner:v14.3.2
container_name: runner
restart: always
depends_on:
- gitlab
volumes:
- ./config/gitlab-runner:/etc/gitlab-runner
- /var/run/docker.sock:/var/run/docker.sock
networks:
- gitlab_network
mariadb:
image: mariadb:latest
restart: always
environment:
- MYSQL_HOST=<MYSQLSERVER>
- MYSQL_ROOT_PASSWORD=<MYSQLROOTPASSWORD>
- MYSQL_DATABASE=<MYSQLDATABASE>
- MYSQL_USER=<MYSQLUSER>
- MYSQL_PASSWORD=<MYSQLPASSWORD>
volumes:
- /data/mariadb:/var/lib/mysql
networks:
- gitlab_network
certbot:
image: certbot/certbot:latest
restart: always
volumes:
- /gitlab/certificates:/etc/letsencrypt
environment:
- CLOUDFLARE_EMAIL=example@example.com
- CLOUDFLARE_API_KEY=your_cloudflare_api_key
- CERTBOT_EMAIL=example@example.com
- CERTBOT_DOMAIN=example.com
command: certonly --dns-cloudflare --dns-cloudflare-credentials /root/cloudflare.ini --email $CERTBOT_EMAIL --agree-tos --no-eff-email --force-renewal -d $CERTBOT_DOMAIN
depends_on:
- gitlab
networks:
- gitlab_network
networks:
gitlab_network:
driver: bridge
secrets:
gitlab_root_password:
file: ./root_password.txt
Here’s a brief explanation of each service:
gitlab
: This service runs a container using thegitlab/gitlab-ce:latest
image. It exposes ports 80, 443, and 22 and mounts several volumes to persist data. The environment variableGITLAB_OMNIBUS_CONFIG
is used to configure various settings such as the external URL, SSH port, Puma workers and threads, PostgreSQL shared buffers and max connections, and Nginx SSL certificate and key.gitlab-runner
: This service runs a container using thegitlab/gitlab-runner:v14.3.2
image. It depends on thegitlab
service and mounts two volumes: one for the GitLab Runner configuration and one for the Docker socket. This allows the runner to use the host’s Docker daemon to run jobs.mariadb
: This service runs a container using themariadb:latest
image. It mounts a volume to persist data and sets several environment variables to configure the MariaDB server such as the root password, database name, and user credentials.certbot
: This service runs a container using thecertbot/certbot:latest
image. It mounts a volume for storing certificates and sets several environment variables to configure Certbot such as the Cloudflare email and API key, Certbot email and domain. The command specified is used to obtain an SSL certificate using the Cloudflare DNS plugin.
Here’s an explanation of the environment variables used in each service:
gitlab
: TheGITLAB_OMNIBUS_CONFIG
variable is used to set various GitLab settings using the Omnibus configuration format. Some of the settings that can be configured include the external URL (external_url
), SSH port (gitlab_rails['gitlab_shell_ssh_port']
), Puma workers and threads (puma['workers']
,puma['worker_timeout']
,puma['max_threads']
,puma['min_threads']
), Puma log level (puma['log_level']
), Puma early hints (puma['enable_early_hints']
), PostgreSQL shared buffers (postgresql['shared_buffers']
), PostgreSQL max connections (postgresql['max_connections']
), Nginx SSL certificate (nginx['ssl_certificate']
), and Nginx SSL certificate key (nginx['ssl_certificate_key']
).mariadb
: The environment variables for this service are used to configure the MariaDB server. TheMYSQL_HOST
variable sets the hostname of the MariaDB server. TheMYSQL_ROOT_PASSWORD
variable sets the password for the root user. TheMYSQL_DATABASE
variable sets the name of the database to create. TheMYSQL_USER
andMYSQL_PASSWORD
variables set the username and password for a user that will have access to the specified database.certbot
: The environment variables for this service are used to configure Certbot and the Cloudflare DNS plugin. TheCLOUDFLARE_EMAIL
andCLOUDFLARE_API_KEY
variables set the email and API key for your Cloudflare account. TheCERTBOT_EMAIL
variable sets the email address to use for important account notifications. TheCERTBOT_DOMAIN
variable sets the domain name for which to obtain an SSL certificate.
The purpose of each volume
Volumes are used to persist data across container restarts and to share data between containers. Here’s an explanation of the purpose of each volume used in the script:
gitlab
: This service mounts four volumes:/gitlab/config:/etc/gitlab
: This volume is used to persist GitLab configuration data./gitlab/logs:/var/log/gitlab
: This volume is used to persist GitLab log data./gitlab/data:/var/opt/gitlab
: This volume is used to persist GitLab application data./gitlab/certificates:/etc/gitlab/ssl
: This volume is used to store SSL certificates for Nginx.
gitlab-runner
: This service mounts two volumes:./config/gitlab-runner:/etc/gitlab-runner
: This volume is used to persist GitLab Runner configuration data./var/run/docker.sock:/var/run/docker.sock
: This volume mounts the Docker socket from the host into the container. This allows the runner to use the host’s Docker daemon to run jobs.
mariadb
: This service mounts one volume:/data/mariadb:/var/lib/mysql
: This volume is used to persist MariaDB data.
certbot
: This service mounts one volume:/gitlab/certificates:/etc/letsencrypt
: This volume is used to store SSL certificates obtained by Certbot.
More about GitLab Omnibus configuration
GitLab Omnibus is a package that includes all the dependencies required to run GitLab, including Ruby, PostgreSQL, Redis, Nginx, and more. The Omnibus package makes it easy to install and configure GitLab on your server.
The GITLAB_OMNIBUS_CONFIG
environment variable is used to set various GitLab settings using the Omnibus configuration format. This variable contains a string of configuration options in a Ruby-like syntax. Each line sets a different configuration option.
For example, the line external_url 'https://gitlab.example.com'
sets the external URL of the GitLab instance to https://gitlab.example.com
. The line gitlab_rails['gitlab_shell_ssh_port'] = 22
sets the SSH port used by GitLab Shell to 22.
Certbot
Certbot is a free, open-source software tool for automatically using Let’s Encrypt certificates on manually-administered websites to enable HTTPS 1. It is made by the Electronic Frontier Foundation (EFF), a nonprofit organization based in San Francisco that defends digital privacy, free speech, and innovation 1.
Certbot can automate the tasks of obtaining certificates and configuring web servers to use them. It is easy to use and can be run on Unix-based operating systems 2.
Learn more:
In conclusion, this tutorial has shown you how to install GitLab on Ubuntu 22 using Docker Compose. By following the steps outlined in this tutorial, you can easily set up a GitLab instance on your server and take advantage of the many features that GitLab has to offer for managing software development projects. With Docker Compose, the installation process is simplified and streamlined, allowing you to get up and running with GitLab quickly and easily.
No responses yet