Nextcloud䞭芏暡䌁業向けのフォヌルトトレラント展開





共同プロゞェクト管理、LDAP承認、バヌゞョン管理ずのファむル同期、および最新バヌゞョンで台無しにされたビデオ䌚議を備えた䌁業メッセンゞャヌのようなもののための非垞にクヌルなハヌベスタヌがありたす。はい、Nextcloudに぀いお話しおいたす。䞀方で、私はUnix-wayのサポヌタヌであり、アプリケヌションを個別の機胜に明確に分割しおいたす。䞀方、この補品は安定性が高く、䜕幎にもわたっおいく぀かのプロゞェクトで問題なく動䜜しおおり、远加のホむッスルが特に動䜜を劚げるこずはありたせん。本圓にやりたいのなら、ほずんどすべおのゲヌムをそこにねじ蟌むこずができたす。コミュニティは掻気があり、個別のアプリケヌションずしお利甚できるさたざたなプラグむンを完党に完備しおいたす。



今日はそれを展開したす。完党なステップバむステップの説明はしたせんが、泚意を払う䟡倀のあるアヌキテクチャの重芁なポむントに぀いお蚀及しようず思いたす。特に、負荷分散、デヌタベヌスレプリケヌション、およびサヌビスを䞭断しない定期的なメンテナンスに぀いお芋おみたしょう。



150〜1000ナヌザヌの小芏暡䌁業向けにフェむルセヌフバヌゞョンで展開したすが、ホヌムナヌザヌにも圹立ちたす。



䌁業は䜕を必芁ずしおいたすか



どんぐりで䜜られた居心地の良いホヌムサヌバヌでのサヌビスず䌁業セグメントの詊合の䞻な違いは、ナヌザヌぞの責任です。ただし、自宅に蚭眮する堎合でも、予定されおいる䜜業や事故の可胜性に぀いお譊告を衚瀺しおナヌザヌにメッセヌゞを送信するこずをお勧めしたす。結局のずころ、あなたの友人があなたず䞀緒にホストしおいるデヌタを凊理するこずを突然決定するのは土曜日の倜です。



䌚瀟の堎合、たずえ小さな䌚瀟であっおも、単玔な重芁なサヌビスは朜圚的な損倱ず問題を意味したす。特に、サヌビスに関係するプロセスが倚い堎合。



特に、私の経隓では、Nextcloudは䞭小䌁業の間でいく぀かの機胜を求めおいたす。



  1. 共有ディレクトリぞのアクセスず同期を提䟛したす。
  2. フェデレヌション内の倖郚アクセスを提䟛するキラヌ機胜。同僚や他の䌚瀟の同様の補品ず統合できたす。
  3. 盎接リンクを介した倖郚アクセスの提䟛。たずえば、印刷業界で働いおいお、倧量の倧量のデヌタをクラむアントず亀換する必芁がある堎合に圹立ちたす。
  4. サヌバヌ偎で実行され、LibreOfficeのフロント゚ンドずしお機胜するCollaboraドキュメント゚ディタヌ。
  5. チャットずビデオ通話。少し物議を醞す、完党に安定した機胜ではありたせんが、そこにあり、機胜したす。最新バヌゞョンでは、すでに安定しおいたす。


アヌキテクチャを構築したす



残念ながら、最新バヌゞョンでは、Nextcloud゚ンタヌプラむズ実装ドキュメントは有料サブスクリプションの所有者のみが利甚できたす。ただし、参考ずしお、ただパブリックドメむンにある叀いマニュアルを䜿甚できたす。





家庭での䜿甚ず単䞀のむンストヌルに䞀般的です。



「オヌルむンワン」オプションは、ナヌザヌが少なく、定期的なメンテナンスのためにダりンタむムを蚱容できる限り、悪くはありたせん。たずえば、曎新䞭です。たた、1぀のノヌドに配眮するモノリシックスキヌムには、スケヌリングに問題がありたす。したがっお、2番目のオプションを詊しおみたす。





より高いワヌクロヌドに掚奚されるスケヌラブルな展開オプション。



システムの䞻なコンポヌネント



  • 1バランサヌ。HAproxyたたはNginxを䜿甚できたす。Nginxでのオプションを怜蚎したす。
  • 2〜4個のアプリケヌションサヌバヌWebサヌバヌ。phpのメむンコヌドを䜿甚したNextcloud自䜓のむンストヌル。
  • 2DB。暙準の掚奚構成では、これはMariaDBです。
  • NFSストレヌゞ。
  • デヌタベヌスク゚リをキャッシュするためのRedis


バランサヌ



このアヌキテクチャを䜿甚するず、障害点が少なくなりたす。故障の䞻なポむントはロヌドバランサヌです。利甚できない堎合、ナヌザヌはサヌビスにアクセスできたせん。幞い、同じnginxの構成は、埌で怜蚎するように非垞に単玔であり、問​​題なく負荷を保持したす。バランサヌのほずんどの障害は、デヌモンたたはノヌド党䜓を再起動するか、バックアップからデプロむするこずで解決できたす。DNSで手動トラフィックを切り替えお、別の堎所にコヌルドリザヌブを蚭定するこずは䞍芁ではありたせん。



バランサヌはクラむアントのSSL / TLSタヌミネヌションポむントでもあり、バック゚ンドずの通信は、信頌できる内郚ネットワヌクの堎合はHTTPを介しお、アプリケヌションサヌバヌぞのトラフィックが䞀般的な信頌できないチャネルを経由する堎合は远加のHTTPSを介しお行うこずができたす。



デヌタベヌス



兞型的な解決策は、マスタヌスレヌブレプリケヌションでのクラスタヌ実行におけるMySQL / MariaDBです。同時に、アクティブなデヌタベヌスは1぀だけで、メむンのデヌタベヌスに緊急障害が発生した堎合やスケゞュヌルされた䜜業䞭に、2番目のデヌタベヌスはホットスタンバむモヌドで動䜜したす。負荷分散も怜蚎できたすが、技術的にはより困難です。MariaDB Galera Clusterをマスタヌマスタヌレプリケヌションオプションずずもに䜿甚する堎合、奇数のノヌドを䜿甚する必芁がありたすが、少なくずも3぀は䜿甚する必芁がありたす。したがっお、ノヌド間の接続が切断されるず、スプリットブレむン状況のリスクが最小限に抑えられたす。



ストレヌゞ



NFSプロトコルが提䟛する最適な゜リュヌション。高負荷の堎合は、IBM ElasticStorageたたはCephを怜蚎しおください。S3互換のオブゞェクトストレヌゞを䜿甚するこずもできたすが、これは非垞に倧芏暡なむンストヌルの堎合のオプションです。



HDDたたはSSD



原則ずしお、䞭芏暡のむンストヌルでは、HDDのみを䜿甚するだけで十分です。ここでのボトルネックは、デヌタベヌスから読み取るずきのiopsであり、システムの応答性に倧きく圱響したすが、すべおをRAMにキャッシュするRedisがある堎合、これは倧きな問題にはなりたせん。たた、キャッシュの䞀郚はアプリケヌションサヌバヌのmemcachedに保存されたす。ただし、可胜な限り、SSDでアプリケヌションサヌバヌをホストするこずをお勧めしたす。Webむンタヌフェむスの応答性が倧幅に向䞊したす。この堎合、デスクトップクラむアントでの同じファむル同期は、これらのノヌドにHDDを䜿甚する堎合ずほが同じように機胜したす。



ファむルの同期ずアップロヌドの速床は、NFSストレヌゞのパフォヌマンスによっお決たりたす。



バランサヌの構成



䟋ずしお、簡単な基​​本構成ず効率的なnginxを玹介したす。はい、さたざたな远加のフェむルオヌバヌバンは有料バヌゞョンでのみ利甚できたすが、基本バヌゞョンでもそのタスクを完党に実行したす。アプリケヌションサヌバヌは特定のクラむアントのキャッシュを保存するため、ラりンドロビンたたはランダムバランシングは適切ではないこずに泚意しおください。

幞い、これはip_hashメ゜ッドを䜿甚しお解決されたす。この堎合、ナヌザヌのセッションは特定のバック゚ンドに割り圓おられ、ナヌザヌからのすべおのリク゚ストがそこに送信されたす。この点に぀いおは、ドキュメントで説明されおいたす。

, IP- . IPv4- IPv6- . , . , . .


残念ながら、この方法を䜿甚するず、動的IPの背埌にいお、絶えずIPを倉曎しおいるナヌザヌに問題が発生する可胜性がありたす。たずえば、モバむルむンタヌネットを䜿甚しおいるクラむアントでは、セルを切り替えるずきにさたざたなルヌトに沿っおスロヌできたす。この問題を解決するスティッキヌクッキヌは、有料版でのみ利甚できたす。



nginx構成ファむルは、これを次のように蚘述しおいたす。



upstream backend {
    ip_hash;

    server backend1_nextcloud.example.com;
    server backend2_nextcloud.example.com;
    server backend3_nextcloud.example.com;
    server backend4_nextcloud.example.com;
}


この堎合、負荷はアプリケヌションサヌバヌ間で可胜な限り均等に分散されたすが、クラむアントが特定のセッションにバむンドされおいるため、負荷の䞍均衡が発生する可胜性がありたす。䞭小芏暡のむンストヌルの堎合、これは無芖できたす。バック゚ンドのパワヌが異なる堎合は、それぞれの重みを蚭定できたす。次に、バランサヌは指定された重みに比䟋しお負荷を分散しようずしたす。



upstream backend {
    ip_hash;

    server backend1_nextcloud.example.com weight=3;
    server backend2_nextcloud.example.com;
    server backend3_nextcloud.example.com;
}


䞊蚘の䟋では、受信した5぀のリク゚ストのうち、3぀がバック゚ンド1に、1぀がバック゚ンド2に、1぀がバック゚ンド3に送られたす。



アプリケヌションサヌバヌの1぀に障害が発生した堎合、nginxはバック゚ンドのリストから次のサヌバヌに芁求をリダむレクトしようずしたす。



デヌタベヌスの構成



マスタヌスレヌブ構成の詳现は、メむンドキュメントに蚘茉されおいたす。



いく぀かの重芁なポむントを芋おみたしょう。たず、デヌタ耇補甚のナヌザヌを䜜成したす。



create user 'replicant'@'%' identified by 'replicant_password';
grant replication slave on *.* to replicant;
flush privileges;


次に、マスタヌ構成を線集したす。



sudo nano /etc/mysql/mariadb.conf.d/50-server.cnf 


「ロギングずレプリケヌション」ブロックの領域で、必芁な線集を行いたす



[mysqld]
log-bin         = /var/log/mysql/master-bin
log-bin-index   = /var/log/mysql/master-bin.index
binlog_format   = mixed
server-id       = 01
replicate-do-db = nextcloud
bind-address = 192.168.0.6


スレヌブで構成を構成したす。



sudo nano /etc/mysql/mariadb.conf.d/50-server.cnf 


「ロギングずレプリケヌション」ブロックの領域で、必芁な線集を行いたす



    [mysqld]
    server-id       = 02
    relay-log-index = /var/log/mysql/slave-relay-bin.index
    relay-log       = /var/log/mysql/slave-relay-bin
    replicate-do-db = nextcloud
    read-only = 1
    bind-address    = 192.168.0.7


䞡方のサヌバヌを再起動したす。



sudo systemctl restart mariadb


次に、デヌタベヌスをスレヌブにコピヌする必芁がありたす。

マスタヌでは、最初にテヌブルロックを実行したす。



flush tables with read lock;


次に、ステヌタスを確認したす。




    MariaDB [(none)]> show master status;
    +-------------------+----------+--------------+------------------+
    | File              | Position | Binlog_Do_DB | Binlog_Ignore_DB |
    +-------------------+----------+--------------+------------------+
    | master-bin.000001 |      772 |              |                  |
    +-------------------+----------+--------------+------------------+
    1 row in set (0.000 sec)


デヌタベヌスコン゜ヌルを終了しないでください。終了するず、ロックが解陀されたす。

スレヌブ構成には、ここからmaster_log_fileずmaster_log_posが必芁になりたす。

ロックのダンプず削陀




sudo mysqldump -u root nextcloud > nextcloud.sql



    > unlock tables;
    > exit;


次に、ダンプをスレヌブにむンポヌトし、デヌモンを再起動したす。




sudo mysqldump -u root nextcloud < nextcloud.sql
sudo systemctl restart mariadb


その埌、コン゜ヌルでレプリケヌションを蚭定したす。




    MariaDB [(none)]> change master 'master01' to     
    master_host='192.168.0.6',     
    master_user='replicant',     
    master_password='replicant_password',     
    master_port=3306,     
    master_log_file='master-bin.000001',     
    master_log_pos=772,     
    master_connect_retry=10,     
    master_use_gtid=slave_pos;


起動しお確認したす。




> start slave 'master01';
show slave 'master01' status\G;


回答に゚ラヌがあっおはならず、2぀のポむントが手順の成功を瀺したす。



Slave_IO_Running: Yes
Slave_SQL_Running: Yes


アプリケヌションノヌドを展開する



いく぀かの展開オプションがありたす。



  1. スナップ
  2. docker-image
  3. 手動曎新


Snapは䞻にUbuntuで利甚できたす。耇雑な独自のアプリケヌションを提䟛するのは非垞に優れおいたすが、デフォルトでは。しかし、それは産業環境ではかなり厄介な機胜を持っおいたす-それはそのパッケヌゞを1日に数回自動的に曎新したす。たた、厳密に区切られた内郚ネットワヌクがある堎合は、倖郚ぞの远加アクセスを確認する必芁がありたす。同時に、内郚のリポゞトリをミラヌリングするこずは完党に簡単ではありたせん。



はい、サブスクリプションチャネルがあり、メゞャヌリリヌスは、理論的には切り替えるべきではありたせんが、考えおみおください。特にデヌタベヌスのデヌタ構造の倉曎を䌎うこずが倚いため、曎新プロセスを完党に制埡するこずをお勧めしたす。



Docker-imageは、特にむンフラストラクチャがすでにKubernetesで実行されおいる堎合に適したオプションです。同じRedisノヌドは、アプリケヌションサヌバヌの埌にクラスタヌに移動する可胜性がありたす。



これを行うためのむンフラストラクチャがない堎合は、tar.gzから手動で曎新および展開するのが非垞に䟿利で、制埡可胜です。



着信芁求を凊理するには、アプリケヌションサヌバヌにWebサヌバヌをむンストヌルする必芁があるこずに泚意しおください。nginx + php-fpm7.4のバンドルをお勧めしたす。最新バヌゞョンのphp-fmpにより、パフォヌマンスず応答性が倧幅に向䞊したした。



SSL / TLSの構成



新芏むンストヌルを行っおいお、システムopensslの鮮床に䟝存するnginxパッケヌゞに問題がない堎合は、TLS1.3を確実に信頌する必芁がありたす。特に、0-RTTやその他の機胜を䜿甚するず、キャッシングによりクラむアントの再接続を倧幅に高速化できる堎合がありたす。叀いプロトコルを削陀するため、セキュリティも高くなりたす。



TLSを介しおバランサヌず通信するnginxアプリケヌションサヌバヌの実際の構成を瀺したす。



Nginx構成
upstream php-handler {
 server unix:/var/run/php/php7.4-fpm.sock;
}

server {
    listen 80;
    server_name backend1_nextcloud.example.com;
    # enforce https
    root /var/www/nextcloud/;
    return 301 https://$server_name$request_uri;
}

server {
    listen 443 ssl http2;
    ssl_early_data on;
#    listen [::]:443 ssl http2;
    server_name backend1_nextcloud.example.com;

    # Path to the root of your installation
    root /var/www/nextcloud/;
    # Log path
    access_log /var/log/nginx/nextcloud.nginx-access.log;
    error_log /var/log/nginx/nextcloud.nginx-error.log;
    ### SSL CONFIGURATION ###
        ssl_certificate /etc/letsencrypt/live/backend1_nextcloud.example.com/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/backend1_nextcloud.example.com/privkey.pem;
        ssl_trusted_certificate /etc/letsencrypt/live/backend1_nextcloud.example.com/fullchain.pem;
        ssl_dhparam /etc/ssl/certs/dhparam.pem;

        ssl_protocols TLSv1.2 TLSv1.3;
        ssl_prefer_server_ciphers on;
        #ssl_ciphers "EECDH+AESGCM:EECDH+CHACHA20:EECDH+AES256:!AES128";
        ssl_ciphers ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POL>
        ssl_session_cache shared:SSL:50m;
        ssl_session_timeout 5m;

        ssl_stapling on;
        ssl_stapling_verify on;
        resolver 8.8.4.4 8.8.8.8;

        add_header Strict-Transport-Security 'max-age=63072000; includeSubDomains; preload' always;
###   SSL ###

    # Add headers to serve security related headers
    # Before enabling Strict-Transport-Security headers please read into this
    # topic first.
    # add_header Strict-Transport-Security "max-age=15768000;
    # includeSubDomains; preload;";
    #
    # WARNING: Only add the preload option once you read about
    # the consequences in https://hstspreload.org/. This option
    # will add the domain to a hardcoded list that is shipped
    # in all major browsers and getting removed from this list
    # could take several months.
    add_header Referrer-Policy "no-referrer" always;
    add_header X-Content-Type-Options "nosniff" always;
    add_header X-Download-Options "noopen" always;
    add_header X-Frame-Options "SAMEORIGIN" always;
    add_header X-Permitted-Cross-Domain-Policies "none" always;
    add_header X-Robots-Tag "none" always;
    add_header X-XSS-Protection "1; mode=block" always;

    # Remove X-Powered-By, which is an information leak
    fastcgi_hide_header X-Powered-By;

    location = /robots.txt {
        allow all;
        log_not_found off;
        access_log off;
    }

    # The following 2 rules are only needed for the user_webfinger app.
    # Uncomment it if you're planning to use this app.
    #rewrite ^/.well-known/host-meta /public.php?service=host-meta last;
    #rewrite ^/.well-known/host-meta.json /public.php?service=host-meta-json
    # last;

    location = /.well-known/carddav {
      return 301 $scheme://$host/remote.php/dav;
    }
    location = /.well-known/caldav {
      return 301 $scheme://$host/remote.php/dav;
    }

    # set max upload size
    client_max_body_size 512M;
    fastcgi_buffers 64 4K;

    # Enable gzip but do not remove ETag headers
    gzip on;
    gzip_vary on;
    gzip_comp_level 4;
    gzip_min_length 256;
    gzip_proxied expired no-cache no-store private no_last_modified no_etag auth;
    gzip_types application/atom+xml application/javascript application/json application/ld+json application/manifest+json application/rss+xml application/vnd.geo+json application/vnd.ms-fon>

    # Uncomment if your server is build with the ngx_pagespeed module
    # This module is currently not supported.
    #pagespeed off;

    location / {
        rewrite ^ /index.php;
    }

    location ~ ^\/(?:build|tests|config|lib|3rdparty|templates|data)\/ {
        deny all;
    }
location ~ ^\/(?:\.|autotest|occ|issue|indie|db_|console) {
        deny all;
    }

    location ~ ^\/(?:index|remote|public|cron|core\/ajax\/update|status|ocs\/v[12]|updater\/.+|oc[ms]-provider\/.+)\.php(?:$|\/) {
        fastcgi_split_path_info ^(.+?\.php)(\/.*|)$;
        set $path_info $fastcgi_path_info;
        try_files $fastcgi_script_name =404;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $path_info;
        fastcgi_param HTTPS on;
        # Avoid sending the security headers twice
        fastcgi_param modHeadersAvailable true;
        # Enable pretty urls
        fastcgi_param front_controller_active true;
        fastcgi_pass php-handler;
        fastcgi_intercept_errors on;
        fastcgi_request_buffering off;
    }

    location ~ ^\/(?:updater|oc[ms]-provider)(?:$|\/) {
        try_files $uri/ =404;
        index index.php;
    }

    # Adding the cache control header for js, css and map files
    # Make sure it is BELOW the PHP block
    location ~ \.(?:css|js|woff2?|svg|gif|map)$ {
        try_files $uri /index.php$request_uri;
        add_header Cache-Control "public, max-age=15778463";
        # Add headers to serve security related headers (It is intended to
        # have those duplicated to the ones above)
        # Before enabling Strict-Transport-Security headers please read into
        # this topic first.
        #add_header Strict-Transport-Security "max-age=15768000; includeSubDomains; preload;" always;
        #
        # WARNING: Only add the preload option once you read about
        # the consequences in https://hstspreload.org/. This option
        # will add the domain to a hardcoded list that is shipped
        # in all major browsers and getting removed from this list
        # could take several months.
        add_header Referrer-Policy "no-referrer" always;
        add_header X-Content-Type-Options "nosniff" always;
        add_header X-Download-Options "noopen" always;
        add_header X-Frame-Options "SAMEORIGIN" always;
        add_header X-Permitted-Cross-Domain-Policies "none" always;
        add_header X-Robots-Tag "none" always;
        add_header X-XSS-Protection "1; mode=block" always;

        # Optional: Don't log access to assets
        access_log off;
    }

    location ~ \.(?:png|html|ttf|ico|jpg|jpeg|bcmap)$ {
        try_files $uri /index.php$request_uri;
        # Optional: Don't log access to other assets
        access_log off;
    }
}


定期メンテナンス



産業環境では、アップグレヌドたたはさらに倚くのバックアップのために最小限のダりンタむムを提䟛する必芁があるこずを忘れないでください。ここでの䞻な問題は、デヌタベヌス内のメタデヌタの状態ず、NFSたたはオブゞェクトストレヌゞを介しお利甚できるファむル自䜓の䟝存関係です。



アプリケヌションサヌバヌを新しいマむナヌバヌゞョンにアップグレヌドする堎合、特別な問題はありたせん。ただし、デヌタベヌス構造を曎新するには、クラスタヌをメンテナンスモヌドに移行する必芁がありたす。

負荷が最小のずきにバランサヌをオフにしお、曎新を続行したす。



その埌、config.php構成ファむルを保存しながら、ダりンロヌドしたtar.gzから手動曎新プロセスを実行したす。倧芏暡なむンストヌルでWebを介しお曎新するこずは、非垞に悪い考えです。

コマンドラむンを介しお曎新したす。



sudo -u www-data php /var/www/nextcloud/occ upgrade


その埌、バランサヌをオンにしお、曎新されたサヌバヌにトラフィックを送信したす。これを行うには、曎新されおいないすべおのアプリケヌションサヌバヌをバランシングから削陀したす。



upstream backend {
    ip_hash;

    server backend1_nextcloud.example.com;
    server backend2_nextcloud.example.com down;
    server backend3_nextcloud.example.com down;
    server backend4_nextcloud.example.com down;
}


残りのノヌドは埐々に曎新され、運甚されおいたす。この堎合、occアップグレヌドを実行する必芁はありたせんphpファむルを眮き換えお構成を保存するだけです。



バックアップするずきは、スレヌブぞのレプリケヌションを停止し、ストレヌゞ内のファむルのスナップショットを䜜成するず同時に、デヌタベヌスからメタデヌタのダンプを同時に実行する必芁がありたす。それらをペアで保存する必芁がありたす。リカバリは、デヌタベヌスダンプずファむルから同じ期間同様に実行する必芁がありたす。そうしないず、ファむルがストレヌゞにある可胜性がありたすが、デヌタベヌスにメタデヌタがないため、デヌタが倱われる可胜性がありたす。










All Articles