--- stage: GitLab Delivery group: Self Managed info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://handbook.gitlab.com/handbook/product/ux/technical-writing/#assignments title: Upgrade self-compiled installations --- {{< details >}} - Tier: Free, Premium, Ultimate - Offering: GitLab Self-Managed {{< /details >}} Upgrade a self-compiled installation to a later version of GitLab. If you are changing from GitLab Community Edition to GitLab Enterprise Edition, see the [Upgrading from CE to EE](upgrading_from_ce_to_ee.md) documentation. ## Upgrading to a new major version Major versions introduce backwards-incompatible changes. You should first upgrade to the latest available minor version of your current major version. Follow the [Upgrade Recommendations](../policy/maintenance.md#upgrade-recommendations) to identify the ideal upgrade path. Before upgrading to a new major version, you should ensure that any background migration jobs from previous releases have been completed. To see the current size of the `background_migration` queue, [Check for background migrations before upgrading](background_migrations.md). ## Upgrade a self-compiled instance To upgrade a self-compiled GitLab instance: 1. Consult changes for different versions of GitLab to ensure compatibility before upgrading: - [GitLab 17 changes](versions/gitlab_17_changes.md) - [GitLab 16 changes](versions/gitlab_16_changes.md) - [GitLab 15 changes](versions/gitlab_15_changes.md) 1. Check for [background migrations](background_migrations.md). All migrations must finish running before each upgrade. 1. [Create a backup](#create-a-backup). 1. [Stop GitLab](#stop-gitlab). 1. [Update Ruby](#update-ruby). 1. [Update Node.js](#update-nodejs). 1. [Update Go](#update-go). 1. [Update Git](#update-git). 1. [Update PostgreSQL](#update-postgresql). 1. [Update the GitLab codebase](#update-the-gitlab-codebase). 1. [Update configuration files](#update-configuration-files). 1. [Install libraries and run migrations](#install-libraries-and-run-migrations). 1. [Update GitLab Shell](#update-gitlab-shell). 1. [Update GitLab Workhorse](#update-gitlab-workhorse). 1. [Update Gitaly](#update-gitaly). 1. [Update GitLab Pages](#update-gitlab-pages). After you've upgraded: 1. [Start GitLab and NGINX](#start-gitlab-and-nginx). 1. [Check GitLab status](#check-gitlab-status). ### Create a backup Prerequisites: - Make sure `rsync` is installed. Perform the backup: ```shell cd /home/git/gitlab sudo -u git -H bundle exec rake gitlab:backup:create RAILS_ENV=production ``` ### Stop GitLab ```shell # For systems running systemd sudo systemctl stop gitlab.target # For systems running SysV init sudo service gitlab stop ``` ### Update Ruby In GitLab 17.5 and later, only Ruby 3.2.x is supported. Be sure to upgrade if necessary. You can check which version of Ruby you have with: ```shell ruby -v ``` [Install Ruby](https://www.ruby-lang.org/en/documentation/installation/). ### Update Node.js To check the minimum required Node.js version, see [Node.js versions](../install/installation.md#software-requirements). GitLab also requires Yarn `>= v1.10.0` to manage JavaScript dependencies. To update Yarn for Debian or Ubuntu: ```shell sudo apt-get remove yarn npm install --global yarn ``` For more information, see the [Yarn website](https://classic.yarnpkg.com/en/docs/install). ### Update Go To check the minimum required Go version, see [Go versions](../install/installation.md#software-requirements). You can check which version you are running: ```shell go version ``` Download and install Go. For example, for 64-bit Linux: ```shell # Remove former Go installation folder sudo rm -rf /usr/local/go curl --remote-name --location --progress-bar "https://go.dev/dl/go1.22.5.linux-amd64.tar.gz" echo '904b924d435eaea086515bc63235b192ea441bd8c9b198c507e85009e6e4c7f0 go1.22.5.linux-amd64.tar.gz' | shasum -a256 -c - && \ sudo tar -C /usr/local -xzf go1.22.5.linux-amd64.tar.gz sudo ln -sf /usr/local/go/bin/{go,gofmt} /usr/local/bin/ rm go1.22.5.linux-amd64.tar.gz ``` ### Update Git To check you are running the minimum required Git version, see [Git versions](../install/installation.md#software-requirements). Use the [Git version provided by Gitaly](https://gitlab.com/gitlab-org/gitaly/-/issues/2729) that: - Is always at the version required by GitLab. - May contain custom patches required for proper operation. ```shell # Install dependencies sudo apt-get install -y libcurl4-openssl-dev libexpat1-dev gettext libz-dev libssl-dev libpcre2-dev build-essential # Clone the Gitaly repository git clone https://gitlab.com/gitlab-org/gitaly.git -b /tmp/gitaly # Compile and install Git cd /tmp/gitaly sudo make git GIT_PREFIX=/usr/local ``` Replace `` with the stable branch that matches the GitLab version you want to install. For example, if you want to install GitLab 16.7, use the branch name `16-7-stable`. Remember to set `git -> bin_path` to `/usr/local/bin/git` in `config/gitlab.yml`. ### Update PostgreSQL The latest version of GitLab might depend on a more recent PostgreSQL version than what you are running. You may also have to enable some extensions. For more information, see the [PostgreSQL requirements](../install/requirements.md#postgresql) {{< alert type="warning" >}} GitLab 18.0 requires PostgreSQL 16. {{< /alert >}} To upgrade PostgreSQL, refer to its [documentation](https://www.postgresql.org/docs/16/upgrading.html). ### Update the GitLab codebase To update your clone of the GitLab codebase: 1. Fetch repository metadata: ```shell cd /home/git/gitlab sudo -u git -H git fetch --all --prune sudo -u git -H git checkout -- Gemfile.lock db/structure.sql locale ``` 1. Check out the branch for the version you want to upgrade to: - For GitLab Community Edition: ```shell cd /home/git/gitlab sudo -u git -H git checkout ``` - For GitLab Enterprise Edition: ```shell cd /home/git/gitlab sudo -u git -H git checkout ``` ### Update configuration files To update configuration files for an upgrade, apply new configuration options for: - `gitlab.yml` - `database.yml` - NGINX (or Apache) - SMTP - systemd - SysV #### New configuration for `gitlab.yml` There might be new configuration options available for [`gitlab.yml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/gitlab.yml.example). 1. View possible new configuration: ```shell cd /home/git/gitlab git diff origin/PREVIOUS_BRANCH:config/gitlab.yml.example origin/BRANCH:config/gitlab.yml.example ``` 1. Apply new configuration manually to your current `gitlab.yml`. #### New configuration for `database.yml` {{< history >}} - [Changed](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/119139) in GitLab 16.0 to have `ci:` section in `config/database.yml.postgresql`. {{< /history >}} There might be new configuration options available for [`database.yml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/database.yml.postgresql). 1. View possible new configuration: ```shell cd /home/git/gitlab git diff origin/PREVIOUS_BRANCH:config/database.yml.postgresql origin/BRANCH:config/database.yml.postgresql ``` 1. Apply new configuration manually to your current `database.yml`: #### New configuration for NGINX or Apache Ensure you're still up-to-date with the latest NGINX configuration changes: ```shell cd /home/git/gitlab # For HTTPS configurations git diff origin/PREVIOUS_BRANCH:lib/support/nginx/gitlab-ssl origin/BRANCH:lib/support/nginx/gitlab-ssl # For HTTP configurations git diff origin/PREVIOUS_BRANCH:lib/support/nginx/gitlab origin/BRANCH:lib/support/nginx/gitlab ``` The GitLab application no longer sets Strict-Transport-Security in your installation. You must enable it in your NGINX configuration to continue using it. If you are using Apache instead of NGINX, see the updated [Apache templates](https://gitlab.com/gitlab-org/gitlab-recipes/tree/master/web-server/apache). Because Apache does not support upstreams behind Unix sockets, you must let GitLab Workhorse listen on a TCP port by using [`/etc/default/gitlab`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/support/init.d/gitlab.default.example#L38). #### SMTP configuration If you use SMTP to deliver mail, you must add the following line to `config/initializers/smtp_settings.rb`: ```ruby ActionMailer::Base.delivery_method = :smtp ``` See [`smtp_settings.rb.sample`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/initializers/smtp_settings.rb.sample#L13) for an example. #### Configure systemd units 1. Check if the systemd units have been updated: ```shell cd /home/git/gitlab git diff origin/PREVIOUS_BRANCH:lib/support/systemd origin/BRANCH:lib/support/systemd ``` 1. Copy them over: ```shell sudo mkdir -p /usr/local/lib/systemd/system sudo cp lib/support/systemd/* /usr/local/lib/systemd/system/ sudo systemctl daemon-reload ``` #### Configure SysV init script There might be new configuration options available for [`gitlab.default.example`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/support/init.d/gitlab.default.example). 1. View possible new configuration: ```shell cd /home/git/gitlab git diff origin/PREVIOUS_BRANCH:lib/support/init.d/gitlab.default.example origin/BRANCH:lib/support/init.d/gitlab.default.example ``` 1. Apply them manually to your current `/etc/default/gitlab`. Ensure you're still up-to-date with the latest init script changes: ```shell cd /home/git/gitlab sudo cp lib/support/init.d/gitlab /etc/init.d/gitlab ``` If you are using the init script on a system running systemd as init, because you have not switched to native systemd units yet, run: ```shell sudo systemctl daemon-reload ``` ### Install libraries and run migrations 1. Make sure you have the required [PostgreSQL extensions](../install/requirements.md#postgresql). 1. Install the needed libraries: ```shell cd /home/git/gitlab # If you haven't done so during installation or a previous upgrade already sudo -u git -H bundle config set --local deployment 'true' sudo -u git -H bundle config set --local without 'development test kerberos' # Update gems sudo -u git -H bundle install # Optional: clean up old gems sudo -u git -H bundle clean # Run database migrations sudo -u git -H bundle exec rake db:migrate RAILS_ENV=production # Update node dependencies and recompile assets sudo -u git -H bundle exec rake yarn:install gitlab:assets:clean gitlab:assets:compile RAILS_ENV=production NODE_ENV=production NODE_OPTIONS="--max_old_space_size=4096" # Clean up cache sudo -u git -H bundle exec rake cache:clear RAILS_ENV=production ``` ### Update GitLab Shell To update GitLab Shell: ```shell cd /home/git/gitlab-shell sudo -u git -H git fetch --all --tags --prune sudo -u git -H git checkout v$(