Change The World

沉默是一种力量,嘶吼就不是力量了?

0%

基本目标

在主机(Ubuntu)CPU架构为x86_64上编译出可以在CPU架构为armv7l主机(Debian)上运行的Qt

环境基本信息

名称 信息 备注
ubuntu-16-04 Intel® Xeon® Silver 4114 CPU @ 2.20GHz(4 core) / 4G

环境搭建

构建Debian模拟文件系统

参考1

注:构建系统时架构需要设置为armhf

通过以上操作后,假设我们的文件系统路径如下:

1
/demo/workplace/linux-rootfs-armhf

安装依赖库

1
2
3
4
5
$ sudo chroot /demo/workplace/linux-rootfs-armhf
$ sudo apt install libgles2-mesa-dev bison build-essential gperf flex ruby python libasound2-dev \
libbz2-dev libcap-dev libcups2-dev libdrm-dev libegl1-mesa-dev libgcrypt11-dev libnss3-dev \
libpci-dev libpulse-dev libudev-dev libxtst-dev gyp ninja-build libglu1-mesa-dev \
libfontconfig1-dev libx11-xcb-dev libicu-dev libgl1-mesa-dev libglu1-mesa-dev libssl1.0-dev

安装交叉编译器

1
2
$ sudo apt install binutils-arm-linux-gnueabihf \
gcc-arm-linux-gnueabihf cpp-arm-linux-gnueabihf g++-arm-linux-gnueabihf

编译Qt5.8.0

下载Qt5.8.0源码

1
$  wget https://download.qt.io/new_archive/qt/5.8/5.8.0/single/qt-everywhere-opensource-src-5.8.0.tar.xz

解压Qt5.8.0源码包

1
$  tar xvf https://download.qt.io/new_archive/qt/5.8/5.8.0/single/qt-everywhere-opensource-src-5.8.0.tar.xz

修改源码中存在的bug

  1. 缺少头文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$ cd qt-everywhere-opensource-src-5.8.0
$ vim qtserialbus/src/plugins/canbus/socketcan/socketcanbackend.cpp
...

#include <QtCore/qdebug.h>
#include <QtCore/qdatastream.h>
#include <QtCore/qsocketnotifier.h>

#include <linux/can/error.h>
#include <linux/can/raw.h>
#include <errno.h>
#include <unistd.h>
#include <net/if.h>
#include <sys/ioctl.h>
#include <sys/time.h>
#include <linux/sockios.h> // 添加该头文件
...
  1. Fix build when xkbcommon is disabled

添加arm-gnueabihf-g++编译器配置文件

1
2
3
$ cd qt-everywhere-opensource-src-5.8.0
$ cp -a qtbase/mkspecs/linux-arm-gnueabi-g++ qtbase/mkspecs/linux-arm-gnueabihf-g++
$ sed -i 's#linux-arm-gnueabi#linux-arm-gnueabihf#g' qtbase/mkspecs/linux-arm-gnueabihf-g++/qmake.conf

开始编译

1
2
3
4
5
6
7
8
9
10
$ ./configure -release -device linux-arm-generic-g++  -sysroot /demo/workplace/linux-rootfs-armhf -prefix /usr/local/Qt-5.8.0 -xplatform linux-arm-gnueabihf-g++ -opensource -confirm-license -nomake tests

$ make && make instal

# 由于编译时间较长可以将编译放入后台执行
# 比如写一个build.sh 脚本内容如
# #!/bin/bash
# make && make install

$ nohup ./build.sh 2> make-err.log | tee make-out.log &

注:编译时间较长请耐心等待

参考

  1. debootstrap 制作arm64位根文件系统

中秋节近,喜,遂登高望远

本文主要出现的原因其实很简单,就是让目前创建的虚拟机支持UEFI引导。话不多说开始吧😳

环境信息

1
2
3
4
[root@dev ~]# cat /etc/redhat-release
CentOS Linux release 8.1.1911 (Core)
[root@dev ~]# uname -a
Linux dev 2.6.78-147.8.1.el8_1.x86_64 #1 SMP Thu Apr 9 13:49:54 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux

查看当前主机Qemu支持机器类型

可以通过以下两种查询方法,或其他有效的方法

  1. 通过qemu-kvm进行查询

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    [root@dev ~]# /usr/libexec/qemu-kvm -M help
    Supported machines are:
    pc RHEL 7.6.0 PC (i440FX + PIIX, 1996) (alias of pc-i440fx-rhel7.6.0)
    pc-i440fx-rhel7.6.0 RHEL 7.6.0 PC (i440FX + PIIX, 1996) (default)
    pc-i440fx-rhel7.5.0 RHEL 7.5.0 PC (i440FX + PIIX, 1996)
    pc-i440fx-rhel7.4.0 RHEL 7.4.0 PC (i440FX + PIIX, 1996)
    pc-i440fx-rhel7.3.0 RHEL 7.3.0 PC (i440FX + PIIX, 1996)
    pc-i440fx-rhel7.2.0 RHEL 7.2.0 PC (i440FX + PIIX, 1996)
    pc-i440fx-rhel7.1.0 RHEL 7.1.0 PC (i440FX + PIIX, 1996)
    pc-i440fx-rhel7.0.0 RHEL 7.0.0 PC (i440FX + PIIX, 1996)
    q35 RHEL-7.6.0 PC (Q35 + ICH9, 2009) (alias of pc-q35-rhel7.6.0)
    pc-q35-rhel7.6.0 RHEL-7.6.0 PC (Q35 + ICH9, 2009)
    pc-q35-rhel7.5.0 RHEL-7.5.0 PC (Q35 + ICH9, 2009)
    pc-q35-rhel7.4.0 RHEL-7.4.0 PC (Q35 + ICH9, 2009)
    pc-q35-rhel7.3.0 RHEL-7.3.0 PC (Q35 + ICH9, 2009)
    none empty machine
  2. 通过libvirt进行查询

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    [root@dev ~]# virsh capabilities
    <capabilities>
    ...
    <guest>
    ...
    <machine maxCpus='240'>pc-i440fx-rhel7.6.0</machine>
    <machine canonical='pc-i440fx-rhel7.6.0' maxCpus='240'>pc</machine>
    <machine maxCpus='240'>pc-i440fx-rhel7.0.0</machine>
    <machine maxCpus='384'>pc-q35-rhel7.6.0</machine>
    <machine canonical='pc-q35-rhel7.6.0' maxCpus='384'>q35</machine>
    <machine maxCpus='240'>pc-i440fx-rhel7.5.0</machine>
    <machine maxCpus='240'>pc-i440fx-rhel7.1.0</machine>
    <machine maxCpus='240'>pc-i440fx-rhel7.2.0</machine>
    <machine maxCpus='255'>pc-q35-rhel7.3.0</machine>
    <machine maxCpus='384'>pc-q35-rhel7.4.0</machine>
    <machine maxCpus='240'>pc-i440fx-rhel7.3.0</machine>
    <machine maxCpus='240'>pc-i440fx-rhel7.4.0</machine>
    <machine maxCpus='384'>pc-q35-rhel7.5.0</machine>
    ...
    </guest>
    ...
    </capabilities>

通过以上内容可以看出,如果我们只是需要使用最新的机器类型只要选择 pcq35

配置虚拟机使用Q35

1
2
3
4
5
6
[root@dev ~]# virsh edit --domain alpinelinux3.8
...
<os>
<type arch='x86_64' machine='q35'>hvm</type>
</os>
...

将以上内容调整为 machine='q35'即为完成

配置虚拟机支持UEFI

如果需要虚拟机支持 uefi 还需要 edk2-ovmf 软件包的支持

  1. 安装edk2-ovmf软件包
1
2
3
4
5
6
[root@dev ~]# yum search edk2-ovmf
FATAL: kernel too old
上次元数据过期检查:2:35:19 前,执行于 2020年07月28日 星期二 13时01分20秒。
===================================== 名称 精准匹配:edk2-ovmf ===================================================
edk2-ovmf.noarch : UEFI firmware for x86_64 virtual machines
[root@dev ~]# yum install -y edk2-ovmf
  1. 编辑虚拟机配置
1
2
3
4
5
6
7
8
9
10
11
[root@ocloud-dev ~]# virsh edit alpinelinux3.8
<os>
...
<loader readonly='yes' secure='yes' type='pflash'>/usr/share/OVMF/OVMF_CODE.secboot.fd</loader>
...
</os>
<features>
...
<smm state='on'/>
...
</features>

找到以上节点添加对应的内容即可

注意:如果loader节点属性secure='yes’则必须开启smm

参考

  1. A New Chipset For Qemu - Intel’s Q35
  2. Features/Q35
  3. UEFI支持
  4. OVMF

本文主要记录构建pacemaker集群的共享存储的学习过程,如有疑问还请查看官方文档,主要内容就是把集群分配的iscsi存储使用clvm + GFS2进行管理,使得此存储设备成功集群的共享存储

共享存储

准备

  1. 配置集群,请参考 通过PACEMAKER创建高可用集群

  2. ISCSI共享存储

  3. 所有的集群节点接入ISCSI共享存储

安装

  1. 安装lvm2-cluster和gfs2-utils软件包[所有节点]
1
# yum install lvm2-cluster gfs2-utils
  1. 将全局Pacemaker参数no_quorum_policy设置为freeze
1
# pcs property set no-quorum-policy=freeze

注意

默认情况下会将 no-quorum-policy 值设定为 stop,说明丢失一个仲裁,同时将停止剩余分区中的所有资源。通常这个选项是最安全同时也是最佳选项,但与大多数资源不同,GFS2 需要仲裁功能。丢失仲裁后,使用 GFS2 挂载的应用程序及 GFS2 挂载本身都将正常停止。所有在无仲裁的情况下停止执行资源的尝试都将失败,并最终造成每次丢失仲裁时都 fence 整个集群。

为解决这个问题,您可以在使用 GFS2 时设置 no-quorum-policy=freeze。这意味着丢失仲裁时,重新获得仲裁钱剩余分区不会做任何操作。

  1. 设置dlm资源。这是clvmd和GFS2的必需依赖项[单节点]
1
# pcs resource create dlm ocf:pacemaker:controld op monitor interval=30s on-fail=fence clone interleave=true ordered=true
  1. 执行以下命令以启用集群。此命令将/etc/lvm/lvm.conf文件中的locking_type参数设置为3[所有节点]
1
# lvmconf --enable-cluster
  1. 将clvmd设置为集群资源[单节点]
1
# pcs resource create clvmd ocf:heartbeat:clvm op monitor interval=30s on-fail=fence clone interleave=true ordered=true
  1. 设置clvmd和dlm依赖项并启动顺序, clvmd必须在dlm之后启动,并且必须与dlm在同一节点上运行[单节点]
1
2
# pcs constraint order start dlm-clone then clvmd-clone
# pcs constraint colocation add clvmd-clone with dlm-clone
  1. 创建集群逻辑卷[单节点]
1
2
3
# pvcreate /dev/vdb
# vgcreate -Ay -cy cluster_vg /dev/vdb
# lvcreate -L5G -n cluster_lv cluster_vg

注:/dev/vdb iscsi共享存储

  1. 使用GFS2文件系统格式化逻辑卷[单节点]
1
# mkfs.gfs2 -j2 -p lock_dlm -t rhel7-demo:gfs2-demo /dev/cluster_vg/cluster_lv
  1. 配置clusterfs资源[单节点]
1
# pcs resource create clusterfs Filesystem device="/dev/cluster_vg/cluster_lv" directory="/var/mountpoint" fstype="gfs2" options="noatime" op monitor interval=10s on-fail=fence clone interleave=true
  1. 设置GFS2和clvmd依赖关系和启动顺序[单节点]
1
2
# pcs constraint order start clvmd-clone then clusterfs-clone
# pcs constraint colocation add clusterfs-clone with clvmd-clone
  1. 查看资源信息
1
# pcs resource show #查看资源信息
  1. 验证是否按预期安装了GFS2
1
2
# mount |grep /mnt/gfs2-demo
/dev/mapper/cluster_vg-cluster_lv on /mnt/gfs2-demo type gfs2 (rw,noatime,seclabel)
  1. 扩展GFS2文件系统空间
1
2
# lvextend -L +2G /dev/cluster_vg/cluster_lv
# gfs2_grow /var/mountpoint
  1. 添加GFS2日志数量
1
# gfs2_jadd -j 1 /var/mountpoint

注:如果节点需要使用此共享存储,必选保证日志数量大于或者等于集群节点,集群节点数小于或等于GFS2文件系统日志数

  1. 添加挂载点

完成以上操作后,就已经成功构建了集群的共享存储,具体参数含义还望请参考官方文档介绍

参考

CHAPTER 5. CONFIGURING A GFS2 FILE SYSTEM IN A CLUSTER

第 5 章 配置集群资源

集群主要用于在主服务由于异常状况不能继续正常工作,此时会有一个备用的服务器继续提供服务,进而不会导致服务停止,本文主要展示双节点集群的建立,集群效果如下图

cluster

安装前准备

配置hosts[所有节点]

1
2
3
#添加如下内容,确保集群中的主机可以通过主机名相互通信
192.168.0.10 node1
192.168.0.11 node2

注:[所有节点]代表所有节点执行,[单节点]代表集群中一个节点执行即可,下同

安装

安装Red Hat High Availability Add-On软件套件以及隔离代理程序[所有节点]

1
# yum install pcs fence-agents-all

防火墙配置[所有节点]

1
2
# firewall-cmd --permanent --add-service=high-availability
# firewall-cmd --add-service=high-availability

用户配置[所有节点]

1
2
3
4
5
# passwd hacluster
Changing password for user hacluster.
New password:
Retype new password:
passwd: all authentication tokens updated successfully.

注:hacluster用户为自动创建用户,只需修改密码即可,确保所有节点密码一致

启动pcsd[所有节点]

1
2
# systemctl start pcsd.service
# systemctl enable pcsd.service

节点认证[单节点]

1
2
3
4
5
[root@z1 ~]# pcs cluster auth node1 node2
Username: hacluster
Password:
node1: Authorized
node2: Authorized

创建集群

创建[单节点]

1
2
3
4
5
[root@z1 ~]# pcs cluster setup --start --name my_cluster node1 node2
node1: Succeeded
node2: Starting Cluster...
node1: Succeeded
node2: Starting Cluster...

注:–start 启动所有节点的集群服务

设置集群自启动

1
# pcs cluster enable --all

手动启动

1
# pcs cluster start --all

注: --all启动所有的节点,否则启动单节点

查看集群状态

1
[root@node1 ~]# pcs cluster status

隔离代理配置

以下使用iscsi设备充当stonith设备
创建隔离代理

1
# pcs stonith create scsi-shooter fence_scsi devices=/dev/disk/by-id/wwn-0x6001405189b893893594dffb3a2cb3e9 pcmk_monitor_action=metadata pcmk_reboot_action=off pcmk_host_list="node1 node2" meta provides=unfencing

注:scsi-shooter 为资源名称,fence_scsi 为fence设备类型,详情列表: pcs stonith list
provides=unfencing 主要用在基于存储的 FENCE 设备,如果仅仅希望stonith资源是开启的,则可以添加配置项 pcmk_monitor_action=metadata,此操作不会检测stonith设备是否存在直接返回成功。

查看隔离配置

1
2
# pcs stonith show scsi-shooter
scsi-shooter (stonith:fence_scsi): Started node1

参考

HIGH AVAILABILITY 外掛程式管理

环境准备

系统:CentOS 7.6 //目前最新发行版,2018年12月31日

网络:可以连接互联网,用于下载必须的软件包

简介与说明

rpcbind

用于将RPC程序编号映射到IP地址端口号组合, RPC进程在启动时通知rpcbind,注册他们正在侦听的端口以及他们希望服务的RPC程序编号。然后,客户端系统使用特定的RPC程序编号联系服务器上的rpcbind。 rpcbind服务将客户端重定向到正确的端口号,以便它可以与请求的服务进行通信。

NFS

网络文件系统(NFS)允许远程主机通过网络安装文件系统,并与这些文件系统进行交互,就好像它们是本地安装的一样。这使系统管理员能够将资源整合到网络上的集中式服务器上。

NFS版本都依赖于客户端和服务器之间的远程过程调用(RPC)。 一般Linux发行版(Fedora、RHEL、CentOS)RPC服务由rpcbind服务控制。要共享或挂载NFS文件系统,以下服务可以协同工作,具体取决于实现的NFS版本

开始安装

软件安装

1
[ocloud@centos-linux ~]$ yum -y install nfs-utils rpcbind

配置

1
2
[ocloud@centos-linux ~]$ sudo vi /etc/exports
/opt/share/ 192.168.0.0/24(rw,no_root_squash,no_all_squash,sync,anonuid=501,anongid=501) #添加内容

简单说明

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/opt/share/           共享目录

192.168.0.0/24、192.168.0.110、nfs.nfsdemo.org、*.nfsdemo.org 主持网段、IP、域名、通配符域名

sync 文件同时写入硬盘和内存;

async 文件暂存于内存,而不是直接写入内存;

no_root_squash NFS客户端连接服务端时如果使用的是root的话,那么对服务端分享的目录来说,也拥有root权限。显然开启这项是不安全的。

root_squash NFS客户端连接服务端时如果使用的是root的话,那么对服务端分享的目录来说,拥有匿名用户权限,通常他将使用nobody或nfsnobody身份;

all_squash 不论NFS客户端连接服务端时使用什么用户,对服务端分享的目录来说都是拥有匿名用户权限;

anonuid 匿名用户的UID值,可以在此处自行设定

anongid 匿名用户的GID值

配置文件生效

1
2
[ocloud@centos-linux ~]$ sudo mkdir -p  /opt/share/ #文件夹必须要存在
[ocloud@centos-linux ~]$ sudo exportfs -r

开启服务

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# rpcbind
[ocloud@centos-linux ~]$ sudo systemctl start rpcbind
[sudo] ocloud 的密码:
[ocloud@centos-linux ~]$ sudo systemctl status rpcbind
● rpcbind.service - RPC bind service
Loaded: loaded (/usr/lib/systemd/system/rpcbind.service; enabled; vendor preset: enabled)
Active: active (running) since 一 2018-12-31 21:33:15 CST; 7s ago
Process: 5966 ExecStart=/sbin/rpcbind -w $RPCBIND_ARGS (code=exited, status=0/SUCCESS)
Main PID: 5967 (rpcbind)
CGroup: /system.slice/rpcbind.service
└─5967 /sbin/rpcbind -w

12月 31 21:33:15 centos-linux.shared systemd[1]: Starting RPC bind service...
12月 31 21:33:15 centos-linux.shared systemd[1]: Started RPC bind service.

# nfs
[ocloud@centos-linux ~]$ sudo systemctl start nfs
[ocloud@centos-linux ~]$ sudo systemctl status nfs
● nfs-server.service - NFS server and services
Loaded: loaded (/usr/lib/systemd/system/nfs-server.service; disabled; vendor preset: disabled)
Active: active (exited) since 一 2018-12-31 21:41:20 CST; 3s ago
Process: 6128 ExecStopPost=/usr/sbin/exportfs -f (code=exited, status=0/SUCCESS)
Process: 6126 ExecStopPost=/usr/sbin/exportfs -au (code=exited, status=0/SUCCESS)
Process: 6122 ExecStop=/usr/sbin/rpc.nfsd 0 (code=exited, status=0/SUCCESS)
Process: 6167 ExecStartPost=/bin/sh -c if systemctl -q is-active gssproxy; then systemctl restart gssproxy ; fi (code=exited, status=0/SUCCESS)
Process: 6151 ExecStart=/usr/sbin/rpc.nfsd $RPCNFSDARGS (code=exited, status=0/SUCCESS)
Process: 6149 ExecStartPre=/usr/sbin/exportfs -r (code=exited, status=0/SUCCESS)
Main PID: 6151 (code=exited, status=0/SUCCESS)
CGroup: /system.slice/nfs-server.service

12月 31 21:41:20 centos-linux.shared systemd[1]: Starting NFS server and services...
12月 31 21:41:20 centos-linux.shared systemd[1]: Started NFS server and services.

设置开机自启动

1
2
[ocloud@centos-linux ~]$ sudo systemctl enable rpcbind
[ocloud@centos-linux ~]$ sudo systemctl enable nfs

查看已注册的RPC列表

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
[ocloud@centos-linux ~]$ rpcinfo -p
program vers proto port service
100000 4 tcp 111 portmapper
100000 3 tcp 111 portmapper
100000 2 tcp 111 portmapper
100000 4 udp 111 portmapper
100000 3 udp 111 portmapper
100000 2 udp 111 portmapper
100024 1 udp 48527 status
100024 1 tcp 39724 status
100005 1 udp 20048 mountd
100005 1 tcp 20048 mountd
100005 2 udp 20048 mountd
100005 2 tcp 20048 mountd
100005 3 udp 20048 mountd
100005 3 tcp 20048 mountd
100003 3 tcp 2049 nfs
100003 4 tcp 2049 nfs
100227 3 tcp 2049 nfs_acl
100003 3 udp 2049 nfs
100003 4 udp 2049 nfs
100227 3 udp 2049 nfs_acl
100021 1 udp 43200 nlockmgr
100021 3 udp 43200 nlockmgr
100021 4 udp 43200 nlockmgr
100021 1 tcp 46330 nlockmgr
100021 3 tcp 46330 nlockmgr
100021 4 tcp 46330 nlockmgr

可以看到nfs相关rpc服务已注册

防火墙设置

如果需要外部主机进行远程访问,则必须将nfs服务开发的端口添加至防火墙

1
2
3
4
[ocloud@centos-linux ~]$ sudo firewall-cmd --permanent --zone=public --add-service=nfs
[ocloud@centos-linux ~]$ sudo firewall-cmd --permanent --zone=public --add-service=mountd
[ocloud@centos-linux ~]$ sudo firewall-cmd --permanent --zone=public --add-service=rpc-bind
[ocloud@centos-linux ~]$ sudo firewall-cmd --reload

客户端进行挂载

1
2
3
4
5
6
[ocloud@centos-linux ~]$ showmount -e 192.168.0.110            #查看可挂载
Export list for 192.168.0.110 :
/opt/share 192.168.0.0/24
[ocloud@centos-linux ~]$ mount -t nfs 192.168.0.110:/opt/share /mnt -o nolock #不提示即为成功
# nfs默认数据传输使用UDP,可以指定传输协议
mount -t nfs 192.168.0.110:/opt/share /mnt -o proto=tcp -o nolock

永久生效设置

1
2
3
4
5
6
7
8
9
[ocloud@centos-linux ~]$ vi /etc/fstab #添加如下的一行内容
...
192.168.0.110:/opt/share /mnt nfs defaults 0 0
...

#第五列
#当其值设置为1时,将允许dump备份程序备份;设置为0时,忽略备份操作
#第六列
#其值是一个顺序。当其值为0时,永远不检查;而 / 根目录分区永远都为1。其它分区从2开始,数字越小越先检查,如果两个分区的数字相同,则同时检查

参考

Network File System

Chapter 9. Network File System (NFS)

6.2. NFS

祝:所有的有理想、有梦想的程序员们,新的一年bug消消乐,码上生花,也希望社会更加宽容…等等

早日活出真实的自己

环境准备

  • CentOS 环境一个

    1
    2
    [ocloud@centos-linux ~]$ uname -a
    Linux centos-linux.shared 3.10.0-957.1.3.el7.x86_64 #1 SMP Thu Nov 29 14:49:43 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
  • CentOS7 镜像一个

    1
    CentOS-7-x86_64-DVD-1810.iso

开始制作

  1. 安装需要的工具
1
[ocloud@centos-linux ~]$ sudo yum -y install createrepo mkisofs dosfstools syslinux
  1. 挂载CentOS-7-x86_64-DVD-1810.iso 到目录
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[ocloud@centos-linux ~]$ lsblk //查看磁盘设备,选择对应的光驱设备
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 64G 0 disk
├─sda1 8:1 0 500M 0 part /boot
└─sda2 8:2 0 63.5G 0 part
├─VolGroup-lv_root 253:0 0 50G 0 lvm /
├─VolGroup-lv_swap 253:1 0 2G 0 lvm [SWAP]
└─VolGroup-lv_home 253:2 0 11.6G 0 lvm /home
sr0 11:0 1 122.5M 0 rom
sr1 11:1 1 4.3G 0 rom //这个即为挂载的CentOS-7-x86_64-DVD-1810.iso

[ocloud@centos-linux ~]$ mkdir ~/originISO
[ocloud@centos-linux ~]$ sudo mount /dev/sr1 ~/originISO
[sudo] ocloud 的密码:
mount: /dev/sr1 写保护,将以只读方式挂载

#如果不是通过光驱加载,则执行以下操作即可,和上面是同样的效果
[ocloud@centos-linux ~]$ sudo mount ~/CentOS-7-x86_64-DVD-1810.iso ~/originISO
  1. 将镜像内容拷贝到即将制作镜像的文件夹
1
2
3
4
5
6
7
[ocloud@centos-linux ~]$ mkdir ~/customISO
[ocloud@centos-linux ~]$ sudo cp -ar ~/originISO/* customISO/
[ocloud@centos-linux customISO]$ ls
CentOS_BuildTag EFI EULA GPL images isolinux LiveOS Packages repodata RPM-GPG-KEY-CentOS-7 RPM-GPG-KEY-CentOS-Testing-7 TRANS.TBL

#Packages目录是用来放rpm安装包
#isolinux 目录包含了启动相关的配置文件
  1. 准备我们需要的rpm包, 具体操作如下
1
2
3
4
5
6
7
8
9
# rpm安装有许多的依赖问题,但是我们可以通过yum获取到相关的依赖包
[ocloud@centos-linux ~]$ yum -h
...
--downloadonly 仅下载而不更新
--downloaddir=DLDIR 指定一个其他文件夹用于保存软件包
...

#比如下载qemu-kvm相关的包
[ocloud@centos-linux ~]$ sudo yum -y --downloadonly --downloaddir="~/customISO/Packages" qemu-kvm qemu-kvm-tools qemu-img gpxe-roms-qemu qemu-guest-agent #这里直接包相关联的包下载到我们制作镜像的单独放rpm包的文件夹中
  1. 更新软件组的关联信息

    由于我们添加了新的rpm包,因此需要更新软件组的关联信息,每次更新了rpm包就需要更新软件组的信息

1
2
3
4
5
6
[ocloud@centos-linux ~]$ cd ~/customISO
[ocloud@centos-linux customISO]$ mv repodata/*comps.xml repodata/comps.xml #备份软件组的配置文件,其中包含了软件组元数据
[ocloud@centos-linux customISO]$ cd repodata/
[ocloud@centos-linux repodata]$ ls | grep -v comps.xml$|xargs rm #删除其他文件
[ocloud@centos-linux repodata]$ cd ../
[ocloud@centos-linux customISO] createrepo -g repodata/comps.xml /home/ocloud/customISO #重新生成软件组的数据信息
  1. 准备kickstart文件

    推荐用来生成 Kickstart 文件的方法是在系统中首先执行一次手动安装。安装完成后,安装程序中的所有选择都会保存到名为 anaconda-ks.cfg 的文件中,该文件位于所安装系统的 /root/ 目录下。然后可以复制这个文件,根据需要进行修改,并在以后的安装中使用得到的配置文件。 —来自redhat官网内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
# 这个文件是一个示例
install #表示是安装系统
cdrom #安装方式,这里是通过光驱
lang en_US.UTF-8 #设置语言
keyboard us #设置键盘
network --device eth0 --bootproto dhcp #设置网络
rootpw 4a7YAZQ1nvUHI --iscrypted #设置root密码,--iscrypted代表加密 --plaintext代表明文
firewall --service=ssh #指定ssh服务可以通过防火墙
authconfig --enableshadow --passalgo=sha512 --enablefingerprint #系统设置认证选项
selinux --enforcing #开启selinux
timezone --utc Asia/Shanghai #设置时区
bootloader --location=mbr --driveorder=sda --append="crashkernel=auto rhgb quiet" #引导装载程序
zerombr #在使用之前初始化的磁盘的系统中执行自动安装时需要这个命令。
#磁盘分区
clearpart --all --drives=sda
#EFIpart /boot/efi --fstype=efi --grow --maxsize=200 --size=20
part /boot --fstype=ext4 --size=500
part pv.raid01 --grow --size=1
volgroup VolGroup --pesize=4096 pv.raid01
logvol /home --fstype=ext4 --name=lv_home --vgname=VolGroup --grow --size=100
logvol / --fstype=ext4 --name=lv_root --vgname=VolGroup --grow --size=1024 --maxsize=51200
logvol swap --name=lv_swap --vgname=VolGroup --grow --size=1008 --maxsize=2016
text
reboot
#EFIbootloader --location=partition
#OPT-6key --skip
user --name=ocloud --password=4a7YAZQ1nvUHI --iscrypted --groups=wheel #添加用户
xconfig --startxonboot

#安装所需要的软件包,把自定义的安装包添加进去即可在安装系统时自定义的软件
%packages --ignoremissing
@base
@core
@debugging
@basic-desktop
@gnome-desktop
@desktop-debugging
@desktop-platform
@directory-client
@fonts
@general-desktop
@graphical-admin-tools
@graphics
@input-methods
@java-platform
@legacy-x
@network-file-system-client
@performance
@perl-runtime
@print-client
@remote-desktop-clients
@server-platform
@virtualization
@virtualization-client
@virtualization-platform
@x11
authconfig
system-config-firewall-base
mtools
pax
python-dmidecode
oddjob
sgpio
genisoimage
wodim
abrt-gui
certmonger
pam_krb5
krb5-workstation
nscd
pam_ldap
nss-pam-ldapd
libXmu
perl-DBD-SQLite
python
gcc
make
kernel-devel
checkpolicy
selinux-policy-devel
%end

#安装完系统后,需要做什么事情请写在%post里面
%post
# Get interface up
ifdown eth0
ifup eth0
/usr/bin/chfn -f 'demo' demo
umount /dev/sr0
[ -e /tmp/sepolicy-devel.temp ] && rm /tmp/sepolicy-devel.temp
echo "..."
echo "setting network for openvswitch"
scriptsUrl="/etc/sysconfig/network-scripts"
if [ -e $scriptsUrl/ifcfg-eth0 ]
then
# disable NetworkManager
systemctl disable NetworkManager

# copy device eth0 configure to ovs-br0
cp $scriptsUrl/ifcfg-eth0 $scriptsUrl/ifcfg-br0

else
echo "device eth0 configure isn't exist,please check it!"
fi

sleep 2
reboot
%end

将kickstart文件保存为ks.cfg文件到~/customISO

  1. 修改安装启动信息
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
[ocloud@centos-linux customISO]$ vi isolinux/isolinux.cfg # BIOS引导
...
append initrd=initrd.img inst.stage2=hd:LABEL=CentOS\x207\x20x86_64 quiet
...

#将以上多处相同的内容调整为为以下内容,光驱进行安装
...
append initrd=initrd.img inst.ks=cdrom:/ks.cfg quiet
...

#使用硬盘进行安装修改为以下内容
...
append initrd=initrd.img inst.ks=hd:LABEL=CentOS\x207\x20x86_64:/ks.cfg inst.stage2=hd:LABEL=CentOS\x207\x20x86_64:/ks.cfg quiet
...

[ocloud@centos-linux customISO]$ vi EFI/BOOT/grub.cfg # EFI引导
...
linuxefi /images/pxeboot/vmlinuz inst.stage2=hd:LABEL=CentOS\x207\x20x86_64 quiet
...

#将以上多处相同的内容调整为为以下内容,光驱进行安装
...
linuxefi /images/pxeboot/vmlinuz inst.ks=cdrom:/ks.cfg quiet
...
#使用硬盘进行安装修改为以下内容
...
linuxefi /images/pxeboot/vmlinuz inst.ks=hd:LABEL=CentOS\x207\x20x86_64:/ks.cfg inst.stage2=hd:LABEL=CentOS\x207\x20x86_64:/ks.cfg quiet
...

因为ks.cfg中指定安装方式为cdrom, 如果通过硬盘安装则发现不了系统映像,因此添加 inst.stage2 指定要载入的安装程序运行时映像位置, 在这里引导参数 inst.ksinst.stage2都会被读取, 如果只希望写一个inst.ks则只需要将ks.cfg中的cdrom调整为 url --url hd:LABEL=CentOS\x207\x20x86_64 即可

  1. 制作CentOS7镜像文件

本文出现的CentOS\x207\x20x86_64 即为 CentOS 7 x86_64 的URI编码, 可通过mkisofs命令的参数-V指定

1
2
[ocloud@centos-linux customISO] mkisofs -o /tmp/CentOS-7-x86_64-demo.iso -b isolinux/isolinux.bin -c isolinux/boot.cat --no-emul-boot --boot-load-size 4 --boot-info-table -eltorito-alt-boot -e images/efiboot.img -no-emul-boot -T -J -R -V "CentOS 7 x86_64" .
[ocloud@centos-linux customISO] isohybrid /tmp/CentOS-7-x86_64-demo.iso #使用mkisofs或genisoimage生成的ISO 9660镜像,以允许混合启动为CD-ROM或硬盘

USB启动盘制作

将U盘插入系统

格式化U盘分区

1
2
3
4
5
6
7
8
[ocloud@centos-linux ~]$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
...
sdb 8:16 1 14.3G 0 disk
└─sdb4 8:20 1 14.3G 0 part #U盘分区
...
[ocloud@centos-linux ~]$ sudo mkfs.vfat -I /dev/sdb
mkfs.fat 3.0.20 (12 Jun 2013)

写入镜像

1
2
[ocloud@centos-linux ~]$ dd if=/tmp/CentOS-7-x86_64-demo.iso of=/dev/sdb
[ocloud@centos-linux ~]$ exit #退出后拔掉U盘即可

完成以上步骤后,即可生成一个自己定制的CentOS7的系统,更多详情请参考参考链接,如果本文有任何问题请发Email

参考

  1. 第 20 章 引导选项
  2. 第 23 章 KICKSTART 安装

前提说明

Vue CLI 3 创建项目,目录大致如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
...
├── [ 512] public
│ ├── [2.2K] favicon.ico
│ └── [ 812] index.html
├── [ 512] src
│ ├── [ 709] App.vue
│ ├── [ 512] assets
│ ├── [ 512] components
│ ├── [ 277] main.js
│ ├── [1.2K] router.js
│ └── [ 512] views
...

在项目根目录手动创建vue.config.js webpack配置文件,现在目录如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
...
├── [ 512] public
│ ├── [2.2K] favicon.ico
│ └── [ 812] index.html
├── [ 512] src
│ ├── [ 709] App.vue
│ ├── [ 512] assets
│ ├── [ 512] components
│ ├── [ 277] main.js
│ ├── [1.2K] router.js
│ └── [ 512] views
├── [1.6k] vue.config.js
...

vue.config.js内容大致如下:

1
2
3
4
5
6
7
8
9
10
11
module.exports = {
configureWebpack: {
// ...
}
}
// OR
module.exports = {
configureWebpack: config => {
// ...
}
}

具体操作

在文件@/public/index.html[1]中引入百度javascript文件,如下:

1
2
3
4
<head>
<!-- ... -->
<script type="text/javascript" src="https://api.map.baidu.com/api?v=2.0&ak=您的秘钥"></script>
</head>

修改vue.config.js内容,如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
module.exports = {
configureWebpack: {
externals: {
"BMap": "BMap"
}
}
}
// OR
module.exports = {
configureWebpack: config => {
config.externals = {
"BMap": "BMap"
}
}
}

完成以上操作后,就可以在需要的地方引入BMap模块了,示例如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<template>
<div id="map" class="map"></div>
</template>



<script>

import BMap from 'BMap'

export default {
methods: {
initMap(){
// 百度地图API功能
var map = new BMap.Map("map");
let point = new BMap.Point(118.750801, 31.944156);

map.centerAndZoom(point, 15);
map.enableScrollWheelZoom(true);
var marker = new BMap.Marker(point); // 创建标注
map.addOverlay(marker);
}

},
mounted(){
this.initMap();
}
}
</script>

<style lang="scss" scoped>
// ...
</style>

[^1]: @代表项目根目录

参考

Vue CLI 3 webpack 相关

webpack externals


学习笔记,以下代码部分拷贝的维基百科,见链接

时间复杂度

    在计算机科学中,算法的时间复杂度是一个函数,它定性描述该算法的运行时间。 这是一个代表算法输入值的字符串的长度的函数。 时间复杂度常用大O符号表述,不包括这个函数的低阶项和首项系数。 使用这种方式时,时间复杂度可被称为是渐近的,亦即考察输入值大小趋近无穷时的情况。

公式:
$$
\lim_{n\rightarrow+\infty} \frac{T(n)}{f(n)} = C(C为不为零的常数)
$$
C一般是算法中最大的语句频度,是最内层循环语句的执行次数。

基本排序算法

sort

图片from: 数据结构常见的八大排序算法

直接插入排序

    是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上,通常采用in-place排序(即只需用到**O(1)**的额外空间的排序),因而在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//JavaScript
function straightInsertSort(arr){
let len = arr.length;

for(let i = 1; i < len; i++){ //第一个元素无需排序
let j = i - 1,
value = arr[i];

while(j>=0 && arr[j] > value){
arr[j+1] = arr[j];
j--;
}

arr[j+1] = value;
}
}

希尔算法

在插入直接排序的基础上使用分组

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//JavaScript
function shellSort(arr){
let len = arr.length;

for(let step = Math.floor(len / 2); step > 0; step = Math.floor(step / 2)){
for(let i = 1; i < len; i++){
let j = i - step,
value = arr[i];

while(j>=0 && arr[j] > value){
arr[j+step] = arr[j];
j -= step;
}

arr[j+step] = value;
}
}
}

选择排序

    (Selection sort)是一种简单直观的排序算法。它的工作原理如下。首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。

图示:

selectsort

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//script
function selectSort(arr){
if(!Array.isArray(arr)) return;
let len = arr.length;

for(let i = 0;i < len - 1; i++){
let min = i;
for(let j = i + 1; j < len; j++){
if(arr[min] > arr[j])
min = j;
}

let temp = arr[min];
arr[min] = arr[i];
arr[i] = temp;
}
}

堆排序

    堆排序(英语:Heapsort)是指利用这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。

图示:

img

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
function heapSort(arr) {
var arr = arr.slice(0);
function swap(i, j) {
var tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}

function max_heapify(start, end) {
//建立父節點指標和子節點指標
var dad = start;
var son = dad * 2 + 1;
if (son >= end)//若子節點指標超過範圍直接跳出函數
return;
if (son + 1 < end && arr[son] < arr[son + 1])//先比較兩個子節點大小,選擇最大的
son++;
if (arr[dad] <= arr[son]) {//如果父節點小於子節點時,交換父子內容再繼續子節點和孫節點比較
swap(dad, son);
max_heapify(son, end);
}
}

var len = arr.length;
//初始化,i從最後一個父節點開始調整
for (var i = Math.floor(len / 2) - 1; i >= 0; i--)
max_heapify(i, len);
//先將第一個元素和已排好元素前一位做交換,再從新調整,直到排序完畢
for (var i = len - 1; i > 0; i--) {
swap(0, i);
max_heapify(0, i);
}
};

冒泡排序

    冒泡排序(英语:Bubble Sort)是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢「浮」到数列的顶端。

图示:

bubblesort

1
2
3
4
5
6
7
8
9
10
11
12
13
function bubbleSort(arr) {
let i, j, temp,
length = arr.length;
for (i = 0; i < length - 1; i++){
for (j = 0; j < length - 1 - i; j++){
if (arr[j] > arr[j + 1]) {
temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
};

运行源码

参考

  1. 时间复杂度wikiwand
  2. 堆排序
  3. 插入排序
  4. 选择排序
  5. 冒泡排序
  6. 豆丁


    本文主要记录onlyoffice安装的过程,在安装过程中可能不会遇到问题,但是也可能会遇到各种各样的问题,如果有错误,那肯定是你错了,下文中主要是集成安装,服务包含Mysql Server、Mail Server、Community Server以及Document Server,欢迎批评指正

题外话:由于本人机器很菜,Mail Server使用Mysql Server时,没跑起来…

介绍 && FAQ

onlyOffice是什么?

    ONLYOFFICE是一个用于业务协作,文档和项目管理的多功能门户。它允许您组织业务任务和里程碑,存储和共享您的公司或个人文档,使用社交网络工具,如博客和论坛,以及通过公司IM与您的团队成员进行沟通。

onlyOffice适用于谁?

    ONLYOFFICE适用于寻求有效的业务流程管理平台的中小型公司。

在云中托管我的门户网站是否安全?

    您的门户网站由以下Web服务提供支持:Amazon EC2,Amazon S3和Amazon RDS。亚马逊网络服务(AWS)在全球数千名开发人员使用的云中提供可靠的基础架构。此外,您可以随时备份存储在门户网站上的数据。因此,您可以确保您的数据安全且受到保护。

我可以通过手机访问我的门户吗?

    目前正在开发位于.com域区域中的门户的移动应用程序。 .org域区域门户和服务器解决方案的移动版本不可用。 现在可以下载适用于iOS的移动ONLYOFFICE Documents应用程序。它允许您查看和编辑.com门户中存储的文本文档,创建新文档,管理和共享它们。

我们想自己维护ONLYOFFICE。那可能吗?

    是。可以下载和编译源代码。此后,您可以将其部署在您自己的服务器上。源代码在SourceForge上列出,并在GNU Affero通用公共许可条款下分发。有关更多详细信息,请参阅服务器版本常见问题部分。

我无法在门户网站的可用列表中找到我的语言。我该怎么做才能参与翻译?

    目前,门户网站的界面有21种语言版本,它也被翻译成二十多种语言,但如果您的母语尚未列出,您可以为ONLYOFFICE翻译做出贡献。请阅读如何成为ONLYOFFICE翻译?

    发送您的请求并访问我们的ONLYOFFICE在线翻译系统的指南。 您也可以直接发送电子邮件至documentation@onlyoffice.com

我有一个问题,这里没有涉及。我该怎么联系你?

    我们不断改进ONLYOFFICE,为您的业务需求提供高效的解决方案。因此,欢迎您提供反馈和建议。请发送电子邮件至support@onlyoffice.com告诉我们ONLYOFFICE如何为您服务。

注:以上为译文,详情请参考FAQ

安装onlyOffice in Docker

创建onlyoffice网络

1
sudo docker network create --driver bridge onlyoffice

安装MySQL数据库

创建外部挂目录[可选]

1
2
3
sudo mkdir -p "/app/onlyoffice/mysql/conf.d";
sudo mkdir -p "/app/onlyoffice/mysql/data";
sudo mkdir -p "/app/onlyoffice/mysql/initdb";

创建MySQL服务器Docker容器。创建配置文件

1
2
3
4
5
6
echo "[mysqld]
sql_mode = 'NO_ENGINE_SUBSTITUTION'
max_connections = 1000
max_allowed_packet = 1048576000
group_concat_max_len = 2048
log-error = /var/log/mysql/error.log" > /app/onlyoffice/mysql/conf.d/onlyoffice.cnf

创建SQL脚本用于生成用户以及赋予对应的权限。 ONLYOFFICE社区服务器需要onlyoffice_user,ONLYOFFICE邮件服务器需要mail_admin

1
2
3
4
5
6
echo "CREATE USER 'onlyoffice_user'@'localhost' IDENTIFIED BY 'onlyoffice_pass';
CREATE USER 'mail_admin'@'localhost' IDENTIFIED BY 'Isadmin123';
GRANT ALL PRIVILEGES ON * . * TO 'root'@'%' IDENTIFIED BY 'my-secret-pw';
GRANT ALL PRIVILEGES ON * . * TO 'onlyoffice_user'@'%' IDENTIFIED BY 'onlyoffice_pass';
GRANT ALL PRIVILEGES ON * . * TO 'mail_admin'@'%' IDENTIFIED BY 'Isadmin123';
FLUSH PRIVILEGES;" > /app/onlyoffice/mysql/initdb/setup.sql

注:为了方面安装,直接使用了默认密码,以上密码是可修改的,以及指定可访问数据库的主机

创建MySQL容器设置MySQL版本到5.7

1
2
3
4
5
6
7
sudo docker run --net onlyoffice -i -t -d --restart=always --name onlyoffice-mysql-server \
-v /app/onlyoffice/mysql/conf.d:/etc/mysql/conf.d \
-v /app/onlyoffice/mysql/data:/var/lib/mysql \
-v /app/onlyoffice/mysql/initdb:/docker-entrypoint-initdb.d \
-e MYSQL_ROOT_PASSWORD=my-secret-pw \
-e MYSQL_DATABASE=onlyoffice \
mysql:5.7

-v: 挂载本地目录

-e: 设置环境变量

可挂载目录[volumes]:

1
2
3
4
environment:
- ./config/mysql/conf.d:/etc/mysql/conf.d
- ./config/mysql/docker-entrypoint-initdb.d:/docker-entrypoint-initdb.d
- mysql_data:/var/lib/mysql

安装Document Server

创建外部挂目录[可选]

1
2
3
4
sudo mkdir -p "/app/onlyoffice/DocumentServer/logs";
sudo mkdir -p "/app/onlyoffice/DocumentServer/data";
sudo mkdir -p "/app/onlyoffice/DocumentServer/lib";
sudo mkdir -p "/app/onlyoffice/DocumentServer/db";

安装

1
2
3
4
5
6
sudo docker run --net onlyoffice -i -t -d --restart=always --name onlyoffice-document-server \
-v /app/onlyoffice/DocumentServer/logs:/var/log/onlyoffice \
-v /app/onlyoffice/DocumentServer/data:/var/www/onlyoffice/Data \
-v /app/onlyoffice/DocumentServer/lib:/var/lib/onlyoffice \
-v /app/onlyoffice/DocumentServer/db:/var/lib/postgresql \
onlyoffice/documentserver

可挂载目录:

1
2
3
4
5
volumes:
- document_data:/var/www/onlyoffice/Data
- document_log:/var/log/onlyoffice
- ./document_fonts:/usr/share/fonts/truetype/custom
- document_forgotten:/var/lib/onlyoffice/documentserver/App_Data/cache/files/forgotten

安装Mail Server

创建外部挂目录[可选]

1
2
3
sudo mkdir -p "/app/onlyoffice/MailServer/data";
sudo mkdir -p "/app/onlyoffice/MailServer/data/certs";
sudo mkdir -p "/app/onlyoffice/MailServer/logs";

安装

1
2
3
4
5
6
sudo docker run --init --net onlyoffice --privileged -i -t -d --restart=always --name onlyoffice-mail-server -p 25:25 -p 143:143 -p 587:587 \
-v /app/onlyoffice/MailServer/data:/var/vmail \
-v /app/onlyoffice/MailServer/data/certs:/etc/pki/tls/mailserver \
-v /app/onlyoffice/MailServer/logs:/var/log \
-h yourdomain.com \
onlyoffice/mailserver

指定数据库, 添加如下参数:

1
2
3
4
5
-e MYSQL_SERVER=onlyoffice-mysql-server \
-e MYSQL_SERVER_PORT=3306 \
-e MYSQL_ROOT_USER=root \
-e MYSQL_ROOT_PASSWD=my-secret-pw \
-e MYSQL_SERVER_DB_NAME=onlyoffice_mailserver \

注:yourdomain.com 更换您的Mail Server的域名

可选参数:

1
2
3
4
5
6
environment:
- MYSQL_SERVER=onlyoffice-mysql-server
- MYSQL_SERVER_PORT=3306
- MYSQL_ROOT_USER=onlyoffice_mailserver_user
- MYSQL_ROOT_PASSWD=onlyoffice_mailserver_user_pass
- MYSQL_SERVER_DB_NAME=onlyoffice_mailserver

安装Community Server

创建外部挂目录[可选]

1
2
3
sudo mkdir -p "/app/onlyoffice/CommunityServer/data";
sudo mkdir -p "/app/onlyoffice/CommunityServer/mysql";
sudo mkdir -p "/app/onlyoffice/CommunityServer/logs";

安装

1
2
3
4
5
6
7
8
9
10
11
12
sudo docker run --net onlyoffice -i -t -d --restart=always --name onlyoffice-community-server -p 80:80 -p 443:443 -p 5222:5222 \
-e MYSQL_SERVER_ROOT_PASSWORD=my-secret-pw \
-e MYSQL_SERVER_DB_NAME=onlyoffice \
-e MYSQL_SERVER_HOST=onlyoffice-mysql-server \
-e MYSQL_SERVER_USER=onlyoffice_user \
-e MYSQL_SERVER_PASS=onlyoffice_pass \
-e DOCUMENT_SERVER_PORT_80_TCP_ADDR=onlyoffice-document-server \
-e MAIL_SERVER_DB_HOST=onlyoffice-mail-server \
-v /app/onlyoffice/CommunityServer/data:/var/www/onlyoffice/Data \
-v /app/onlyoffice/CommunityServer/logs:/var/log/onlyoffice \
-v /app/onlyoffice/CommunityServer/mysql:/var/lib/mysql \
onlyoffice/communityserver

-p: 指定端口映射

上面使用的时默认的邮箱安装,否则需指定邮箱服务器的数据库:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
sudo docker run --net onlyoffice -i -t -d --restart=always --name onlyoffice-community-server -p 80:80 -p 443:443 -p 5222:5222 \
-e MYSQL_SERVER_ROOT_PASSWORD=my-secret-pw \
-e MYSQL_SERVER_DB_NAME=onlyoffice \
-e MYSQL_SERVER_HOST=onlyoffice-mysql-server \
-e MYSQL_SERVER_USER=onlyoffice_user \
-e MYSQL_SERVER_PASS=onlyoffice_pass \

-e DOCUMENT_SERVER_PORT_80_TCP_ADDR=onlyoffice-document-server \

-e MAIL_SERVER_API_HOST=${MAIL_SERVER_IP} \
-e MAIL_SERVER_DB_HOST=onlyoffice-mysql-server \
-e MAIL_SERVER_DB_NAME=onlyoffice_mailserver \
-e MAIL_SERVER_DB_PORT=3306 \
-e MAIL_SERVER_DB_USER=root \
-e MAIL_SERVER_DB_PASS=my-secret-pw \

-v /app/onlyoffice/CommunityServer/data:/var/www/onlyoffice/Data \
-v /app/onlyoffice/CommunityServer/logs:/var/log/onlyoffice \
onlyoffice/communityserver

可选参数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
environment:
- DOCUMENT_SERVER_PORT_80_TCP_ADDR=onlyoffice-document-server
- MYSQL_SERVER_ROOT_PASSWORD=my-secret-pw
- MYSQL_SERVER_DB_NAME=onlyoffice
- MYSQL_SERVER_HOST=onlyoffice-mysql-server
- MYSQL_SERVER_USER=onlyoffice_user
- MYSQL_SERVER_PASS=onlyoffice_pass
- MAIL_SERVER_API_PORT=8081
- MAIL_SERVER_API_HOST=onlyoffice-mail-server
- MAIL_SERVER_DB_HOST=onlyoffice-mysql-server
- MAIL_SERVER_DB_PORT=3306
- MAIL_SERVER_DB_NAME=onlyoffice_mailserver
- MAIL_SERVER_DB_USER=onlyoffice_mailserver_user
- MAIL_SERVER_DB_PASS=onlyoffice_mailserver_user_pass

依赖服务:

1
2
3
4
depends_on:
- onlyoffice-mysql-server
- onlyoffice-document-server
- onlyoffice-mail-server

挂载目录:

1
2
3
4
5
volumes:
- community_data:/var/www/onlyoffice/Data
- community_log:/var/log/onlyoffice
- document_data:/var/www/onlyoffice/DocumentServerData
- ./certs:/var/www/onlyoffice/Data/certs

通过下面的命令获取对应服务器的ip地址,如:获取Mail Serverip地址

1
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' onlyoffice-mail-server

以上步骤正确完成之后,就可以开始您的onlyOffice之旅了, 点击开始

注: 如果不指定数据库则使用自身的数据库

备份

请阅读 Data backup,付费用户享有的权利🙃, 当然也可以手动备份

参考

Docker-CommunityServer

Installing all three servers (Community Server, Document Server, Mail Server) integrated

General Questions FAQ

如何在Ubuntu 14.04上安裝ONLYOFFICE組織您的團隊合作

docker-compose.yml

abort connection

Mysql bug #76661

Mysql #81899