Install Sourcegraph with Docker Compose on Digital Ocean
This tutorial shows you how to deploy Sourcegraph via Docker Compose to a single Droplet running on DigitalOcean.
(optional, recommended) Create a fork for customizations
We strongly recommend that you create your own fork of sourcegraph/deploy-sourcegraph-docker to track customizations to the Sourcegraph Docker Compose yaml. This will make upgrades far easier.
See "Store customizations in a fork" for full instructions.
Run Sourcegraph on a Digital Ocean Droplet
-
Create a new Digital Ocean Droplet.
- Set the operating system to be Ubuntu 18.04.
- For droplet size: use the resource estimator to find a good starting point for your deployment.
- (optional, recommended) Set up SSH access (Authentication > SSH keys) for convenient access to the droplet.
- (optional, recommended) Check the "Enable backups" checkbox to enable weekly backups of all your data.
-
In the "Select additional options" section of the Droplet creation page, select the "User Data" and "Monitoring" boxes, and paste the following script in the "
Enter user data here...
" text box:- (optional) If you created a fork as recommended above, update the following environment variables in the script below:
DEPLOY_SOURCEGRAPH_DOCKER_FORK_CLONE_URL
: Your fork's git clone URLDEPLOY_SOURCEGRAPH_DOCKER_FORK_REVISION
: The git revision containing your fork's customizations to the base Sourcegraph Docker Compose yaml. Most likely,DEPLOY_SOURCEGRAPH_DOCKER_FORK_REVISION='release'
if you followed our branching recommendations in "Store customizations in a fork".
- (optional) If you created a fork as recommended above, update the following environment variables in the script below:
#!/usr/bin/env bash set -euxo pipefail PERSISTENT_DISK_DEVICE_NAME='/dev/sda' DOCKER_DATA_ROOT='/mnt/docker-data' DOCKER_COMPOSE_VERSION='1.25.3' DEPLOY_SOURCEGRAPH_DOCKER_CHECKOUT='/root/deploy-sourcegraph-docker' # 🚨 Update these variables with the correct values from your fork! DEPLOY_SOURCEGRAPH_DOCKER_FORK_CLONE_URL='https://github.com/sourcegraph/deploy-sourcegraph-docker.git' DEPLOY_SOURCEGRAPH_DOCKER_FORK_REVISION='v3.14.2' # Install git sudo apt-get update -y sudo apt-get install -y git # Clone Docker Compose definition git clone "${DEPLOY_SOURCEGRAPH_DOCKER_FORK_CLONE_URL}" "${DEPLOY_SOURCEGRAPH_DOCKER_CHECKOUT}" cd "${DEPLOY_SOURCEGRAPH_DOCKER_CHECKOUT}" git checkout "${DEPLOY_SOURCEGRAPH_DOCKER_FORK_REVISION}" # Format (if necessary) and mount DO persistent disk device_fs=$(sudo lsblk "${PERSISTENT_DISK_DEVICE_NAME}" --noheadings --output fsType) if [ "${device_fs}" == "" ] ## only format the volume if it isn't already formatted then sudo mkfs.ext4 -m 0 -E lazy_itable_init=0,lazy_journal_init=0,discard "${PERSISTENT_DISK_DEVICE_NAME}" fi sudo mkdir -p "${DOCKER_DATA_ROOT}" sudo mount -o discard,defaults "${PERSISTENT_DISK_DEVICE_NAME}" "${DOCKER_DATA_ROOT}" # Mount DO disk on reboots DISK_UUID=$(sudo blkid -s UUID -o value "${PERSISTENT_DISK_DEVICE_NAME}") sudo echo "UUID=${DISK_UUID} ${DOCKER_DATA_ROOT} ext4 discard,defaults,nofail 0 2" >> '/etc/fstab' umount "${DOCKER_DATA_ROOT}" mount -a # Install Docker curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" sudo apt-get update -y apt-cache policy docker-ce apt-get install -y docker-ce docker-ce-cli containerd.io # Install jq for scripting sudo apt-get update -y sudo apt-get install -y jq # Edit Docker storage directory to mounted volume DOCKER_DAEMON_CONFIG_FILE='/etc/docker/daemon.json' ## initialize the config file with empty json if it doesn't exist if [ ! -f "${DOCKER_DAEMON_CONFIG_FILE}" ] then mkdir -p $(dirname "${DOCKER_DAEMON_CONFIG_FILE}") echo '{}' > "${DOCKER_DAEMON_CONFIG_FILE}" fi ## update Docker's 'data-root' to point to our mounted disk tmp_config=$(mktemp) trap "rm -f ${tmp_config}" EXIT sudo cat "${DOCKER_DAEMON_CONFIG_FILE}" | sudo jq --arg DATA_ROOT "${DOCKER_DATA_ROOT}" '.["data-root"]=$DATA_ROOT' > "${tmp_config}" sudo cat "${tmp_config}" > "${DOCKER_DAEMON_CONFIG_FILE}" ## finally, restart Docker daemon to pick up our changes sudo systemctl restart --now docker # Install Docker Compose curl -L "https://github.com/docker/compose/releases/download/${DOCKER_COMPOSE_VERSION}/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose chmod +x /usr/local/bin/docker-compose curl -L "https://raw.githubusercontent.com/docker/compose/${DOCKER_COMPOSE_VERSION}/contrib/completion/bash/docker-compose" -o /etc/bash_completion.d/docker-compose # Run Sourcegraph. Restart the containers upon reboot. cd "${DEPLOY_SOURCEGRAPH_DOCKER_CHECKOUT}"/docker-compose docker-compose up -d
-
Click on "Add Volume" and add new block storage with the following settings:
- Size: We recommend > 250 GB. (As a rule of thumb, Sourcegraph needs at least as much space as all your repositories combined take up. Allocating as much disk space as you can upfront helps you avoid needing to select a droplet with a larger root disk later on.)
- Under Chose configuration options, select "Manually Format and Mount"
-
You may have to wait a minute or two for the instance to finish initializing before Sourcegraph becomes accessible. You can monitor the status by SSHing into the Droplet and running the following diagnostic commands:
# Follow the status of the user data script you provided earlier tail -f /var/log/cloud-init-output.log # (Once the user data script completes) monitor the health of the "sourcegraph-frontend" container docker ps --filter="name=sourcegraph-frontend-0"
- Navigate to the droplet's IP address to finish initializing Sourcegraph. If you have configured a DNS entry for the IP, configure
externalURL
to reflect that.
After initialization
After initial setup, we recommend you do the following:
- Restrict the accessibility of ports other than
80
and443
via Cloud Firewalls. - Set up TLS/SSL) in the Docker Compose deployment
Update your Sourcegraph version
To update to the most recent version of Sourcegraph (X.Y.Z), SSH into your instance and run the following:
cd /root/deploy-sourcerph-docker/docker-compose git pull git checkout vX.Y.Z docker-compose up -d
Storage and Backups
The Sourcegraph Docker Compose definition uses Docker volumes to store its data. The script above configures Docker to store all Docker data on the additional block storage volume that was attached to the droplet (mounted at /mnt/docker-data
- the volumes themselves are stored under /mnt/docker-data/volumes
) There are a few different ways to backup this data:
-
(recommended) The most straightfoward method to backup this data is to snapshot the entire
/mnt/docker-data
block storage volume on an automatic scheduled basis. -
Using an external Postgres instance (see below) lets a service such as Digital Ocean's Managed Database for Postgres take care of backing up all of Sourcegraph's user data for you. If the droplet running Sourcegraph ever dies or is destroyed, creating a fresh droplet that's connected to that external Postgres will leave Sourcegraph in the same state that it was before.
Using an external database for persistence
The Docker Compose configuration has its own internal PostgreSQL and Redis databases. To preserve this data when you kill and recreate the containers, you can use external services for persistence, such as Digital Ocean Managed Databases for Postgres, Redis, and Spaces for storing user uploads.