seafile-admin-docs/13.0/setup_binary/cluster_deployment/index.html

6385 lines
120 KiB
HTML

<!doctype html>
<html lang="en" class="no-js">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<meta name="author" content="seafile">
<link rel="canonical" href="https://haiwen.github.io/seafile-admin-docs/13.0/setup_binary/cluster_deployment/">
<link rel="prev" href="../https_with_nginx/">
<link rel="next" href="../start_seafile_at_system_bootup/">
<link rel="icon" href="../../media/favicon.ico">
<meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.7.0">
<title>Cluster Deployment - Seafile Admin Manual</title>
<link rel="stylesheet" href="../../assets/stylesheets/main.618322db.min.css">
<link rel="stylesheet" href="../../assets/stylesheets/palette.ab4e12ef.min.css">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback">
<style>:root{--md-text-font:"Roboto";--md-code-font:"Roboto Mono"}</style>
<link rel="stylesheet" href="../../stylesheets/extra.css">
<script>__md_scope=new URL("../..",location),__md_hash=e=>[...e].reduce(((e,_)=>(e<<5)-e+_.charCodeAt(0)),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+"."+e,JSON.stringify(_))}catch(e){}}</script>
</head>
<body dir="ltr" data-md-color-scheme="default" data-md-color-primary="indigo" data-md-color-accent="indigo">
<input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off">
<input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off">
<label class="md-overlay" for="__drawer"></label>
<div data-md-component="skip">
<a href="#cluster-deployment" class="md-skip">
Skip to content
</a>
</div>
<div data-md-component="announce">
</div>
<div data-md-color-scheme="default" data-md-component="outdated" hidden>
</div>
<header class="md-header" data-md-component="header">
<nav class="md-header__inner md-grid" aria-label="Header">
<a href="../.." title="Seafile Admin Manual" class="md-header__button md-logo" aria-label="Seafile Admin Manual" data-md-component="logo">
<img src="../../media/seafile-transparent-1024.png" alt="logo">
</a>
<label class="md-header__button md-icon" for="__drawer">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3zm0 5h18v2H3zm0 5h18v2H3z"/></svg>
</label>
<div class="md-header__title" data-md-component="header-title">
<div class="md-header__ellipsis">
<div class="md-header__topic">
<span class="md-ellipsis">
Seafile Admin Manual
</span>
</div>
<div class="md-header__topic" data-md-component="header-topic">
<span class="md-ellipsis">
Cluster Deployment
</span>
</div>
</div>
</div>
<form class="md-header__option" data-md-component="palette">
<input class="md-option" data-md-color-media="" data-md-color-scheme="default" data-md-color-primary="indigo" data-md-color-accent="indigo" aria-label="Switch to dark mode" type="radio" name="__palette" id="__palette_0">
<label class="md-header__button md-icon" title="Switch to dark mode" for="__palette_1" hidden>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 8a4 4 0 0 0-4 4 4 4 0 0 0 4 4 4 4 0 0 0 4-4 4 4 0 0 0-4-4m0 10a6 6 0 0 1-6-6 6 6 0 0 1 6-6 6 6 0 0 1 6 6 6 6 0 0 1-6 6m8-9.31V4h-4.69L12 .69 8.69 4H4v4.69L.69 12 4 15.31V20h4.69L12 23.31 15.31 20H20v-4.69L23.31 12z"/></svg>
</label>
<input class="md-option" data-md-color-media="" data-md-color-scheme="slate" data-md-color-primary="indigo" data-md-color-accent="indigo" aria-label="Switch to light mode" type="radio" name="__palette" id="__palette_1">
<label class="md-header__button md-icon" title="Switch to light mode" for="__palette_0" hidden>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 18c-.89 0-1.74-.2-2.5-.55C11.56 16.5 13 14.42 13 12s-1.44-4.5-3.5-5.45C10.26 6.2 11.11 6 12 6a6 6 0 0 1 6 6 6 6 0 0 1-6 6m8-9.31V4h-4.69L12 .69 8.69 4H4v4.69L.69 12 4 15.31V20h4.69L12 23.31 15.31 20H20v-4.69L23.31 12z"/></svg>
</label>
</form>
<script>var palette=__md_get("__palette");if(palette&&palette.color){if("(prefers-color-scheme)"===palette.color.media){var media=matchMedia("(prefers-color-scheme: light)"),input=document.querySelector(media.matches?"[data-md-color-media='(prefers-color-scheme: light)']":"[data-md-color-media='(prefers-color-scheme: dark)']");palette.color.media=input.getAttribute("data-md-color-media"),palette.color.scheme=input.getAttribute("data-md-color-scheme"),palette.color.primary=input.getAttribute("data-md-color-primary"),palette.color.accent=input.getAttribute("data-md-color-accent")}for(var[key,value]of Object.entries(palette.color))document.body.setAttribute("data-md-color-"+key,value)}</script>
<label class="md-header__button md-icon" for="__search">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg>
</label>
<div class="md-search" data-md-component="search" role="dialog">
<label class="md-search__overlay" for="__search"></label>
<div class="md-search__inner" role="search">
<form class="md-search__form" name="search">
<input type="text" class="md-search__input" name="query" aria-label="Search" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="search-query" required>
<label class="md-search__icon md-icon" for="__search">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11z"/></svg>
</label>
<nav class="md-search__options" aria-label="Search">
<a href="javascript:void(0)" class="md-search__icon md-icon" title="Share" aria-label="Share" data-clipboard data-clipboard-text="" data-md-component="search-share" tabindex="-1">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M18 16.08c-.76 0-1.44.3-1.96.77L8.91 12.7c.05-.23.09-.46.09-.7s-.04-.47-.09-.7l7.05-4.11c.54.5 1.25.81 2.04.81a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3c0 .24.04.47.09.7L8.04 9.81C7.5 9.31 6.79 9 6 9a3 3 0 0 0-3 3 3 3 0 0 0 3 3c.79 0 1.5-.31 2.04-.81l7.12 4.15c-.05.21-.08.43-.08.66 0 1.61 1.31 2.91 2.92 2.91s2.92-1.3 2.92-2.91A2.92 2.92 0 0 0 18 16.08"/></svg>
</a>
<button type="reset" class="md-search__icon md-icon" title="Clear" aria-label="Clear" tabindex="-1">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"/></svg>
</button>
</nav>
<div class="md-search__suggest" data-md-component="search-suggest"></div>
</form>
<div class="md-search__output">
<div class="md-search__scrollwrap" tabindex="0" data-md-scrollfix>
<div class="md-search-result" data-md-component="search-result">
<div class="md-search-result__meta">
Initializing search
</div>
<ol class="md-search-result__list" role="presentation"></ol>
</div>
</div>
</div>
</div>
</div>
<div class="md-header__source">
<a href="https://github.com/haiwen/seafile-admin-docs/" title="Go to repository" class="md-source" data-md-component="source">
<div class="md-source__icon md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M439.6 236.1 244 40.5c-5.4-5.5-12.8-8.5-20.4-8.5s-15 3-20.4 8.4L162.5 81l51.5 51.5c27.1-9.1 52.7 16.8 43.4 43.7l49.7 49.7c34.2-11.8 61.2 31 35.5 56.7-26.5 26.5-70.2-2.9-56-37.3L240.3 199v121.9c25.3 12.5 22.3 41.8 9.1 55-6.4 6.4-15.2 10.1-24.3 10.1s-17.8-3.6-24.3-10.1c-17.6-17.6-11.1-46.9 11.2-56v-123c-20.8-8.5-24.6-30.7-18.6-45L142.6 101 8.5 235.1C3 240.6 0 247.9 0 255.5s3 15 8.5 20.4l195.6 195.7c5.4 5.4 12.7 8.4 20.4 8.4s15-3 20.4-8.4l194.7-194.7c5.4-5.4 8.4-12.8 8.4-20.4s-3-15-8.4-20.4"/></svg>
</div>
<div class="md-source__repository">
haiwen/seafile-admin-docs
</div>
</a>
</div>
</nav>
</header>
<div class="md-container" data-md-component="container">
<nav class="md-tabs" aria-label="Tabs" data-md-component="tabs">
<div class="md-grid">
<ul class="md-tabs__list">
<li class="md-tabs__item">
<a href="../.." class="md-tabs__link">
Introduction
</a>
</li>
<li class="md-tabs__item">
<a href="../../setup/overview/" class="md-tabs__link">
Setup
</a>
</li>
<li class="md-tabs__item md-tabs__item--active">
<a href="../outline/" class="md-tabs__link">
Setup (binary)
</a>
</li>
<li class="md-tabs__item">
<a href="../../extension/setup_seadoc/" class="md-tabs__link">
Extensions
</a>
</li>
<li class="md-tabs__item">
<a href="../../config/ldap_in_ce/" class="md-tabs__link">
Configuration
</a>
</li>
<li class="md-tabs__item">
<a href="../../administration/" class="md-tabs__link">
Administration
</a>
</li>
<li class="md-tabs__item">
<a href="../../upgrade/upgrade/" class="md-tabs__link">
Upgrade
</a>
</li>
<li class="md-tabs__item">
<a href="../../develop/" class="md-tabs__link">
Developing
</a>
</li>
<li class="md-tabs__item">
<a href="../../changelog/server-changelog/" class="md-tabs__link">
ChangeLog
</a>
</li>
</ul>
</div>
</nav>
<main class="md-main" data-md-component="main">
<div class="md-main__inner md-grid">
<div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" >
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--primary md-nav--lifted" aria-label="Navigation" data-md-level="0">
<label class="md-nav__title" for="__drawer">
<a href="../.." title="Seafile Admin Manual" class="md-nav__button md-logo" aria-label="Seafile Admin Manual" data-md-component="logo">
<img src="../../media/seafile-transparent-1024.png" alt="logo">
</a>
Seafile Admin Manual
</label>
<div class="md-nav__source">
<a href="https://github.com/haiwen/seafile-admin-docs/" title="Go to repository" class="md-source" data-md-component="source">
<div class="md-source__icon md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M439.6 236.1 244 40.5c-5.4-5.5-12.8-8.5-20.4-8.5s-15 3-20.4 8.4L162.5 81l51.5 51.5c27.1-9.1 52.7 16.8 43.4 43.7l49.7 49.7c34.2-11.8 61.2 31 35.5 56.7-26.5 26.5-70.2-2.9-56-37.3L240.3 199v121.9c25.3 12.5 22.3 41.8 9.1 55-6.4 6.4-15.2 10.1-24.3 10.1s-17.8-3.6-24.3-10.1c-17.6-17.6-11.1-46.9 11.2-56v-123c-20.8-8.5-24.6-30.7-18.6-45L142.6 101 8.5 235.1C3 240.6 0 247.9 0 255.5s3 15 8.5 20.4l195.6 195.7c5.4 5.4 12.7 8.4 20.4 8.4s15-3 20.4-8.4l194.7-194.7c5.4-5.4 8.4-12.8 8.4-20.4s-3-15-8.4-20.4"/></svg>
</div>
<div class="md-source__repository">
haiwen/seafile-admin-docs
</div>
</a>
</div>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_1" >
<label class="md-nav__link" for="__nav_1" id="__nav_1_label" tabindex="0">
<span class="md-ellipsis">
Introduction
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_1_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_1">
<span class="md-nav__icon md-icon"></span>
Introduction
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../.." class="md-nav__link">
<span class="md-ellipsis">
Introduction
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../introduction/file_permission_management/" class="md-nav__link">
<span class="md-ellipsis">
File permission management
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../introduction/seafile_professional_sdition_software_license_agreement/" class="md-nav__link">
<span class="md-ellipsis">
Seafile Pro edition license
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../introduction/roadmap/" class="md-nav__link">
<span class="md-ellipsis">
Roadmap
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../introduction/contribution/" class="md-nav__link">
<span class="md-ellipsis">
Contribution
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2" >
<label class="md-nav__link" for="__nav_2" id="__nav_2_label" tabindex="0">
<span class="md-ellipsis">
Setup
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_2_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_2">
<span class="md-nav__icon md-icon"></span>
Setup
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../setup/overview/" class="md-nav__link">
<span class="md-ellipsis">
Overview
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../setup/system_requirements/" class="md-nav__link">
<span class="md-ellipsis">
System requirements
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../setup/architecture/" class="md-nav__link">
<span class="md-ellipsis">
Supported architecture
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../setup/caddy/" class="md-nav__link">
<span class="md-ellipsis">
HTTPS and Caddy
</span>
</a>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2_5" >
<label class="md-nav__link" for="__nav_2_5" id="__nav_2_5_label" tabindex="0">
<span class="md-ellipsis">
Single node installation
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_2_5_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_2_5">
<span class="md-nav__icon md-icon"></span>
Single node installation
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../setup/setup_ce_by_docker/" class="md-nav__link">
<span class="md-ellipsis">
Setup community edition
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../setup/setup_pro_by_docker/" class="md-nav__link">
<span class="md-ellipsis">
Setup pro edition
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2_6" >
<label class="md-nav__link" for="__nav_2_6" id="__nav_2_6_label" tabindex="0">
<span class="md-ellipsis">
Advanced topics
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_2_6_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_2_6">
<span class="md-nav__icon md-icon"></span>
Advanced topics
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2_6_1" >
<label class="md-nav__link" for="__nav_2_6_1" id="__nav_2_6_1_label" tabindex="0">
<span class="md-ellipsis">
Storage Backends
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="3" aria-labelledby="__nav_2_6_1_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_2_6_1">
<span class="md-nav__icon md-icon"></span>
Storage Backends
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../setup/setup_with_s3/" class="md-nav__link">
<span class="md-ellipsis">
S3 Backend
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../setup/setup_with_ceph/" class="md-nav__link">
<span class="md-ellipsis">
Ceph Backend
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../setup/setup_with_swift/" class="md-nav__link">
<span class="md-ellipsis">
OpenStack Swift Backend
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../setup/setup_with_multiple_storage_backends/" class="md-nav__link">
<span class="md-ellipsis">
Multiple Storage Backends
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../setup/migrate_backends_data/" class="md-nav__link">
<span class="md-ellipsis">
Data migration
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../../setup/use_seasearch/" class="md-nav__link">
<span class="md-ellipsis">
Use SeaSearch as search engine (Pro)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../setup/seafile_docker_autostart/" class="md-nav__link">
<span class="md-ellipsis">
Seafile Docker autostart
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../setup/setup_with_an_existing_mysql_server/" class="md-nav__link">
<span class="md-ellipsis">
Deploy with an existing MySQL server
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../setup/use_other_reverse_proxy/" class="md-nav__link">
<span class="md-ellipsis">
Use other reverse proxy
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../setup/run_seafile_as_non_root_user_inside_docker/" class="md-nav__link">
<span class="md-ellipsis">
Run Seafile as non root user inside docker
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../../setup/cluster_deploy_with_docker/" class="md-nav__link">
<span class="md-ellipsis">
Cluster installation (Pro)
</span>
</a>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2_8" >
<label class="md-nav__link" for="__nav_2_8" id="__nav_2_8_label" tabindex="0">
<span class="md-ellipsis">
Setup with Kubernetes (K8S)
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_2_8_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_2_8">
<span class="md-nav__icon md-icon"></span>
Setup with Kubernetes (K8S)
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2_8_1" >
<label class="md-nav__link" for="__nav_2_8_1" id="__nav_2_8_1_label" tabindex="0">
<span class="md-ellipsis">
With Helm
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="3" aria-labelledby="__nav_2_8_1_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_2_8_1">
<span class="md-nav__icon md-icon"></span>
With Helm
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../setup/helm_chart_single_node/" class="md-nav__link">
<span class="md-ellipsis">
Single node
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../setup/helm_chart_cluster/" class="md-nav__link">
<span class="md-ellipsis">
Cluster (Pro)
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2_8_2" >
<label class="md-nav__link" for="__nav_2_8_2" id="__nav_2_8_2_label" tabindex="0">
<span class="md-ellipsis">
By K8S resource files
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="3" aria-labelledby="__nav_2_8_2_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_2_8_2">
<span class="md-nav__icon md-icon"></span>
By K8S resource files
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../setup/k8s_single_node/" class="md-nav__link">
<span class="md-ellipsis">
Single node
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../setup/cluster_deploy_with_k8s/" class="md-nav__link">
<span class="md-ellipsis">
Cluster (Pro)
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../../setup/k8s_advanced_management/" class="md-nav__link">
<span class="md-ellipsis">
Seafile K8S advanced management
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2_9" >
<label class="md-nav__link" for="__nav_2_9" id="__nav_2_9_label" tabindex="0">
<span class="md-ellipsis">
Migration
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_2_9_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_2_9">
<span class="md-nav__icon md-icon"></span>
Migration
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../setup/migrate_ce_to_pro_with_docker/" class="md-nav__link">
<span class="md-ellipsis">
Migration from Seafile Community
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../setup/migrate_non_docker_to_docker/" class="md-nav__link">
<span class="md-ellipsis">
Migrate from non-docker deployment
</span>
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--active md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_3" checked>
<label class="md-nav__link" for="__nav_3" id="__nav_3_label" tabindex="">
<span class="md-ellipsis">
Setup (binary)
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_3_label" aria-expanded="true">
<label class="md-nav__title" for="__nav_3">
<span class="md-nav__icon md-icon"></span>
Setup (binary)
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../outline/" class="md-nav__link">
<span class="md-ellipsis">
Outline
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../installation/" class="md-nav__link">
<span class="md-ellipsis">
Installation
</span>
<span class="md-status md-status--new" title="Work in progress">
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../https_with_nginx/" class="md-nav__link">
<span class="md-ellipsis">
HTTPS with Nginx
</span>
</a>
</li>
<li class="md-nav__item md-nav__item--active">
<input class="md-nav__toggle md-toggle" type="checkbox" id="__toc">
<label class="md-nav__link md-nav__link--active" for="__toc">
<span class="md-ellipsis">
Cluster Deployment
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<a href="./" class="md-nav__link md-nav__link--active">
<span class="md-ellipsis">
Cluster Deployment
</span>
</a>
<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
<label class="md-nav__title" for="__toc">
<span class="md-nav__icon md-icon"></span>
Table of contents
</label>
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
<li class="md-nav__item">
<a href="#cluster-requirements" class="md-nav__link">
<span class="md-ellipsis">
Cluster requirements
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#preparation-all-nodes" class="md-nav__link">
<span class="md-ellipsis">
Preparation (all nodes)
</span>
</a>
<nav class="md-nav" aria-label="Preparation (all nodes)">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#install-prerequisites" class="md-nav__link">
<span class="md-ellipsis">
Install prerequisites
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#create-user-seafile" class="md-nav__link">
<span class="md-ellipsis">
Create user seafile
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#placing-the-seafile-pe-license-in-optseafile" class="md-nav__link">
<span class="md-ellipsis">
Placing the Seafile PE license in /opt/seafile
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#setup-and-configure-nginx-only-for-frontend-nodes" class="md-nav__link">
<span class="md-ellipsis">
Setup and configure Nginx (only for frontend nodes)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#start-seafile-service-on-boot-optional" class="md-nav__link">
<span class="md-ellipsis">
Start Seafile Service on boot (optional)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#firewall-settings" class="md-nav__link">
<span class="md-ellipsis">
Firewall Settings
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#setup-the-first-frontend-node" class="md-nav__link">
<span class="md-ellipsis">
Setup the first frontend Node
</span>
</a>
<nav class="md-nav" aria-label="Setup the first frontend Node">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#setup-seafile-server-pro" class="md-nav__link">
<span class="md-ellipsis">
Setup Seafile server Pro
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#create-and-modify-configuration-files-in-optseafileconf" class="md-nav__link">
<span class="md-ellipsis">
Create and Modify configuration files in /opt/seafile/conf
</span>
</a>
<nav class="md-nav" aria-label="Create and Modify configuration files in /opt/seafile/conf">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#env" class="md-nav__link">
<span class="md-ellipsis">
.env
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#seafileconf" class="md-nav__link">
<span class="md-ellipsis">
seafile.conf
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#seahub_settingspy" class="md-nav__link">
<span class="md-ellipsis">
seahub_settings.py
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#seafeventsconf" class="md-nav__link">
<span class="md-ellipsis">
seafevents.conf
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#update-seahub-database" class="md-nav__link">
<span class="md-ellipsis">
Update Seahub Database
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#run-and-test-the-single-node" class="md-nav__link">
<span class="md-ellipsis">
Run and Test the Single Node
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#configure-other-frontend-nodes" class="md-nav__link">
<span class="md-ellipsis">
Configure other frontend nodes
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#backend-node" class="md-nav__link">
<span class="md-ellipsis">
Backend node
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#load-balancer-setting" class="md-nav__link">
<span class="md-ellipsis">
Load Balancer Setting
</span>
</a>
<nav class="md-nav" aria-label="Load Balancer Setting">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#aws-elastic-load-balancer-elb" class="md-nav__link">
<span class="md-ellipsis">
AWS Elastic Load Balancer (ELB)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#nginx" class="md-nav__link">
<span class="md-ellipsis">
Nginx
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#haproxy" class="md-nav__link">
<span class="md-ellipsis">
HAProxy
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#see-how-it-runs" class="md-nav__link">
<span class="md-ellipsis">
See how it runs
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#the-final-configuration-of-the-front-end-nodes" class="md-nav__link">
<span class="md-ellipsis">
The final configuration of the front-end nodes
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#https" class="md-nav__link">
<span class="md-ellipsis">
HTTPS
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#optional-deploy-seadoc-server" class="md-nav__link">
<span class="md-ellipsis">
(Optional) Deploy SeaDoc server
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_3_5" >
<label class="md-nav__link" for="__nav_3_5" id="__nav_3_5_label" tabindex="">
<span class="md-ellipsis">
Other deployment notes
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_3_5_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_3_5">
<span class="md-nav__icon md-icon"></span>
Other deployment notes
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../start_seafile_at_system_bootup/" class="md-nav__link">
<span class="md-ellipsis">
Start Seafile at System Bootup
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../using_logrotate/" class="md-nav__link">
<span class="md-ellipsis">
Logrotate
</span>
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_4" >
<label class="md-nav__link" for="__nav_4" id="__nav_4_label" tabindex="0">
<span class="md-ellipsis">
Extensions
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_4_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_4">
<span class="md-nav__icon md-icon"></span>
Extensions
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_4_1" >
<label class="md-nav__link" for="__nav_4_1" id="__nav_4_1_label" tabindex="0">
<span class="md-ellipsis">
Extra Seafile components
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_4_1_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_4_1">
<span class="md-nav__icon md-icon"></span>
Extra Seafile components
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../extension/setup_seadoc/" class="md-nav__link">
<span class="md-ellipsis">
SeaDoc Integration
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../extension/notification-server/" class="md-nav__link">
<span class="md-ellipsis">
Notification Server
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../extension/metadata-server/" class="md-nav__link">
<span class="md-ellipsis">
Metadata Server
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../extension/thumbnail-server/" class="md-nav__link">
<span class="md-ellipsis">
Thumbnail Server
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../extension/webdav/" class="md-nav__link">
<span class="md-ellipsis">
WebDAV extension
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../extension/fuse/" class="md-nav__link">
<span class="md-ellipsis">
FUSE extension
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../extension/seafile-ai/" class="md-nav__link">
<span class="md-ellipsis">
Seafile AI extension
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_4_2" >
<label class="md-nav__link" for="__nav_4_2" id="__nav_4_2_label" tabindex="0">
<span class="md-ellipsis">
Online Office
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_4_2_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_4_2">
<span class="md-nav__icon md-icon"></span>
Online Office
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../extension/libreoffice_online/" class="md-nav__link">
<span class="md-ellipsis">
Collabora Online Integration
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../extension/only_office/" class="md-nav__link">
<span class="md-ellipsis">
OnlyOffice Integration
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../extension/office_web_app/" class="md-nav__link">
<span class="md-ellipsis">
Office Online Server Integration (Pro)
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_4_3" >
<label class="md-nav__link" for="__nav_4_3" id="__nav_4_3_label" tabindex="0">
<span class="md-ellipsis">
Cluster (Pro)
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_4_3_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_4_3">
<span class="md-nav__icon md-icon"></span>
Cluster (Pro)
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../extension/distributed_indexing/" class="md-nav__link">
<span class="md-ellipsis">
Distributed indexing
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_4_4" >
<label class="md-nav__link" for="__nav_4_4" id="__nav_4_4_label" tabindex="0">
<span class="md-ellipsis">
Virus Scan (Pro)
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_4_4_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_4_4">
<span class="md-nav__icon md-icon"></span>
Virus Scan (Pro)
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../extension/virus_scan/" class="md-nav__link">
<span class="md-ellipsis">
Outline
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../extension/virus_scan_with_clamav/" class="md-nav__link">
<span class="md-ellipsis">
Virus scan with ClamAV
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../extension/virus_scan_with_kav4fs/" class="md-nav__link">
<span class="md-ellipsis">
Virus scan with Kav4fs
</span>
<span class="md-status md-status--new" title="Work in progress">
</span>
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_5" >
<label class="md-nav__link" for="__nav_5" id="__nav_5_label" tabindex="0">
<span class="md-ellipsis">
Configuration
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_5_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_5">
<span class="md-nav__icon md-icon"></span>
Configuration
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_5_1" >
<label class="md-nav__link" for="__nav_5_1" id="__nav_5_1_label" tabindex="0">
<span class="md-ellipsis">
Authentication & Users
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_5_1_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_5_1">
<span class="md-nav__icon md-icon"></span>
Authentication & Users
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_5_1_1" >
<label class="md-nav__link" for="__nav_5_1_1" id="__nav_5_1_1_label" tabindex="0">
<span class="md-ellipsis">
LDAP/AD Integration
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="3" aria-labelledby="__nav_5_1_1_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_5_1_1">
<span class="md-nav__icon md-icon"></span>
LDAP/AD Integration
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../config/ldap_in_ce/" class="md-nav__link">
<span class="md-ellipsis">
LDAP Integration
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../config/ldap_in_pro/" class="md-nav__link">
<span class="md-ellipsis">
LDAP Integration (Pro)
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_5_1_2" >
<label class="md-nav__link" for="__nav_5_1_2" id="__nav_5_1_2_label" tabindex="0">
<span class="md-ellipsis">
Single Sign On
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="3" aria-labelledby="__nav_5_1_2_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_5_1_2">
<span class="md-nav__icon md-icon"></span>
Single Sign On
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../config/single_sign_on/" class="md-nav__link">
<span class="md-ellipsis">
Outline
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../config/oauth/" class="md-nav__link">
<span class="md-ellipsis">
OAuth Authentication
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../config/remote_user/" class="md-nav__link">
<span class="md-ellipsis">
Remote User Authentication
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../config/shibboleth_authentication/" class="md-nav__link">
<span class="md-ellipsis">
Shibboleth Authentication
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../config/auto_login_seadrive/" class="md-nav__link">
<span class="md-ellipsis">
Auto Login to SeaDrive on Windows
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../config/saml2/" class="md-nav__link">
<span class="md-ellipsis">
SAML 2.0 (Pro)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../config/auth_switch/" class="md-nav__link">
<span class="md-ellipsis">
Switch authentication
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_5_1_3" >
<label class="md-nav__link" for="__nav_5_1_3" id="__nav_5_1_3_label" tabindex="0">
<span class="md-ellipsis">
Advanced User Management (Pro)
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="3" aria-labelledby="__nav_5_1_3_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_5_1_3">
<span class="md-nav__icon md-icon"></span>
Advanced User Management (Pro)
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../config/multi_institutions/" class="md-nav__link">
<span class="md-ellipsis">
Multi-Institutions Support
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../config/roles_permissions/" class="md-nav__link">
<span class="md-ellipsis">
Roles and Permissions
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../config/admin_roles_permissions/" class="md-nav__link">
<span class="md-ellipsis">
Administrator Roles and Permissions
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../config/multi_tenancy/" class="md-nav__link">
<span class="md-ellipsis">
Multi-Tenancy Support
</span>
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../../config/details_about_file_search/" class="md-nav__link">
<span class="md-ellipsis">
Advanced File Search configuration (Pro)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../config/ocm/" class="md-nav__link">
<span class="md-ellipsis">
Open Cloud Mesh
</span>
</a>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_5_4" >
<label class="md-nav__link" for="__nav_5_4" id="__nav_5_4_label" tabindex="0">
<span class="md-ellipsis">
Available configuration options
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_5_4_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_5_4">
<span class="md-nav__icon md-icon"></span>
Available configuration options
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../config/" class="md-nav__link">
<span class="md-ellipsis">
Outline
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../config/env/" class="md-nav__link">
<span class="md-ellipsis">
Environment variables
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../config/seafile-conf/" class="md-nav__link">
<span class="md-ellipsis">
seafile.conf
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../config/seahub_settings_py/" class="md-nav__link">
<span class="md-ellipsis">
seahub_settings.py
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../config/seafevents-conf/" class="md-nav__link">
<span class="md-ellipsis">
seafevents.conf
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../config/seahub_customization/" class="md-nav__link">
<span class="md-ellipsis">
Seahub customization
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../config/sending_email/" class="md-nav__link">
<span class="md-ellipsis">
Email Sending
</span>
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_6" >
<label class="md-nav__link" for="__nav_6" id="__nav_6_label" tabindex="0">
<span class="md-ellipsis">
Administration
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_6_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_6">
<span class="md-nav__icon md-icon"></span>
Administration
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../administration/" class="md-nav__link">
<span class="md-ellipsis">
Outline
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../administration/account/" class="md-nav__link">
<span class="md-ellipsis">
Account management
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../administration/two_factor_authentication/" class="md-nav__link">
<span class="md-ellipsis">
Two-factor Authentication
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../administration/security_features/" class="md-nav__link">
<span class="md-ellipsis">
Security features
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../administration/auditing/" class="md-nav__link">
<span class="md-ellipsis">
Access logs and auditing
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../administration/export_report/" class="md-nav__link">
<span class="md-ellipsis">
Export report
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../administration/logs/" class="md-nav__link">
<span class="md-ellipsis">
Seafile server logs
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../administration/backup_recovery/" class="md-nav__link">
<span class="md-ellipsis">
Backup and Recovery
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../administration/seafile_fsck/" class="md-nav__link">
<span class="md-ellipsis">
Seafile FSCK
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../administration/seafile_gc/" class="md-nav__link">
<span class="md-ellipsis">
Seafile GC
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../administration/clean_database/" class="md-nav__link">
<span class="md-ellipsis">
Clean database
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_7" >
<label class="md-nav__link" for="__nav_7" id="__nav_7_label" tabindex="0">
<span class="md-ellipsis">
Upgrade
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_7_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_7">
<span class="md-nav__icon md-icon"></span>
Upgrade
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../upgrade/upgrade/" class="md-nav__link">
<span class="md-ellipsis">
Outline
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../upgrade/upgrade_docker/" class="md-nav__link">
<span class="md-ellipsis">
Upgrade Seafile Docker
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../upgrade/upgrade_a_cluster/" class="md-nav__link">
<span class="md-ellipsis">
Upgrade Seafile Cluster
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../upgrade/upgrade_a_cluster_binary/" class="md-nav__link">
<span class="md-ellipsis">
Upgrade Seafile Cluster (binary)
</span>
<span class="md-status md-status--new" title="Work in progress">
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../upgrade/upgrade_notes_for_13.0.x/" class="md-nav__link">
<span class="md-ellipsis">
Upgrade notes for 13.0.x
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../upgrade/upgrade_notes_for_12.0.x/" class="md-nav__link">
<span class="md-ellipsis">
Upgrade notes for 12.0.x
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../upgrade/upgrade_notes_for_11.0.x/" class="md-nav__link">
<span class="md-ellipsis">
Upgrade notes for 11.0.x
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../upgrade/upgrade_notes_for_10.0.x/" class="md-nav__link">
<span class="md-ellipsis">
Upgrade notes for 10.0.x
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../upgrade/upgrade_notes_for_9.0.x/" class="md-nav__link">
<span class="md-ellipsis">
Upgrade notes for 9.0.x
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../upgrade/seafile_obsolete_configurations/" class="md-nav__link">
<span class="md-ellipsis">
Summary of obsolete configurations
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_8" >
<label class="md-nav__link" for="__nav_8" id="__nav_8_label" tabindex="0">
<span class="md-ellipsis">
Developing
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_8_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_8">
<span class="md-nav__icon md-icon"></span>
Developing
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../develop/" class="md-nav__link">
<span class="md-ellipsis">
Outline
</span>
</a>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_8_2" >
<label class="md-nav__link" for="__nav_8_2" id="__nav_8_2_label" tabindex="0">
<span class="md-ellipsis">
How to Build Seafile
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_8_2_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_8_2">
<span class="md-nav__icon md-icon"></span>
How to Build Seafile
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../develop/build_seafile/" class="md-nav__link">
<span class="md-ellipsis">
Outline
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../develop/linux/" class="md-nav__link">
<span class="md-ellipsis">
Linux
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../develop/osx/" class="md-nav__link">
<span class="md-ellipsis">
macOS
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../develop/windows/" class="md-nav__link">
<span class="md-ellipsis">
Windows
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../develop/server/" class="md-nav__link">
<span class="md-ellipsis">
Server development
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../develop/rpi/" class="md-nav__link">
<span class="md-ellipsis">
Server binary package
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../../develop/translation/" class="md-nav__link">
<span class="md-ellipsis">
Translation
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../develop/web_api_v2.1/" class="md-nav__link">
<span class="md-ellipsis">
Web API V2.1
</span>
</a>
</li>
<li class="md-nav__item">
<a href="https://github.com/rene-s/Seafile-PHP-SDK" class="md-nav__link">
<span class="md-ellipsis">
PHP API
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../develop/data_model/" class="md-nav__link">
<span class="md-ellipsis">
Data Model
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_9" >
<label class="md-nav__link" for="__nav_9" id="__nav_9_label" tabindex="0">
<span class="md-ellipsis">
ChangeLog
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_9_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_9">
<span class="md-nav__icon md-icon"></span>
ChangeLog
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../changelog/server-changelog/" class="md-nav__link">
<span class="md-ellipsis">
Seafile Community Edition
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../changelog/changelog-for-seafile-professional-server/" class="md-nav__link">
<span class="md-ellipsis">
Seafile Professional Edition
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../changelog/client-changelog/" class="md-nav__link">
<span class="md-ellipsis">
Seafile Client
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../changelog/drive-client-changelog/" class="md-nav__link">
<span class="md-ellipsis">
Drive Client
</span>
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" >
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
<label class="md-nav__title" for="__toc">
<span class="md-nav__icon md-icon"></span>
Table of contents
</label>
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
<li class="md-nav__item">
<a href="#cluster-requirements" class="md-nav__link">
<span class="md-ellipsis">
Cluster requirements
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#preparation-all-nodes" class="md-nav__link">
<span class="md-ellipsis">
Preparation (all nodes)
</span>
</a>
<nav class="md-nav" aria-label="Preparation (all nodes)">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#install-prerequisites" class="md-nav__link">
<span class="md-ellipsis">
Install prerequisites
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#create-user-seafile" class="md-nav__link">
<span class="md-ellipsis">
Create user seafile
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#placing-the-seafile-pe-license-in-optseafile" class="md-nav__link">
<span class="md-ellipsis">
Placing the Seafile PE license in /opt/seafile
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#setup-and-configure-nginx-only-for-frontend-nodes" class="md-nav__link">
<span class="md-ellipsis">
Setup and configure Nginx (only for frontend nodes)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#start-seafile-service-on-boot-optional" class="md-nav__link">
<span class="md-ellipsis">
Start Seafile Service on boot (optional)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#firewall-settings" class="md-nav__link">
<span class="md-ellipsis">
Firewall Settings
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#setup-the-first-frontend-node" class="md-nav__link">
<span class="md-ellipsis">
Setup the first frontend Node
</span>
</a>
<nav class="md-nav" aria-label="Setup the first frontend Node">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#setup-seafile-server-pro" class="md-nav__link">
<span class="md-ellipsis">
Setup Seafile server Pro
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#create-and-modify-configuration-files-in-optseafileconf" class="md-nav__link">
<span class="md-ellipsis">
Create and Modify configuration files in /opt/seafile/conf
</span>
</a>
<nav class="md-nav" aria-label="Create and Modify configuration files in /opt/seafile/conf">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#env" class="md-nav__link">
<span class="md-ellipsis">
.env
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#seafileconf" class="md-nav__link">
<span class="md-ellipsis">
seafile.conf
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#seahub_settingspy" class="md-nav__link">
<span class="md-ellipsis">
seahub_settings.py
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#seafeventsconf" class="md-nav__link">
<span class="md-ellipsis">
seafevents.conf
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#update-seahub-database" class="md-nav__link">
<span class="md-ellipsis">
Update Seahub Database
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#run-and-test-the-single-node" class="md-nav__link">
<span class="md-ellipsis">
Run and Test the Single Node
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#configure-other-frontend-nodes" class="md-nav__link">
<span class="md-ellipsis">
Configure other frontend nodes
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#backend-node" class="md-nav__link">
<span class="md-ellipsis">
Backend node
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#load-balancer-setting" class="md-nav__link">
<span class="md-ellipsis">
Load Balancer Setting
</span>
</a>
<nav class="md-nav" aria-label="Load Balancer Setting">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#aws-elastic-load-balancer-elb" class="md-nav__link">
<span class="md-ellipsis">
AWS Elastic Load Balancer (ELB)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#nginx" class="md-nav__link">
<span class="md-ellipsis">
Nginx
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#haproxy" class="md-nav__link">
<span class="md-ellipsis">
HAProxy
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#see-how-it-runs" class="md-nav__link">
<span class="md-ellipsis">
See how it runs
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#the-final-configuration-of-the-front-end-nodes" class="md-nav__link">
<span class="md-ellipsis">
The final configuration of the front-end nodes
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#https" class="md-nav__link">
<span class="md-ellipsis">
HTTPS
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#optional-deploy-seadoc-server" class="md-nav__link">
<span class="md-ellipsis">
(Optional) Deploy SeaDoc server
</span>
</a>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-content" data-md-component="content">
<article class="md-content__inner md-typeset">
<h1 id="cluster-deployment">Cluster Deployment<a class="headerlink" href="#cluster-deployment" title="Permanent link">&para;</a></h1>
<div class="admonition tip">
<p class="admonition-title">Tip</p>
<p>Since version 8.0, the recommend way to install Seafile clsuter is using <a href="../../setup/cluster_deploy_with_docker/"><em>Docker</em></a></p>
</div>
<h2 id="cluster-requirements">Cluster requirements<a class="headerlink" href="#cluster-requirements" title="Permanent link">&para;</a></h2>
<p>Please refer <a href="../../setup/system_requirements/#seafile-cluster">here</a> for the details about the cluster requirements for <strong>all nodes</strong> in Seafile cluster. In general, we recommend that each node should have at least 2G RAM and a 2-core CPU (&gt; 2GHz).</p>
<h2 id="preparation-all-nodes">Preparation (all nodes)<a class="headerlink" href="#preparation-all-nodes" title="Permanent link">&para;</a></h2>
<h3 id="install-prerequisites">Install prerequisites<a class="headerlink" href="#install-prerequisites" title="Permanent link">&para;</a></h3>
<p>Please follow <a href="../installation/#installing-prerequisites">here</a> to install prerequisites</p>
<div class="admonition note">
<p class="admonition-title">Note</p>
<p>Cache server (the first step) is not necessary, if you donot wish this node deploy it.</p>
</div>
<h3 id="create-user-seafile">Create user <code>seafile</code><a class="headerlink" href="#create-user-seafile" title="Permanent link">&para;</a></h3>
<p>Create a new user and follow the instructions on the screen:</p>
<div class="highlight"><pre><span></span><code>adduser seafile
</code></pre></div>
<p>Change ownership of the created directory to the new user:</p>
<div class="highlight"><pre><span></span><code>chown -R seafile: /opt/seafile
</code></pre></div>
<p>All the following steps are done as user seafile.</p>
<p>Change to user seafile:</p>
<div class="highlight"><pre><span></span><code>su seafile
</code></pre></div>
<h3 id="placing-the-seafile-pe-license-in-optseafile">Placing the Seafile PE license in <code>/opt/seafile</code><a class="headerlink" href="#placing-the-seafile-pe-license-in-optseafile" title="Permanent link">&para;</a></h3>
<p>Save the license file in Seafile's programm directory <code>/opt/seafile</code>. Make sure that the name is <code>seafile-license.txt</code>. </p>
<div class="admonition danger">
<p class="admonition-title">If the license file has a different name or cannot be read, Seafile server will start with in trailer mode with most THREE users</p>
</div>
<h3 id="setup-and-configure-nginx-only-for-frontend-nodes">Setup and configure Nginx (only for frontend nodes)<a class="headerlink" href="#setup-and-configure-nginx-only-for-frontend-nodes" title="Permanent link">&para;</a></h3>
<p>For security reasons, the Seafile frontend service will only listen to requests from the local port <code>8000</code>. You need to use Nginx to reverse proxy this port to port <code>80</code> for external access:</p>
<ol>
<li>
<p>Install Nginx</p>
<div class="highlight"><pre><span></span><code>sudo<span class="w"> </span>apt<span class="w"> </span>update
sudo<span class="w"> </span>apt<span class="w"> </span>install<span class="w"> </span>nginx
</code></pre></div>
</li>
<li>
<p>Create the configurations file for current node</p>
<div class="highlight"><pre><span></span><code>sudo<span class="w"> </span>nano<span class="w"> </span>/etc/nginx/sites-available/seafile.conf
</code></pre></div>
<p>and, add the following contents into this file:</p>
<div class="highlight"><pre><span></span><code><span class="k">log_format</span><span class="w"> </span><span class="s">seafileformat</span><span class="w"> </span><span class="s">&#39;</span><span class="nv">$http_x_forwarded_for</span><span class="w"> </span><span class="nv">$remote_addr</span><span class="w"> </span><span class="s">[</span><span class="nv">$time_local]</span><span class="w"> </span><span class="s">&quot;</span><span class="nv">$request&quot;</span><span class="w"> </span><span class="nv">$status</span><span class="w"> </span><span class="nv">$body_bytes_sent</span><span class="w"> </span><span class="s">&quot;</span><span class="nv">$http_referer&quot;</span><span class="w"> </span><span class="s">&quot;</span><span class="nv">$http_user_agent&quot;</span><span class="w"> </span><span class="nv">$upstream_response_time&#39;</span><span class="p">;</span>
<span class="k">server</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="kn">listen</span><span class="w"> </span><span class="mi">80</span><span class="p">;</span>
<span class="w"> </span><span class="kn">server_name</span><span class="w"> </span><span class="s">&lt;current</span><span class="w"> </span><span class="s">node&#39;s</span><span class="w"> </span><span class="s">IP&gt;</span><span class="p">;</span>
<span class="w"> </span><span class="kn">proxy_set_header</span><span class="w"> </span><span class="s">X-Forwarded-For</span><span class="w"> </span><span class="nv">$remote_addr</span><span class="p">;</span>
<span class="w"> </span><span class="kn">location</span><span class="w"> </span><span class="s">/</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="kn">proxy_pass</span><span class="w"> </span><span class="s">http://127.0.0.1:8000</span><span class="p">;</span>
<span class="w"> </span><span class="kn">proxy_set_header</span><span class="w"> </span><span class="s">Host</span><span class="w"> </span><span class="nv">$http_host</span><span class="p">;</span>
<span class="w"> </span><span class="kn">proxy_set_header</span><span class="w"> </span><span class="s">X-Real-IP</span><span class="w"> </span><span class="nv">$remote_addr</span><span class="p">;</span>
<span class="w"> </span><span class="kn">proxy_set_header</span><span class="w"> </span><span class="s">X-Forwarded-For</span><span class="w"> </span><span class="nv">$proxy_add_x_forwarded_for</span><span class="p">;</span>
<span class="w"> </span><span class="kn">proxy_set_header</span><span class="w"> </span><span class="s">X-Forwarded-Host</span><span class="w"> </span><span class="nv">$server_name</span><span class="p">;</span>
<span class="w"> </span><span class="kn">proxy_read_timeout</span><span class="w"> </span><span class="s">1200s</span><span class="p">;</span>
<span class="w"> </span><span class="c1"># used for view/edit office file via Office Online Server</span>
<span class="w"> </span><span class="kn">client_max_body_size</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span>
<span class="w"> </span><span class="kn">access_log</span><span class="w"> </span><span class="s">/var/log/nginx/seahub.access.log</span><span class="w"> </span><span class="s">seafileformat</span><span class="p">;</span>
<span class="w"> </span><span class="kn">error_log</span><span class="w"> </span><span class="s">/var/log/nginx/seahub.error.log</span><span class="p">;</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="kn">location</span><span class="w"> </span><span class="s">/seafhttp</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="kn">rewrite</span><span class="w"> </span><span class="s">^/seafhttp(.*)</span>$<span class="w"> </span><span class="nv">$1</span><span class="w"> </span><span class="s">break</span><span class="p">;</span>
<span class="w"> </span><span class="kn">proxy_pass</span><span class="w"> </span><span class="s">http://127.0.0.1:8082</span><span class="p">;</span>
<span class="w"> </span><span class="kn">client_max_body_size</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span>
<span class="w"> </span><span class="kn">proxy_set_header</span><span class="w"> </span><span class="s">X-Forwarded-For</span><span class="w"> </span><span class="nv">$proxy_add_x_forwarded_for</span><span class="p">;</span>
<span class="w"> </span><span class="kn">proxy_read_timeout</span><span class="w"> </span><span class="s">36000s</span><span class="p">;</span>
<span class="w"> </span><span class="kn">proxy_send_timeout</span><span class="w"> </span><span class="s">36000s</span><span class="p">;</span>
<span class="w"> </span><span class="kn">send_timeout</span><span class="w"> </span><span class="s">36000s</span><span class="p">;</span>
<span class="w"> </span><span class="kn">access_log</span><span class="w"> </span><span class="s">/var/log/nginx/seafhttp.access.log</span><span class="w"> </span><span class="s">seafileformat</span><span class="p">;</span>
<span class="w"> </span><span class="kn">error_log</span><span class="w"> </span><span class="s">/var/log/nginx/seafhttp.error.log</span><span class="p">;</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="kn">location</span><span class="w"> </span><span class="s">/media</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="kn">root</span><span class="w"> </span><span class="s">/opt/seafile/seafile-server-latest/seahub</span><span class="p">;</span>
<span class="w"> </span><span class="p">}</span>
<span class="p">}</span>
</code></pre></div>
</li>
<li>
<p>Link the configurations file to <code>sites-enabled</code> directory:</p>
<div class="highlight"><pre><span></span><code>sudo<span class="w"> </span>ln<span class="w"> </span>-s<span class="w"> </span>/etc/nginx/sites-available/seafile.conf<span class="w"> </span>/etc/nginx/sites-enabled/
</code></pre></div>
</li>
<li>
<p>Test and enable configuration</p>
<div class="highlight"><pre><span></span><code>sudo<span class="w"> </span>nginx<span class="w"> </span>-t
sudo<span class="w"> </span>nginx<span class="w"> </span>-s<span class="w"> </span>reload
</code></pre></div>
</li>
</ol>
<h3 id="start-seafile-service-on-boot-optional">Start Seafile Service on boot (optional)<a class="headerlink" href="#start-seafile-service-on-boot-optional" title="Permanent link">&para;</a></h3>
<p>It would be convenient to setup Seafile service to start on system boot. Follow <a href="../start_seafile_at_system_bootup/">this documentation</a> to set it up on.</p>
<h3 id="firewall-settings">Firewall Settings<a class="headerlink" href="#firewall-settings" title="Permanent link">&para;</a></h3>
<p>There are 2 firewall rule changes for Seafile cluster:</p>
<ul>
<li>On each nodes, you should open the health check port (default 11001);</li>
<li>On the Cache and ElasticSearch server, please only allow Seafile servers to access this port for security resons.</li>
</ul>
<h2 id="setup-the-first-frontend-node">Setup the first frontend Node<a class="headerlink" href="#setup-the-first-frontend-node" title="Permanent link">&para;</a></h2>
<h3 id="setup-seafile-server-pro">Setup Seafile server Pro<a class="headerlink" href="#setup-seafile-server-pro" title="Permanent link">&para;</a></h3>
<p>Please follow <em>Installation of Seafile Server Professional Edition</em> to setup:</p>
<ul>
<li><a href="../installation/#downloading-the-install-package">Download the install package</a></li>
<li><a href="../installation/#uncompressing-the-package">Uncompress the package</a></li>
<li><a href="../installation/#setting-up-seafile-pro-databases">Set up Seafile Pro databases</a></li>
</ul>
<h3 id="create-and-modify-configuration-files-in-optseafileconf">Create and Modify configuration files in <code>/opt/seafile/conf</code><a class="headerlink" href="#create-and-modify-configuration-files-in-optseafileconf" title="Permanent link">&para;</a></h3>
<h4 id="env">.env<a class="headerlink" href="#env" title="Permanent link">&para;</a></h4>
<div class="admonition tip">
<p class="admonition-title">Tip</p>
<p><code>JWT_PRIVATE_KEY</code>, A random string with a length of no less than 32 characters can be generated from:
<div class="highlight"><pre><span></span><code>pwgen<span class="w"> </span>-s<span class="w"> </span><span class="m">40</span><span class="w"> </span><span class="m">1</span>
</code></pre></div></p>
</div>
<div class="highlight"><pre><span></span><code><span class="nv">JWT_PRIVATE_KEY</span><span class="o">=</span>&lt;Your<span class="w"> </span>jwt<span class="w"> </span>private<span class="w"> </span>key&gt;
<span class="nv">SEAFILE_SERVER_PROTOCOL</span><span class="o">=</span>https
<span class="nv">SEAFILE_SERVER_HOSTNAME</span><span class="o">=</span>seafile.example.com
<span class="nv">SEAFILE_MYSQL_DB_HOST</span><span class="o">=</span>&lt;your<span class="w"> </span>database<span class="w"> </span>host&gt;
<span class="nv">SEAFILE_MYSQL_DB_PORT</span><span class="o">=</span><span class="m">3306</span>
<span class="nv">SEAFILE_MYSQL_DB_USER</span><span class="o">=</span>seafile
<span class="nv">SEAFILE_MYSQL_DB_PASSWORD</span><span class="o">=</span>&lt;your<span class="w"> </span>MySQL<span class="w"> </span>password&gt;
<span class="nv">SEAFILE_MYSQL_DB_CCNET_DB_NAME</span><span class="o">=</span>ccnet_db
<span class="nv">SEAFILE_MYSQL_DB_SEAFILE_DB_NAME</span><span class="o">=</span>seafile_db
<span class="nv">SEAFILE_MYSQL_DB_SEAHUB_DB_NAME</span><span class="o">=</span>seahub_db
</code></pre></div>
<h4 id="seafileconf">seafile.conf<a class="headerlink" href="#seafileconf" title="Permanent link">&para;</a></h4>
<ol>
<li>
<p>Add or modify the following configuration to <code>seafile.conf</code>:</p>
<div class="tabbed-set tabbed-alternate" data-tabs="1:2"><input checked="checked" id="__tabbed_1_1" name="__tabbed_1" type="radio" /><input id="__tabbed_1_2" name="__tabbed_1" type="radio" /><div class="tabbed-labels"><label for="__tabbed_1_1">Memcached</label><label for="__tabbed_1_2">Redis</label></div>
<div class="tabbed-content">
<div class="tabbed-block">
<div class="highlight"><pre><span></span><code>[memcached]
memcached_options = --SERVER=&lt;your memcached ip&gt;[:&lt;your memcached port&gt;] --POOL-MIN=10 --POOL-MAX=100
</code></pre></div>
</div>
<div class="tabbed-block">
<div class="highlight"><pre><span></span><code>[redis]
redis_host = &lt;your redis ip&gt;
redis_port = &lt;your redis port, default 6379&gt;
max_connections = 100
</code></pre></div>
</div>
</div>
</div>
</li>
<li>
<p>Enable cluster mode</p>
<div class="highlight"><pre><span></span><code>[cluster]
enabled = true
</code></pre></div>
<div class="admonition tip">
<p class="admonition-title">More options in <code>cluster</code> section</p>
<p>The Seafile server also opens a port for the load balancers to run health checks. Seafile by default uses port <code>11001</code>. You can change this by adding the following config:</p>
<div class="highlight"><pre><span></span><code>[cluster]
health_check_port = 12345
</code></pre></div>
</div>
</li>
<li>
<p>Enable backend storage:</p>
<ul>
<li><a href="../../setup/setup_with_s3/">S3</a></li>
<li><a href="../../setup/setup_with_swift/">OpenStack Swift</a></li>
<li><a href="../../setup/setup_with_ceph/">Ceph</a></li>
</ul>
</li>
</ol>
<h4 id="seahub_settingspy">seahub_settings.py<a class="headerlink" href="#seahub_settingspy" title="Permanent link">&para;</a></h4>
<ol>
<li>
<p>You must setup and use memory cache when deploying Seafile cluster, please add or modify the following configuration to <code>seahub_settings.py</code>:</p>
<div class="tabbed-set tabbed-alternate" data-tabs="2:2"><input checked="checked" id="__tabbed_2_1" name="__tabbed_2" type="radio" /><input id="__tabbed_2_2" name="__tabbed_2" type="radio" /><div class="tabbed-labels"><label for="__tabbed_2_1">Memcached</label><label for="__tabbed_2_2">Redis</label></div>
<div class="tabbed-content">
<div class="tabbed-block">
<div class="highlight"><pre><span></span><code><span class="n">CACHES</span> <span class="o">=</span> <span class="p">{</span>
<span class="s1">&#39;default&#39;</span><span class="p">:</span> <span class="p">{</span>
<span class="s1">&#39;BACKEND&#39;</span><span class="p">:</span> <span class="s1">&#39;django_pylibmc.memcached.PyLibMCCache&#39;</span><span class="p">,</span>
<span class="s1">&#39;LOCATION&#39;</span><span class="p">:</span> <span class="s1">&#39;&lt;your Memcached host&gt;:&lt;your Memcached port, default 11211&gt;&#39;</span><span class="p">,</span>
<span class="p">},</span>
<span class="p">}</span>
</code></pre></div>
</div>
<div class="tabbed-block">
<p>please Refer to <a href="https://docs.djangoproject.com/en/4.2/topics/cache/#redis">Django's documentation about using Redis cache</a> to add Redis configurations to <code>seahub_settings.py</code>.</p>
</div>
</div>
</div>
</li>
<li>
<p>Add following options to seahub_setting.py, which will tell Seahub to store avatar in database and cache avatar in memcached, and store css CACHE to local memory.</p>
<div class="highlight"><pre><span></span><code>AVATAR_FILE_STORAGE = &#39;seahub.base.database_storage.DatabaseStorage&#39;
</code></pre></div>
</li>
</ol>
<h4 id="seafeventsconf">seafevents.conf<a class="headerlink" href="#seafeventsconf" title="Permanent link">&para;</a></h4>
<p>Modify the <code>[INDEX FILES]</code> section to enable full test search, we take <em>ElasticSearch</em> for example:</p>
<div class="highlight"><pre><span></span><code>[INDEX FILES]
enabled = true
interval = 10m
highlight = fvh
index_office_pdf = true
es_host = &lt;your ElasticSearch host&gt;
es_port = &lt;your ElasticSearch port, default 9200&gt;
</code></pre></div>
<h3 id="update-seahub-database">Update Seahub Database<a class="headerlink" href="#update-seahub-database" title="Permanent link">&para;</a></h3>
<p>In cluster environment, we have to store avatars in the database instead of in a local disk.</p>
<div class="highlight"><pre><span></span><code>mysql -h&lt;your MySQL host&gt; -P&lt;your MySQL port&gt; -useafile -p&lt;user seafile&#39;s password&gt;
# enter MySQL environment
USE seahub_db;
CREATE TABLE `avatar_uploaded` (`filename` TEXT NOT NULL, `filename_md5` CHAR(32) NOT NULL PRIMARY KEY, `data` MEDIUMTEXT NOT NULL, `size` INTEGER NOT NULL, `mtime` datetime NOT NULL);
</code></pre></div>
<h3 id="run-and-test-the-single-node">Run and Test the Single Node<a class="headerlink" href="#run-and-test-the-single-node" title="Permanent link">&para;</a></h3>
<p>Once you have finished configuring this single node, start it to test if it runs properly:</p>
<div class="admonition note">
<p class="admonition-title">Note</p>
<p>For installations using python virtual environment, activate it if it isn't already active</p>
<div class="highlight"><pre><span></span><code><span class="nb">source</span><span class="w"> </span>python-venv/bin/activate
</code></pre></div>
</div>
<div class="highlight"><pre><span></span><code>cd /opt/seafile/seafile-server-latest
su seafile
./seafile.sh start
./seahub.sh start
</code></pre></div>
<div class="admonition success">
<p class="admonition-title">Success</p>
<p>The first time you start seahub, the script would prompt you to create an admin account for your Seafile server. Then you can see the following message in your console:</p>
<div class="highlight"><pre><span></span><code>Starting seafile server, please wait ...
Seafile server started
Done.
Starting seahub at port 8000 ...
Seahub is started
Done.
</code></pre></div>
<p>Finally, you can visit <code>http://ip-address-of-this-node:80</code> and login with the admin account to test if this node is working fine or not.</p>
</div>
<h2 id="configure-other-frontend-nodes">Configure other frontend nodes<a class="headerlink" href="#configure-other-frontend-nodes" title="Permanent link">&para;</a></h2>
<p>If the first frontend node works fine, you can <strong>compress</strong> the whole directory <code>/opt/seafile</code> into a <strong>tarball</strong> and <strong>copy it</strong> to all other Seafile server nodes. You can simply <strong>uncompress</strong> it and <strong>start</strong> the server by:</p>
<div class="admonition note">
<p class="admonition-title">Note</p>
<p>For installations using python virtual environment, activate it if it isn't already active</p>
<div class="highlight"><pre><span></span><code><span class="nb">source</span><span class="w"> </span>python-venv/bin/activate
</code></pre></div>
</div>
<div class="highlight"><pre><span></span><code><span class="nb">cd</span><span class="w"> </span>/opt/seafile/seafile-server-latest
su<span class="w"> </span>seafile
./seafile.sh<span class="w"> </span>start
./seahub.sh<span class="w"> </span>start
</code></pre></div>
<h2 id="backend-node">Backend node<a class="headerlink" href="#backend-node" title="Permanent link">&para;</a></h2>
<p>In the backend node, you need to execute the following command to start Seafile server. <strong>CLUSTER_MODE=backend</strong> means this node is seafile backend server.</p>
<div class="admonition note">
<p class="admonition-title">Note</p>
<p>For installations using python virtual environment, activate it if it isn't already active</p>
<div class="highlight"><pre><span></span><code><span class="nb">source</span><span class="w"> </span>python-venv/bin/activate
</code></pre></div>
</div>
<div class="highlight"><pre><span></span><code><span class="nb">export</span><span class="w"> </span><span class="nv">CLUSTER_MODE</span><span class="o">=</span>backend
<span class="nb">cd</span><span class="w"> </span>/opt/seafile/seafile-server-latest
su<span class="w"> </span>seafile
./seafile.sh<span class="w"> </span>start
./seafile-background-tasks.sh<span class="w"> </span>start
</code></pre></div>
<h2 id="load-balancer-setting">Load Balancer Setting<a class="headerlink" href="#load-balancer-setting" title="Permanent link">&para;</a></h2>
<div class="admonition note">
<p class="admonition-title">Note</p>
<p>Since Seafile Pro server 6.0.0, cluster deployment requires "sticky session" settings in the load balancer. Otherwise sometimes folder download on the web UI can't work properly. Read the "Load Balancer Setting" section below for details</p>
</div>
<p>Generally speaking, in order to better access the Seafile service, we recommend that you use a load balancing service to access the Seafile cluster and bind your domain name (such as <code>seafile.cluster.com</code>) to the load balancing service. Usually, you can use:</p>
<ul>
<li>Cloud service provider's load balancing service (e.g., <strong><em>AWS Elastic Load Balancer</em></strong>)</li>
<li>
<p>Deploy your own load balancing service, our document will give two of common load balance services:</p>
<ul>
<li><strong><em>Nginx</em></strong></li>
<li><strong><em>HAproxy</em></strong></li>
</ul>
</li>
</ul>
<h3 id="aws-elastic-load-balancer-elb">AWS Elastic Load Balancer (ELB)<a class="headerlink" href="#aws-elastic-load-balancer-elb" title="Permanent link">&para;</a></h3>
<p>In the AWS ELB management console, after you've added the Seafile server instances to the instance list, you should do two more configurations.</p>
<p>First you should setup HTTP(S) listeners. Ports 443 and 80 of ELB should be forwarded to the ports 80 or 443 of the Seafile servers.</p>
<p>Then you setup health check</p>
<p><img alt="elb-health-check" src="../../images/elb-health-check.png" /></p>
<p>Refer to <a href="http://docs.aws.amazon.com/elasticloadbalancing/latest/classic/elb-sticky-sessions.html">AWS documentation</a> about how to setup sticky sessions.</p>
<h3 id="nginx">Nginx<a class="headerlink" href="#nginx" title="Permanent link">&para;</a></h3>
<ol>
<li>
<p>Install Nginx in the host if you would like to deploy load balance service</p>
<div class="highlight"><pre><span></span><code>sudo<span class="w"> </span>apt<span class="w"> </span>update
sudo<span class="w"> </span>apt<span class="w"> </span>install<span class="w"> </span>nginx
</code></pre></div>
</li>
<li>
<p>Create the configurations file for Seafile cluster</p>
<div class="highlight"><pre><span></span><code>sudo<span class="w"> </span>nano<span class="w"> </span>/etc/nginx/sites-available/seafile-cluster
</code></pre></div>
<p>and, add the following contents into this file:</p>
<div class="highlight"><pre><span></span><code><span class="k">upstream</span><span class="w"> </span><span class="s">seafile_cluster</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="kn">server</span><span class="w"> </span><span class="s">&lt;IP:</span><span class="w"> </span><span class="s">your</span><span class="w"> </span><span class="s">frontend</span><span class="w"> </span><span class="s">node</span><span class="w"> </span><span class="mi">1</span><span class="s">&gt;:80</span><span class="p">;</span>
<span class="w"> </span><span class="kn">server</span><span class="w"> </span><span class="s">&lt;IP:</span><span class="w"> </span><span class="s">your</span><span class="w"> </span><span class="s">frontend</span><span class="w"> </span><span class="s">node</span><span class="w"> </span><span class="mi">2</span><span class="s">&gt;:80</span><span class="p">;</span>
<span class="w"> </span><span class="kn">...</span>
<span class="err">}</span>
<span class="s">server</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="kn">listen</span><span class="w"> </span><span class="mi">80</span><span class="p">;</span>
<span class="w"> </span><span class="kn">server_name</span><span class="w"> </span><span class="s">&lt;your</span><span class="w"> </span><span class="s">domain&gt;</span><span class="p">;</span>
<span class="w"> </span><span class="kn">location</span><span class="w"> </span><span class="s">/</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="kn">proxy_pass</span><span class="w"> </span><span class="s">http://seafile_cluster</span><span class="p">;</span>
<span class="w"> </span><span class="kn">proxy_set_header</span><span class="w"> </span><span class="s">Host</span><span class="w"> </span><span class="nv">$host</span><span class="p">;</span>
<span class="w"> </span><span class="kn">proxy_set_header</span><span class="w"> </span><span class="s">X-Real-IP</span><span class="w"> </span><span class="nv">$remote_addr</span><span class="p">;</span>
<span class="w"> </span><span class="kn">proxy_set_header</span><span class="w"> </span><span class="s">X-Forwarded-For</span><span class="w"> </span><span class="nv">$proxy_add_x_forwarded_for</span><span class="p">;</span>
<span class="w"> </span><span class="kn">proxy_set_header</span><span class="w"> </span><span class="s">X-Forwarded-Proto</span><span class="w"> </span><span class="nv">$scheme</span><span class="p">;</span>
<span class="w"> </span><span class="kn">http_502</span><span class="w"> </span><span class="s">http_503</span><span class="w"> </span><span class="s">http_504</span><span class="p">;</span>
<span class="w"> </span><span class="p">}</span>
<span class="p">}</span>
</code></pre></div>
</li>
<li>
<p>Link the configurations file to <code>sites-enabled</code> directory:</p>
<div class="highlight"><pre><span></span><code>sudo<span class="w"> </span>ln<span class="w"> </span>-s<span class="w"> </span>/etc/nginx/sites-available/seafile-cluster<span class="w"> </span>/etc/nginx/sites-enabled/
</code></pre></div>
</li>
<li>
<p>Test and enable configuration</p>
<div class="highlight"><pre><span></span><code>sudo<span class="w"> </span>nginx<span class="w"> </span>-t
sudo<span class="w"> </span>nginx<span class="w"> </span>-s<span class="w"> </span>reload
</code></pre></div>
</li>
</ol>
<h3 id="haproxy">HAProxy<a class="headerlink" href="#haproxy" title="Permanent link">&para;</a></h3>
<p>This is a sample <code>/etc/haproxy/haproxy.cfg</code>:</p>
<p>(Assume your health check port is <code>11001</code>)</p>
<div class="highlight"><pre><span></span><code>global
log 127.0.0.1 local1 notice
maxconn 4096
user haproxy
group haproxy
defaults
log global
mode http
retries 3
maxconn 2000
timeout connect 10000
timeout client 300000
timeout server 36000000
listen seafile 0.0.0.0:80
mode http
option httplog
option dontlognull
option forwardfor
cookie SERVERID insert indirect nocache
server seafileserver01 192.168.1.165:80 check port 11001 cookie seafileserver01
server seafileserver02 192.168.1.200:80 check port 11001 cookie seafileserver02
</code></pre></div>
<h2 id="see-how-it-runs">See how it runs<a class="headerlink" href="#see-how-it-runs" title="Permanent link">&para;</a></h2>
<p>Now you should be able to test your cluster. Open <a href="https://seafile.example.com">https://seafile.example.com</a> in your browser and enjoy. You can also synchronize files with Seafile clients.</p>
<h2 id="the-final-configuration-of-the-front-end-nodes">The final configuration of the front-end nodes<a class="headerlink" href="#the-final-configuration-of-the-front-end-nodes" title="Permanent link">&para;</a></h2>
<p>Here is the summary of configurations at the front-end node that related to cluster setup. (for version 7.1+)</p>
<p>For <strong>seafile.conf</strong>:</p>
<div class="highlight"><pre><span></span><code>[cluster]
enabled = true
</code></pre></div>
<p>The <code>enabled</code> option will prevent the start of background tasks by <code>./seafile.sh start</code> in the front-end node. The tasks should be explicitly started by <code>./seafile-background-tasks.sh start</code> at the back-end node.</p>
<p>For <strong>seahub_settings.py</strong>:</p>
<div class="highlight"><pre><span></span><code>AVATAR_FILE_STORAGE = &#39;seahub.base.database_storage.DatabaseStorage&#39;
</code></pre></div>
<p>For <strong>seafevents.conf</strong>:</p>
<div class="highlight"><pre><span></span><code>[INDEX FILES]
enabled = true
interval = 10m
highlight = fvh # This configuration is for improving searching speed
es_host = &lt;IP of background node&gt;
es_port = 9200
</code></pre></div>
<p>The <code>[INDEX FILES]</code> section is needed to let the front-end node know the file search feature is enabled.</p>
<h2 id="https">HTTPS<a class="headerlink" href="#https" title="Permanent link">&para;</a></h2>
<p>You can engaged HTTPS in your load balance service, as you can use certificates manager (e.g., <a href="https://certbot.eff.org">Certbot</a>) to acquire and enable HTTPS to your Seafile cluster. You have to modify the relative URLs from the prefix <code>http://</code> to <code>https://</code> in <code>seahub_settings.py</code> and <code>.env</code>, after enabling HTTPS.</p>
<h2 id="optional-deploy-seadoc-server">(Optional) Deploy SeaDoc server<a class="headerlink" href="#optional-deploy-seadoc-server" title="Permanent link">&para;</a></h2>
<p>You can follow <a href="../../extension/setup_seadoc/">here</a> to deploy SeaDoc server. And then modify <code>SEADOC_SERVER_URL</code> in your <code>.env</code> file</p>
</article>
</div>
<script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script>
</div>
<button type="button" class="md-top md-icon" data-md-component="top" hidden>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M13 20h-2V8l-5.5 5.5-1.42-1.42L12 4.16l7.92 7.92-1.42 1.42L13 8z"/></svg>
Back to top
</button>
</main>
<footer class="md-footer">
<nav class="md-footer__inner md-grid" aria-label="Footer" >
<a href="../https_with_nginx/" class="md-footer__link md-footer__link--prev" aria-label="Previous: HTTPS with Nginx">
<div class="md-footer__button md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11z"/></svg>
</div>
<div class="md-footer__title">
<span class="md-footer__direction">
Previous
</span>
<div class="md-ellipsis">
HTTPS with Nginx
</div>
</div>
</a>
<a href="../start_seafile_at_system_bootup/" class="md-footer__link md-footer__link--next" aria-label="Next: Start Seafile at System Bootup">
<div class="md-footer__title">
<span class="md-footer__direction">
Next
</span>
<div class="md-ellipsis">
Start Seafile at System Bootup
</div>
</div>
<div class="md-footer__button md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M4 11v2h12l-5.5 5.5 1.42 1.42L19.84 12l-7.92-7.92L10.5 5.5 16 11z"/></svg>
</div>
</a>
</nav>
<div class="md-footer-meta md-typeset">
<div class="md-footer-meta__inner md-grid">
<div class="md-copyright">
<div class="md-copyright__highlight">
Copyright &copy; 2024 Seafile Ltd.
</div>
Made with
<a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener">
Material for MkDocs
</a>
</div>
<div class="md-social">
<a href="https://github.com/haiwen/seafile-admin-docs/" target="_blank" rel="noopener" title="github.com" class="md-social__link">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M173.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6m-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3m44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9M252.8 8C114.1 8 8 113.3 8 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C436.2 457.8 504 362.9 504 252 504 113.3 391.5 8 252.8 8M105.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1m-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7m32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1m-11.4-14.7c-1.6 1-1.6 3.6 0 5.9s4.3 3.3 5.6 2.3c1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2"/></svg>
</a>
</div>
</div>
</div>
</footer>
</div>
<div class="md-dialog" data-md-component="dialog">
<div class="md-dialog__inner md-typeset"></div>
</div>
<script id="__config" type="application/json">{"annotate": null, "base": "../..", "features": ["navigation.footer", "navigation.tracking", "navigation.sections", "navigation.tabs", "navigation.top", "search.suggest", "search.highlight", "search.share", "math", "content.code.copy", "content.code.annotate"], "search": "../../assets/javascripts/workers/search.7a47a382.min.js", "tags": null, "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}, "version": {"provider": "mike"}}</script>
<script src="../../assets/javascripts/bundle.e71a0d61.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.7/MathJax.js?config=TeX-MML-AM_CHTML"></script>
</body>
</html>