メインコンテンツまでスキップ

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いれるだけです。

https://scan.nextcloud.com/

A+がMAXですがこれは目安なのでA+だから完璧ということはありません。