内网搭建nextcloud,通过vps的端口转发进行访问
---------使用docker搭建nextcloud---------
使用环境:
- 物理主机:ubuntu
- docker
- 一台能访问的vps
- 如需要使用https,参考这里:https://certbot.eff.org/lets-encrypt/debianbuster-apache
[ 注意:以下所有主机均关闭防火墙操作,如需开启防火墙操作,请先配置防火墙策略 ]
1、docker搜索nextcloud
# docker search nextcloud
2、下载nextcloud
# docker pull nextcloud
3、运行nextcloud,将主机的3380端口映射到docker容器中的80端口。
# docker run -d --name nextcloud --hostname="nextcloud" -p 3380:80 -p 3443:443 nextcloud
[ 温馨提示:可以映射文件夹到物理机,便于操作,参考命令 docker run -d --hostname="nextcloud" --name="nextcloud" -v /home/anonymous/docker/nextcloud/root:/root -v /home/anonymous/docker/nextcloud/data:/var/www/html/data -p 62080:80 -p 62443:443 -p 62036:3306 nextcloud ]
4、在浏览器中打开nextcloud, http://127.0.0.1:3380
[ 我们选择mariadb作为存储的数据库,那么下面就先开始安装并创建该数据库 ]
5、进入docker容器,配置数据库
# docker exec -it nextcloud /bin/bash
//安装mariadb数据库
# apt update
# apt install vim mariadb-server
如果能直接进入数据库,则直接修改密码即可,不需要再进行下列-----------------框住的设置
# /etc/init.d/mysql start //启动数据库
# mysql -u root
MariaDB [(none)]> use mysql;
MariaDB [mysql]> alter user 'root'@'localhost' identified by '123456';
----------------------------------------------------------------------------------------------------------
安装完数据库之后,由于没有密码,登录不进数据库;接下来修改mariadb的root密码
# /etc/init.d/mysql stop //先停止mysql
# mysqld_safe --skip-grant-tables & //注意, & 意思是在背景运行,如果不加& ,那么可以再打开一个终端运行下面的命令
# mysql -u root //不加 -p 可以直接进入到mysql数据库,再使用下面的命令修改密码
// 连接到数据库中,设置数据库用户root的新密码
MariaDB [(none)]> use mysql;
MariaDB [mysql]> update user set password=password("123456") where User='root'; //举例,密码设置为123456
------------------------------------------------------------------------------------------------------------------------------
MariaDB [mysql]> flush privileges;
MariaDB [mysql]> quit;
// 重启后,即可登录数据库:
# /etc/init.d/mysql restart
# mysql -uroot -p
然后输入密码即可进入到数据库中:
// 为nextcloud创建数据库:
MariaDB [(none)]> create database nextcloud_db;
MariaDB [(none)]> grant all on nextcloud_db.* to 'nextcloud'@'%' identified by 'nextcloud'; //授予用户nextcloud在nextcloud_db数据库所有表的所有权限,并设置用户nextcloud密码为"nextcloud",注意:%为任意地方都可以登录,如只需本地登录,则%替换为127.0.0.1
MariaDB [(none)]> flush privileges;
MariaDB [(none)]> quit;
[ 以上创建了数据库名:nextcloud_db 用户:nextcloud 密码:nextcloud ]
6、创建nextcloud帐号,并填写以上所创建的数据库相关的信息。
7、安装nextcloud完成。
注意:默认只允许本机访问nextcloud,即使用 http://127.0.0.1:3380 地址访问,假如主机的ip地址为:192.168.1.2,那么想在外部(如同网段的手机)使用192这个地址是不能访问nextcloud的,需要在docker中的nextcloud进行配置,
在trusted_domians处增加一栏即可:
1 => '192.168.1.2:3380' ,
# vim /var/www/html/config/config.php
在外部(如同一网段中的手机或者其他电脑)使用使用地址 http://192.168.1.2:3380 也可以访问。
接下来,我们使用vps端口转发功能,通过vps的ip及转发的端口访问内网的nextcloud
8、使用ssh反向隧道
在物理主机(不是docker中的nextcloud)中运行命令,前提是物理主机要预先安装有openssh-server。
# ssh -fNR 9988:localhost:3380 root@vps_ip
// 参数说明 -f 为背景运行 N为不打开命令行界面 R为使用反向隧道
// 9988为本地物理机的外网访问端口,用于与vps通信
// localhost:3380 为物理机的3380端口
// 整条命令的意思是:vps通过访问9988端口,由于端口转发,所以9988端口流量转发到3380端口,再由于3380端口被映射到dockder中的80端口。总的来说,通过vps的9988端口可以直接访问到docker中nextcloud的80端口。
9、在vps主机上开启端口转发功能
编辑 /etc/ssh/sshd_config
去掉注释,并把 no 改为 yes,这一步很关键,没有开启端口转发,访问网页会提示拒绝访问。
10、使用vps的ip访问内网的nextcloud http://vps_ip:9988
然后发现并不能打开,因为需要修改trusted_domians,参照第7步,把vps的ip和端口加进去即可。
[ http访问就设置完成了,接下来设置使用https,保证数据安全 ]
11、注册域名,并设置dns记录
首先注册一个域名,然后在域名提供商的网站上面设置DNS记录,如设置A记录即可将域名指向公网ip地址(也就是上面的vps地址)
12、在内网宿主机上设置端口转发
# ssh -p 22 -fNR 443:localhost:3443 root@vps_ip
其中:443为vps上映射的端口,确保在vps上443端口没有被使用。3443为宿主机映射到docker里的nextcloud的443端口。
也就是说访问vps的443端口即可访问到nextcloud的443端口。
至于为什么要用vps的443端口,而不能用其他端口,因为在设置域名dns记录时,直接添加ip地址,没有设置其他端口,默认就是443,访问域名时候直接指向vps的443端口。
13、使用certbot配置https
设置https,无需在vps上做任何设置,vps只做端口转发使用。
在内网主机中的docker里的nextcloud里面安装 certbot
# apt install certbot
然后使用certbot进行设置
# certbot --apache
输入自己的域名地址,回车即可设置成功。
14、在nextcloud上设置trusted_domians以便使用域名访问
将域名写进上面第7步的 trusted_domians,前缀无需写上https
1 => 'domain.com' ,
15、可以成功访问 https://mydomain.com