作者 by Stuart / 2022-01-07 / 2 评论 / 160 个足迹
VPS,KVM虚拟化,系统为Debian 10
使用Docker快速、模块化部署nextcloud搭建私有云。
更新软件源并安装必要软件
apt-get update
apt-get install ca-certificates curl gnupg lsb-release
添加官方的GPG密钥
curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
添加稳定版软件源
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/debian \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
再次更新软件源并安装Docker CE
apt-get update
apt-get install docker-ce docker-ce-cli containerd.io
创建目录备用,并创建网桥
mkdir /home/apache/site #映射Apache网页根目录与PHP-FPM根目录
mkdir /home/apache/conf #映射配置文件
mkdir /home/apache/a2log #映射日志文件
docker network create nextcloud #创建网桥
这里选用和MySQL几乎完全兼容的MariaDB
拉取MariaDB数据库镜像(默认为最新版镜像)
docker pull mariadb
运行MariaDB容器
docker run --detach --name mariadb-server --env MARIADB_USER=MariaDB用户 --env MARIADB_PASSWORD=MariaDB用户密码 --env MARIADB_ROOT_PASSWORD=数据库Root密码 -p 3306:3306 --network nextcloud --restart=always mariadb:latest
P.S.容器名与MariaDB用户、MariaDB用户密码、数据库Root密码以及端口映射均随意就好,3306是MySQL的默认端口;-p为手动指定端口映射,-P为将容器内部端口映射到主机随机端口;
查看容器以及运行状态
docker ps -a
输出如下
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
容器ID mariadb:latest "docker-entrypoint.s…" 10 minutes ago Up 10 minutes 0.0.0.0:3306->3306/tcp, :::3306->3306/tcp mariadb-server
登录数据库,这里选择直接进入MariaDB的docker内操作,当然也可直接在物理机跑一个mysql-client或者别的啥花活,均可,SQL语句以分号";"结束;
docker exec -it 容器名称mariadb-server或容器ID bash
mariadb -uroot -p
#输入数据库Root密码
select version();#查看版本,结果如下
MariaDB [(none)]> select version();
+-------------------------------------+
| version() |
+-------------------------------------+
| 10.6.5-MariaDB-1:10.6.5+maria~focal |
+-------------------------------------+
1 row in set (0.001 sec)
MariaDB [(none)]>
It works!
创建数据库以及用户并授权
create database nextcloud_DB;
create user "nextcloud"@"%" identified by "NCDB_Password";#创建一个不限制主机的用户nextcloud,密码NCDB_Password
grant all privileges on nextcloud_DB.* to "nextcloud"@"%";#对于上述用户授予nextcloud_DB数据库中所有表的所有权限
flush privileges;#刷新权限
exit;#退出数据库
修改参数
cd /etc/mysql/
SET GLOBAL innodb_read_only_compressed=OFF;
exit#退出容器
docker pull httpd:latest
docker run -p 80:80 -p 443:443 -v /home/apache/site/:/usr/local/apache2/htdocs/ -v /home/apache/a2log/:/usr/local/apache2/logs/ -itd --network nextcloud --name apache-server httpd:latest
docker pull php:8.0.14-fpm-buster
docker run -itd --name php-fpm --network nextcloud -v /home/apache/site/:/var/www/html/ php:8.0.14-fpm-buster
复制出httpd.conf并修改httpd.conf,去掉注释,使apache加载mod,并将修改完成的配置文件以及补充的配置文件复制回docker中
docker cp apache-server:/usr/local/apache2/conf/httpd.conf /home/apache/conf
cd /home/apache/conf
vim httpd.conf
去掉这两行的注释
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so
追加一条加载项到配置文件中
echo "Include conf/extra/fpm-config.conf">>httpd.conf
新建fpm-config.conf
vim /home/apache/conf/fpm-config.conf
fpm-config.conf文件内容如下
<Virtualhost *:80>
DocumentRoot /usr/local/apache2/htdocs/
ProxyPassMatch ^/(.*\.php(/.*)?)$ fcgi://php-fpm容器的IP地址:9000/var/www/html/$1
DirectoryIndex /index.php index.php
</VirtualHost>
其中php-fpm容器的IP地址可以通过docker network inspect nextcloud查看
将修改完成的httpd.conf以及补充的fpm-config.conf复制回容器内
docker cp /home/apache/conf/httpd.conf apache-server:/usr/local/apache2/conf/
docker cp /home/apache/conf/fpm-config.conf apache-server:/usr/local/apache2/conf/extra/
创建index.php,使用phpinfo函数测试php-fpm是否工作正常
cd /home/apache/site
vim index.php
内容如下
<php?
phpinfo();
?>
使用浏览器访问80端口,phpinfo正常工作如图所示
测试完成后删除index.php
使用官方脚本方式直接安装,至于为啥不使用docker.....详见后记
cd /home/apache/site
wget https://download.nextcloud.com/server/installer/setup-nextcloud.php --no-check-certificate
浏览器访问http://ip地址/setup-nextcloud.php
如图所示,开始安装向导;
输入.使用当前目录,或者随意创建个二级目录;
安装完成,开始配置;
配置填写如图所示即可,数据的IP地址可以使用docker network inspect nextcloud来查看;
是否安装推荐的APP,视喜好而定;
完事,它跑起来了.jpg
至于为啥会选择其他组件都使用docker而nextcloud直接使用脚本安装在物理机呢.....因为docker跑nextcloud-fpm会遇到神秘问题,apache截至安装完成都一切正常,但是在安装完成后,本应跳转到推荐的APP时,会直接报错,且没有错误日志。apache php-fpm均工作正常,apache日志显示所有正常收到访问请求并处理,但是访问nextcloud肯定报错Internal Server Error,具体原因未知,回头慢慢摸罢......
为啥不换成Nginx或者all in one的nextcloud-apache镜像?前面和这玩意死磕太久,累了Orz
https://cwiki.apache.org/confluence/display/HTTPD/PHP-FPM
https://docs.docker.com/engine/reference/commandline/docker/
 评论 2 条