Nextcloud是一种开源文件同步和共享软件,可以替代Google Drive,Yandex Disk和类似的基于云存储。Nextcloud现在具有Onlyoffice,允许共享文档编辑和Nextcloud对话、视频会议、虚拟办公等解决方案等。
在本教程中,我们将在vultr云服务器(如搬瓦工、Hostwinds、vultr等)上设置Nextcloud 18,使用nginx作为Web服务器,并使用PostgreSQL作为数据库引擎。
Vultr成立于2014年,主营VPS云服务器、独立服务器等产品,按小时计费,其中VPS云服务器产品基于KVM架构性能也是比较有保障,目前拥有全球16大数据中心可以选择,包含日本、新加坡、洛杉矶、硅谷、西雅图等等!是目前国外比较成熟的一家按小时计费商家,支持信用卡、paypal、比特币、支付宝、微信等充值方式。
官方网站
设置云服务器
登录到vultr并部署新服务器。本教程中我们使用1GB内存,25GB存储和CentOS 8模板的最基础服务器。部署服务器后,即可使用SSH登录。
ssh root@<your-ip-address>
登录后,更改密码,然后输入两次新密码。
passwd
为了保护服务器安全,最好防止以root用户身份登录,因此需要创建另一个用户。
为您自己创建一个新的用户名。
adduser nextcloud
然后给新用户一个密码
passwd nextcloud
将用户添加到Wheel组,以能够调用管理特权。
usermod -aG wheel nextcloud
然后通过编辑/ etc / ssh / sshd_config文件并将PermitRootLogin设置为no来防止root登录。
nano /etc/ssh/sshd_config
PermitRootLogin no
退出编辑器,然后重新启动SSHD服务。重新启动过程完成后,断开连接并使用新的用户名重新登录
ssh nextcloud@<your-ip-address>
当启用SE Linux时,CentOS 8提供了一些安全保护。SE Linux的主要目的是通过遵循最小特权原则来控制文件访问权限,以便程序仅访问所需的文件。这在运行诸如NextCloud之类的服务时特别有用,但确实会增加设置的复杂性。
通过设置SELINUX = enforcing,我们将SE Linux从许可模式更改为强制模式。
sudo nano /etc/selinux/config
SELINUX=enforcing
然后保存文件并退出编辑器。
这些更改将在下次重新启动时应用,但是为了节省时间,您可以使用以下命令更改运行时的设置。
sudo setenforce enforcing
如果再检查SELinux模式。
sestatus
然后,输出应给出以下内容。
SELinux status: enabled SELinuxfs mount: /sys/fs/selinux SELinux root directory: /etc/selinux Loaded policy name: targeted Current mode: enforcing Mode from config file: permissive Policy MLS status: enabled Policy deny_unknown status: allowed Memory protection checking: actual (secure) Max kernel policy version: 31
最后,更新已安装的软件
sudo dnf -y update
完成后,请继续进行下一步。
配置域名
您将需要配置一个有效的域名,使其指向您的云服务器IP地址,以便能够获取SSL证书,如本指南后面所述。如果您没有域名,则可以使用Freenom获取免费的临时域名。
您可以在我们的域名指南中阅读有关域名系统以及如何配置DNS记录以将您的域指向正确的IP地址的更多信息。
安装NGINX Web服务器
接下来,我们将安装NGINX作为NextCloud服务器的基础。
但首先,添加EPEL存储库
sudo dnf -y install epel-release
然后更新存储库并安装Nginx
sudo dnf -y install nginx
验证安装
sudo nginx -v
应该给出类似的输出
nginx version: nginx/1.14.1
启用(确保Nginx在重新启动后自动启动)并启动Nginx
sudo systemctl enable nginx sudo systemctl start nginx
检查Nginx是否正在运行
curl -I 127.0.0.1
这应该给出类似于以下内容的输出
HTTP/1.1 200 OK Server: nginx/1.14.1 Date: Thu, 30 Jul 2020 16:34:40 GMT Content-Type: text/html Content-Length: 4057 Last-Modified: Mon, 07 Oct 2019 21:16:24 GMT Connection: keep-alive ETag: "5d9bab28-fd9" Accept-Ranges: bytes
创建防火墙规则以允许Web访问
sudo firewall-cmd --zone=public --add-service=http --permanent sudo firewall-cmd --zone=public --add-service=https --permanent sudo firewall-cmd --reload
安装Let’s Encrypt加密证书
编辑Nginx配置以指示域名
sudo nano /etc/nginx/nginx.conf
更改服务器名称以使用您的域,将my.domain.com替换为您的域。
server_name my.domain.com www.my.domain.com;
然后,保存并退出。
然后重新加载NGINX以应用更改。
sudo systemctl reload nginx
接下来,安装Certbot,它将自动设置证书。
sudo dnf install -y certbot python3-certbot-nginx
然后使用以下命令获取证书。再次用您的替换my.domain.com。
sudo certbot --nginx -d my.domain.com
在第一次运行时,您需要向Certbot提供一些详细信息。
- 然后它将询问您的电子邮件地址,并且您已阅读并同意服务条款。
- 然后,您可以选择从电子前沿基金会(EFF)接收信息。
- 然后,应将my.domain.com和www.my.domain.com指示为要获取其证书的域,您应该同意。
- 最后指示它应该将所有流量从HTTP重定向到HTTPS。
如果成功,您将看到确认Certbot已为您的域获取证书的确认。
安装PostGRESQL
接下来,您将需要安装数据库。我们将使用外部存储库来安装最新版本的PostgreSQL,即版本12。
使用以下命令启用外部PostgreSQL存储库。
sudo dnf -y install https://download.postgresql.org/pub/repos/yum/reporpms/EL-8-x86_64/pgdg-redhat-repo-latest.noarch.rpm
从CentOS存储库中禁用PostgreSQL。
sudo dnf -qy module disable postgresql
然后从外部存储库安装PostgreSQL。
sudo dnf -y install postgresql12 postgresql12-server
初始化数据库,并使其在服务器启动时自动启动。
sudo /usr/pgsql-12/bin/postgresql-12-setup initdb sudo systemctl enable postgresql-12 sudo systemctl start postgresql-12
接下来,使用以下命令为postgres用户帐户设置密码,然后输入两次新密码。
sudo passwd postgres
完成后,使用下一个命令更改为postgres用户帐户。
su -l postgres
输入Postgres数据库软件。
psql
然后为NextCloud创建数据库。用安全的密码替换密码。
CREATE USER nextclouddbuser WITH PASSWORD 'nextclouddbuserpassword';
建立资料库
CREATE DATABASE nextclouddb;
授予NextCloud用户访问数据库的权限。
GRANT ALL PRIVILEGES ON DATABASE nextclouddb TO nextclouddbuser;
通过键入以下内容退出数据库。
\q
然后,退出postgres用户帐户。
exit
要启用到数据库的连接,必须修改配置,编辑pg_hba.conf文件。
sudo nano /var/lib/pgsql/12/data/pg_hba.conf
然后找到主机IPv4行并按如下所示进行设置。
host all all 127.0.0.1/32 md5
同样,更改线路IPv6主机。
host all all ::1/128 md5
之后,重新启动Postgresql服务以启用更改。
sudo systemctl restart postgresql-12
数据库准备就绪!继续下面的安装下一步。
安装Redis
Redis是一个开源的内存中数据结构存储,我们将其用作缓存。
使用以下命令安装Redis。
sudo dnf install -y redis
然后启动并启用Redis服务。
sudo systemctl enable redis.service sudo systemctl start redis.service
这就是配置Redis所需要做的全部工作。在下一节中继续进行PHP安装。
安装PHP 7.4
接下来,您需要安装PHP。首先,启用REMI存储库。
sudo dnf -y install https://rpms.remirepo.net/enterprise/remi-release-8.rpm
安装实用程序包。
sudo dnf -y install yum-utils unzip policycoreutils-python-utils mlocate bzip2 wget tar
为REMI存储库启用模块流。
sudo dnf module reset php sudo dnf -y module install php:remi-7.4
安装PHP模块。
sudo dnf install -y php php-gd php-mbstring php-intl \ php-pecl-apcu php-opcache php-json php-pecl-zip php-pear \ php-pecl-imagick php-fpm php-pecl-redis5 \ php-intl php-pgsql php-common php-pdo php-xml \ php-lz4 php-xml php-pecl-crypto php-pecl-rar \ php-pecl-pq php-pecl-lzf php-cli php-pecl-apcu-bc
然后通过首先编辑/etc/php-fpm.d/www.conf文件来设置PHP 。
sudo nano /etc/php-fpm.d/www.conf
取消注释以下行,并将管理内存限制更改为512 MB。
;env[HOSTNAME] = $HOSTNAME ;env[PATH] = /usr/local/bin:/usr/bin:/bin ;env[TMP] = /tmp ;env[TMPDIR] = /tmp ;env[TEMP] = /tmp ... ;php_admin_value[memory_limit] = 128M ... ;php_value[opcache.file_cache] = /var/lib/php/opcache
之后,这些行应如下所示。
env[HOSTNAME] = $HOSTNAME env[PATH] = /usr/local/bin:/usr/bin:/bin env[TMP] = /tmp env[TMPDIR] = /tmp env[TEMP] = /tmp ... php_admin_value[memory_limit] = 512M ... php_value[opcache.file_cache] = /var/lib/php/opcache
接下来,创建以下目录来存储临时信息。
sudo mkdir -p /var/lib/php/{session,opcache,wsdlcache} sudo chown -R root:nginx /var/lib/php/{opcache,wsdlcache} sudo chown -R nginx:nginx /var/lib/php/session
完成后,启动并启用PHP以在引导时运行。
sudo systemctl enable php-fpm sudo systemctl start php-fpm
下载Nextcloud
从其下载页面获取NextCloud服务器。您可以使用以下命令下载安装软件包。在网页上查看最新版本。
wget https://download.nextcloud.com/server/releases/nextcloud-18.0.7.tar.bz2
接下来,要验证软件包,请同时下载SHA256哈希值,签名和PGP密钥。
wget https://download.nextcloud.com/server/releases/nextcloud-18.0.7.tar.bz2.sha256 wget https://download.nextcloud.com/server/releases/nextcloud-18.0.7.tar.bz2.asc wget https://nextcloud.com/nextcloud.asc
然后使用以下命令验证sha256sum。
sha256sum -c nextcloud-18.0.7.tar.bz2.sha256 < nextcloud-18.0.7.tar.bz2
输出应如下面的示例所示。
nextcloud-18.0.7.tar.bz2: OK
通过首先导入密钥来验证签名。
gpg --import nextcloud.asc
哪个应该给出以下内容。
gpg: directory '/home/nextcloud/.gnupg' created gpg: keybox '/home/nextcloud/.gnupg/pubring.kbx' created gpg: /home/nextcloud/.gnupg/trustdb.gpg: trustdb created gpg: key D75899B9A724937A: public key "Nextcloud Security <security@nextcloud.com>" imported gpg: Total number processed: 1 gpg: imported: 1
然后检查签名。
gpg --verify nextcloud-18.0.7.tar.bz2.asc nextcloud-18.0.7.tar.bz2
哪个应该给出如下输出。
gpg: Signature made Wed 15 Jul 2020 20:07:06 UTC gpg: using RSA key D75899B9A724937A gpg: Good signature from "Nextcloud Security <security@nextcloud.com>" [unknown] gpg: WARNING: This key is not certified with a trusted signature! gpg: There is no indication that the signature belongs to the owner. Primary key fingerprint: 2880 6A87 8AE4 23A2 8372 792E D758 99B9 A724 937A
要验证密钥,请在公共密钥服务器(例如https://pgp.mit.edu/)上进行检查,您应在该服务器上搜索0xD75899B9A724937A
接下来,将包解压缩到一个文件夹中。
tar -xvf nextcloud-18.0.7.tar.bz2
将文件夹复制到NGINX根目录。
sudo rm -rf /usr/share/nginx/html sudo cp -r nextcloud /usr/share/nginx/html
另外,建立以下数据目录。
sudo mkdir /usr/share/nginx/data
确保NGINX可以读写NextCloud文件夹
sudo chown -R nginx:nginx /usr/share/nginx
然后重启NGINX。
sudo systemctl restart nginx
您还需要配置SELinux以允许访问适当的文件夹。
sudo semanage fcontext -a -t httpd_sys_rw_content_t '/usr/share/nginx/data(/.*)?' sudo semanage fcontext -a -t httpd_sys_rw_content_t '/usr/share/nginx/html/config(/.*)?' sudo semanage fcontext -a -t httpd_sys_rw_content_t '/usr/share/nginx/html/apps(/.*)?' sudo semanage fcontext -a -t httpd_sys_rw_content_t '/usr/share/nginx/html/.htaccess' sudo semanage fcontext -a -t httpd_sys_rw_content_t '/usr/share/nginx/html/.user.ini' sudo semanage fcontext -a -t httpd_sys_rw_content_t '/usr/share/nginx/html/3rdparty/aws/aws-sdk-php/src/data/logs(/.*)?'
sudo restorecon -R '/usr/share/nginx/html/' sudo restorecon -R '/usr/share/nginx/data/' sudo setsebool -P httpd_can_network_connect on
为NextCloud配置NGINX和PHP
现在设置NGINX和PHP配置文件。将/etc/nginx/nginx.conf更改为具有以下内容。
sudo nano /etc/nginx/nginx.conf
# For more information on configuration, see: # * Official English Documentation: http://nginx.org/en/docs/ # * Official Russian Documentation: http://nginx.org/ru/docs/ user nginx; worker_processes auto; error_log /var/log/nginx/error.log; pid /run/nginx.pid; # Load dynamic modules. See /usr/share/doc/nginx/README.dynamic. include /usr/share/nginx/modules/*.conf; events { worker_connections 1024; } http { log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log /var/log/nginx/access.log main; sendfile on; tcp_nopush on; tcp_nodelay on; keepalive_timeout 65; types_hash_max_size 2048; include /etc/nginx/mime.types; default_type application/octet-stream; # Load modular configuration files from the /etc/nginx/conf.d directory. # See http://nginx.org/en/docs/ngx_core_module.html#include # for more information. include /etc/nginx/conf.d/*.conf; server { # Load configuration files for the default server block. include /etc/nginx/default.d/*.conf; location / { } } }
接下来,创建NextCloud网站配置文件/etc/nginx/conf.d/nextcloud.conf
sudo nano /etc/nginx/conf.d/nextcloud.conf
在配置文件中包括以下内容。由于文件的长度,您可能需要分批复制。将所有出现的my.domain.com替换为您的域。
upstream php-handler { server unix:/run/php-fpm/www.sock; } server { listen 80; listen [::]:80; server_name my.domain.com; # enforce https return 301 https://$server_name:443$request_uri; } server { listen 443 ssl http2; listen [::]:443 ssl http2; server_name www.my.domain.com my.domain.com; ssl_certificate /etc/letsencrypt/live/my.domain.com/fullchain.pem; # managed by Certbot ssl_certificate_key /etc/letsencrypt/live/my.domain.com/privkey.pem; # managed by Certbot include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot # Add headers to serve security-related headers # Before enabling Strict-Transport-Security headers please read into this # topic first. add_header Strict-Transport-Security "max-age=15768000; includeSubDomains; preload;" always; # # WARNING: Only add the preload option once you read about # the consequences in https://hstspreload.org/. This option # will add the domain to a hardcoded list that is shipped # in all major browsers and getting removed from this list # could take several months. 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-Robots-Tag "none" always; add_header X-XSS-Protection "1; mode=block" always; # Remove X-Powered-By, which is an information leak fastcgi_hide_header X-Powered-By; # Path to the root of your installation root /usr/share/nginx/html/; 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; # The following rule is only needed for the Social app. # Uncomment it if you're planning to use this app. #rewrite ^/.well-known/webfinger /public.php?service=webfinger last; location = /.well-known/carddav { return 301 $scheme://$host:$server_port/remote.php/dav; } location = /.well-known/caldav { return 301 $scheme://$host:$server_port/remote.php/dav; } location ^~ { # set max upload size client_max_body_size 512M; fastcgi_buffers 64 4K; # Enable gzip but do not remove ETag headers 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; # Uncomment if your server is built with the ngx_pagespeed module # This module is currently not supported. # pagespeed off; 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\/.+|oc[ms]-provider\/.+)\.php(?:$|\/) { 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; # Avoid sending the security headers twice fastcgi_param modHeadersAvailable true; # Enable pretty urls fastcgi_param front_controller_active true; fastcgi_pass php-handler; fastcgi_intercept_errors on; fastcgi_request_buffering off; } location ~ ^\/(?:updater|oc[ms]-provider)(?:$|\/) { try_files $uri/ =404; index index.php; } # Adding the cache control header for js, css and map files # Make sure it is BELOW the PHP block location ~ ^\/.+[^\/]\.(?:css|js|woff2?|svg|gif|map)$ { try_files $uri /index.php$request_uri; add_header Cache-Control "public, max-age=15778463"; # Add headers to serve security related headers (It is intended # to have those duplicated to the ones above) # Before enabling Strict-Transport-Security headers please read # into this topic first. #add_header Strict-Transport-Security "max-age=15768000; includeSubDomains; preload;" always; # # WARNING: Only add the preload option once you read about # the consequences in https://hstspreload.org/. This option # will add the domain to a hardcoded list that is shipped # in all major browsers and getting removed from this list # could take several months. 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; # Optional: Don't log access to assets access_log off; } location ~ ^\/.+[^\/]\.(?:png|html|ttf|ico|jpg|jpeg|bcmap)$ { try_files $uri /index.php$request_uri; # Optional: Don't log access to other assets access_log off; } } }
接下来,增加PHP内存限制。
sudo nano /etc/php.ini
如下将memory_limit更改为512 MB。通过按ctrl + w,输入memory_limit并按Enter键,可以在nano中使用搜索功能。
memory_limit = 512M
另外,对php-fpm配置进行以下更改。
sudo nano /etc/php-fpm.d/www.conf
将用户和组的值从apache更改为nginx,以使各行如下所示。
user = nginx group = nginx
安装NextCloud
转到NextCloud安装目录。
cd /usr/share/nginx/html
然后使用以下命令安装Nextcloud。请注意,所有用于php occ的命令都需要从/ usr / share / nginx / html目录中调用。确保将数据库密码设置为与创建数据库时相同的密码。另外,在Nextcloud Web面板上为您的管理员帐户创建密码。
sudo -u nginx php occ maintenance:install \ --data-dir /usr/share/nginx/data \ --database "pgsql" \ --database-name "nextclouddb" \ --database-user "nextclouddbuser" \ --database-pass "nextclouddbuserpassword" \ --admin-user "nextcloudadmin" \ --admin-pass "nextcloudadminpassword"
安装将花费一些时间,一旦完成,您将确认Nextcloud已成功安装。
接下来,通过运行以下命令来配置数据库以保护服务器的安全。
sudo -u nginx php occ db:add-missing-indices
在运行文件缓存转换之前,首先,启用维护模式。
sudo -u nginx php occ maintenance:mode --on
然后运行转换,并在要求确认时选择是。
sudo -u nginx php occ db:convert-filecache-bigint
然后,再次关闭维护模式。
sudo -u nginx php occ maintenance:mode --off
修改文件/usr/share/nginx/html/config/config.php以允许您的域名作为从中访问Nextcloud并使用缓存的位置。
sudo nano config/config.php
更改内容以包括以下内容。再次用自己的my.domain.com替换,并在允许的domains数组之后插入memcache和redis配置。
... array ( 0 => 'localhost', 1 => 'my.domain.com', ), 'memcache.distributed' => '\OC\Memcache\Redis', 'memcache.locking' => '\OC\Memcache\Redis', 'memcache.local' => '\OC\Memcache\APCu', 'redis' => array( 'host' => 'localhost', 'port' => 6379, ), 'datadirectory' => '/usr/share/nginx/data', ...
完成所有操作后,重新启动Nextcloud服务器,以确保所有设置均已成功应用。
sudo reboot
服务器再次启动后,所有服务都应恢复,并且网站可以联机。继续下面的画龙点睛以安装一些应用程序,并确保您的Nextcloud服务器是安全的。
配置Nextcloud
通过Web界面登录到您的Nextcloud实例。转到您的Nextcloud网站,并使用Nextcloud安装命令中设置的管理员用户名和密码登录。
https://my.domain.com/login
登录后,您将看到Nextcloud仪表板。要进行最后几个配置,请单击齿轮和“应用程序”链接转到“应用程序”视图。
然后在“应用程序”列表中,通过单击左侧的菜单链接转到“应用程序包”。
在“应用程序捆绑包”视图中,通过单击“全部启用”按钮启用并安装集线器捆绑包。然后,Nextcloud将开始下载选定的应用程序,并将其包括在您的网站中。
之后,您应该看到已启用所选的应用程序。
注销您的实例,然后再次重新启动服务器。
sudo reboot
然后,重启程完成后,重新登录。
检查文档编辑(仅Office和Community Document Server)和Talk应用程序是否正常运行。您可以通过打开Example.md文件进行编辑来测试它们。您可以通过单击右上角的X关闭编辑器。
接下来,在服务器概述中检查服务器是否有任何配置警告,以及该软件是否为最新。如果一切都已正确配置,则应该看到绿色的复选图标,表示所有选择均已通过。
最后,您还可以使用Nextcloud安全扫描程序检查Nextcloud的安装。转到https://scan.nextcloud.com/并在文本字段中输入您的Nextcloud域名,然后单击“扫描”。
您将获得A +结果的满分,如下所示。
之后,您还应该考虑通过安装Fail2Ban来进一步保护服务器安全。