{"id":51066,"date":"2025-07-30T04:19:10","date_gmt":"2025-07-30T04:19:10","guid":{"rendered":"https:\/\/www.devopsschool.com\/blog\/?p=51066"},"modified":"2025-07-30T06:50:10","modified_gmt":"2025-07-30T06:50:10","slug":"artifactory-setting-up-artifactory-7-high-availability-cluster","status":"publish","type":"post","link":"https:\/\/www.devopsschool.com\/blog\/artifactory-setting-up-artifactory-7-high-availability-cluster\/","title":{"rendered":"Artifactory: Setting up Artifactory 7 High Availability Cluster"},"content":{"rendered":"\n<p>Here is a comprehensive, step-by-step guide to <strong>design, configure, and deploy JFrog Artifactory 7.x in High Availability (HA) mode<\/strong>\u2014including all architectural and configuration considerations required for a successful, production-grade setup.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>I. Planning &amp; Architecture<\/strong><\/h2>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>A. Core Components of Artifactory HA<\/strong><\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Cluster Nodes:<\/strong> 2+ Artifactory servers, all running the same exact version.<\/li>\n\n\n\n<li><strong>External Database:<\/strong> A supported, highly-available relational DB (PostgreSQL preferred for HA).<\/li>\n\n\n\n<li><strong>Shared Filestore:<\/strong> All nodes must access the same binary store\u2014either via NFS (for filesystem) or object\/cloud storage.<\/li>\n\n\n\n<li><strong>Load Balancer:<\/strong> Distributes traffic evenly to all Artifactory nodes.<\/li>\n\n\n\n<li><strong>Licenses:<\/strong> Each node requires a unique, valid Enterprise (X or +) or Edge license<a href=\"https:\/\/jfrog.com\/help\/r\/jfrog-installation-setup-documentation\/artifactory-ha-installation\" target=\"_blank\" rel=\"noreferrer noopener\">1<\/a><a href=\"https:\/\/jfrog.com\/help\/r\/jfrog-installation-setup-documentation\/high-availability\" target=\"_blank\" rel=\"noreferrer noopener\">2<\/a><a href=\"https:\/\/jfrog.com\/solution-sheet\/get-ready-for-high-availability\/\" target=\"_blank\" rel=\"noreferrer noopener\">3<\/a>.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>B. Network and Placement<\/strong><\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>All cluster nodes, filestore, DB, and LB should reside on the same high-speed, low-latency LAN.<\/li>\n\n\n\n<li>Open required TCP ports for node-to-node traffic and node-to-shared resources<a href=\"https:\/\/jfrog.com\/help\/r\/jfrog-installation-setup-documentation\/artifactory-ha-installation\" target=\"_blank\" rel=\"noreferrer noopener\">1<\/a><a href=\"https:\/\/jfrog.com\/help\/r\/jfrog-installation-setup-documentation\/installing-artifactory\" target=\"_blank\" rel=\"noreferrer noopener\">4<\/a><a href=\"https:\/\/www.devopsschool.com\/slide\/storage\/training_logos\/345_fRQFX0dAAO2WhuVJ8JWaCFQeaH1865DW\/logo_345_1649840838_Artifactory-High-Availability.pdf\" target=\"_blank\" rel=\"noreferrer noopener\">5<\/a>.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>II. Infrastructure Preparation<\/strong><\/h2>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>1. External Database (e.g., PostgreSQL)<\/strong><\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Set up the DB on a reliable, HA-capable platform (consider failover and backup).<\/li>\n\n\n\n<li>Create a dedicated Artifactory DB user and database.<\/li>\n\n\n\n<li><strong>Important:<\/strong> Grant all privileges needed, especially on the <code>public<\/code> schema<a href=\"https:\/\/jfrog.com\/help\/r\/jfrog-installation-setup-documentation\/configure-artifactory-ha-to-use-postgresql-database-in-ha\" target=\"_blank\" rel=\"noreferrer noopener\">6<\/a>.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>2. Shared Filestore<\/strong><\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Option 1:<\/strong> NFS mount accessible by all nodes (recommended for on-premises).<\/li>\n\n\n\n<li><strong>Option 2:<\/strong> Cloud\/object storage (S3, GCS, Azure Blob) for cloud-native install<a href=\"https:\/\/jfrog.com\/help\/r\/jfrog-installation-setup-documentation\/cloud-native-high-availability\" target=\"_blank\" rel=\"noreferrer noopener\">7<\/a><a href=\"https:\/\/jfrog.com\/usecase\/pragmatic-scalability-hood-artifactory-ha\/\" target=\"_blank\" rel=\"noreferrer noopener\">8<\/a>.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>3. Load Balancer<\/strong><\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Install an LB (HAProxy, NGINX, F5, AWS ELB, etc.).<\/li>\n\n\n\n<li>Configure: Sticky sessions (if needed), TCP\/HTTP health checks, SSL termination.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>4. Artifactory Nodes<\/strong><\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Deploy multiple Artifactory 7.x nodes on dedicated hosts\/VMs\/containers.<\/li>\n\n\n\n<li>Ensure consistent OS, network, Java, and software patch levels.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>III. Software Installation Steps<\/strong><\/h2>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>1. Download &amp; Install Artifactory 7.x<\/strong><\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Download the appropriate Artifactory distribution (archive, RPM\/DEB, Docker, Helm).<\/li>\n\n\n\n<li>Unpack\/install on each node in your cluster<a href=\"https:\/\/jfrog.com\/help\/r\/jfrog-installation-setup-documentation\/installing-artifactory\" target=\"_blank\" rel=\"noreferrer noopener\">4<\/a>.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>2. Configure System YAML on Each Node<\/strong><\/h2>\n\n\n\n<p>Configure <code>$JFROG_HOME\/artifactory\/var\/etc\/system.yaml<\/code>:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"><code>shared:<br>  node:<br>    id: &lt;unique-node-id>            # Unique value per node, e.g., art1, art2<br>    ip: &lt;this-node's-IP><br>  database:<br>    type: postgresql<br>    driver: org.postgresql.Driver<br>    url: \"jdbc:postgresql:\/\/db1:5432,db2:5432\/artifactory?targetServerType=primary\"<br>    username: artifactory<br>    password: \"&lt;your-db-password>\"<br>  filestore:<br>    type: file-system<br>    dir: \"\/mnt\/nfs-volume\/filestore\"    # or S3\/object config as needed<br>  # Optional: taskAffinity can be set to 'any' for all, for cloud-native HA<br><\/code><\/pre>\n\n\n\n<p><strong>Other must-have config:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>License key for this node<\/li>\n\n\n\n<li>Join key (cluster secret)<a href=\"https:\/\/jfrog.com\/help\/r\/jfrog-installation-setup-documentation\/cloud-native-high-availability\" target=\"_blank\" rel=\"noreferrer noopener\">7<\/a><\/li>\n\n\n\n<li>Communication ports and clustering configs<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>3. Verify Permissions<\/strong><\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>All nodes must be able to:\n<ul class=\"wp-block-list\">\n<li>Read\/write the shared filestore directory\/object bucket<\/li>\n\n\n\n<li>Connect to the database using their configured credentials<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>4. Place JDBC Driver<\/strong><\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Copy the PostgreSQL (or chosen DB) JDBC driver <code>.jar<\/code> to each node&#8217;s <code>$JFROG_HOME\/artifactory\/var\/bootstrap\/artifactory\/tomcat\/lib<\/code><a href=\"https:\/\/jfrog.com\/help\/r\/jfrog-installation-setup-documentation\/installing-artifactory\" target=\"_blank\" rel=\"noreferrer noopener\">4<\/a>.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>IV. Cluster Bootstrap<\/strong><\/h2>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>1. Start the First Node<\/strong><\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Start Artifactory on Node 1; perform initial setup\/licensing via web UI or REST.<\/li>\n\n\n\n<li>Add the HA license for this node.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>2. Join Additional Nodes<\/strong><\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Repeat install\/config for each node, using a unique <code>node.id<\/code> per node, same <code>join.key<\/code>, and same DB\/storage config.<\/li>\n\n\n\n<li>For each, add its unique license via the running Artifactory UI.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>3. Configure the Load Balancer<\/strong><\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Add all node IPs and service ports (default 8082).<\/li>\n\n\n\n<li>Ensure health checking and failover are enabled.<\/li>\n\n\n\n<li>Optionally: Enable SSL termination.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>V. Post-Deployment Tasks<\/strong><\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Verify HA Status:<\/strong> Log into the Admin UI, check Cluster Status.<\/li>\n\n\n\n<li><strong>Logs:<\/strong> Ensure each node logs a unique Node ID and appears in the cluster list<a href=\"https:\/\/jfrog.com\/help\/r\/jfrog-installation-setup-documentation\/verify-the-ha-installation-and-configuration\" target=\"_blank\" rel=\"noreferrer noopener\">9<\/a>.<\/li>\n\n\n\n<li><strong>Backups:<\/strong> Set up system and DB backups for HA cluster integrity.<\/li>\n\n\n\n<li><strong>Monitor:<\/strong> Enable service-level monitoring and alerting for all core infrastructure.<\/li>\n\n\n\n<li><strong>Test:<\/strong> Simulate node failures and ensure traffic\/load is handled seamlessly.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>VI. Configuration Checklist<\/strong><\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Requirement<\/th><th>How to Configure<\/th><\/tr><\/thead><tbody><tr><td><strong>HA License<\/strong><\/td><td>Each node must have a <em>unique<\/em> enterprise (X\/+) license<\/td><\/tr><tr><td><strong>External Database<\/strong><\/td><td>Use JDBC in <code>system.yaml<\/code> under <code>shared: database:<\/code><\/td><\/tr><tr><td><strong>Shared Filestore<\/strong><\/td><td><code>filestore:<\/code> config pointing to NFS\/object location<\/td><\/tr><tr><td><strong>Cluster Join Key<\/strong><\/td><td>Set in <code>system.yaml<\/code> or during first setup<\/td><\/tr><tr><td><strong>Node IDs<\/strong><\/td><td>Each node&#8217;s <code>node: id:<\/code> unique across cluster<\/td><\/tr><tr><td><strong>Load Balancer<\/strong><\/td><td>Route external access to all nodes<\/td><\/tr><tr><td><strong>Firewall<\/strong><\/td><td>Open needed cluster (inter-node), DB, storage, LB ports<\/td><\/tr><tr><td><strong>Permissions<\/strong><\/td><td>RW access to filestore; full DB privileges on schema<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>VII. What&#8217;s New in Artifactory 7.x Cloud-Native HA<\/strong><\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Masterless mode:<\/strong> All nodes can perform scheduler\/GC\/backups (<code>taskAffinity: any<\/code>)<\/li>\n\n\n\n<li><strong>Self-healing:<\/strong> Any node can pick up cluster tasks, improving failover<a href=\"https:\/\/jfrog.com\/help\/r\/jfrog-installation-setup-documentation\/cloud-native-high-availability\" target=\"_blank\" rel=\"noreferrer noopener\">7<\/a><\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Additional Best Practices<\/strong><\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Always pin all nodes to the same version\u2014upgrade via rolling restarts.<\/li>\n\n\n\n<li>For best resilience, use 3+ nodes if possible.<\/li>\n\n\n\n<li>Store binaries on robust backend storage with snapshot\/DR processes.<\/li>\n\n\n\n<li>For PostgreSQL HA, use a failover cluster and specify multiple DB hosts in the JDBC URL<a href=\"https:\/\/jfrog.com\/help\/r\/jfrog-installation-setup-documentation\/configure-artifactory-ha-to-use-postgresql-database-in-ha\" target=\"_blank\" rel=\"noreferrer noopener\">6<\/a>.<\/li>\n<\/ul>\n\n\n\n<p>By following these design and setup instructions, you will achieve a <strong>highly available, scalable, and resilient Artifactory 7 cluster<\/strong> that meets production-grade HA requirements\u2014including robust database\/storage architecture, network design, full configuration coverage, and operational tips for ongoing administration.<\/p>\n\n\n\n<p>If you need sample <code>system.yaml<\/code> or specific configuration samples for your storage or DB platform, please ask!<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Another METHOD<\/h2>\n\n\n\n<p>Certainly! Here\u2019s a <strong>detailed, up-to-date, step-by-step guide<\/strong> to set up <strong>JFrog Artifactory 7.x High Availability (HA)<\/strong> with design considerations, infrastructure, and all config files required.<br>This is written for <strong>self-hosted Linux VMs\/EC2<\/strong>, PostgreSQL, and NFS\/EFS as shared filestore.<br>It follows JFrog\u2019s 7.x architecture, best practices, and includes references for each step.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">\ud83d\udfe2 <strong>Artifactory 7.x High Availability (HA) Setup Guide<\/strong><\/h1>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">1\ufe0f\u20e3 <strong>Design &amp; Architecture Planning<\/strong><\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Minimum nodes:<\/strong> 2 application nodes (recommended 3+ for resilience)<\/li>\n\n\n\n<li><strong>Shared filestore:<\/strong> Required (NFS or AWS EFS)<\/li>\n\n\n\n<li><strong>Shared database:<\/strong> Required (e.g., PostgreSQL\/MySQL\/Aurora)<\/li>\n\n\n\n<li><strong>Load balancer:<\/strong> Required in front of all nodes (e.g., Nginx, HAProxy, AWS ELB)<\/li>\n\n\n\n<li><strong>Network:<\/strong> All nodes must be in the same LAN\/VPC (low latency).<\/li>\n\n\n\n<li><strong>Service user:<\/strong> Run Artifactory as the same OS user on all nodes (<code>artifactory<\/code>).<\/li>\n<\/ul>\n\n\n\n<p><strong>Example Reference Design:<\/strong><\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">             +---------------------------+\n             |        Load Balancer      |\n             +------------+--------------+\n                          |\n           +--------------+--------------+\n           |                             |\n   +-------+--------+           +--------+-------+\n   | Artifactory 1  |           | Artifactory 2  |   ... (Artifactory N)\n   +-------+--------+           +--------+-------+\n           |                             |\n           +-------------+---------------+\n                         |\n            +------------+-------------+\n            |    Shared Storage (EFS\/NFS)\n            +--------------------------+\n            |    Shared Database (PGSQL\/MySQL)\n            +--------------------------+\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">2\ufe0f\u20e3 <strong>Infrastructure Preparation<\/strong><\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Provision servers<\/strong>: At least 2 Linux VMs\/EC2, identical OS.<\/li>\n\n\n\n<li><strong>Create\/prepare shared filestore<\/strong>: NFS or AWS EFS.<\/li>\n\n\n\n<li><strong>Set up PostgreSQL\/MySQL<\/strong>: Accessible to all nodes, with one DB &amp; user.<\/li>\n\n\n\n<li><strong>Set up a load balancer<\/strong>: Round-robin TCP\/HTTP forwarding to all nodes\u2019 <code>:8082<\/code>.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">3\ufe0f\u20e3 <strong>Install Artifactory on All Nodes<\/strong><\/h2>\n\n\n\n<p>Repeat on <strong>each node<\/strong>:<\/p>\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\"><span class=\"hljs-comment\"># RHEL\/CentOS<\/span>\nsudo yum install -y nfs-utils\n<span class=\"hljs-comment\"># or Ubuntu\/Debian<\/span>\nsudo apt update &amp;&amp; sudo apt install -y nfs-common\n\n<span class=\"hljs-comment\"># Mount the shared filestore (EFS\/NFS)<\/span>\nsudo mkdir -p \/mnt\/efs\nsudo mount -t nfs4 &lt;efs_or_nfs_dns&gt;:\/ \/mnt\/efs\n\n<span class=\"hljs-comment\"># Optional: add to \/etc\/fstab for persistency<\/span>\n\n<span class=\"hljs-comment\"># Download &amp; install Artifactory<\/span>\nwget https:<span class=\"hljs-comment\">\/\/releases.jfrog.io\/artifactory\/artifactory-pro\/rpm\/jfrog-artifactory-pro-&lt;version&gt;.rpm<\/span>\nsudo yum install -y jfrog-artifactory-pro-&lt;version&gt;.rpm\n\n<span class=\"hljs-comment\"># or, for Debian\/Ubuntu:<\/span>\nwget https:<span class=\"hljs-comment\">\/\/releases.jfrog.io\/artifactory\/artifactory-pro\/deb\/jfrog-artifactory-pro-&lt;version&gt;.deb<\/span>\nsudo apt install -y .\/jfrog-artifactory-pro-&lt;version&gt;.deb\n\n<span class=\"hljs-comment\"># Create artifactory user\/group if not auto-created<\/span>\n<\/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\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">4\ufe0f\u20e3 <strong>Database Setup (Once Only)<\/strong><\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Create a DB and user<\/strong> (PostgreSQL example):<\/li>\n<\/ul>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">sudo -u postgres psql\nCREATE DATABASE artifactory WITH ENCODING UTF8;\nCREATE USER artifactory WITH PASSWORD <span class=\"hljs-string\">'YourStrongPassword!'<\/span>;\nGRANT ALL PRIVILEGES ON DATABASE artifactory TO artifactory;\n\\q\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><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<ul class=\"wp-block-list\">\n<li>Make sure <strong>all nodes<\/strong> can reach the database.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">5\ufe0f\u20e3 <strong>Configure <code>system.yaml<\/code> on All Nodes<\/strong><\/h2>\n\n\n\n<p><strong>Location:<\/strong><br><code>\/opt\/jfrog\/artifactory\/var\/etc\/system.yaml<\/code><\/p>\n\n\n\n<p><strong>Minimal HA section:<\/strong><\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">shared:\n  node:\n    id: &lt;unique-node-id&gt;          <span class=\"hljs-comment\"># (Must be unique per node, e.g., \"art1\", \"art2\", \"art3\")<\/span>\n  database:\n    type: postgresql\n    url: jdbc:postgresql:<span class=\"hljs-comment\">\/\/&lt;db-host&gt;:5432\/artifactory<\/span>\n    username: artifactory\n    password: YourStrongPassword!\n  extraJavaOpts: <span class=\"hljs-string\">\"-Xms2g -Xmx2g\"<\/span>  <span class=\"hljs-comment\"># Example: Tune as needed<\/span>\n  <span class=\"hljs-comment\"># Required for HA<\/span>\n  haEnabled: <span class=\"hljs-keyword\">true<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><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<ul class=\"wp-block-list\">\n<li>Set <strong><code>node.id<\/code> uniquely on every node!<\/strong><\/li>\n\n\n\n<li>All other configs (database, filestore) should be identical.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">6\ufe0f\u20e3 <strong>Configure Shared Filestore on All Nodes<\/strong><\/h2>\n\n\n\n<p><strong>Edit <code>binarystore.xml<\/code>:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Path: <code>\/opt\/jfrog\/artifactory\/var\/etc\/artifactory\/binarystore.xml<\/code><\/li>\n\n\n\n<li>Example for EFS\/NFS:<\/li>\n<\/ul>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">config<\/span> <span class=\"hljs-attr\">version<\/span>=<span class=\"hljs-string\">\"2\"<\/span>&gt;<\/span>\n  <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">chain<\/span> <span class=\"hljs-attr\">template<\/span>=<span class=\"hljs-string\">\"file-system\"<\/span>\/&gt;<\/span>\n  <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">provider<\/span> <span class=\"hljs-attr\">id<\/span>=<span class=\"hljs-string\">\"file-system\"<\/span> <span class=\"hljs-attr\">type<\/span>=<span class=\"hljs-string\">\"file-system\"<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">fileStoreDir<\/span>&gt;<\/span>\/mnt\/efs<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">fileStoreDir<\/span>&gt;<\/span>\n  <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">provider<\/span>&gt;<\/span>\n<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">config<\/span>&gt;<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><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\n<p><em>(All nodes must mount the same EFS\/NFS path and have this file identical.)<\/em><\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">7\ufe0f\u20e3 <strong>Permissions on Shared Storage<\/strong><\/h2>\n\n\n\n<p>On <strong>each node<\/strong>:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">sudo chown -R artifactory:artifactory \/mnt\/efs\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">8\ufe0f\u20e3 <strong>Start Artifactory on All Nodes<\/strong><\/h2>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">sudo systemctl start artifactory\nsudo systemctl status artifactory\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">9\ufe0f\u20e3 <strong>Configure Load Balancer<\/strong><\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Forward traffic to all Artifactory nodes on port 8082.<\/li>\n\n\n\n<li>Use sticky sessions if possible (for UI).<\/li>\n\n\n\n<li>Health checks: <code>\/artifactory\/webapp\/#\/login<\/code> or <code>\/artifactory\/api\/system\/ping<\/code>.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83d\udd1f <strong>Verify HA Cluster<\/strong><\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Access Artifactory via load balancer IP: <code>http:\/\/&lt;lb-ip>:8082<\/code><\/li>\n\n\n\n<li>In the UI: Admin \u2192 High Availability \u2192 See all nodes listed and healthy.<\/li>\n\n\n\n<li>Upload\/download artifacts, check for replication across nodes.<\/li>\n\n\n\n<li>Check logs for errors or cluster warnings.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">1\ufe0f\u20e31\ufe0f\u20e3 <strong>Best Practices<\/strong><\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>All nodes must be same Artifactory version.<\/li>\n\n\n\n<li>Clock sync (NTP) across all nodes and DB.<\/li>\n\n\n\n<li>Secure your NFS\/EFS mounts (restrict by security group\/ACL).<\/li>\n\n\n\n<li>Monitor health via <code>\/api\/system\/ha\/nodes<\/code>.<\/li>\n\n\n\n<li>Use SSL\/HTTPS on your load balancer for production.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">1\ufe0f\u20e32\ufe0f\u20e3 <strong>Extra (Optional Advanced)<\/strong><\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Set up <strong>access service<\/strong> for SSO\/permissions sharing (automatic in 7.x).<\/li>\n\n\n\n<li>Scale horizontally by adding more nodes (update LB and assign new <code>node.id<\/code>).<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>References<\/strong><\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/jfrog.com\/help\/r\/jfrog-installation-setup-documentation\/artifactory-high-availability\" target=\"_blank\" rel=\"noopener\">JFrog HA Install Guide (Official)<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/jfrog.com\/help\/r\/jfrog-installation-setup-documentation\/system-requirements-ha\" target=\"_blank\" rel=\"noopener\">HA System Requirements<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/jfrog.com\/help\/r\/jfrog-installation-setup-documentation\/filestore-configuration\" target=\"_blank\" rel=\"noopener\">Shared Filestore Setup<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/jfrog.com\/help\/r\/jfrog-platform-administration-documentation\/system-configuration-file\" target=\"_blank\" rel=\"noopener\">system.yaml reference<\/a><\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Summary Table<\/strong><\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Component<\/th><th>Recommendation<\/th><\/tr><\/thead><tbody><tr><td>Nodes<\/td><td>2+ (identical OS\/version)<\/td><\/tr><tr><td>Filestore<\/td><td>Shared (EFS or NFS)<\/td><\/tr><tr><td>Database<\/td><td>Shared (PostgreSQL\/MySQL)<\/td><\/tr><tr><td>Load Balancer<\/td><td>Required (L7\/L4, sticky sessions preferred)<\/td><\/tr><tr><td>Node Config<\/td><td>Unique <code>node.id<\/code>, identical DB\/storage config<\/td><\/tr><tr><td>Storage Perms<\/td><td><code>artifactory:artifactory<\/code> on NFS\/EFS<\/td><\/tr><tr><td>Cluster State<\/td><td>Verify in UI\/Admin\/API<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Absolutely! Here are <strong>sample config files<\/strong> for a typical <strong>JFrog Artifactory 7.x High Availability (HA) setup<\/strong> using PostgreSQL and NFS\/EFS for the shared filestore.<\/h2>\n\n\n\n<p>These examples assume:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>3 Artifactory nodes<\/strong> (node1, node2, node3).<\/li>\n\n\n\n<li>All nodes use the same shared NFS\/EFS path (e.g., <code>\/mnt\/efs<\/code>).<\/li>\n\n\n\n<li>Database is on host <code>db.example.com<\/code>, with DB\/user <code>artifactory<\/code> and password <code>SuperSecretPW<\/code>.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">1\ufe0f\u20e3 <strong>system.yaml<\/strong> (on each node)<\/h2>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>\ud83d\udd39 <strong><code>node.id<\/code> must be unique per node!<\/strong><br>\ud83d\udd39 All other config (DB, storage, etc.) must be identical on all nodes.<\/p>\n<\/blockquote>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Node 1 Example (<code>\/opt\/jfrog\/artifactory\/var\/etc\/system.yaml<\/code>):<\/strong><\/h3>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">shared:\n  node:\n    id: art1           <span class=\"hljs-comment\"># CHANGE for each node: art1, art2, art3, etc.<\/span>\n  database:\n    type: postgresql\n    driver: org.postgresql.Driver\n    url: jdbc:postgresql:<span class=\"hljs-comment\">\/\/db.example.com:5432\/artifactory<\/span>\n    username: artifactory\n    password: SuperSecretPW\n  extraJavaOpts: <span class=\"hljs-string\">\"-Xms4g -Xmx4g\"<\/span>\n  haEnabled: <span class=\"hljs-keyword\">true<\/span>\n\nlogging:\n  consoleLog:\n    enabled: <span class=\"hljs-keyword\">true<\/span>\n\nartifactory:\n  joinKey: <span class=\"hljs-string\">\"YOUR-ARTIFACTORY-HA-JOIN-KEY\"<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><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<ul class=\"wp-block-list\">\n<li>On <strong>Node 2<\/strong>, change <code>id: art2<\/code>, and so on.<\/li>\n\n\n\n<li><code>joinKey<\/code> can be generated via the first node\u2019s UI or CLI; must be identical across all nodes in the cluster.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">2\ufe0f\u20e3 <strong>binarystore.xml<\/strong> (all nodes)<\/h2>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>\ud83d\udd39 <strong>All nodes must have the same file, pointing to the shared NFS\/EFS path.<\/strong><\/p>\n<\/blockquote>\n\n\n\n<p><strong>Location:<\/strong><br><code>\/opt\/jfrog\/artifactory\/var\/etc\/artifactory\/binarystore.xml<\/code><\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-6\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">config<\/span> <span class=\"hljs-attr\">version<\/span>=<span class=\"hljs-string\">\"2\"<\/span>&gt;<\/span>\n  <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">chain<\/span> <span class=\"hljs-attr\">template<\/span>=<span class=\"hljs-string\">\"file-system\"<\/span>\/&gt;<\/span>\n  <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">provider<\/span> <span class=\"hljs-attr\">id<\/span>=<span class=\"hljs-string\">\"file-system\"<\/span> <span class=\"hljs-attr\">type<\/span>=<span class=\"hljs-string\">\"file-system\"<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">fileStoreDir<\/span>&gt;<\/span>\/mnt\/efs<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">fileStoreDir<\/span>&gt;<\/span>\n  <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">provider<\/span>&gt;<\/span>\n<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">config<\/span>&gt;<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-6\"><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\n<ul class=\"wp-block-list\">\n<li>If your filestore is under a subdirectory, adjust <code>&lt;fileStoreDir><\/code> accordingly (e.g., <code>\/mnt\/efs\/artifactory-filestore<\/code>).<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">3\ufe0f\u20e3 <strong>PostgreSQL Connection Example<\/strong><\/h2>\n\n\n\n<p><strong>Artifactory DB user must have full privileges<\/strong> on the <code>artifactory<\/code> database and <code>public<\/code> schema.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">4\ufe0f\u20e3 <strong>\/etc\/fstab<\/strong> (all nodes) \u2014 for persistent EFS\/NFS mount<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-7\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml\">fs-xxxxxx.efs.<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">region<\/span>&gt;<\/span>.amazonaws.com:\/ \/mnt\/efs nfs4 defaults,_netdev 0 0\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-7\"><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\n<p>or for on-prem NFS:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-8\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">nfs-server.example.com:<span class=\"hljs-regexp\">\/export\/<\/span>artifactory \/mnt\/efs nfs defaults,_netdev <span class=\"hljs-number\">0<\/span> <span class=\"hljs-number\">0<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-8\"><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<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">5\ufe0f\u20e3 <strong>Permissions (run on every node)<\/strong><\/h2>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">sudo chown -R artifactory:artifactory \/mnt\/efs\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">6\ufe0f\u20e3 <strong>Example Load Balancer (nginx.conf fragment)<\/strong><\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-9\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">upstream artifactory_ha {\n    server art1.example.com:<span class=\"hljs-number\">8082<\/span>;\n    server art2.example.com:<span class=\"hljs-number\">8082<\/span>;\n    server art3.example.com:<span class=\"hljs-number\">8082<\/span>;\n}\nserver {\n    listen <span class=\"hljs-number\">80<\/span>;\n    server_name artifactory.example.com;\n\n    location \/ {\n        proxy_pass http:<span class=\"hljs-comment\">\/\/artifactory_ha;<\/span>\n        proxy_set_header Host $host;\n        proxy_set_header X-Forwarded-<span class=\"hljs-keyword\">For<\/span> $proxy_add_x_forwarded_for;\n        proxy_set_header X-Forwarded-Proto $scheme;\n    }\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-9\"><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<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p><em>Enable sticky sessions if possible for the UI, especially with advanced load balancers.<\/em><\/p>\n<\/blockquote>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">7\ufe0f\u20e3 <strong>Minimal PostgreSQL Privileges (for reference)<\/strong><\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-10\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">GRANT ALL ON DATABASE artifactory TO artifactory;\nGRANT ALL ON SCHEMA <span class=\"hljs-keyword\">public<\/span> TO artifactory;\nALTER SCHEMA <span class=\"hljs-keyword\">public<\/span> OWNER TO artifactory;\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-10\"><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<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83d\udfe2 <strong>Recap<\/strong><\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>system.yaml<\/code> \u2192 Unique node ID, identical DB\/storage config, same join key<\/li>\n\n\n\n<li><code>binarystore.xml<\/code> \u2192 All nodes, points to the same EFS\/NFS path<\/li>\n\n\n\n<li>All nodes mount shared filestore identically<\/li>\n\n\n\n<li>Load balancer points to all nodes<\/li>\n\n\n\n<li>DB user has full schema permissions<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Here is a comprehensive, step-by-step guide to design, configure, and deploy JFrog Artifactory 7.x in High Availability (HA) mode\u2014including all architectural and configuration considerations required for a successful, production-grade setup&#8230;. <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"","sticky":false,"template":"","format":"standard","meta":{"_joinchat":[],"footnotes":""},"categories":[4879],"tags":[],"class_list":["post-51066","post","type-post","status-publish","format-standard","hentry","category-artifactory"],"_links":{"self":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/51066","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=51066"}],"version-history":[{"count":2,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/51066\/revisions"}],"predecessor-version":[{"id":51068,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/51066\/revisions\/51068"}],"wp:attachment":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/media?parent=51066"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/categories?post=51066"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/tags?post=51066"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}