Cài đặt NextCloud trên Ubuntu 22.04

Tác giả: 01/02/2024

Nextcloud là một phần mềm (Mã nguồn mở) miễn phí giống như Dropbox, Google Drive, một nhánh của dự án ownCloud. Nextcloud được viết bằng PHP và JavaScript, nó hỗ trợ nhiều hệ thống cơ sở dữ liệu như MySQL / MariaDB, PostgreSQL, Oracle Database và SQLite. Để giữ cho các tệp của bạn được đồng bộ hóa giữa Máy tính để bàn và máy chủ của riêng bạn, Nextcloud cung cấp các ứng dụng cho máy tính để bàn Windows, Linux và Mac và một ứng dụng di động cho Android và iOS. Nextcloud không chỉ là một bản sao dropbox, nó cung cấp các tính năng bổ sung như Lịch, Danh bạ, Lên lịch tác vụ và phát trực tuyến phương tiện với Ampache.

Bước 1 – Update and Upgrade 

apt update -y

apt upgrade -y

reboot

Bước 2 – DownLoad Nextcloud mới nhất tại trang chủ

Tại trang chủ https://nextcloud.com/install chúng ta sẽ tìm mục download cho server và chọn tải về

wget https://download.nextcloud.com/server/releases/latest.zip

Cài đặt phần mềm giải nén unzip

apt install unzip

Tạo thư mục chứa mã nguồn nextcloud , option -d là chọn destination để extra,hiện tại chúng ta đang đứng tại /root

mkdir -p /var/www/
unzip latest.zip  -d  /var/www/

Bước 3 – Tạo Database và User cho Nextcloud với PostgreSQL

Nextcloud hoạt động tương thích với PostgreSQL, MariaDB/MySQL, and SQLite, Nhưng đạt hiệu suất tốt nhất với PostgreSQL

Cài đặt PostgreSQL và login PostgreSQL với user postgres

apt install -y postgresql postgresql-contrib
service postgresql start
systemctl enable  postgresql
sudo -u postgres psql

Tạo database nextcloud

CREATE DATABASE nextcloud TEMPLATE template0 ENCODING 'UNICODE';

Tạo user nextcloud và password

CREATE USER nextclouduser WITH PASSWORD 'nextclouduser_password';

Grant permission database nextcloud với nextclouduser

ALTER DATABASE nextcloud OWNER TO nextclouduser;
GRANT ALL PRIVILEGES ON DATABASE nextcloud TO nextclouduser;

Ctr + D để thoát PostgreSQL

Test

psql -h 127.0.0.1 -d nextcloud -U nextclouduser -W

Sau đó chúng ta log out

Step 4: Cài đặt Nginx và tạo Nginx Virtual Host cho Nextcloud

apt install nginx -y

Tạo 1 file cấu hình Vhost

vi  /etc/nginx/conf.d/nextcloud.conf

Bạn hãy thay domain của bạn tại dòng nextcloud.itvn.xyz

server {
    listen 80;
    listen [::]:80;
    server_name nextcloud.itvn.xyz;

    # Add headers to serve security related headers
    add_header X-Content-Type-Options nosniff;
    add_header X-XSS-Protection "1; mode=block";
    add_header X-Robots-Tag none;
    add_header X-Download-Options noopen;
    add_header X-Permitted-Cross-Domain-Policies none;
    add_header Referrer-Policy no-referrer;

    #I found this header is needed on Ubuntu, but not on Arch Linux. 
    add_header X-Frame-Options "SAMEORIGIN";

    # Path to the root of your installation
    root /var/www/nextcloud/;

    access_log /var/log/nginx/nextcloud.access;
    error_log /var/log/nginx/nextcloud.error;

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

    # The following 2 rules are only needed for the user_webfinger app.
    # Uncomment it if you're planning to use this app.
    #rewrite ^/.well-known/host-meta /public.php?service=host-meta last;
    #rewrite ^/.well-known/host-meta.json /public.php?service=host-meta-json
    # last;

    location = /.well-known/carddav {
        return 301 $scheme://$host/remote.php/dav;
    }
    location = /.well-known/caldav {
       return 301 $scheme://$host/remote.php/dav;
    }

    location ~ /.well-known/acme-challenge {
      allow all;
    }

    # set max upload size
    client_max_body_size 512M;
    fastcgi_buffers 64 4K;

    # Disable gzip to avoid the removal of the ETag header
    gzip off;

    # Uncomment if your server is build with the ngx_pagespeed module
    # This module is currently not supported.
    #pagespeed off;

    error_page 403 /core/templates/403.php;
    error_page 404 /core/templates/404.php;

    location / {
       rewrite ^ /index.php;
    }

    location ~ ^/(?:build|tests|config|lib|3rdparty|templates|data)/ {
       deny all;
    }
    location ~ ^/(?:\.|autotest|occ|issue|indie|db_|console) {
       deny all;
     }

    location ~ ^/(?:index|remote|public|cron|core/ajax/update|status|ocs/v[12]|updater/.+|ocs-provider/.+|core/templates/40[34])\.php(?:$|/) {
       include fastcgi_params;
       fastcgi_split_path_info ^(.+\.php)(/.*)$;
       try_files $fastcgi_script_name =404;
       fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
       fastcgi_param PATH_INFO $fastcgi_path_info;
       #Avoid sending the security headers twice
       fastcgi_param modHeadersAvailable true;
       fastcgi_param front_controller_active true;
       fastcgi_pass unix:/run/php/php8.1-fpm.sock;
       fastcgi_intercept_errors on;
       fastcgi_request_buffering off;
    }

    location ~ ^/(?:updater|ocs-provider)(?:$|/) {
       try_files $uri/ =404;
       index index.php;
    }

    # Adding the cache control header for js and css files
    # Make sure it is BELOW the PHP block
    location ~* \.(?:css|js)$ {
        try_files $uri /index.php$uri$is_args$args;
        add_header Cache-Control "public, max-age=7200";
        # Add headers to serve security related headers (It is intended to
        # have those duplicated to the ones above)
        add_header X-Content-Type-Options nosniff;
        add_header X-XSS-Protection "1; mode=block";
        add_header X-Robots-Tag none;
        add_header X-Download-Options noopen;
        add_header X-Permitted-Cross-Domain-Policies none;
        add_header Referrer-Policy no-referrer;
        # Optional: Don't log access to assets
        access_log off;
   }

   location ~* \.(?:svg|gif|png|html|ttf|woff|ico|jpg|jpeg)$ {
        try_files $uri /index.php$uri$is_args$args;
        # Optional: Don't log access to other assets
        access_log off;
   }
}

Sau đó lưu file cấu hình trên và phân quyền cho user www-data

chown www-data:www-data /var/www/nextcloud/ -R

Kiểm tra cấu hình

nginx -t
systemctl restart nginx
systemctl enable nginx

Bước 5 – Cài đặt php mới nhất, Phiên bản Nextcloud hiện tại tương thích với php8.1

apt install imagemagick php-imagick php8.1-common php8.1-pgsql php8.1-fpm php8.1-gd php8.1-curl php8.1-imagick php8.1-zip php8.1-xml php8.1-mbstring php8.1-bz2 php8.1-intl php8.1-bcmath php8.1-gmp
systemctl start php8.1-fpm
systemctl status php8.1-fpm

Bước 6 – Enable HTTPS

Bạn có thể lựa chọn DNS Cloudflare lấy Proxy để bỏ qua phần https này hoặc cấu hình theo cách sau để có SSL R3

Cài đặt certbot và module của nginx

apt install certbot python3-certbot-nginx -y
certbot --nginx --agree-tos --redirect --hsts --staple-ocsp --email tudv@nhanhoa.com.vn -d nextcloud.itvn.xyz

  • --nginx: Sử dụng trình xác thực và cài đặt Nginx
  • --agree-tos: Đồng ý với các điều khoản dịch vụ Let's Encrypt
  • --redirect: Thực thi HTTPS bằng cách thêm chuyển hướng 301.
  • --hsts: Kích hoạt HTTP Strict Transport Security. Điều này bảo vệ chống lại cuộc tấn công tước SSL / TLS.
  • --staple-ocsp: Bật OCSP Stapling.
  • --email: Email được sử dụng để đăng ký và liên hệ khôi phục.
  • -d Cờ được theo sau bởi một danh sách các tên miền, được phân tách bằng dấu phẩy. Bạn có thể thêm tối đa 100 tên miền.

Certbot có thể không thể thêm tiêu đề HSTS trong tệp cấu hình Nginx cho Nextcloud. Nếu bạn muốn bật HSTS (HTTP Strict Transport Security), hãy chỉnh sửa tệp /etc/nginx/conf.d/nextcloud.conf

Kiểm tra nếu chưa thấy chúng ta có thể thêm dòng sau vào khối máy chủ SSL để bật tiêu đề HSTS

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

Đây là một câu lệnh được sử dụng trong cấu hình máy chủ web để bảo vệ các trang web của bạn bằng cách sử dụng một cơ chế an toàn gọi là “Strict-Transport-Security” (HSTS).

Cụ thể, câu lệnh “add_header Strict-Transport-Security” được sử dụng để thêm một tiêu đề HTTP Strict-Transport-Security (HSTS) vào các yêu cầu HTTP được gửi đến máy chủ web của bạn. Tiêu đề này sẽ chỉ định rằng các truy cập tới trang web cần phải được thực hiện thông qua HTTPS, thay vì HTTP thông thường.

Tham số “max-age” được sử dụng để chỉ định thời gian, tính bằng giây, mà trình duyệt của người dùng sẽ lưu trữ thông tin về HSTS. Trong trường hợp này, giá trị “31536000” tương đương với 1 năm.

Từ khóa “always” được sử dụng để đảm bảo rằng tiêu đề HSTS sẽ được thêm vào tất cả các yêu cầu HTTP, bao gồm cả những yêu cầu từ các trang web con của trang web chính. Điều này giúp đảm bảo rằng tất cả các truy cập đến trang web của bạn đều được bảo vệ bằng HTTPS.

Thêm http2 để cải thiện tốc độ load trang

vi  /etc/nginx/conf.d/nextcloud.conf


Kiểm tra cấu hình nginx và restart lại nginx

nginx -t

systemctl restart nginx

Bước 7: Khởi chạy trình hướng dẫn thiết lập dựa trên web trong trình duyệt web của bạn

Truy cập vào https://nextcloud.itvn.xyz

Để hoàn tất cài đặt, bạn cần

  • Tạo tài khoản quản trị viên
  • Nhập đường dẫn của thư mục dữ liệu Nextcloud
  • Nhập chi tiết cơ sở dữ liệu bạn đã tạo ở bước 2. Bạn có thể sử dụng làm địa chỉ máy chủ, vì PostgreSQL lắng nghe trên cổng 5432

Thư mục dữ liệu là nơi lưu trữ tệp của người dùng. Để bảo mật, tốt nhất là đặt thư mục dữ liệu bên ngoài thư mục webroot Nextcloud. Vì vậy, thay vì lưu trữ các tệp của người dùng trong , chúng ta có thể thay đổi nó thành /var/www/nextcloud-data. có thể được tạo bằng lệnh sau:

mkdir /var/www/nextcloud-data

Sau đó, đảm bảo người dùng Nginx () có quyền ghi vào thư mục dữ liệu.

chown www-data:www-data /var/www/nextcloud-data -R

Chọn Install

Install Recommended apps

Bước 8 – Cấu hình nâng cao

8.1 – Tăng giới hạn bộ nhớ PHP

Giới hạn bộ nhớ PHP mặc định là 128MB. NextCloud đề xuất 512MB để có hiệu suất tốt hơn. Để thay đổi giới hạn bộ nhớ PHP, hãy chỉnh sửa tệp php.ini.

vi /etc/php/8.1/fpm/php.ini

Tìm dòng sau. (dòng 430)

memory_limit = 128M

Thay đổi giá trị.

memory_limit = 512M

Lưu và đóng tệp. Ngoài ra, bạn có thể chạy lệnh sau để thay đổi giá trị mà không cần mở tệp theo cách thủ công.

sudo sed -i 's/memory_limit = 128M/memory_limit = 512M/g' /etc/php/8.1/fpm/php.ini

Sau đó tải lại dịch vụ PHP-FPM để các thay đổi có hiệu lực.

systemctl restart php8.1-fpm
systemctl enable php8.1-fpm

8.2 – Thiết lập PHP để truy vấn đúng các biến môi trường hệ thống

vi /etc/php/8.1/fpm/pool.d/www.conf

Tìm dòng sau (dòng 421).

;clear_env = no

Xóa dấu chấm phẩy để bỏ chú thích dòng này.

clear_env = no

Lưu và đóng tệp. Ngoài ra, bạn có thể chạy lệnh sau để bỏ ghi chú dòng này mà không cần mở tệp theo cách thủ công.

sed -i 's/;clear_env = no/clear_env = no/g' /etc/php/8.1/fpm/pool.d/www.conf

Sau đó tải lại dịch vụ PHP-FPM để các thay đổi có hiệu lực.

systemctl restart php8.1-fpm

8.3 – Tăng giới hạn kích thước tệp tải lên

Giới hạn kích thước tệp tải lên tối đa mặc định do Nginx đặt là 1MB. Để cho phép tải các tệp lớn lên máy chủ NextCloud của bạn, hãy chỉnh sửa tệp cấu hình Nginx cho NextCloud.

vi   /etc/nginx/conf.d/nextcloud.conf

Chúng ta đã đặt kích thước tệp tối đa trong tệp này, như được chỉ ra bởi

client_max_body_size 512M;

Bạn có thể thay đổi nó nếu bạn thích, như 1G.

client_max_body_size 1024M;

Lưu và đóng tệp. Sau đó tải lại Nginx để các thay đổi có hiệu lực.

sudo systemctl restart nginx

PHP cũng đặt giới hạn kích thước tệp tải lên. Kích thước tệp tối đa mặc định để tải lên là 2MB. Để tăng giới hạn kích thước tải lên, hãy chỉnh sửa tệp cấu hình PHP.

vi /etc/php/8.1/fpm/php.ini

Tìm dòng sau (dòng 846).

upload_max_filesize = 2M

Thay đổi giá trị như bên dưới:

upload_max_filesize = 1024M

Lưu và đóng tệp. Ngoài ra, bạn có thể chạy lệnh sau để thay đổi giá trị mà không cần mở tệp theo cách thủ công.

sudo sed -i 's/upload_max_filesize = 2M/upload_max_filesize = 1024M/g' /etc/php/8.1/fpm/php.ini

Sau đó khởi động lại PHP-FPM.

systemctl restart php8.1-fpm

8.4 – Cấu hình Redis Cache cho NextCloud

Chúng ta sẽ kích hoạt bộ nhớ đệm cho nextCloud bằng cách sử dụng Redis. Chạy lệnh sau để cài đặt máy chủ Redis từ kho lưu trữ Ubuntu.

apt install redis-server -y

Bạn có thể kiểm tra phiên bản với:

redis-server -v

systemctl start redis-server
systemctl enable redis-server

Để cấu hình Redis làm bộ nhớ cache cho nextCloud, chúng ta cần cài đặt tiện ích mở rộng PHP để giao tiếp với Redis.
apt install php8.1-redis -y

Kiểm tra xem tiện ích mở rộng đã được bật chưa

php8.1 --ri redis

Chúng ta có thể thấy rằng tiện ích mở rộng Redis được bật. Nếu nó không được bật, hãy chạy lệnh sau:

phpenmod redis

Tiếp theo, chỉnh sửa tệp

vi  /var/www/nextcloud/config/config.php

Thêm các dòng sau phía trên dòng kết thúc.);

'memcache.distributed' => '\OC\Memcache\Redis',
'memcache.local' => '\OC\Memcache\Redis',
'memcache.locking' => '\OC\Memcache\Redis',
'redis' => array(
     'host' => 'localhost',
     'port' => 6379,
     ),

systemctl restart nginx php8.1-fpm

8.5 – Thêm mục nhập DNS cục bộ

Bạn nên chỉnh sửa tệp trên máy chủ Nextcloud của mình và thêm mục sau, để bản thân Nextcloud sẽ không phải truy vấn DNS công cộng, điều này có thể cải thiện độ ổn định tổng thể. Nếu máy chủ Nextcloud của bạn không thể phân giải tên máy chủ, thì bạn có thể gặp phải lỗi hết thời gian chờ cổng 504 tại /etc/hosts thêm vào

127.0.0.1   localhost nextcloud.itvn.xyz

Một địa chỉ IP trong tệp có thể có nhiều tên máy chủ, vì vậy nếu bạn đã cài đặt các ứng dụng khác trên cùng một hộp, bạn cũng có thể thêm các tên máy chủ hoặc tên miền phụ khác trên cùng một dòng như thế này.

127.0.0.1   localhost focal ubuntu nextcloud.itvn.xyz collabora.itvn.xyz

8.6 – Sử dụng Cron để chạy các tác vụ nền

Theo mặc định, Nextcloud sử dụng AJAX để thực hiện một tác vụ với mỗi lần tải trang. Bạn có thể sử dụng dịch vụ cron hệ thống hiệu quả hơn để chạy các công việc nền. Đi tới Cài đặt Nextcloud -> Cài đặt cơ bản và chọn Cron

Tiếp theo, chỉnh sửa tệp crontab của người dùng.www-data

Tiếp theo, chỉnh sửa tệp crontab của người dùng.www-data

sudo -u www-data crontab -e

Thêm dòng sau vào tệp này, vì vậy công việc cron sẽ chạy cứ sau 5 phút.

*/5 * * * * php8.1 -f /var/www/nextcloud/cron.php

Lưu và đóng tệp.

8.7 – Ngăn chặn các nỗ lực đăng nhập độc hại

Nếu máy tính của bạn có địa chỉ IP public tĩnh, bạn có thể tạo danh whitelist là địa chỉ IP trong tệp cấu hình Nginx

vi /etc/nginx/conf.d/nextcloud.conf

Tạo location login Thêm các dòng sau trong khối máy chủ SSL để hạn chế quyền truy cập vào URL, vì vậy chỉ địa chỉ IP của bạn mới có thể truy cập URL này. Thay thế 14.248.82.194 bằng địa chỉ IP của riêng bạn.

location ~* ^/login{
       try_files $uri /index.php;
       include fastcgi_params;
       fastcgi_split_path_info ^(.+\.php)(/.*)$;
       fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
       fastcgi_param PATH_INFO $fastcgi_path_info;
       #Avoid sending the security headers twice
       fastcgi_param modHeadersAvailable true;
       fastcgi_param front_controller_active true;
       fastcgi_pass unix:/run/php/php8.1-fpm.sock;
       fastcgi_intercept_errors on;
       fastcgi_request_buffering off;

       allow 58.187.230.7;
       allow 14.248.82.194;
       deny all;
}

Lưu và đóng tệp. Sau đó kiểm tra cấu hình Nginx.

nginx -t

Nếu thử nghiệm thành công, hãy tải lại Nginx để các thay đổi có hiệu lực.

systemctl restart nginx

8.8 – Mẹo khắc phục sự cố

Nếu bạn gặp lỗi, bạn có thể kiểm tra một trong các tệp nhật ký sau để tìm hiểu điều gì sai.

  • Nhật ký lỗi Nginx: /var/log/nginx/error.log
  • Nhật ký lỗi Nginx cho máy chủ ảo Nextcloud: /var/log/nginx/nextcloud.error
  • Nhật ký ứng dụng Nextcloud: /var/www/nextcloud/data/nextcloud.log

8.9 – Về phần đọc, chỉnh sửa Office bạn hãy cài đặt thêm Collabora Online vào Ubuntu từ the Official Repository

Tổng kết

Hy vọng hướng dẫn này đã giúp bạn cài đặt NextCloud trên máy chủ Ubuntu 22.04 với Nginx. Như mọi khi, nếu bạn thấy bài đăng này hữu ích, thì bạn hãy góp ý để mình có thể chỉnh sửa thêm. Hãy giữ sức khoẻ!

Hẹn gặp lại các bạn tại các bài viết sau tại wiki.nhanhoa.com


                    

Trả lời