{"id":459,"date":"2026-10-14T13:01:25","date_gmt":"2026-10-14T13:01:25","guid":{"rendered":"http:\/\/www.scmgalaxy.com\/tutorials\/2015\/11\/21\/install-and-configure-gerrit2-in-centos-and-ubantu\/"},"modified":"2026-10-14T13:01:25","modified_gmt":"2026-10-14T13:01:25","slug":"install-and-configure-gerrit2-in-centos-and-ubantu","status":"publish","type":"post","link":"https:\/\/www.devopsschool.com\/blog\/install-and-configure-gerrit2-in-centos-and-ubantu\/","title":{"rendered":"Install and Configure Gerrit on CentOS and Ubuntu (MySQL + Apache Reverse Proxy)"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\"><em>Originally published on 2015-11-21; fully revised and updated.<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This guide walks DevOps and platform engineers through a clean Gerrit installation flow on Linux, based on the original CentOS\/Ubuntu post and expanded into a production-oriented checklist. You will install prerequisites, configure MySQL\/MariaDB, initialize Gerrit, place Apache in front as a reverse proxy, and verify that the service is reachable.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img decoding=\"async\" src=\"https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2015\/11\/install-and-configure-gerri.png\" alt=\"gerrit2-installation-configuration\"\/><\/figure>\n<\/div>\n\n\n<h2 class=\"wp-block-heading\">Installation workflow at a glance<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Use this sequence to keep installation and troubleshooting predictable.<\/p>\n\n\n\n<pre class=\"mermaid\">\nflowchart TD\n    A[Update OS packages] --> B[Install Git Java and tools]\n    B --> C[Provision MySQL database]\n    C --> D[Download Gerrit WAR]\n    D --> E[Run Gerrit init]\n    E --> F[Start Gerrit service]\n    F --> G[Configure Apache reverse proxy]\n    G --> H[Verify web and logs]\n<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Prerequisites and planning<\/h2>\n\n\n\n<ul class=\"wp-block-list\"><li>A Linux host (CentOS\/RHEL or Ubuntu\/Debian) with sudo access.<\/li><li>DNS or host mapping for the Gerrit URL you plan to expose via Apache.<\/li><li>Open network access for HTTP\/HTTPS (and SSH for Gerrit if you plan to use it).<\/li><li>A Java runtime version supported by your chosen Gerrit release.<\/li><li>A database backend (the original post used MySQL-family tooling).<\/li><\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Important:<\/strong> the original post references Gerrit 2.9.1. Treat that as a legacy example and select a currently supported Gerrit release from official documentation before production rollout.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Install base packages on CentOS\/RHEL and Ubuntu\/Debian<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The package names and service names can differ by distribution and version. The table below provides a practical mapping for common setups.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Task<\/th><th>CentOS\/RHEL (typical)<\/th><th>Ubuntu\/Debian (typical)<\/th><\/tr><\/thead><tbody><tr><td>Update package metadata<\/td><td>sudo yum update -y (or dnf update -y)<\/td><td>sudo apt-get update<\/td><\/tr><tr><td>Install Git<\/td><td>sudo yum install -y git<\/td><td>sudo apt-get install -y git<\/td><\/tr><tr><td>Install Screen<\/td><td>sudo yum install -y screen<\/td><td>sudo apt-get install -y screen<\/td><\/tr><tr><td>Install Java<\/td><td>sudo yum install -y java-11-openjdk<\/td><td>sudo apt-get install -y openjdk-11-jre<\/td><\/tr><tr><td>Install Apache<\/td><td>sudo yum install -y httpd<\/td><td>sudo apt-get install -y apache2<\/td><\/tr><tr><td>Install MariaDB\/MySQL<\/td><td>sudo yum install -y mariadb-server<\/td><td>sudo apt-get install -y mariadb-server<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php language-bash\"><span class=\"hljs-comment\"># CentOS\/RHEL example<\/span>\nsudo yum update -y\nsudo yum install -y git screen java<span class=\"hljs-number\">-11<\/span>-openjdk mariadb-server httpd<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php language-bash\"><span class=\"hljs-comment\"># Ubuntu\/Debian example<\/span>\nsudo apt-get update\nsudo apt-get install -y git screen openjdk<span class=\"hljs-number\">-11<\/span>-jre mariadb-server apache2<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Create the Gerrit database (MySQL\/MariaDB example)<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The original article includes MySQL as a setup step. The following SQL creates a dedicated database and user for Gerrit.<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs language-bash\">sudo mysql -u root -p<\/code><\/span><\/pre>\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript language-sql\">CREATE DATABASE gerritdb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;\nCREATE USER <span class=\"hljs-string\">'gerrit'<\/span>@<span class=\"hljs-string\">'localhost'<\/span> IDENTIFIED BY <span class=\"hljs-string\">'change_me'<\/span>;\nGRANT ALL PRIVILEGES ON gerritdb.* TO <span class=\"hljs-string\">'gerrit'<\/span>@<span class=\"hljs-string\">'localhost'<\/span>;\nFLUSH PRIVILEGES;<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Download and initialize Gerrit<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The original post used a direct WAR download and interactive setup. The same pattern is shown below. Replace the legacy version with your chosen release.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript language-bash\">sudo useradd --system --home \/opt\/gerrit --create-home --shell \/bin\/bash gerrit\nsudo su - gerrit\ncd \/opt\/gerrit\nwget https:<span class=\"hljs-comment\">\/\/gerrit-releases.storage.googleapis.com\/gerrit-2.9.1.war<\/span>\njava -jar gerrit<span class=\"hljs-number\">-2.9<\/span><span class=\"hljs-number\">.1<\/span>.war init --site-path \/opt\/gerrit\/review_site<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Start, stop, and restart Gerrit<\/h2>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs language-bash\">cd \/opt\/gerrit\/review_site\n.\/bin\/gerrit.sh start\n.\/bin\/gerrit.sh stop\n.\/bin\/gerrit.sh restart<\/code><\/span><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Install Apache and configure reverse proxy to Gerrit<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Placing Apache in front of Gerrit gives you a standard entry point for HTTP\/HTTPS and simplifies endpoint management.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml language-apacheconf\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">VirtualHost<\/span> *<span class=\"hljs-attr\">:80<\/span>&gt;<\/span>\n    ServerName gerrit.example.com\n\n    ProxyPreserveHost On\n    AllowEncodedSlashes NoDecode\n    ProxyPass \/ http:\/\/127.0.0.1:8080\/\n    ProxyPassReverse \/ http:\/\/127.0.0.1:8080\/\n<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">VirtualHost<\/span>&gt;<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-6\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php language-bash\"><span class=\"hljs-comment\"># Ubuntu\/Debian<\/span>\nsudo a2enmod proxy proxy_http headers\nsudo systemctl restart apache2\n\n<span class=\"hljs-comment\"># CentOS\/RHEL<\/span>\nsudo systemctl enable httpd\nsudo systemctl restart httpd<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-6\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Verification checklist<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-7\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php language-bash\"><span class=\"hljs-comment\"># Gerrit backend port<\/span>\nss -lntp | grep <span class=\"hljs-number\">8080<\/span>\n\n<span class=\"hljs-comment\"># Direct backend response<\/span>\ncurl -I http:<span class=\"hljs-comment\">\/\/127.0.0.1:8080\/<\/span>\n\n<span class=\"hljs-comment\"># Apache front-end response<\/span>\ncurl -I http:<span class=\"hljs-comment\">\/\/127.0.0.1\/<\/span>\n\n<span class=\"hljs-comment\"># Gerrit logs<\/span>\ntail -n <span class=\"hljs-number\">100<\/span> \/opt\/gerrit\/review_site\/logs\/error_log<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-7\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">References from the original post<\/h2>\n\n\n\n<ul class=\"wp-block-list\"><li>Screen command reference: <a href=\"http:\/\/www.tecmint.com\/screen-command-examples-to-manage-linux-terminals\/\">http:\/\/www.tecmint.com\/screen-command-examples-to-manage-linux-terminals\/<\/a><\/li><li>Gerrit quick install docs: <a href=\"https:\/\/gerrit-review.googlesource.com\/Documentation\/install-quick.html\">https:\/\/gerrit-review.googlesource.com\/Documentation\/install-quick.html<\/a><\/li><li>OpenStack review install docs: <a href=\"https:\/\/review.openstack.org\/Documentation\/install.html\">https:\/\/review.openstack.org\/Documentation\/install.html<\/a><\/li><li>Legacy Gerrit docs URL: <a href=\"https:\/\/gerrit.googlecode.com\/svn\/documentation\/2.0\/install.html\">https:\/\/gerrit.googlecode.com\/svn\/documentation\/2.0\/install.html<\/a><\/li><li>Additional legacy walkthroughs: <a href=\"http:\/\/dachary.org\/?p=1716\">http:\/\/dachary.org\/?p=1716<\/a>, <a href=\"https:\/\/www.rosehosting.com\/blog\/how-to-install-gerrit2-on-a-centos-7-linux-vps\/\">https:\/\/www.rosehosting.com\/blog\/how-to-install-gerrit2-on-a-centos-7-linux-vps\/<\/a>, <a href=\"https:\/\/www.digitalocean.com\/community\/tutorials\/how-to-install-gerrit-on-an-ubuntu-cloud-server\">https:\/\/www.digitalocean.com\/community\/tutorials\/how-to-install-gerrit-on-an-ubuntu-cloud-server<\/a><\/li><\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Common pitfalls<\/h2>\n\n\n\n<ul class=\"wp-block-list\"><li>Using an outdated Gerrit version from old tutorials without checking current support status.<\/li><li>Java runtime mismatch with the selected Gerrit release.<\/li><li>Database credentials created correctly but not entered correctly during Gerrit init.<\/li><li>Apache proxy modules not enabled (common on Debian\/Ubuntu).<\/li><li>Troubleshooting from browser errors only instead of checking Gerrit and Apache logs together.<\/li><\/ul>\n","protected":false},"excerpt":{"rendered":"<p>A practical, step-by-step guide to installing Gerrit for code review on CentOS\/RHEL and Ubuntu\/Debian. Includes package command comparisons, setup workflow, Apache proxy configuration, and verification checks.<\/p>\n","protected":false},"author":1,"featured_media":3147,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_joinchat":[],"footnotes":""},"categories":[558],"tags":[535,254,945,1340,1344,1345,1342,1343,1346,1122,545,237,593,1339,213,1341],"class_list":["post-459","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-source-code-management","tag-centos","tag-configure","tag-gerrit","tag-gerrit2","tag-gerrit2-configuration-in-centos","tag-gerrit2-configuration-in-ubantu","tag-gerrit2-installation-in-centos","tag-gerrit2-installation-in-ubantu","tag-gerrit2-tutorial","tag-guide","tag-how","tag-install","tag-process","tag-step","tag-tutorial","tag-ubantu"],"_links":{"self":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/459","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/comments?post=459"}],"version-history":[{"count":4,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/459\/revisions"}],"predecessor-version":[{"id":79334,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/459\/revisions\/79334"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/media\/3147"}],"wp:attachment":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/media?parent=459"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/categories?post=459"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/tags?post=459"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}