系統總體設計
系統架構圖
系統架構
網絡規劃
伺服器名 | 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雲盤,這樣就可以很好的将企業統一認證接口內建到雲盤認證中。