ホームサーバー完全構築ガイド #6 クラウドストレージの構築
ホームサーバー完全構築ガイド シリーズ記事:
ホームサーバー完全構築ガイド #0 計画とハードウェア選定
ホームサーバー完全構築ガイド #1 OS導入と基本設定
ホームサーバー完全構築ガイド #2 インフラの構築
ホームサーバー完全構築ガイド #3 サービス群の選定
ホームサーバー完全構築ガイド #4 WordPressのデプロイ
ホームサーバー完全構築ガイド #5 情報収集システムの構築
ホームサーバー完全構築ガイド #7 DevOpsプラットフォームの構築
はじめに
ホームサーバー完全構築ガイドシリーズへようこそ。このシリーズでは、ホームサーバーを活用したさまざまなシステム構築方法をご紹介しています。今回は、プライバシーとカスタマイズ性を重視したクラウドストレージ環境を構築するために、Nextcloud を取り上げます。
Google Drive や Dropbox などのクラウドサービスは便利ですが、データが外部サーバーに保存されるため、プライバシーやセキュリティに不安を感じる方も少なくありません。また、これらのサービスにはカスタマイズの制約があり、特定の用途やニーズに完全に対応できない場合もあります。一方で、Nextcloud を使用すれば、クラウドサービスと同等の利便性を保ちながら、データを完全に自分のサーバーで管理でき、自由度の高いカスタマイズが可能です。
今回の記事では、Nginx を Web サーバーとして採用し、提供いただいた Nginx の設定ファイルを活用します。この設定は、Cloudflare を DNS サービスプロバイダーとして利用することを前提としています。また、データベースには信頼性の高い MySQL を使用します。
今回のゴール
- Nextcloud の導入:ホームサーバーに Nextcloud をインストールして動作させる
- データベースの設定:MySQL を使用して Nextcloud のデータを管理
- Nginx の設定:Cloudflare を前提とした Nginx 設定ファイルを適用
- セキュアな通信の設定:Let's Encrypt を使って HTTPS 通信を実現
- 運用の開始:クライアントアプリのインストールや機能拡張
準備
必要な環境
-
サーバー環境:
- 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_certificate
とssl_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 を使用し、安定したデータ管理を行いました。
これにより、データを自分の管理下に置きつつ、高い利便性を享受できます。ぜひ、ご自身のニーズに合わせてカスタマイズしてみてください。
Discussion