0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ホームサーバー完全構築ガイド #6 クラウドストレージの構築

Last updated at Posted at 2024-12-06

ホームサーバー完全構築ガイド シリーズ記事:

ホームサーバー完全構築ガイド #0 計画とハードウェア選定
ホームサーバー完全構築ガイド #1 OS導入と基本設定
ホームサーバー完全構築ガイド #2 インフラの構築
ホームサーバー完全構築ガイド #3 サービス群の選定
ホームサーバー完全構築ガイド #4 WordPressのデプロイ
ホームサーバー完全構築ガイド #5 情報収集システムの構築
ホームサーバー完全構築ガイド #7 DevOpsプラットフォームの構築

はじめに

ホームサーバー完全構築ガイドシリーズへようこそ。このシリーズでは、ホームサーバーを活用したさまざまなシステム構築方法をご紹介しています。今回は、プライバシーとカスタマイズ性を重視したクラウドストレージ環境を構築するために、Nextcloud を取り上げます。

Google Drive や Dropbox などのクラウドサービスは便利ですが、データが外部サーバーに保存されるため、プライバシーやセキュリティに不安を感じる方も少なくありません。また、これらのサービスにはカスタマイズの制約があり、特定の用途やニーズに完全に対応できない場合もあります。一方で、Nextcloud を使用すれば、クラウドサービスと同等の利便性を保ちながら、データを完全に自分のサーバーで管理でき、自由度の高いカスタマイズが可能です。

今回の記事では、Nginx を Web サーバーとして採用し、提供いただいた Nginx の設定ファイルを活用します。この設定は、Cloudflare を DNS サービスプロバイダーとして利用することを前提としています。また、データベースには信頼性の高い MySQL を使用します。

今回のゴール

  1. Nextcloud の導入:ホームサーバーに Nextcloud をインストールして動作させる
  2. データベースの設定:MySQL を使用して Nextcloud のデータを管理
  3. Nginx の設定:Cloudflare を前提とした Nginx 設定ファイルを適用
  4. セキュアな通信の設定:Let's Encrypt を使って HTTPS 通信を実現
  5. 運用の開始:クライアントアプリのインストールや機能拡張

準備

必要な環境

  • サーバー環境
    • OS:Ubuntu Server 22.04(推奨)
    • CPU & メモリ:最低 2コア / 2GB RAM(推奨 4コア / 4GB RAM 以上)
    • ストレージ:必要な容量に応じて設定(SSD 推奨)
  • ネットワーク環境
    • ドメイン名(例:example.com)が利用可能
    • サーバーがインターネットからアクセス可能な IP アドレスを持っていること
  • DNS 設定
    • Cloudflare を DNS サービスプロバイダーとして使用し、ドメインを設定

必要なソフトウェアのインストール

システムのアップデート

まず、システムを最新の状態に更新します。

sudo apt update && sudo apt upgrade -y

Nginx のインストール

Nginxのインストールはホームサーバー完全構築ガイド #2 インフラの構築を参照してください。

PHP および関連モジュールのインストール

Nextcloud に必要な PHP とその拡張モジュールをインストールします。

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

PHP-FPM のバージョンを確認します。

php -v

MySQL のインストールと初期設定

MySQLのインストールおよび初期設定はホームサーバー完全構築ガイド #2 インフラの構築を参照してください。

Nextcloud のダウンロードとセットアップ

Nextcloud のダウンロード

Nextcloud の最新バージョンを公式サイトからダウンロードします。

wget https://download.nextcloud.com/server/releases/latest.tar.bz2

アーカイブの解凍

ダウンロードしたファイルを解凍し、適切なディレクトリに移動します。

tar -xjf latest.tar.bz2
sudo mv nextcloud /var/www/

権限の設定

Nextcloud のディレクトリに適切な権限を設定します。

sudo chown -R www-data:www-data /var/www/nextcloud
sudo chmod -R 755 /var/www/nextcloud

データベースの設定

MySQL コンソールに入り、データベースとユーザーを作成します。

sudo mysql -u root -p

以下の SQL コマンドを実行します。

CREATE DATABASE nextcloud CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
CREATE USER 'nextclouduser'@'localhost' IDENTIFIED WITH mysql_native_password BY 'あなたのパスワード';
GRANT ALL PRIVILEGES ON nextcloud.* TO 'nextclouduser'@'localhost';
FLUSH PRIVILEGES;
EXIT;

Nginx の設定

Nginx 設定ファイルの編集

提供いただいた Nginx の設定を適用します。この設定は Cloudflare を DNS サービスプロバイダーとして利用することを前提としています。

設定ファイルを作成または編集します。

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

以下の内容を貼り付けます(必要に応じてパスやドメイン名を調整してください)。

upstream php-handler {
    server unix:/run/php/php8.1-fpm.sock;
}

# Cloudflare を DNS サービスプロバイダーとして利用

server {
    listen 80;
    listen [::]:80;

    server_name cloud.example.com;

    server_tokens off;

    include /etc/nginx/trust_source/cloudflare;
    deny all;

    access_log /var/log/nginx/nextcloud/access80.log;
    error_log /var/log/nginx/nextcloud/error80.log;

    return 301 https://$server_name$request_uri;
}

server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;

    server_name cloud.example.com;

    server_tokens off;

    # 内部ネットワークを許可
    allow 172.19.0.0/16;

    include /etc/nginx/trust_source/cloudflare;
    deny all;

    ssl_certificate     /etc/ssl/your_ssl_cert.pem;
    ssl_certificate_key /etc/ssl/your_ssl_key.key;
    ssl_session_timeout 1d;
    ssl_session_cache shared:MozSSL:10m;
    ssl_session_tickets off;

    ssl_dhparam /etc/ssl/dhparam.pem;

    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:...';
    ssl_prefer_server_ciphers off;

    add_header Strict-Transport-Security "max-age=63072000" always;

    ssl_stapling on;
    ssl_stapling_verify on;

    ssl_trusted_certificate /etc/ssl/your_trusted_cert.pem;

    resolver 1.1.1.1;

    access_log /var/log/nginx/nextcloud/access443.log;
    error_log /var/log/nginx/nextcloud/error443.log;

    root /var/www/nextcloud;

    index index.php index.html /index.php$request_uri;

    client_max_body_size 512M;
    client_body_timeout 300s;
    fastcgi_buffers 64 4K;

    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 text/javascript application/javascript application/json application/ld+json application/manifest+json application/rss+xml application/vnd.geo+json application/vnd.ms-fontobject application/wasm application/x-font-ttf application/x-web-app-manifest+json application/xhtml+xml application/xml font/opentype image/bmp image/svg+xml image/x-icon text/cache-manifest text/css text/plain text/vcard text/vnd.rim.location.xloc text/vtt text/x-component text/x-cross-domain-policy;

    client_body_buffer_size 512k;

    add_header Referrer-Policy                   "no-referrer"       always;
    add_header X-Content-Type-Options            "nosniff"           always;
    add_header X-Frame-Options                   "SAMEORIGIN"        always;
    add_header X-Permitted-Cross-Domain-Policies "none"              always;
    add_header X-Robots-Tag                      "noindex, nofollow" always;
    add_header X-XSS-Protection                  "1; mode=block"     always;

    fastcgi_hide_header X-Powered-By;

    include mime.types;
    types {
        application/javascript mjs;
    }

    location = / {
        if ( $http_user_agent ~ ^DavClnt ) {
            return 302 /remote.php/webdav/$is_args$args;
        }
    }

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

    location ^~ /.well-known {
        location = /.well-known/carddav { return 301 /remote.php/dav/; }
        location = /.well-known/caldav  { return 301 /remote.php/dav/; }

        location /.well-known/acme-challenge    { try_files $uri $uri/ =404; }
        location /.well-known/pki-validation    { try_files $uri $uri/ =404; }

        return 301 /index.php$request_uri;
    }

    location ~ ^/(?:build|tests|config|lib|3rdparty|templates|data)(?:$|/)  { return 404; }

    location ~ ^/(?:\.|autotest|occ|issue|indie|db_|console)                { return 404; }

    location ~ \.php(?:$|/) {
        rewrite ^/(?!index|remote|public|cron|core\/ajax\/update|status|ocs\/v[12]|updater\/.+|ocs-provider\/.+|.+\/richdocumentscode\/proxy) /index.php$request_uri;

        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;

        fastcgi_param modHeadersAvailable true;
        fastcgi_param front_controller_active true;
        fastcgi_pass php-handler;

        fastcgi_intercept_errors on;
        fastcgi_request_buffering off;

        fastcgi_max_temp_file_size 0;
    }

    location ~ \.(?:css|js|mjs|svg|gif|png|jpg|ico|wasm|tflite|map|ogg|flac)$ {
        try_files $uri /index.php$request_uri;
        add_header Cache-Control "public, max-age=15778463, $asset_immutable";
        access_log off;

        location ~ \.wasm$ {
            default_type application/wasm;
        }
    }

    location ~ \.woff2?$ {
        try_files $uri /index.php$request_uri;
        expires 7d;
        access_log off;
    }

    location /remote {
        return 301 /remote.php$request_uri;
    }

    location / {
        try_files $uri $uri/ /index.php$request_uri;
    }
}

注意

  • server_name はあなたのドメイン名に変更してください(例:cloud.example.com)。
  • ssl_certificatessl_certificate_key のパスは、あなたの SSL 証明書のパスに変更してください。
  • include /etc/nginx/trust_source/cloudflare;Cloudflare を DNS サービスプロバイダーとして使用している場合に有効です。

Nginx 設定の有効化とテスト

設定ファイルを保存し、シンボリックリンクを作成してサイトを有効化します。

sudo ln -s /etc/nginx/sites-available/nextcloud.conf /etc/nginx/sites-enabled/

Nginx の設定をテストします。

sudo nginx -t

問題がなければ、Nginx を再起動します。

sudo systemctl restart nginx

Let's Encrypt による HTTPS の設定

Certbot のインストール

Let's Encrypt の Certbot をインストールします。

sudo apt install certbot python3-certbot-nginx -y

SSL 証明書の取得と適用

以下のコマンドを実行し、プロンプトに従って設定します。

sudo certbot --nginx -d cloud.example.com

SSL 証明書の自動更新確認

Certbot の自動更新が正しく設定されているか確認します。

sudo certbot renew --dry-run

Nextcloud の Web 設定

ブラウザで以下の URL にアクセスします。

https://cloud.example.com

管理者アカウントの作成

  • ユーザー名:任意の管理者ユーザー名
  • パスワード:強力なパスワードを設定

データベース設定

  • データベースの種類:MySQL
  • データベース名nextcloud
  • データベースユーザー名nextclouduser
  • データベースパスワード:先ほど設定したパスワード
  • データベースホストlocalhost

すべて入力したら、「インストール完了」ボタンをクリックします。


Nextcloud の運用開始

クライアントアプリのインストール

  • デスクトップクライアント公式サイトからダウンロード
  • モバイルアプリ:App Store や Google Play から入手可能

アプリの追加

Nextcloud 内の「アプリ」セクションから、カレンダーやタスク管理などのアプリを追加できます。

バックアップの設定

定期的なデータのバックアップを設定し、データの安全性を確保します。


まとめ

今回のガイドでは、ホームサーバーに Nextcloud を導入し、プライバシーを重視したクラウドストレージ環境を構築しました。Nginx を使用し、Cloudflare を前提とした設定ファイルを適用することで、高性能かつセキュアなサーバーを実現しました。また、データベースには MySQL を使用し、安定したデータ管理を行いました。

これにより、データを自分の管理下に置きつつ、高い利便性を享受できます。ぜひ、ご自身のニーズに合わせてカスタマイズしてみてください。


参考資料

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?