diff --git a/manual/docker/cluster/deploy_seafile_cluster_with_docker.md b/manual/docker/cluster/deploy_seafile_cluster_with_docker.md new file mode 100644 index 00000000..a5ae62e0 --- /dev/null +++ b/manual/docker/cluster/deploy_seafile_cluster_with_docker.md @@ -0,0 +1,411 @@ +# Seafile Docker Cluster Deployment + +## Environment + +System: Ubuntu 20.04 + +docker-compose: 1.25.0 + +Seafile Server: 2 frontend nodes, 1 backend node + +## Deployment preparation + +Install docker-compose on each node + +``` +$ apt update && apt install docker-compose -y + +``` + +Create the three databases ccnet_db, seafile_db, and seahub_db required by Seafile on MariaDB/MySQL, and authorize the \`seafile\` user to be able to access these three databases: + +``` +$ mysql -h{your mysql host} -u[username] -p[password] + +mysql> +create user 'seafile'@'%' identified by 'PASSWORD'; + +create database `ccnet_db` character set = 'utf8'; +create database `seafile_db` character set = 'utf8'; +create database `seahub_db` character set = 'utf8'; + +GRANT ALL PRIVILEGES ON `ccnet_db`.* to 'seafile'@'%'; +GRANT ALL PRIVILEGES ON `seafile_db`.* to 'seafile'@'%'; +GRANT ALL PRIVILEGES ON `seahub_db`.* to 'seafile'@'%'; + +``` + +You also need to create a table in \`seahub_db\` + +``` +mysql> +use seahub_db; +CREATE TABLE `avatar_uploaded` ( + `filename` text NOT NULL, + `filename_md5` char(32) NOT NULL, + `data` mediumtext NOT NULL, + `size` int(11) NOT NULL, + `mtime` datetime NOT NULL, + PRIMARY KEY (`filename_md5`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +``` + +## Deploy Seafile service + +### Deploy seafile frontend nodes + +Install docker-compose on the backend node + +``` +$ apt update && apt install docker-compose -y + +``` + +Create the mount directory + +``` +$ mkdir -p /opt/seafile/shared + +``` + +Create the docker-compose.yml file + +``` +$ cd /opt/seafile +$ vim docker-compose.yml + +``` + +``` +version: '2.0' +services: + seafile: + image: docker.seafile.top/seafileltd/seafile-pro-mc:9.0.2 + container_name: seafile + ports: + - 80:80 + volumes: + - /opt/seafile/shared:/shared + environment: + - CLUSTER_SERVER=true + - CLUSTER_MODE=frontend + - TIME_ZONE=Asia/Shanghai # Optional, default is UTC. Should be uncomment and set to your local time zone. + +``` + +**Note**: **CLUSTER_SERVER=true** means seafile cluster mode, **CLUSTER_MODE=frontend** means this node is seafile frontend server. + +Start the seafile docker container + +``` +$ cd /opt/seafile +$ docker-compose up -d + +``` + +#### Initial configuration files + +1\. Manually generate configuration files + +``` +$ docker exec -it seafile bash + +# cd /scripts && ./cluster_conf_init.py +# cd /opt/seafile/conf + +``` + +2\. Modify the mysql configuration options (user, host, password) in configuration files such as ccnet.conf, seafevents.conf, seafile.conf and seahub_settings.py. + +3\. Modify the memcached configuration option in seahub_settings.py + +``` +CACHES = { + 'default': { + 'BACKEND': 'django_pylibmc.memcached.PyLibMCCache', + 'LOCATION': 'memcached:11211', + }, +... +} + | + v + +CACHES = { + 'default': { + 'BACKEND': 'django_pylibmc.memcached.PyLibMCCache', + 'LOCATION': '{you memcached server host}:11211', + }, +... +} + +``` + +4\. Modify the \[INDEX FILES] configuration options in seafevents.conf + +``` +[INDEX FILES] +es_port = {your elasticsearch server port} +es_host = {your elasticsearch server host} +external_es_server = true +enabled = true +interval = 10m +... + +``` + +5\. Add some configurations in seahub_settings.py + +```python +SERVICE_URL = 'http{s}://{your server IP or sitename}/' +FILE_SERVER_ROOT = 'http{s}://{your server IP or sitename}/seafhttp' +AVATAR_FILE_STORAGE = 'seahub.base.database_storage.DatabaseStorage' + +``` + +6\. Add cluster special configuration in seafile.conf + +``` +[cluster] +enabled = true +memcached_options = --SERVER={your memcached server host} --POOL-MIN=10 --POOL-MAX=100 + +``` + +#### Import the tables of seahub_db, seafile_db and ccnet_db + +Enter the container, and then execute the following commands to import tables + +``` +$ docker exec -it seafile bash + +# mysql -h{your mysql host} -u[username] -p[password] ccnet_db < /opt/seafile/seafile-server-latest/sql/mysql/ccnet.sql +# mysql -h{your mysql host} -u[username] -p[password] seafile_db < /opt/seafile/seafile-server-latest/sql/mysql/seafile.sql +# mysql -h{your mysql host} -u[username] -p[password] seahub_db < /opt/seafile/seafile-server-laster/seahub/sql/mysql.sql + +``` + +Start Seafile service + +``` +$ docker exec -it seafile bash + +# cd /opt/seafile/seafile-server-latest +# ./seafile.sh start && ./seahub.sh start + +``` + +When you start it for the first time, seafile will guide you to set up an admin user. + +When deploying the second frontend node, you can directly copy all the directories generated by the first frontend node, including the docker-compose.yml file and modified configuration files, and then start the seafile docker container. + +### Deploy seafile backend node + +Create the mount directory + +``` +$ mkdir -p /opt/seafile/shared + +``` + +Create the docker-compose.yml file + +``` +$ cd /opt/seafile +$ vim docker-compose.yml + +``` + +``` +version: '2.0' +services: + seafile: + image: docker.seafile.top/seafileltd/seafile-pro-mc:9.0.2 + container_name: seafile + ports: + - 80:80 + volumes: + - /opt/seafile/shared:/shared + environment: + - CLUSTER_SERVER=true + - CLUSTER_MODE=backend + - TIME_ZONE=Asia/Shanghai # Optional, default is UTC. Should be uncomment and set to your local time zone. + +``` + +**Note**: **CLUSTER_SERVER=true** means seafile cluster mode, **CLUSTER_MODE=backend** means this node is seafile backend server. + +Start the seafile docker container + +``` +$ cd /opt/seafile +$ docker-compose up -d + +``` + +Copy configuration files of the frontend node, and then start Seafile server of the backend node + +``` +$ docker exec -it seafile bash + +# cd /opt/seafile/seafile-server-latest +# ./seafile.sh start && ./seafile-background-tasks.sh start + +``` + +### Use S3 as backend storage + +Modify the seafile.conf file on each node to configure S3 storage. + +vim seafile.conf + +``` +[commit_object_backend] +name = s3 +bucket = {your-commit-objects} # The bucket name can only use lowercase letters, numbers, and dashes +key_id = {your-key-id} +key = {your-secret-key} +use_v4_signature = true +aws_region = eu-central-1 # eu-central-1 for Frankfurt region + +[fs_object_backend] +name = s3 +bucket = {your-fs-objects} +key_id = {your-key-id} +key = {your-secret-key} +use_v4_signature = true +aws_region = eu-central-1 + +[block_backend] +name = s3 +bucket = {your-block-objects} +key_id = {your-key-id} +key = {your-secret-key} +use_v4_signature = true +aws_region = eu-central-1 + +``` + +### Deployment load balance + +#### Install HAproxy and Keepalived services + +Execute the following commands on the two Seafile frontend servers: + +``` +$ apt install haproxy keepalived -y + +$ mv /etc/haproxy/haproxy.cfg /etc/haproxy/haproxy.cfg.bak + +$ cat > /etc/haproxy/haproxy.cfg << 'EOF' +global + log 127.0.0.1 local1 notice + maxconn 4096 + user haproxy + group haproxy + +defaults + log global + mode http + retries 3 + timeout connect 10000 + timeout client 300000 + timeout server 300000 + +listen seafile 0.0.0.0:80 + mode http + option httplog + option dontlognull + option forwardfor + cookie SERVERID insert indirect nocache + server seafile01 Front-End01-IP:8001 check port 11001 cookie seafile01 + server seafile02 Front-End02-IP:8001 check port 11001 cookie seafile02 +EOF + +``` + +**Note**: Correctly modify the IP address (Front-End01-IP and Front-End02-IP) of the frontend server in the above configuration file. + +**Choose one of the above two servers as the master node, and the other as the slave node.** + +Perform the following operations on the master node: + +```bash +$ cat > /etc/keepalived/keepalived.conf << 'EOF' +! Configuration File for keepalived + +global_defs { + notification_email { + root@localhost + } + notification_email_from keepalived@localhost + smtp_server 127.0.0.1 + smtp_connect_timeout 30 + router_id node1 + vrrp_mcast_group4 224.0.100.18 +} + +vrrp_instance VI_1 { + state MASTER + interface eno1 # Set to the device name of a valid network interface on the current server, and the virtual IP will be bound to the network interface + virtual_router_id 50 + priority 100 + advert_int 1 + authentication { + auth_type PASS + auth_pass seafile123 + } + virtual_ipaddress { + 172.26.154.45/24 dev eno1 # Configure to the correct virtual IP and network interface device name + } +} +EOF + +``` + +**Note: **Correctly configure the virtual IP address and network interface device name in the above file. + +Perform the following operations on the standby node: + +```bash +$ cat > /etc/keepalived/keepalived.conf << 'EOF' +! Configuration File for keepalived + +global_defs { + notification_email { + root@localhost + } + notification_email_from keepalived@localhost + smtp_server 127.0.0.1 + smtp_connect_timeout 30 + router_id node2 + vrrp_mcast_group4 224.0.100.18 +} + +vrrp_instance VI_1 { + state BACKUP + interface eno1 # Set to the device name of a valid network interface on the current server, and the virtual IP will be bound to the network interface + virtual_router_id 50 + priority 98 + advert_int 1 + authentication { + auth_type PASS + auth_pass seafile123 + } + virtual_ipaddress { + 172.26.154.45/24 dev eno1 # Configure to the correct virtual IP and network interface device name + } +} +EOF + +``` + +Finally, run the following commands on the two Seafile frontend servers to start the corresponding services: + +``` +$ systemctl enable --now haproxy +$ systemctl enable --now keepalived + +``` + +So far, Seafile cluster has been deployed. diff --git a/mkdocs.yml b/mkdocs.yml index 8ea8764a..9a7ffadd 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -121,6 +121,7 @@ nav: - Seafile Setup with Docker: - Seafile Community Installation: docker/deploy_seafile_with_docker.md - Seafile Professional Installation: docker/pro-edition/deploy_seafile_pro_with_docker.md + - Seafile Docker Cluster Deployment: docker/cluster/deploy_seafile_cluster_with_docker.md - Migration from Seafile Community: docker/pro-edition/migrate_ce_to_pro_with_docker.md - Migrate from non-docker deployment: docker/non_docker_to_docker.md - Upgrade from 6.3 to 7.0: