VPSでNextcloudをセルフホスト:システム管理者のための実践ガイド

DevOps tutorial - IT technology blog
DevOps tutorial - IT technology blog

クイックスタート:Dockerで5分でNextcloudを構築

深夜2時、コーヒーは冷めきり、あなたはプロプライエタリなクラウドストレージにうんざりしています。自分のデータは自分で管理したい。そう思っているなら、次のコーヒーを淹れる前に、あなたのVPS(仮想プライベートサーバー)でNextcloudインスタンスを起動させましょう。最も速い方法はDockerを使うことです。

まず、サーバーにDockerとDocker Composeをインストールします。最近のほとんどのLinuxディストリビューションでは、これは簡単です。まっさらなサーバーなら、これらのコマンドで始められます。

# Debian/Ubuntuの場合
sudo apt update && sudo apt upgrade -y
sudo apt install docker.io docker-compose-v2 -y

次に、Nextcloudの設定用のディレクトリを作成し、その中にdocker-compose.ymlファイルを追加します。

mkdir ~/nextcloud && cd ~/nextcloud
nano docker-compose.yml

この設定をファイルに貼り付けてください。これは2つのサービスを定義します。Nextcloudアプリケーションと、そのメタデータを保存するためのMariaDBデータベースです。重要な点として、デフォルトのパスワードを長くてランダムなものに変更してください。

version: '3.8'

services:
  db:
    image: mariadb:10.11 # 最近の安定版を使用
    restart: always
    command: --transaction-isolation=READ-COMMITTED --binlog-format=ROW
    volumes:
      - db:/var/lib/mysql
    environment:
      - MYSQL_ROOT_PASSWORD=CHANGE_ME_TO_A_VERY_STRONG_PASSWORD
      - MYSQL_PASSWORD=CHANGE_ME_TO_A_STRONG_DB_PASSWORD
      - MYSQL_DATABASE=nextcloud
      - MYSQL_USER=nextcloud
    healthcheck:
        test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "root", "-p$$MYSQL_ROOT_PASSWORD"]
        interval: 10s
        timeout: 5s
        retries: 5

  app:
    image: nextcloud:latest
    restart: always
    ports:
      - 8080:80
    depends_on:
      db:
        condition: service_healthy
    volumes:
      - nextcloud:/var/www/html
    environment:
      - MYSQL_PASSWORD=CHANGE_ME_TO_A_STRONG_DB_PASSWORD
      - MYSQL_DATABASE=nextcloud
      - MYSQL_USER=nextcloud
      - MYSQL_HOST=db

volumes:
  db:
  nextcloud:

ファイルを保存したら、コンテナを起動します。

# 注意: 新しいプラグインでは 'docker compose' (スペースあり) を使用します
sudo docker compose up -d

これで完了です。Nextcloudインスタンスが実行中になりました。http://YOUR_SERVER_IP:8080にアクセスして確認できます。適切なドメイン名を使用し、HTTPSを有効にする方法は次のセクションで説明します。

詳細な手動インストール:ベアメタル方式

Dockerは高速ですが、Nextcloudをサーバーに直接インストールすると、コンポーネントをより細かく制御でき、理解も深まります。このアプローチでは、スタックのすべての部分を微調整できます。ここでは、Debian/Ubuntu上で標準的なLEMPスタック(Nginx、MariaDB、PHP)を使用します。

1. LEMPスタックとPHP拡張機能のインストール

まず、Webサーバー、データベース、そしてNextcloudがファイル、画像、さまざまなバックグラウンドタスクを処理するために必要とするすべてのPHP拡張機能をインストールする必要があります。

sudo apt update
sudo apt install nginx mariadb-server -y
sudo apt install php-fpm php-gd php-mysql php-curl php-mbstring php-intl php-gmp php-bcmath php-xml php-zip php-imagick -y

2. データベースの設定

MariaDBシェルにログインし、Nextcloud専用のデータベースとユーザーを作成します。これにより、データが分離されます。`your_strong_password`は、ご自身で生成したユニークで安全なパスワードに置き換えることを忘れないでください。

sudo mysql # デフォルトのインストールではrootにパスワードは不要です

CREATE DATABASE nextcloud;
CREATE USER 'nextcloud'@'localhost' IDENTIFIED BY 'your_strong_password';
GRANT ALL PRIVILEGES ON nextcloud.* TO 'nextcloud'@'localhost';
FLUSH PRIVILEGES;
EXIT;

3. Nextcloudのダウンロードと準備

次に、最新バージョンのNextcloudを取得し、ウェブルートディレクトリに展開し、Webサーバーがファイルを読み書きできるように適切な権限を設定します。

cd /tmp
wget https://download.nextcloud.com/server/releases/latest.zip
unzip latest.zip
sudo mv nextcloud /var/www/
sudo chown -R www-data:www-data /var/www/nextcloud/

4. NginxとSSLの設定

では、Nginxを設定してNextcloudサイトを安全に提供しましょう。これには、サーバーブロックの設定と無料のSSL証明書の取得が含まれます。新しいNginx設定ファイルを作成します。

sudo nano /etc/nginx/sites-available/nextcloud.conf

以下の設定を貼り付けてください。これは本番環境に対応したテンプレートです。`cloud.yourdomain.com`を実際のドメインまたはサブドメインに置き換えてください。

server {
    listen 80;
    server_name cloud.yourdomain.com;

    # 全てのHTTPトラフィックをHTTPSにリダイレクト
    location / {
        return 301 https://$host$request_uri;
    }
}

server {
    listen 443 ssl http2;
    server_name cloud.yourdomain.com;

    # SSL証明書のパスは後ほどCertbotによって追加されます
    # ssl_certificate /etc/letsencrypt/live/cloud.yourdomain.com/fullchain.pem;
    # ssl_certificate_key /etc/letsencrypt/live/cloud.yourdomain.com/privkey.pem;

    add_header X-Content-Type-Options nosniff;
    add_header X-XSS-Protection "1; mode=block";
    add_header X-Robots-Tag "noindex, nofollow";
    add_header X-Frame-Options "SAMEORIGIN";

    root /var/www/nextcloud/;
    index index.php index.html /index.php$request_uri;

    # 最大アップロードサイズを設定 - 大容量ファイルには必須!
    client_max_body_size 10G;

    # CalDAVとCardDAVの設定
    location /.well-known/carddav { return 301 $scheme://$host/remote.php/dav; }
    location /.well-known/caldav  { return 301 $scheme://$host/remote.php/dav; }

    location ~ \.php(?:$|/) {
        fastcgi_split_path_info ^(.+?\.php)(/.*)$;
        fastcgi_pass unix:/var/run/php/php-fpm.sock; # パスはPHPのバージョンによって異なる場合があります
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }
}

この新しいサイトを有効にし、構文をテストしてから、Certbotを使用してLet’s Encryptから無料のSSL証明書を取得します。

sudo ln -s /etc/nginx/sites-available/nextcloud.conf /etc/nginx/sites-enabled/
sudo apt install certbot python3-certbot-nginx -y
sudo nginx -t # リロードする前に必ず設定をテストしてください
sudo systemctl reload nginx
sudo certbot --nginx -d cloud.yourdomain.com

Certbotは自動的に`nextcloud.conf`を編集し、SSL証明書のパスを含めてくれます。これで、ブラウザで`https://cloud.yourdomain.com`にアクセスしてセットアップウィザードを完了させることができます。

ステップ3:パフォーマンスチューニングとバックアップ

基本的なセットアップは機能しますが、スムーズで安全な体験のためには、いくつかの追加手順が不可欠です。UIを高速化するためのRedisキャッシュを設定し、自動バックアップを設定しましょう。

Redisキャッシュの有効化

メモリキャッシュにRedisを設定すると、頻繁にアクセスされるデータをRAMに保持することで、UIの応答時間を50%以上削減できます。応答性の違いはすぐに体感できます。

sudo apt install redis-server php-redis -y
sudo systemctl enable --now redis-server

次に、`config.php`ファイルを編集して、NextcloudにRedisを使用するように指示します。

sudo -u www-data nano /var/www/nextcloud/config/config.php

// 最後の ');' の前にこれらの行を追加します
'memcache.local' => '\OC\Memcache\Redis',
'redis' => [
    'host' => 'localhost',
    'port' => 6379,
],
'memcache.locking' => '\OC\Memcache\Redis',

自動バックアップ

テストされたバックアップがないシステムは、いつか失敗する運命にあるシステムです。このシンプルなbashスクリプトをcronジョブで毎晩実行することで、データベースとデータディレクトリ全体がバックアップされます。

#!/bin/bash
# /usr/local/bin/backup_nextcloud.sh

# 重要:真の障害復旧のためには、別のディスクまたはリモートストレージを使用してください
BACKUP_DIR="/mnt/backups/nextcloud"
TIMESTAMP=$(date +"%F")

# データベースのバックアップ
mysqldump --single-transaction -h localhost -u nextcloud -pyour_strong_password nextcloud > $BACKUP_DIR/nextcloud-db-$TIMESTAMP.sql

# データディレクトリと設定のバックアップ
# -AはACLを保持し、-aはアーカイブモード、-xは単一ファイルシステムに留まる
rsync -Aax /var/www/nextcloud/ $BACKUP_DIR/nextcloud-data-$TIMESTAMP/

# 7日以上前のバックアップをクリーンアップ
find $BACKUP_DIR -type f -mtime +7 -name '*.sql' -delete
find $BACKUP_DIR -type d -mtime +7 -name 'nextcloud-data-*' -exec rm -rf {} \;

一般的な問題のトラブルシューティング

問題は必ず発生します。問題は「いつ」起こるかであり、「もし」ではありません。手がかりをどこで探すべきかを知ることが、戦いの半分です。

  • Permission Denied (権限がありません): 不思議なエラーの少なくとも90%は、ファイルの所有権に起因します。Webサーバーのユーザー(`www-data`)がNextcloudのファイルを所有していることを常に再確認してください: `sudo chown -R www-data:www-data /var/www/nextcloud`。
  • 502 Bad Gateway: このエラーは、NginxがPHPプロセスと通信できないことを意味します。PHP-FPMサービスが実行中であること(`systemctl status php8.2-fpm.service`—バージョンは異なる場合があります)と、Nginx設定のソケットパスが正しいことを確認してください。
  • ログファイルは最高の友です: 何かが壊れたときは、まずログを確認してください。それらが最も直接的な手がかりを提供します。主なログは、Nextcloudログ(`/var/www/nextcloud/data/nextcloud.log`)、Nginxエラーログ(`/var/log/nginx/error.log`)、およびシステムジャーナル(`journalctl -u nginx`)です。

独自のクラウドを運営することは責任を伴いますが、それによって得られるコントロールとプライバシーは、その労力に見合う価値があります。一度設定して終わり、にはしないでください。健全なインスタンスとは、監視され、バックアップされ、定期的に更新されるものです。

Share: