Nextcloud 是一个强大的网盘和云协作平台,允许用户在全平台同步文件、协同编辑文档,并提供多种协作工具,如日历、联系人管理、Email、和即时音视频通话。Nextcloud 开源可自建,因此相比商业服务,更能保护隐私内容。
AhFei 最常使用它的同步功能,用来同步安卓手机和 Windows 电脑上的 Obsidian 库,取代坚果云。
| 指标 | 描述 |
|---|---|
| 适用系统 | Debian 系发行版,包括 Ubuntu, Armbian,其他发行版稍改命令一般也可 |
| 走通流程时间 | 30 分钟 |
I might have made some mistakes, please let me know if I’ve gotten anything wrong!
官网: Nextcloud – Open source content collaboration platform
官方安装手册: Installation and server configuration — Nextcloud latest Administration Manual latest documentation

原生部署采取 Apache2 + PHP + MariaDB。
根据 AhFei 的浅薄的理解,PHP 程序的工作流程是: 访问网站时,浏览器会发送请求到服务器,Apache2 收到请求,调用 PHP 程序得到要返回的内容,然后响应用户请求。
从这个流程可以看到,PHP 本身并不一直在“运行”,而是 Apache2 去调用,使用数据库存储数据。因此所有 PHP 程序只需要将代码文件放在某个目录下,在其配置文件中编辑好数据库的信息,然后在 Apache2 中增加一个虚拟主机就可以了。
原生部署
单人使用,内存 1g 就行,建议 2g。如果想让同步丝滑,就要使用优化线路的机器。
安装目录是 /var/www/nextcloud.cufah.cloud,域名使用 nextcloud.cufah.cloud,先设置好 DNS 解析。
前置准备
更新软件
sudo apt update && sudo apt -y upgrade && sudo apt autoremove
设置 Hostname (非必须)
sudo vim /etc/hostname # 清空,填 nextcloud.cufah.cloud
sudo hostnamectl set-hostname nextcloud.cufah.cloud
sudo vim /etc/hosts
示例如下
127.0.0.1 localhost
127.0.1.1 nextcloud.cufah.cloud
设置 Web Server——Apache2
sudo apt -y install php php-apcu php-bcmath php-cli php-common php-curl php-gd php-bz2 php-gmp php-imagick php-intl php-mbstring php-mysql php-zip php-xml libmagickcore-6.q16-6-extra
检查状态
systemctl status apache2
允许 Nextcloud 需要的一些 php 扩展
sudo phpenmod bcmath gmp imagick intl
配置 PHP
查看版本
php --version
sudo vim /etc/php/8.3/apache2/php.ini
推荐调整下面的变量
memory_limit = 512M
upload_max_filesize = 200M
# 最大执行时间,如果机器性能较弱,就不要限制了,否则备份的时候会因为超时失败
# max_execution_time = 360
post_max_size = 200M
date.timezone = Asia/Shanghai
opcache.enable=1
opcache.memory_consumption=128
opcache.interned_strings_buffer=32
opcache.max_accelerated_files=10000
opcache.revalidate_freq=1
opcache.save_comments=1
迁移时可以复制原先的
scp -P 40527 root@1.2.3.4:/etc/php/8.3/apache2/php.ini /etc/php/8.3/apache2/php.ini
确保 php 模组开启
sudo a2enmod dir env headers mime rewrite ssl
重启 Apache
sudo systemctl restart apache2
下载 Nextcloud
如果迁移,跳过此节,参考下面迁移一节,将旧服务器数据移动新服务器
下载网址: Download and install Nextcloud ,最新版网址是固定的,因此直接执行命令即可
curl -O https://download.nextcloud.com/server/releases/latest.tar.bz2
解压
tar -xjf latest.tar.bz2
重命名目录
mv nextcloud nextcloud.cufah.cloud
移动到合适位置
sudo mv nextcloud.cufah.cloud /var/www/
设置权限 www-data 为其所有者
sudo chown -R www-data:www-data /var/www/nextcloud.cufah.cloud
配置数据库 MariaDB
迁移的话,这一节也要全部做完,和初次安装无区别
安装 MariaDB
sudo apt -y install mariadb-server
检查状态
systemctl status mariadb
为了基本的安全,先运行下面命令
sudo mysql_secure_installation
它会询问一些问题。
- 首先会问 mariadb 的 root 密码,我们还没设置。因此回车即可;
- 然后,这个脚本会问是否设置 root 密码,设置就可
- 最后会询问是否移除匿名用户,禁止 root 远程登陆等,一直回车即可,默认都是同意
创建 Nextcloud 数据库
sudo mariadb
进入仿 shell 界面,使用 MySQL 格式命令。创建名为 nextcloud_db 的空数据库:
CREATE DATABASE nextcloud_db;
检查所有数据库
SHOW DATABASES;
创建用户 nextcloud ,并使其能访问数据库 ,记得修改密码
GRANT ALL PRIVILEGES ON <数据库名称>.* TO '<用户名>'@'localhost' IDENTIFIED BY '用户密码';
比如 GRANT ALL PRIVILEGES ON nextcloud_db.* TO 'nextcloud'@'localhost' IDENTIFIED BY 'sdvwaNTd42wD156';
使命令生效
FLUSH PRIVILEGES;
退出
exit
迁移的话,现在去转移数据库的数据
设置虚拟主机
HTTP
禁止默认的主机
sudo a2dissite 000-default.conf
为 Nextcloud 配置主机文件(监听 80 端口的,记得修改域名和 Nextcloud 的目录)
sudo vim /etc/apache2/sites-available/nextcloud.cufah.cloud.conf
<VirtualHost *:80>
DocumentRoot "/var/www/nextcloud.cufah.cloud"
ServerName nextcloud.cufah.cloud
<Directory "/var/www/nextcloud.cufah.cloud/">
Options MultiViews FollowSymlinks
AllowOverride All
Order allow,deny
Allow from all
</Directory>
TransferLog /var/log/apache2/nextcloud.cufah.cloud_access.log
ErrorLog /var/log/apache2/nextcloud.cufah.cloud_error.log
# 开启自动跳转 https
RewriteEngine on
RewriteCond %{SERVER_NAME} =nextcloud.cufah.cloud
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
</VirtualHost>
HTTPS
sudo a2dissite default-ssl.conf
使用 acme.sh 自动获取和更新证书: [[02acme.sh]] 使用 acme.sh 申请和自动更新证书的完整指南 – 技焉洲
使用 root 申请: sudo -i
申请证书(修改域名)
acme.sh --issue -d nextcloud.cufah.cloud --apache
复制证书到指定目录(修改域名)
acme.sh --install-cert -d nextcloud.cufah.cloud \
--key-file /etc/ssl/private/nextcloud.cufah.cloud.key \
--fullchain-file /etc/ssl/certs/nextcloud.cufah.cloud.cer \
--reloadcmd "systemctl reload nginx"
编写 Apache2 主机文件(监听 443 端口的,记得修改域名和 Nextcloud 的目录)
sudo vim /etc/apache2/sites-available/nextcloud.cufah.cloud-le-ssl.conf
<IfModule mod_ssl.c>
<VirtualHost *:443>
DocumentRoot "/var/www/nextcloud.cufah.cloud"
ServerName nextcloud.cufah.cloud
<IfModule mod_headers.c>
Header always set Strict-Transport-Security "max-age=15552000; includeSubDomains"
</IfModule>
<Directory "/var/www/nextcloud.cufah.cloud/">
Options MultiViews FollowSymlinks
AllowOverride All
Order allow,deny
Allow from all
</Directory>
TransferLog /var/log/apache2/nextcloud.cufah.cloud_access.log
ErrorLog /var/log/apache2/nextcloud.cufah.cloud_error.log
SSLCertificateFile /etc/ssl/certs/nextcloud.cufah.cloud.cer
SSLCertificateKeyFile /etc/ssl/private/nextcloud.cufah.cloud.key
SSLEngine on
# Intermediate configuration, tweak to your needs
SSLProtocol all -SSLv2 -SSLv3 -TLSv1 -TLSv1.1
SSLCipherSuite ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384
SSLHonorCipherOrder off
SSLSessionTickets off
SSLOptions +StrictRequire
# Add vhost name to log entries:
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-agent}i\"" vhost_combined
LogFormat "%v %h %l %u %t \"%r\" %>s %b" vhost_common
</VirtualHost>
</IfModule>
启用两个虚拟主机
sudo a2ensite nextcloud.cufah.cloud.conf
sudo a2ensite nextcloud.cufah.cloud-le-ssl.conf
sudo systemctl reload apache2
现在就可以试一试能不能访问网页了
禁用虚拟主机的命令
sudo a2dissite nextcloud.cufah.cloud.conf
sudo a2dissite nextcloud.cufah.cloud-le-ssl.conf
迁移旧的虚拟主机
sudo scp -P 40527 root@1.2.3.4:/etc/apache2/sites-available/nextcloud.cufah.cloud.conf /etc/apache2/sites-available/
sudo scp -P 40527 root@1.2.3.4:/etc/apache2/sites-available/nextcloud.cufah.cloud-le-ssl.conf /etc/apache2/sites-available/
使用
精选的 APP 都可以要
Web
提供的 WebDAV,网址在个人首页,左下角展开查看。
Notes 这个 APP 有安卓客户端,我用来取代手机自带的备忘录、便签之类的软件。
office 套件
How to install ONLYOFFICE in Nextcloud Hub – Nextcloud
外部存储
挂载另一个 Nextcloud 的空间,用户名和密码认证即可
挂载 WebDAV,认证: 用户和密码
infini 的配置: https://toi.teracloud.jp/dav/ 远程子文件夹为 nextcloud(看实际目录) 开启 https 单独的密码
各平台客户端软件
Windows: https://download.nextcloud.com/desktop/releases/Windows/ ,只是用来同步的软件。
安卓,推荐安装 F-Droid 这个开源应用商店,在上面安装 Nextcloud 以及额外配套的 APP。
其他
修改配置文件 config.php
先修改 config.php 的权限,安全原因
sudo chmod 660 /var/www/nextcloud.cufah.cloud/config/config.php
一个一个看
sudo vim /var/www/nextcloud.cufah.cloud/config/config.php
添加邮箱(以 Gmail 为例,也可以在网页上配置)
'mail_smtpmode' => 'smtp',
'mail_smtpsecure' => 'ssl',
'mail_sendmailmode' => 'smtp',
'mail_smtpauthtype' => 'LOGIN',
'mail_smtpauth' => 1,
'mail_from_address' => 'vfly2nextcloud',
'mail_domain' => 'gmail.com',
'mail_smtphost' => 'smtp.gmail.com',
'mail_smtpport' => '465',
'mail_smtpname' => 'example@gmail.com',
'mail_smtppassword' => 'password',
修改默认手机号区域
'default_phone_region' => 'CN',
后台任务
Cron 方式
先确保手动执行有效
sudo -u www-data /usr/bin/php -f /var/www/nextcloud.cufah.cloud/cron.php
为 www-data 添加定时任务
sudo crontab -u www-data -e
粘贴此行(注意修改路径)
*/5 * * * * /usr/bin/php -f /var/www/nextcloud.cufah.cloud/cron.php
检查
sudo crontab -u www-data -l
执行 occ
这里命令的含义是以 www-data 用户身份去执行某个命令,如添加数据库索引 db:add-missing-indices,occ 是个可执行文件,默认在安装目录下 /var/www/nextcloud.cufah.cloud/occ
开启维护模式
sudo -u www-data php /var/www/nextcloud.cufah.cloud/occ maintenance:mode --on
退出维护模式
sudo -u www-data php /var/www/nextcloud.cufah.cloud/occ maintenance:mode --off
更新命令
sudo -u www-data php /var/www/nextcloud.cufah.cloud/occ upgrade
数据库缺失索引
sudo -u www-data php /var/www/nextcloud.cufah.cloud/occ db:add-missing-indices
Mimetype 迁移
sudo -u www-data php /var/www/nextcloud.cufah.cloud/occ maintenance:repair --include-expensive
改变 Nextcloud 的数据目录
参照上文, Nextcloud 安装在 /var/www/nextcloud.cufah.cloud,因此数据目录默认也是它。假设移动到 /mnt/nextcloud-data/,步骤如下:
先开启维护模式
然后移动数据文件到新目录
cd /var/www/nextcloud.cufah.cloud && mv * /mnt/nextcloud-data/
mv .htaccess .ocdata /mnt/nextcloud-data # 确保隐藏文件也被移动
修改配置文件
'datadirectory' => '/mnt/nextcloud-data',
确保新目录的所有者是 www-data
sudo chown www-data:www-data -R /mnt/nextcloud-data
关闭维护模式
更新
在网页开启更新,然后看网页提示,在终端执行 sudo -u www-data php /var/www/nextcloud.cufah.cloud/occ upgrade 命令,虽然在网页也能完成更新,但是在终端执行更快更稳。
备份
开启维护模式
sudo -u www-data php /var/www/nextcloud.cufah.cloud/occ maintenance:mode --on
备份 nextcloud 文件夹
tar -J -cvf nextcloud.tar.xz /var/www/nextcloud.cufah.cloud/ -p
解压的方法
mkdir temporary
tar -J -xf nextcloud.tar.xz -C temporary
导出数据库
mysqldump --single-transaction --default-character-set=utf8 -u nextcloud --password='&4gVUCANTd42wD@WZt' nextcloud_db > nextcloud-dump.sql
退出维护模式
sudo -u www-data php /var/www/nextcloud.cufah.cloud/occ maintenance:mode --off
迁移
迁移前可以在网页上删除回收站的文件和备份,减小体积
先看上面原生部署一节,根据指示操作。
开启维护模式
sudo -u www-data php /var/www/nextcloud.cufah.cloud/occ maintenance:mode --on
关闭 cron 任务
sudo crontab -u www-data -e
迁移 nextcloud 文件
直接迁移原服务器上的
sudo rsync -avuzP -e "ssh -p 40527" -r root@1.2.3.4:/var/www/nextcloud.cufah.cloud /var/www/
设置权限 www-data 为所有者
sudo chown -R www-data:www-data /var/www/nextcloud.cufah.cloud
检查权限
ls -l /var/www/nextcloud.cufah.cloud
迁移数据库
导出数据库
mysqldump -u nextcloud -p nextcloud_db > nextcloud-dump.sql
nextcloud是数据库的用户名nextcloud_db是需要导出的数据库名称nextcloud-dump.sql是文件输出目录的文件
转移
scp -P 40527 root@1.2.3.4:/home/ahfei/nextcloud-dump.sql /home/ahfei/nextcloud-dump.sql
导入数据库
先建一个新数据库。前面有步骤
导入上文导出的文件
mysql -u nextcloud -p nextcloud_db < ./nextcloud-dump.sql
nextcloud:你可以登录数据库的用户名。nextcloud_db:刚刚新建的空数据库,这条命令会把数据导入到这其中。nextcloud-dump.sql:是上文我们从数据库导出的 sql 文件
如果运行成功,命令行不会有任何提示。如果运行失败,命令行会提示失败原因。
要检测是否导入成功,我们可以登录到 MySQL 查看并检查数据库中的数据。
sudo mariadb
使用 USE nextcloud_db; 选择刚刚我们导入数据的新建数据库,然后使用SHOW TABLES; 查看数据库中包含的表,最后用SELECT * FROM oc_users;打开表查看内容。
如果迁移失败,可以考虑删除数据库,重新进行
DROP DATABASE nextcloud_db;
退出维护模式
sudo -u www-data php /var/www/nextcloud.ahfei.blog/occ maintenance:mode --off
遇到的问题
查看日志的方法
Nextcloud 的日志通常保存在 Nextcloud 安装目录中的 data 目录下的 nextcloud.log 文件中
tail -n 10 /var/www/nextcloud.ahfei.blog/data/nextcloud.log
硬盘空间不足,nextcloud 自动进入维护模式。
先清理硬盘,或者增加硬盘空间。找到占用硬盘最大的目录
sudo du -Sh /var/www/nextcloud.ahfei.blog | sort -rh | head -n 10
然后退出维护模式
sudo -u www-data php /var/www/nextcloud.ahfei.blog/occ maintenance:mode --off
禁用插件
# 查找 Nextcloud 中所有已安装的应用或插件
sudo -u www-data php /var/www/nextcloud.ahfei.blog/occ app:list
# 只看已启用的应用
sudo -u www-data php /var/www/nextcloud.ahfei.blog/occ app:list | grep -B1000 "Disabled apps:"
# 禁用应用
sudo -u www-data php /var/www/nextcloud.ahfei.blog/occ app:disable backup
与 Nginx 配合使用
使用 Nginx 反代,使用 Apache2 运行 nextcloud
改虚拟主机那里的端口。
另外还要改 apache2 绑定的端口,比如 443 改成 4443,否则重启时依然会尝试绑定 443 端口,但这个端口要被 Nginx 使用。
sudo vim /etc/apache2/ports.conf
然后访问 https://nextcloud.ahfei.blog:4443 ,应该可以正常使用。之后用 Nginx 反代即可
Nginx 的配置示例
sudo vim /etc/nginx/sites-available/nextcloud.cufah.cloud
server {
listen 443 ssl;
server_name nextcloud.cufah.cloud;
client_max_body_size 200M;
# 指定证书的路径
ssl_certificate /etc/ssl/certs/nextcloud.cufah.cloud.cer;
ssl_certificate_key /etc/ssl/private/nextcloud.cufah.cloud.key;
# 避免阻断 acme 的自动申请
location /.well-known/acme-challenge/ {
root /var/www/html;
}
location / {
proxy_pass https://127.0.0.1:4443;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_buffering off;
}
}
sudo ln -s /etc/nginx/sites-available/nextcloud.cufah.cloud /etc/nginx/sites-enabled/nextcloud.cufah.cloud
检查配置,并重启生效
sudo nginx -t && sudo systemctl reload nginx
类似功能软件
原文链接: https://yanh.tech/2024/07/nextcloud-self-hosted-network-disk-and-cloud-collaboration-platform/
版权声明:本博客所有文章除特別声明外,均为 AhFei 原创,采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 技焉洲 (yanh.tech) 。
保持更新 ٩(•̤̀ᵕ•̤́๑)ᵒᵏᵎᵎᵎᵎ 清晰恒益的实用技能,欢迎使用 RSS 订阅,如果能留言互动就更好了。
可在 Telegram 群组 https://t.me/vfly2 交流依文章步骤遇到的问题。

