UbuntuでNextcloudを構築する
前提
簡単なハードニング等は既に済ませてある前提です。
必要があればセキュリティ設定(ハードニング)を実施してください。
今回、インストールするものNginx,PHP8.3,FPM,MariaDBを使用してNextcloudを構築します。
Oracleで構築していたものを一度きれいにしたかったのでOS再インストールしたので一応この手順書を作成してます。
OracleのAlways Freeで試してますがXserverのVPSでも動きました。
UbuntuのVersionは22,24でテストしました。
Nginxのconfは一応、公式をベースにしておきます。
別サーバーへの移行方法も別ページにまとめておきます。
今回のサイトが以下です。 https://cloud.momijiina.tech
別に使わないのでURLは公開しますし多分消さないです。
Googleドライブ30TBありますし漏れて困るのはローカルサーバー保存です。
ポート開放
必要があれば
sudo ufw allow 80
sudo ufw allow 443
sudo ufw reload
証明書取得
certbotのインストール
sudo apt -y install certbot
証明書を取得する
既にポート80が使われている場合はそのソフトウェアの動作を止める必要があります。(Nginx等)
cloud.momijiina.techは変更してください(一応ね・・書いときます)
sudo certbot certonly --standalone -d cloud.momijiina.tech
VPS等の逆引きホスト名でも実は取得できます。(テストの際ぜひ)
ConoHaの例(xxxは数値(ipだったもの)ですわざとつぶしています)
sudo certbot certonly --standalone -d vxxx-251-xxx-137.vapy.static.cnode.jp
Nginxをインストールする
最新のNginx取得に必要なものをインストール
sudo apt -y install curl gnupg2 ca-certificates lsb-release ubuntu-keyring
Nginxの署名鍵をインポート
curl https://nginx.org/keys/nginx_signing.key | gpg --dearmor \
| sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null
最新のNginx安定板を取得する
echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] \
http://nginx.org/packages/ubuntu `lsb_release -cs` nginx" \
| sudo tee /etc/apt/sources.list.d/nginx.list
Nginxのインストール
sudo apt update
sudo apt -y install nginx
Nginxの起動と有効化
sudo systemctl enable nginx --now
起動状況とバージョン確認
sudo nginx -v
sudo systemctl status nginx
PHP8.3とFPMのインストール
※既にphpが入っている場合は一番最新が自動で入るので注意
PHP自体は複数バージョンがインストールされてても問題ないです。(nginxで指定します)
sudo add-apt-repository ppa:ondrej/php
sudo apt update
nginxで好きなバージョンをfpm経由で切り替えれるので複数いれてて問題ないです。
sudo apt install php8.3
バージョン確認
php -vでも可能
php8.3 -v
注意(apache2が勝手に入る)
apache2などが自動で入る場合があります。
Nginxを先にインストールしてるので恐らくphpインストール時にapache2起動エラーがでてるかも
nginxと干渉するので不要なら削除しておくといいです。(併用することも可能ですが今回は削除推奨)
sudo apt remove apache2
sudo apt autoremove
FPMをインストールする
sudo apt -y install php8.3-fpm
Nextcloudで必要なモジュール等のインストール
sudo apt -y install php8.3-mbstring php8.3-intl php8.3-gd php8.3-zip php8.3-mysql php8.3-bcmath php8.3-gmp php8.3-opcache php8.3-imagick php8.3-curl php8.3-apcu php8.3-xml php8.3-redis unzip imagemagick
MariaDBのインストール
phpMyAdminが必要な場合は各自でインストールしてください。
sudo apt -y install mariadb-server mariadb-client
MariaDBの起動と有効化
sudo systemctl enable mariadb --now
MariaDBのバージョン確認
mysql --version
mysql_secure_installation
初期設定です。
sudo mysql_secure_installation
質問1.Enter current password for root (enter for none):
初回はパスワードを設定していないため Enterキーでスキップ
質問2.Switch to unix_socket authentication [Y/n]
他の人にもrootアクセスをパスワードで許可したい場合はnです。
質問3.Change the root password?
Yでrootパスワードを設定します。
質問4.Remove anonymous users? [Y/n]
Y推奨です。 匿名ユーザー(ユーザー名がないMySQLアカウント)を削除しますか?という意味です。 匿名ユーザーはセキュリティリスクになるため、通常は削除します。
質問5.Disallow root login remotely? [Y/n]
MySQLのrootユーザーでリモートからのログインを禁止しますか? 基本的には「Y」です。 リモートからは一般ユーザーで接続するのが安全です。
質問6.Remove test database and access to it? [Y/n]
基本はYでいいです。 testデータベースとそのアクセス権を削除しますか?という意味です。いらないです
質問7.Reload privilege tables now? [Y/n]
基本はYです。 今すぐ権限テーブルを再読み込みしますか?という意味です。
データベースを作成する
mysqlにrootでアクセスする
mysql -u root -p
パスワードを設定した場合は聞いてきます。
今回はnextcloudというデータベースを作成します。
CREATE DATABASE nextcloud CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
次に先ほど作成したデータベースにnextcloudというユーザーを作成してパスワードを設定して権限をあたえます。
nextcloud'@'localhostは データベース名'@'接続元IP
です(必要があれば編集して)
今回は接続元IPはDBサーバーの分離する以外はlocalhostでいいです。
あなたのパスワードという文字列はいい感じのパスワードに変更してください。
GRANT ALL PRIVILEGES ON nextcloud.* TO 'nextcloud'@'localhost' IDENTIFIED BY 'あなたのパスワード';
FLUSH PRIVILEGES;
EXIT;
FPMを設定する
新しい設定ファイルを作成します
vi /etc/php/8.3/fpm/pool.d/nextcloud.conf
設定例(そのままでも可)
結構、過剰な設定にしてるので注意(速度重視です)
[nextcloud]
user = www-data
group = www-data
listen.owner = www-data
listen.group = www-data
listen = /run/php/nextcloud.sock
listen.allowed_clients = 127.0.0.1
pm = dynamic
pm.max_children = 100
pm.start_servers = 5
pm.min_spare_servers = 5
pm.max_spare_servers = 35
pm.max_requests = 1000
env[HOSTNAME] = $HOSTNAME
env[PATH] = /usr/local/bin:/usr/bin:/bin
env[TMP] = /tmp
env[TMPDIR] = /tmp
env[TEMP] = /tmp
php_value[session.save_handler] = files
php_value[session.save_path] = /var/lib/php/sessions
php_value[max_execution_time] = 3600
php_value[memory_limit] = 512M
php_value[post_max_size] = 10G
php_value[upload_max_filesize] = 10G
php_value[max_input_time] = 3600
php_value[max_input_vars] = 6000
php_value[date.timezone] = Asia/Tokyo
php_value[opcache.enable_cli] = 1
php_value[opcache.memory_consumption] = 512
php_value[opcache.interned_strings_buffer] = 128
php_value[opcache.max_accelerated_files] = 10000
php_value[opcache.revalidate_freq] = 60
php_value[opcache.save_comments] = 1
php_value[opcache.fast_shutdown] = 1
FPMを再起動する
sudo systemctl restart php8.3-fpm.service
ステータス確認
先ほど追加したものが動作しているはずです
sudo systemctl status php8.3-fpm.service
Nextcloudのインストール
Nextcloudの最新版のインストール
/var/wwwにインストールします
念のためダウンロードURLは確認推奨します。
cd /var/www
sudo wget https://download.nextcloud.com/server/releases/latest.zip
ファイルの展開とzip削除
sudo unzip latest.zip
sudo rm latest.zip
権限をwww-dataに変更する
sudo chown -R www-data:www-data /var/www/nextcloud
Nginxを設定する
cd /etc/nginx
nginxのユーザー権限を変更する
www-dataに変更する。
sudo vi nginx.conf
user nginx;
をuser www-data;
に変更する。
Nextcloud用のNginx設定ファイルの作成
cd /etc/nginx/conf.d
sudo vi nextcloud.conf
設定例(公式ベース)
upstream php-handler {
server unix:/var/run/php/nextcloud.sock;
}
server {
listen 80;
listen [::]:80;
server_name cloud.momijiina.tech;
server_tokens off;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name cloud.momijiina.tech;
root /var/www/nextcloud;
ssl_certificate "/etc/letsencrypt/live/cloud.momijiina.tech/fullchain.pem";
ssl_certificate_key "/etc/letsencrypt/live/cloud.momijiina.tech/privkey.pem";
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
client_max_body_size 2G;
client_body_timeout 300;
client_body_buffer_size 512M;
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-fontobject 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;
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 "noindex, nofollow" always;
add_header X-XSS-Protection "1; mode=block" always;
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
proxy_send_timeout 600;
proxy_read_timeout 600;
proxy_connect_timeout 600;
fastcgi_hide_header X-Powered-By;
fastcgi_read_timeout 300;
keepalive_timeout 300;
fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_buffers 64 4k;
fastcgi_buffer_size 64k;
include mime.types;
types {
text/javascript mjs;
application/wasm wasm;
}
#index index.php index.html /nextcloud/index.php$request_uri;
index index.php index.html /index.php$request_uri;
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; }
location = /.well-known/webfinger {return 301 /index.php/.well-known/webfinger;}
location = /.well-known/nodeinfo {return 301 /index.php/.well-known/nodeinfo;}
location = /.well-known/host-meta {return 301 /index.php/.well-known/host-meta;}
location = /.well-known/host-meta.json {return 301 /index.php/.well-known/host-meta.json;}
location = /.well-known/ocm-provider {return 301 /index.php/.well-known/ocm-provider;}
}
location ^~ /.well-known/acme-challenge {
root /var/www/html;
}
location = /.well-known/acme-challenge/ {
return 404;
}
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(_arm64)?\/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_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $path_info;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param HTTPS on;
fastcgi_param modHeadersAvailable true;
fastcgi_param front_controller_active true;
fastcgi_pass unix:/run/php/nextcloud.sock;
fastcgi_intercept_errors on;
fastcgi_request_buffering off;
}
location ~ \.(?:css|js|mjs|svg|gif|png|jpg|ico|wasm|tflite|map|ogg|flac)$ {
try_files $uri /index.php$request_uri;
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
add_header Cache-Control "public, max-age=15778463";
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;
access_log off;
}
location ~ \.(otf|woff2?)$ {
try_files $uri /index.php$request_uri;
expires 7d; # Cache-Control policy borrowed from `.htaccess`
access_log off; # Optional: Don't log access to assets
}
location /remote {
return 301 /remote.php$request_uri;
}
location / {
try_files $uri $uri/ /index.php$request_uri;
}
}
Nginxの再読み込みをする
あとはnginxエラーを確認して再読み込みするだけです。
sudo nginx -t
nginx: configuration file /etc/nginx/nginx.conf test is successful
となってれば問題なくリロードできるはずです。
sudo systemctl reload nginx
サイトへアクセスする
指定のドメインにアクセスすればインストールページが表示されます。
私の場合は https://cloud.momijiina.tech
管理者アカウントのIDやパスワードは好きなものを入れて下さい。
以下は例です
また、推奨アプリ等はお好みでお願いします。
後からでもいれれます。
Cronを設定する(推奨)
www-dataでcronを実行する
sudo crontab -u www-data -e
nextcloud推奨設定
一番下に
*/5 * * * * /usr/bin/php -f /var/www/nextcloud/cron.php
Redisをインストールする(推奨)
普通に入れると古いのが入るんで更新します。
sudo add-apt-repository ppa:redislabs/redis
sudo apt -y update
sudo apt -y install redis-server
Redisの自動起動を有効化
sudo systemctl enable redis-server --now
RedisをNexcloudに設定する
sudo vi /var/www/nextcloud/config/config.php
メンテナンスの上くらいにいれてますがべつにどこでも大丈夫です。
'memcache.local' => '\\OC\\Memcache\\APCu',
'filelocking.enabled' => true,
'memcache.distributed' => '\\OC\\Memcache\\Redis',
'memcache.locking' => '\\OC\\Memcache\\Redis',
'redis' =>
array (
'host' => 'localhost',
'port' => 6379,
),
'maintenance' => false,
OCCコマンドの使い方
Nextcloudフォルダ内で
cd /var/www/nextcloud/
以下コマンドが使えます(occの後に色々入ります)
sudo -u www-data php occ
PHPのversionを指定する場合は8.4など
sudo -u www-data /usr/bin/php8.4 occ
今回,以下のようなエラーが出て場合は上のコマンドにコピーしてnextcloudフォルダ内で実行すればエラー解決できます。
1つ以上のmimetypeマイグレーションが利用できます。時折、特定のファイルタイプをよりよく扱うために新しいmimetypesが追加されます。大規模なインスタンスではmimetypesの移行に時間がかかるため、アップグレード時には自動的には行われません。移行を行うには `occ maintenance:repair --include-expensive` コマンドを使用してください。
いくつかの欠落しているオプションのインデックスを検出しました。データベースのパフォーマンスを向上させるために、(Nextcloudまたはインストールされたアプリケーションによって)新しいインデックスが追加されることがあります。インデックスの追加には時間がかかり、一時的にパフォーマンスが低下することがあるため、アップグレード時には自動的には行われません。インデックスが追加されると、それらのテーブルへのクエリが速くなるはずです。インデックスを追加するには、`occ db:add-missing-indices` コマンドを使用してください。 インデックスが不足: "mail_messages_strucanalyz_idx" テーブル内の "mail_messages", "mail_acc_prov_idx" テーブル内の "mail_accounts", "mail_alias_accid_idx" テーブル内の "mail_aliases", "mail_messages_mb_id_uid_uidx" テーブル内の "mail_messages", "mail_smime_certs_uid_email_idx" テーブル内の "mail_smime_certificates", "mail_trusted_senders_idx" テーブル内の "mail_trusted_senders", "mail_coll_idx" テーブル内の "mail_coll_addresses" 詳細については、ドキュメント↗を参照してください。
例
sudo -u www-data php occ maintenance:repair --include-expensive
その他エラー修正
下まで設定してもらえれば以下のようになります。
高性能バッグエンドもテスト後、構築方法を作成します。
高性能バックエンドが構成されていません。
No High-performance backend configured - Running Nextcloud Talk without the High-performance backend only scales for very small calls (max. 2-3 participants). Please set up the High-performance backend to ensure calls with multiple participants work seamlessly. 詳細については、ドキュメント↗を参照してください。
Nextcloud31からこのエラーがでますが通話しない人からするといらないものです。
無視するか別タブにテストしていればインストール方法を載せてます。
ログには **年月日 :: 以降、エラーが * 件あります。
これは諦めて無視してください
ログを出さないようにすれば消えますが・・・・
サーバーにはメンテナンスウィンドウの開始時間が設定されていません
Nextcloudのconfig.phpを編集する
sudo vi /var/www/nextcloud/config/config.php
以下を追加
'maintenance_window_start' => 1,
ご使用のシステムには、デフォルトの電話地域が設定されていません。
Nextcloudのconfig.phpを編集する
sudo vi /var/www/nextcloud/config/config.php
以下を追加
'default_phone_region' => 'JP',
メールサーバーの設定が未設定または未確認です。
これは管理者設定の基本設定のメールサーバーの設定をすれば消えます.
自分のプロフィール(個人情報の設定)にメールアドレスがないと400エラーになるので注意
最後にセキュリティスキャンを実施する
Nextcloudの公式からセキュリティスキャンが公開されています。
以下のサイトにアクセスしてURLいれるだけです。
A+がMAXですがこれは目安なのでA+だから完璧ということはありません。