系统总体设计
系统架构图
系统架构
网络规划
服务器名 | IP地址 | 服务端口 | 端口用途 | 系统用途 |
HaproxySrv | 192.168.1.222(服务地址) 200.192.168.222 (内部地址) | 19000 | minio服务端口 | 负载均衡服务器,对外提供服务地址 |
19001 | minio控制台端口 | |||
80 | 云盘对外服务端口 | |||
6443 | Onlyoffice服务端口 | |||
NextCloudAP | 200.192.168.99(内部地址) | 9980 | NextCloud服务端口 | NextCloud应用服务器 |
6443 | Onlyoffice服务端口 | |||
NextCloudDB | 200.192.168.100 | 12306 | Mysql服务端口 | 数据库服务器 |
16379 | Redis服务端口 | |||
Minio节点: Node1~node6 | 200.192.168.1 200.192.168.2 200.192.168.3 200.192.168.4 200.192.168.5 200.192.168.6 | 19000 | Minio api服务端口 | Minio分布式存储节点服务器 |
19001 | Minio控制台端口 |
系统实施工艺
基础操作系统安装
安装国产银河麒麟操作系统,根据需要创建响应的应用用户。配置yum源:
将dvd挂载到操作系统/mnt/dvd
mount /dev/sr0 /mnt/dvd
mv /etc/yum.repos.d/kylin_x86_64.repo /etc/yum.repos.d/kylin_x86_64.repo.bak
vi /etc/yum.respos.d/dvd.repo输入以下内容
[dvd]
name=dvd
baseurl=file:///mnt/dvd
enable=1
gpgcheck=0
保存退出
执行yum makecache更新yum缓存
Minio分布式存储节点安装
用虚拟机克隆6台麒麟系统服务器,或者安装6台物理服务器。
创建minio用户
useradd minio
配置环境变量
vi .bash_profile
export MINIO_ROOT_USER=minio_admin
export MINIO_ROOT_PASSWORD=minio_password
export MINIO_API_STALE_UPLOADS_EXPIRY=1
挂载数据盘
不管是使用lvm创建一个较大的逻辑卷或者直接将raid盘中的一个较大的分区,挂载到指定的文件系统,编辑/etc/fstab,添加内容如下:
/dev/vg01/lvdata /home/data xfs defaults 0 0
保存退出后
mount /home/data
创建并启动minio分布式存储服务
6台minio节点服务器完成了创建用户和数据盘挂载后,使用minio用户登陆,编辑启动脚本
vi start.sh
minio server \
http://200.192.168.1:19000/home/data \
http://200.192.168.2:19000/home/data \
http://200.192.168.3:19000/home/data \
http://200.192.168.4:19000/home/data \
http://200.192.168.5:19000/home/data \
http://200.192.168.6:19000/home/data \
--console-address ":19001" \
--address ":19000"
vi stop.sh
ps -ef|grep minio|grep -v grep|awk '{print $2}'|xargs kill -9
执行sh start.sh启动每一台的minio服务,minio启动成功
创建minio的bucket,相应的策略和用户
登陆minio控制台,随便连接任意Minio节点可登陆Minio控制台,等到负载均衡服务器安装完成后,就可以通过负载服务器连接。
输入之前在环境变量中配置的minio_admin和minio_password,即可登陆到Minio控制台。
用图形界面创建bucket
点击Buckets——>Create Bucket ——>输入BucketName:nextcloud——>设置Quota限额为1T——>最后点击Create Bucket
创建成功一个bucket为nextcloud
创建策略Policy——>Policy Name:nextcloud——>Raw Policy中输入策略内容:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:*"
],
"Resource": [
"arn:aws:s3:::nextcloud/*"
]
}
]
}
创建用户nextcloud并关联nextcloud策略
使用nextcloud的用户密码登陆minio控制台,可以看到它具有在nextcloud上的增删改权限。
数据库配置
mysql的数据库安装不再赘述,网上自己查工艺。
创建nextcloud用户和数据库。
create database nextcloud;
use nextcloud;
grant all privileges on nextcloud.* to nextcloud identified by 'xxxxx';
记录nextcloud用户密码,等会儿配置nextcloud有用。
启动redis服务
创建redis文件系统/home/db/redis
将redis-5.0.9.tar.gz解压到/home/db/redis目录下
修改/home/db/redis/redis-5.0.9/etc/redis.conf
将requirepass “XXXX”修改成复杂密码,记录下来。
编辑启动脚本start.sh如下:
cd /home/db/redis/redis-5.0.9
check_exist()
{
res=`ps -ef|grep "./bin/redis-server"|grep -v grep`
if [ "$res" != "" ]
then
echo "redis is running : $res"
exit
fi
}
check_exist
nohup ./bin/redis-server ./etc/redis.conf --protected-mode no > r.log &
安装Haproxy负载均衡服务器
在haproxysrv服务器上,创建haproxy用户,并分配文件系统到/home/ap/haproxy
mkdir /home/ap/haproxy/haproxy
使用haproxy用户登陆,将haproxy程序文件复制到/home/ap/haproxy/haproxy下
包含执行程序haproxy和配置文件haproxy.conf
编辑配置haproxy.conf文件:
global
#log 127.0.0.1 local0 err
log 127.0.0.1:514 local0 info
ulimit-n 65536
maxconn 32000
daemon
nbproc 2
cpu-map 1 0
cpu-map 2 1
pidfile /home/ap/haproxy/haproxy/haproxy.pid
quiet
#
defaults
log global
mode http
option httplog
option dontlognull
option redispatch
option abortonclose
option nolinger
retries 3
timeout connect 5000
timeout client 300s
timeout server 300s
timeout check 6000
balance leastconn
#balance source
#
listen AdminListener01
bind 192.168.1.222:19999
stats uri /stats
stats refresh 30s
stats realm message\ Haproxy
stats auth admin:xxxxxx
stats hide-version
#
backend Backend19000
#option httpchk GET /ecpweb/Index1.jsp status
http-check expect status 200
server node1 200.192.168.1:19000 check port 19000 inter 2000 rise 2 fall 2
server node2 200.192.168.2:19000 check port 19000 inter 2000 rise 2 fall 2
server node3 200.192.168.3:19000 check port 19000 inter 2000 rise 2 fall 2
server node4 200.192.168.4:19000 check port 19000 inter 2000 rise 2 fall 2
server node5 200.192.168.5:19000 check port 19000 inter 2000 rise 2 fall 2
server node6 200.192.168.6:19000 check port 19000 inter 2000 rise 2 fall 2
frontend Proxy19001
bind 200.192.168.222:19001
#option forwardfor
default_backend Backend19001
#
backend Backend19001
http-check expect status 200
server node1 200.192.168.1:19001 check port 19001 inter 2000 rise 2 fall 2
server node2 200.192.168.2:19001 check port 19001 inter 2000 rise 2 fall 2
server node3 200.192.168.3:19001 check port 19001 inter 2000 rise 2 fall 2
server node4 200.192.168.4:19001 check port 19001 inter 2000 rise 2 fall 2
server node5 200.192.168.5:19001 check port 19001 inter 2000 rise 2 fall 2
server node6 200.192.168.6:19001 check port 19001 inter 2000 rise 2 fall 2
#
frontend Proxy80
bind 128.1.100.222:80
#option forwardfor
default_backend Backend9980
#
backend Backend9980
http-check expect status 200
server nextcloud 200.192.168.99:9980 check port 9980 inter 2000 rise 2 fall 2
#start frontend Proxy6443
frontend Proxy6443
bind 0.0.0.0:6443
mode tcp
option tcplog
default_backend Backend6443
#
##Backend6443
backend Backend6443
mode tcp
server nextcloud 200.192.168.99:6443 maxconn 204800 check port 6443 inter 2000 rise 2 fall 2
#end frontend Proxy6443
保存退出。
以上配置主要是把minio的api端口19000,控制台端口19001,nextcloud应用服务器9980端口,onlyoffice的6443端口映射出来。
安装nextcloud应用服务器
在nextcloudap应用服务器200.192.168.99执行以下操作
安装docker服务
从docker官网上下载docker-20.10.23.tgz,解压后将里面的文件复制到/usr/bin目录下
containerd
containerd-shim
containerd-shim-runc-v2
ctr
docker
dockerd
docker-init
docker-proxy
runc
然后vi /usr/lib/systemd/system/docker.service贴入以下内容:
[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network-online.target firewalld.service
Wants=network-online.target
[Service]
Type=notify
ExecStart=/usr/bin/dockerd
ExecReload=/bin/kill -s HUP $MAINPID
LimitNOFILE=infinity
LimitNPROC=infinity
TimeoutStartSec=0
Delegate=yes
KillMode=process
Restart=on-failure
StartLimitBurst=3
StartLimitInterval=60s
[Install]
WantedBy=multi-user.target
保存退出后
systemctl enable docker
systemctl start docker
将docker服务启动起来
导入docker镜像
从外网下载nextcloud和onlyoffice镜像,然后用docker image save >nextcloud.tar保存,然后传到企业内网。
使用docker image load<nextcloud.tar
docker image load<onlyoffice.tar导入
然后用docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]为导入的镜像打标签,结果如下:
REPOSITORY TAG IMAGE ID CREATED SIZE
nextcloud latest 1ab67f263045 2 months ago 1e+03MB
onlyoffice latest 0da47c251add 2 months ago 2.84GB
onlyoffice/documentserver latest 0da47c251add 2 months ago 2.84GB
将minio共享存储挂载成s3fs文件系统
首先安装s3fs程序,官网下载s3fs-fuse-1.91.tar.gz,解压编译安装
./autogen.sh
./configure
make&&make install
安装后就可以使用s3fs程序进行minio挂载
将minio的用户nextcloud密码保存在/etc/passwod-s3fs文件
编写挂载程序mnt.sh
s3fs -o passwd_file=/etc/passwd-s3fs -o use_path_request_style -o url=http://200.192.168.222:19000 -o bucket=nextcloud /s3fs -o use_xattr -o allow_other
创建ap文件系统
lvcreate -L 10G -n lvap vg00
mkfs.xfs /dev/vg00/lvap
vi /etc/fstab追加如下内容:
/dev/vg00/lvap /home/ap xfs defaults 0 0
保存退出后
mount /home/ap
然后
mkdir /home/ap/nextcloud /home/ap/onlyoffice
创建nextcloud容器应用
docker run -d \
--name ncloud \
-v /home/ap/nextcloud:/var/www/html \
-v /s3fs/data:/var/www/html/data \
-v /etc/localtime:/etc/localtime \
-e REDIS_HOST=200.192.168.100 \
-e REDIS_HOST_PASSWORD=xxxxx \
-p 9980:80 \
nextcloud
配置nextcloud
https://200.192.168.99:9080
按照提示设置管理员用户,密码,配置mysql数据库的用户密码,使用我们刚才配置的mysql数据库nextcloud,用户nextcloud,密码xxxxx,数据库连接200.192.168.100:12306
这里不赘述
点击install后过段时间,nextcloud就可以进入用户管理界面了
安装onlyoffice
创建onlyoffice容器
docker run -i -t -d --privileged -p 6680:80 -p 6443:443 --restart=unless-stopped \
-v /home/ap/onlyoffice/logs:/var/log/onlyoffice \
-v /home/ap/onlyoffice/data:/var/www/onlyoffice/Data \
-v /home/ap/onlyoffice/db:/var/lib/postgresql \
-v /etc/localtime:/etc/localtime \
--name myoffice \
onlyoffice/documentserver
创建onlyoffice私有证书
mkdir /home/ap/onlyoffice/data/certs
cd /home/ap/onlyoffice/data/certs
openssl genrsa -out tls.key 2048
openssl req -new -key tls.key -out tls.csr
openssl x509 -req -days 365 -in tls.csr -signkey tls.key -out tls.crt
openssl dhparam -out dhparam.pem 2048
chmod 400 tls.key
docker restart myoffice
然后用浏览器访问https://192.168.1.222:6443可以看到onlyoffice访问成功界面
在nextcloud配置onlyoffice
从nextcloud应用商店下载onlyoffice.tar.gz,解压到/home/ap/nextcloud/apps
cd /home/ap/nextcloud/apps
tar zxvf onlyoffice.tar.gz
然后用admin登陆nextcloud,点击应用
在已禁用的应用中找到onlyoffice,点击启用,可以在已启用的栏目中找到:
然后点击管理设置,onlyoffice进入onlyoffice的设置
然后填入相应的地址:
密钥地址的获得,执行如下命令:
docker exec 4b7b22f7ce0d /var/www/onlyoffice/documentserver/npm/json -f /etc/onlyoffice/documentserver/local.json 'services.CoAuthoring.secret.session.string'
点击保存后提示设置已保存
然后随便在nextcloud上新建excel,word文档,验证onlyoffice安装成功.
配置nextcloud外部权限认证
安装python3.10.6,并创建虚拟环境
从官网下载Python-3.10.6.tgz,编译安装成功。
cd /home/ap
python3 -m venv ven
source /home/ap/ven/bin/activate
然后安装Flask和Flask_BasicAuth,从官网上下载安装包,自行编译安装
创建简单的Flask_BasicAuth认证站点:
mkdir -p /home/ap/flaskbasicauth
cd /home/ap/flaskbasicauth
vi index.py
# -*- coding: utf-8 -*-
from flask import Flask
from flask_basicauth import BasicAuth
app = Flask(__name__)
# app.config['BASIC_AUTH_FORCE'] = True # 整个站点都验证
class MyBasicAuth(BasicAuth):
def check_credentials(self,username,password):
if username=='kkk' and password=='1234567': #这里就可以扩展进行其他方式的认证
return True
else:
return False
basic_auth = MyBasicAuth(app)
@app.route('/')
@basic_auth.required
def index():
return "Success!"
if __name__ == '__main__':
app.run("200.192.168.222",port=5000)
保存后退出
编写启动脚本start.sh
source /home/ap/ven/bin/activate
python /home/ap/flaskbasicauth/index.py
保存后退出
nohup sh start.sh&
启动flask应用,tail -f nohup.out查看无报错,观察连接状态。
NextCloud安装user_external插件
从nextcloud官网应用商店下载user_external-v3.1.0.tar.gz
解压到目录/home/ap/nextcloud/custom_apps
cd /home/ap/nextcloud/custom_apps
tar zxvf user_external-v3.1.0.tar.gz
可以在nextcloud的应用管理上看到已禁用的插件External user authentication,可以启用它
然后再config.php配置文件追加external user的配置参数:
vi /home/ap/nextcloud/config/config.php
在下面这个参数后面
array (
0 => 'user_external',
),
追加如下参数
'user_backends'=>array(
array(
'class'=>'\OCA\UserExternal\BasicAuth',
'arguments'=>array('http://200.192.168.222:5000'), #flask basic auth安装的地址
),
),
然后重启nextcloud容器让配置生效。
docker restart nextcloud
使用kkk用户成功登陆nextcloud
管理员可以看到kkk用户登陆成功。
从flask的日志也可以看到如下记录:
200.192.168.99 - - [29/May/2023 11:37:19] "GET / HTTP/1.1" 200 -
可见通过外部认证也可以成功登陆nextcloud云盘,这样就可以很好的将企业统一认证接口集成到云盘认证中。