🎃

Ubuntu 22.04でNextcloudをインストール

2022/10/30に公開

1 初めに

この記事は以下の環境を想定しています。
・Ubuntu 22.04 LTS版であり、管理者権限を持っている。(他の環境の場合は一部変更が必要なことがあります)
・Linuxについて、基本コマンド(cpやmv、chownなど)の知識がある。
・Nginxをnginx.orgのレポからインストールする

なお、この記事に書かれている事は自己責任で実行してください。

2 Nginxをインストールする

コマンドはここに書いてあるものとほとんど同じです。(ここからコピペしました)

$ sudo apt install curl gnupg2 ca-certificates lsb-release ubuntu-keyring
$ curl https://nginx.org/keys/nginx_signing.key | gpg --dearmor \
    | sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null
$ 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 > /dev/null
$ echo -e "Package: *\nPin: origin nginx.org\nPin: release o=nginx\nPin-Priority: 900\n" \
    | sudo tee /etc/apt/preferences.d/99nginx
$ sudo apt update
$ sudo apt install nginx

3 SSL証明書を取得する

この部分はすでにSSL証明書を取得している人や他の方法で取得したい人などは飛ばしてください。

ⅰ)Certbotをインストールする

CertbotをAPTコマンドを使ってインストールします。

$ sudo apt -y install certbot

ⅱ) SSL証明書を取得する

$ sudo certbot certonly --webroot -w /usr/share/nginx/html -d [ドメイン名] --email [メールアドレス]

4 必要なソフトをインストールする

Nextcloudを動かすのに必要なものをAPTコマンドでインストールしていきます。
(2022/11/14 追記)
「php-imagickモジュールはSVGをサポートしていません」のエラーを解消する為にlibmagiskcore-6.q16-6-extraを追加しました。
参考元:【Nextcloud】「このインスタンスのphp-imagickモジュールはSVGをサポートしていません」を修正する。

$ sudo apt -y install php php8.1-fpm php-pear php-mbstring php-intl php-gd php-zip php-mysql php-bcmath php-gmp php-opcache php-imagick php-curl php-apcu wget unzip mariadb libmagickcore-6.q16-6-extra

5 mariadbのセットアップ&設定

ⅰ)セットアップ

$ sudo mysql_secure_installation

コマンドを実行したら[y/n]の形式で色々聞かれる(rootパスワードを設定するか等)ので表示されている内容を理解した上で自分にあった設定にしてください。
基本的に全て"y"で答えれば良いと思います。

ⅱ)データベースを作成

以下のコマンドを実行してください。データベース名、ユーザー名はnextcloudです。
PASSWORDと書かれたところを適宜変更してください。(''は削除しないでください)

$ sudo mysql
MariaDB [(none)]> create database nextcloud;
MariaDB [(none)]> grant all privileges on nextcloud.* to nextcloud@'localhost' identified by 'PASSWORD';
MariaDB [(none)]> flush privileges;
MariaDB [(none)]> exit

6 Nginxの設定

ウェブルートは/var/www/nextcloud/とします。
新しく設定ファイルを作成して記述していきます。
設定ファイルはNextcloudさんのドキュメントを参考にしました。
こういうドキュメントめっちゃありがたい…

sudo vim /etc/nginx/conf.d/nextcloud.conf
upstream php-handler {
    server 127.0.0.1:9000;
}
server {
    listen 80;
    listen [::]:80;
    server_name _;

    server_tokens off;
    #httpをhttpsに転送
    return 301 https://$server_name$request_uri;
}

server {
    listen 443      ssl http2;
    listen [::]:443 ssl http2;
    server_name _;
    
    root /var/www/nextcloud;
    
    ssl_certificate     /etc/letsencrypt/live/[ドメイン名]/fullchain.pem;
    ssl_certificate_key     /etc/letsencrypt/live/[ドメイン名]/privkey.pem;
    
    server_tokens off;
    
    #この設定は設定ミスをするとややこしくなる為、注意してください。
    #add_header Strict-Transport-Security "max-age=15768000; includeSubDomains; preload" always;
    
    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/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;
    
    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;
    
    fastcgi_hide_header X-Powered-By;
    
    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; }

        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\/.+|oc[ms]-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|svg|gif|png|jpg|ico|wasm|tflite|map)$ {
        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;
    }

    # Rule borrowed from `.htaccess`
    location /remote {
        return 301 /remote.php$request_uri;
    }

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

7 Nextcloudのダウンロード

Nextcloud.comからファイルをダウンロードして解凍、設置します。

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

8 完了!

これでブラウザからhttps://[ドメイン名]にアクセスすると表示されるはずです!
もしコードの誤りや誤字がありましたら教えてくれると幸いです。
ここに書くとかなりの分量になるので後日別の記事でセキュリティを上げる設定を解説する予定です。

9 参考にしていただいたサイト

nginx: Linux packages
NGINX configuration
Server World - ネットワークサーバー構築

Discussion