Feature/rpm support (#192)
* Create specfiles and systemd scripts * Add fix * Add systemd packaging * add fix * Add fix * Add configuracion and fixes * Update app-conf.sh and change cfg dir * Add ability to start nodejs * Update config * Change owner of folders * Delete temporary files * Fix chmod config * Fix configure docs * Сode optimization * Add configuration elasticsearch * Rename directory * Fix work with the name of branches that include '/' * Fix work with the name of branches that include '/' * Revert "Fix work with the name of branches that include '/'" This reverts commit c0970cd84657dac503843720b0cdbce0130a329c. * Revert "Fix work with the name of branches that include '/'" This reverts commit 6ea3718df8950dd6ec87642195822a6ee433c40e. * Add fix * Add fix * Add ability to change the release and version * Fix docs configuration * Add kafka configuration * Add environment variables * Add fix * Add old rpms removal and buildroot removal * Add OneClickInstall * Correct the typo * Move systemd from rpm to common * Add a user-defined configuration option .json * Add minor fix * Add a machinekey generation * Add a typo fix * Change nodejs version * Change the location of some folders * Fix minor bugs * Fix minor bugs * Rename service directories * Fix kafka privileges Co-authored-by: Alexey Golubev <alexey.golubev@onlyoffice.com>
This commit is contained in:
parent
91105e8cd0
commit
c1fa203780
84
build/install/OneClickInstall/install-RedHat.sh
Normal file
84
build/install/OneClickInstall/install-RedHat.sh
Normal file
@ -0,0 +1,84 @@
|
||||
#!/bin/bash
|
||||
|
||||
set -e
|
||||
|
||||
package_manager="yum"
|
||||
package_sysname="onlyoffice";
|
||||
|
||||
package_services="";
|
||||
RES_APP_INSTALLED="is already installed";
|
||||
RES_APP_CHECK_PORTS="uses ports"
|
||||
RES_CHECK_PORTS="please, make sure that the ports are free.";
|
||||
RES_INSTALL_SUCCESS="Thank you for installing ONLYOFFICE Appserver.";
|
||||
RES_QUESTIONS="In case you have any questions contact us via http://support.onlyoffice.com or visit our forum at http://dev.onlyoffice.org"
|
||||
|
||||
while [ "$1" != "" ]; do
|
||||
case $1 in
|
||||
|
||||
-u | --update )
|
||||
if [ "$2" != "" ]; then
|
||||
UPDATE=$2
|
||||
shift
|
||||
fi
|
||||
;;
|
||||
|
||||
-ls | --local_scripts )
|
||||
if [ "$2" != "" ]; then
|
||||
LOCAL_SCRIPTS=$2
|
||||
shift
|
||||
fi
|
||||
;;
|
||||
|
||||
-? | -h | --help )
|
||||
echo " Usage $0 [PARAMETER] [[PARAMETER], ...]"
|
||||
echo " Parameters:"
|
||||
echo " -u, --update use to update existing components (true|false)"
|
||||
echo " -ls, --local_scripts use 'true' to run local scripts (true|false)"
|
||||
echo " -?, -h, --help this help"
|
||||
echo
|
||||
exit 0
|
||||
;;
|
||||
|
||||
esac
|
||||
shift
|
||||
done
|
||||
|
||||
if [ -z "${UPDATE}" ]; then
|
||||
UPDATE="false";
|
||||
fi
|
||||
|
||||
if [ -z "${LOCAL_SCRIPTS}" ]; then
|
||||
LOCAL_SCRIPTS="true";
|
||||
fi
|
||||
|
||||
cat > /etc/yum.repos.d/onlyoffice.repo <<END
|
||||
[onlyoffice]
|
||||
name=onlyoffice repo
|
||||
baseurl=http://download.onlyoffice.com/repo/centos/main/noarch/
|
||||
gpgcheck=1
|
||||
enabled=1
|
||||
gpgkey=http://keyserver.ubuntu.com/pks/lookup?op=get&search=0x8320CA65CB2DE8E5
|
||||
END
|
||||
|
||||
cat > /etc/yum.repos.d/onlyoffice4testing.repo <<END
|
||||
[onlyoffice4testing]
|
||||
name=onlyoffice4testing repo
|
||||
baseurl=http://static.teamlab.info.s3.amazonaws.com/repo/4testing/centos/main/noarch/
|
||||
gpgcheck=1
|
||||
enabled=1
|
||||
gpgkey=http://static.teamlab.info.s3.amazonaws.com/k8s
|
||||
END
|
||||
|
||||
DOWNLOAD_URL_PREFIX="https://download.onlyoffice.com/install-appserver/install-RedHat"
|
||||
|
||||
if [ "$LOCAL_SCRIPTS" = "true" ]; then
|
||||
source install-RedHat/bootstrap.sh
|
||||
source install-RedHat/check-ports.sh
|
||||
source install-RedHat/install-preq.sh
|
||||
source install-RedHat/install-app.sh
|
||||
else
|
||||
source <(curl ${DOWNLOAD_URL_PREFIX}/bootstrap.sh)
|
||||
source <(curl ${DOWNLOAD_URL_PREFIX}/check-ports.sh)
|
||||
source <(curl ${DOWNLOAD_URL_PREFIX}/install-preq.sh)
|
||||
source <(curl ${DOWNLOAD_URL_PREFIX}/install-app.sh)
|
||||
fi
|
15
build/install/OneClickInstall/install-RedHat/bootstrap.sh
Normal file
15
build/install/OneClickInstall/install-RedHat/bootstrap.sh
Normal file
@ -0,0 +1,15 @@
|
||||
#!/bin/bash
|
||||
|
||||
set -e
|
||||
|
||||
cat<<EOF
|
||||
|
||||
#######################################
|
||||
# BOOTSTRAP
|
||||
#######################################
|
||||
|
||||
EOF
|
||||
|
||||
if ! rpm -q net-tools; then
|
||||
${package_manager} -y install net-tools;
|
||||
fi
|
39
build/install/OneClickInstall/install-RedHat/check-ports.sh
Normal file
39
build/install/OneClickInstall/install-RedHat/check-ports.sh
Normal file
@ -0,0 +1,39 @@
|
||||
#!/bin/bash
|
||||
|
||||
set -e
|
||||
|
||||
cat<<EOF
|
||||
|
||||
#######################################
|
||||
# CHECK PORTS
|
||||
#######################################
|
||||
|
||||
EOF
|
||||
|
||||
if rpm -qa | grep ${package_sysname}-appserver; then
|
||||
echo "${package_sysname}-appserver $RES_APP_INSTALLED"
|
||||
APPSERVER_INSTALLED="true";
|
||||
elif [ "${UPDATE}" != "true" ] && netstat -lnp | awk '{print $4}' | grep -qE ":80$|:8081$|:8083$|:5001$|:5002$|:8080$|:80$"; then
|
||||
echo "${package_sysname}-appserver $RES_APP_CHECK_PORTS: 80, 8081, 8083, 5001, 5002, 9200, 2181, 9092";
|
||||
echo "$RES_CHECK_PORTS"
|
||||
exit
|
||||
else
|
||||
APPSERVER_INSTALLED="false";
|
||||
fi
|
||||
|
||||
if rpm -qa | grep ${package_sysname}-documentserver; then
|
||||
echo "${package_sysname}-documentserver $RES_APP_INSTALLED"
|
||||
DOCUMENT_SERVER_INSTALLED="true";
|
||||
elif [ "${UPDATE}" != "true" ] && netstat -lnp | awk '{print $4}' | grep -qE ":8083$|:5432$|:5672$|:6379$|:8000$|:8080$"; then
|
||||
echo "${package_sysname}-documentserver $RES_APP_CHECK_PORTS: 8083, 5432, 5672, 6379, 8000, 8080";
|
||||
echo "$RES_CHECK_PORTS"
|
||||
exit
|
||||
else
|
||||
DOCUMENT_SERVER_INSTALLED="false";
|
||||
fi
|
||||
|
||||
if [ "$APPSERVER_INSTALLED" = "true" ] || [ "$DOCUMENT_SERVER_INSTALLED" = "true" ]; then
|
||||
if [ "$UPDATE" != "true" ]; then
|
||||
exit;
|
||||
fi
|
||||
fi
|
177
build/install/OneClickInstall/install-RedHat/install-app.sh
Normal file
177
build/install/OneClickInstall/install-RedHat/install-app.sh
Normal file
@ -0,0 +1,177 @@
|
||||
#!/bin/bash
|
||||
|
||||
set -e
|
||||
|
||||
cat<<EOF
|
||||
|
||||
#######################################
|
||||
# INSTALL APP
|
||||
#######################################
|
||||
|
||||
EOF
|
||||
|
||||
MYSQL_SERVER_HOST=${MYSQL_SERVER_HOST:-"localhost"}
|
||||
MYSQL_SERVER_DB_NAME=${MYSQL_SERVER_DB_NAME:-"${package_sysname}"}
|
||||
MYSQL_SERVER_USER=${MYSQL_SERVER_USER:-"root"}
|
||||
MYSQL_SERVER_PORT=${MYSQL_SERVER_PORT:-3306}
|
||||
|
||||
if [ "${MYSQL_FIRST_TIME_INSTALL}" = "true" ]; then
|
||||
MYSQL_TEMPORARY_ROOT_PASS="";
|
||||
|
||||
if [ -f "/var/log/mysqld.log" ]; then
|
||||
MYSQL_TEMPORARY_ROOT_PASS=$(cat /var/log/mysqld.log | grep "temporary password" | rev | cut -d " " -f 1 | rev | tail -1);
|
||||
fi
|
||||
|
||||
while ! mysqladmin ping -u root --silent; do
|
||||
sleep 1
|
||||
done
|
||||
|
||||
if ! mysql "-u$MYSQL_SERVER_USER" "-p$MYSQL_TEMPORARY_ROOT_PASS" -e ";" >/dev/null 2>&1; then
|
||||
if [ -z $MYSQL_TEMPORARY_ROOT_PASS ]; then
|
||||
MYSQL="mysql --connect-expired-password -u$MYSQL_SERVER_USER -D mysql";
|
||||
else
|
||||
MYSQL="mysql --connect-expired-password -u$MYSQL_SERVER_USER -p${MYSQL_TEMPORARY_ROOT_PASS} -D mysql";
|
||||
fi
|
||||
|
||||
$MYSQL -e "ALTER USER '${MYSQL_SERVER_USER}'@'localhost' IDENTIFIED WITH mysql_native_password BY '${MYSQL_TEMPORARY_ROOT_PASS}'" >/dev/null 2>&1 \
|
||||
|| $MYSQL -e "UPDATE user SET plugin='mysql_native_password', authentication_string=PASSWORD('${MYSQL_TEMPORARY_ROOT_PASS}') WHERE user='${MYSQL_SERVER_USER}' and host='localhost';"
|
||||
|
||||
systemctl restart mysqld
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ -e /etc/redis.conf ]; then
|
||||
sed -i "s/bind .*/bind 127.0.0.1/g" /etc/redis.conf
|
||||
sed -r "/^save\s[0-9]+/d" -i /etc/redis.conf
|
||||
|
||||
systemctl restart redis
|
||||
fi
|
||||
|
||||
sed "/host\s*all\s*all\s*127\.0\.0\.1\/32\s*ident$/s|ident$|trust|" -i /var/lib/pgsql/data/pg_hba.conf
|
||||
sed "/host\s*all\s*all\s*::1\/128\s*ident$/s|ident$|trust|" -i /var/lib/pgsql/data/pg_hba.conf
|
||||
|
||||
for SVC in $package_services; do
|
||||
systemctl start $SVC
|
||||
systemctl enable $SVC
|
||||
done
|
||||
|
||||
if [ "$DOCUMENT_SERVER_INSTALLED" = "false" ]; then
|
||||
declare -x DS_PORT=8083
|
||||
|
||||
DS_RABBITMQ_HOST=localhost;
|
||||
DS_RABBITMQ_USER=guest;
|
||||
DS_RABBITMQ_PWD=guest;
|
||||
|
||||
DS_REDIS_HOST=localhost;
|
||||
|
||||
DS_COMMON_NAME=${DS_COMMON_NAME:-"ds"};
|
||||
|
||||
DS_DB_HOST=localhost;
|
||||
DS_DB_NAME=$DS_COMMON_NAME;
|
||||
DS_DB_USER=$DS_COMMON_NAME;
|
||||
DS_DB_PWD=$DS_COMMON_NAME;
|
||||
|
||||
declare -x JWT_ENABLED=true;
|
||||
declare -x JWT_SECRET="$(cat /dev/urandom | tr -dc A-Za-z0-9 | head -c 12)";
|
||||
declare -x JWT_HEADER="AuthorizationJwt";
|
||||
|
||||
if ! su - postgres -s /bin/bash -c "psql -lqt" | cut -d \| -f 1 | grep -q ${DS_DB_NAME}; then
|
||||
su - postgres -s /bin/bash -c "psql -c \"CREATE DATABASE ${DS_DB_NAME};\""
|
||||
su - postgres -s /bin/bash -c "psql -c \"CREATE USER ${DS_DB_USER} WITH password '${DS_DB_PWD}';\""
|
||||
su - postgres -s /bin/bash -c "psql -c \"GRANT ALL privileges ON DATABASE ${DS_DB_NAME} TO ${DS_DB_USER};\""
|
||||
fi
|
||||
|
||||
${package_manager} -y install ${package_sysname}-documentserver
|
||||
|
||||
systemctl restart supervisord
|
||||
|
||||
expect << EOF
|
||||
|
||||
set timeout -1
|
||||
log_user 1
|
||||
|
||||
spawn documentserver-configure.sh
|
||||
|
||||
expect "Configuring database access..."
|
||||
|
||||
expect -re "Host"
|
||||
send "\025$DS_DB_HOST\r"
|
||||
|
||||
expect -re "Database name"
|
||||
send "\025$DS_DB_NAME\r"
|
||||
|
||||
expect -re "User"
|
||||
send "\025$DS_DB_USER\r"
|
||||
|
||||
expect -re "Password"
|
||||
send "\025$DS_DB_PWD\r"
|
||||
|
||||
if { "${INSTALLATION_TYPE}" == "ENTERPRISE" || "${INSTALLATION_TYPE}" == "DEVELOPER" } {
|
||||
expect "Configuring redis access..."
|
||||
send "\025$DS_REDIS_HOST\r"
|
||||
}
|
||||
|
||||
expect "Configuring AMQP access... "
|
||||
expect -re "Host"
|
||||
send "\025$DS_RABBITMQ_HOST\r"
|
||||
|
||||
expect -re "User"
|
||||
send "\025$DS_RABBITMQ_USER\r"
|
||||
|
||||
expect -re "Password"
|
||||
send "\025$DS_RABBITMQ_PWD\r"
|
||||
|
||||
expect eof
|
||||
|
||||
EOF
|
||||
DOCUMENT_SERVER_INSTALLED="true";
|
||||
fi
|
||||
|
||||
NGINX_ROOT_DIR="/etc/nginx"
|
||||
|
||||
NGINX_WORKER_PROCESSES=${NGINX_WORKER_PROCESSES:-$(grep processor /proc/cpuinfo | wc -l)};
|
||||
NGINX_WORKER_CONNECTIONS=${NGINX_WORKER_CONNECTIONS:-$(ulimit -n)};
|
||||
|
||||
sed 's/^worker_processes.*/'"worker_processes ${NGINX_WORKER_PROCESSES};"'/' -i ${NGINX_ROOT_DIR}/nginx.conf
|
||||
sed 's/worker_connections.*/'"worker_connections ${NGINX_WORKER_CONNECTIONS};"'/' -i ${NGINX_ROOT_DIR}/nginx.conf
|
||||
|
||||
if rpm -q "firewalld"; then
|
||||
firewall-cmd --permanent --zone=public --add-service=http
|
||||
firewall-cmd --permanent --zone=public --add-service=https
|
||||
systemctl restart firewalld.service
|
||||
fi
|
||||
|
||||
if [ "$APPSERVER_INSTALLED" = "false" ]; then
|
||||
|
||||
${package_manager} install -y ${package_sysname}-appserver.x86_64
|
||||
|
||||
if [ "${MYSQL_FIRST_TIME_INSTALL}" = "true" ]; then
|
||||
expect << EOF
|
||||
set timeout -1
|
||||
log_user 1
|
||||
|
||||
spawn appserver-configuration.sh
|
||||
expect -re "Database host:"
|
||||
send "\025$MYSQL_SERVER_HOST\r"
|
||||
|
||||
expect -re "Database name:"
|
||||
send "\025$MYSQL_SERVER_DB_NAME\r"
|
||||
|
||||
expect -re "Database user:"
|
||||
send "\025$MYSQL_SERVER_USER\r"
|
||||
|
||||
expect -re "Database password:"
|
||||
send "\025$MYSQL_TEMPORARY_ROOT_PASS\r"
|
||||
|
||||
expect eof
|
||||
EOF
|
||||
APPSERVER_INSTALLED="true";
|
||||
else
|
||||
bash appserver-configuration.sh
|
||||
fi
|
||||
fi
|
||||
|
||||
echo ""
|
||||
echo "$RES_INSTALL_SUCCESS"
|
||||
echo "$RES_QUESTIONS"
|
||||
echo ""
|
155
build/install/OneClickInstall/install-RedHat/install-preq.sh
Normal file
155
build/install/OneClickInstall/install-RedHat/install-preq.sh
Normal file
@ -0,0 +1,155 @@
|
||||
#!/bin/bash
|
||||
|
||||
set -e
|
||||
|
||||
cat<<EOF
|
||||
|
||||
#######################################
|
||||
# INSTALL PREREQUISITES
|
||||
#######################################
|
||||
|
||||
EOF
|
||||
|
||||
# clean yum cache
|
||||
${package_manager} clean all
|
||||
|
||||
${package_manager} -y install yum-utils
|
||||
|
||||
REV=$(cat /etc/redhat-release | sed s/.*release\ // | sed s/\ .*//);
|
||||
REV_PARTS=(${REV//\./ });
|
||||
REV=${REV_PARTS[0]};
|
||||
|
||||
if ! [[ "$REV" =~ ^[0-9]+$ ]]; then
|
||||
REV=7;
|
||||
fi
|
||||
|
||||
# add epel repo
|
||||
rpm -ivh https://dl.fedoraproject.org/pub/epel/epel-release-latest-$REV.noarch.rpm || true
|
||||
rpm -ivh https://rpms.remirepo.net/enterprise/remi-release-$REV.rpm || true
|
||||
|
||||
#add nodejs repo
|
||||
curl -sL https://rpm.nodesource.com/setup_12.x | bash - || true
|
||||
|
||||
#add yarn
|
||||
curl -sL https://dl.yarnpkg.com/rpm/yarn.repo | tee /etc/yum.repos.d/yarn.repo || true
|
||||
|
||||
#add dotnet repo
|
||||
rpm -Uvh https://packages.microsoft.com/config/centos/$REV/packages-microsoft-prod.rpm || true
|
||||
|
||||
#add mysql repo
|
||||
case $REV in
|
||||
8) dnf remove -y @mysql
|
||||
dnf module -y reset mysql && dnf module -y disable mysql
|
||||
${package_manager} localinstall -y https://dev.mysql.com/get/mysql80-community-release-el8-1.noarch.rpm || true ;;
|
||||
7) ${package_manager} localinstall -y https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm || true ;;
|
||||
6) ${package_manager} localinstall -y https://dev.mysql.com/get/mysql80-community-release-el6-3.noarch.rpm || true ;;
|
||||
esac
|
||||
|
||||
if ! rpm -q mysql-community-server; then
|
||||
MYSQL_FIRST_TIME_INSTALL="true";
|
||||
fi
|
||||
|
||||
#add elasticsearch repo
|
||||
rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch
|
||||
cat > /etc/yum.repos.d/elasticsearch.repo <<END
|
||||
[elasticsearch]
|
||||
name=Elasticsearch repository for 7.x packages
|
||||
baseurl=https://artifacts.elastic.co/packages/7.x/yum
|
||||
gpgcheck=1
|
||||
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
|
||||
enabled=0
|
||||
autorefresh=1
|
||||
type=rpm-md
|
||||
END
|
||||
|
||||
#install kafka
|
||||
mkdir -p /var/www/appserver/services/
|
||||
getent passwd kafka >/dev/null || useradd -m -d /var/www/appserver/services/kafka -s /sbin/nologin -p kafka kafka
|
||||
cd /var/www/appserver/services/kafka
|
||||
wget https://downloads.apache.org/kafka/2.7.0/kafka_2.13-2.7.0.tgz
|
||||
tar xzf kafka_*.tgz --strip 1 && rm -rf kafka_*.tgz
|
||||
chown -R kafka /var/www/appserver/services/kafka
|
||||
cd -
|
||||
|
||||
cat > /etc/systemd/system/zookeeper.service <<END
|
||||
[Unit]
|
||||
Requires=network.target remote-fs.target
|
||||
After=network.target remote-fs.target
|
||||
[Service]
|
||||
Type=simple
|
||||
User=kafka
|
||||
ExecStart=/bin/sh -c '/var/www/appserver/services/kafka/bin/zookeeper-server-start.sh /var/www/appserver/services/kafka/config/zookeeper.properties > /var/www/appserver/services/kafka/zookeeper.log 2>&1'
|
||||
ExecStop=/var/www/appserver/services/kafka/bin/zookeeper-server-stop.sh
|
||||
Restart=on-abnormal
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
END
|
||||
|
||||
cat > /etc/systemd/system/kafka.service <<END
|
||||
[Unit]
|
||||
Requires=zookeeper.service
|
||||
After=zookeeper.service
|
||||
[Service]
|
||||
Type=simple
|
||||
User=kafka
|
||||
ExecStart=/bin/sh -c '/var/www/appserver/services/kafka/bin/kafka-server-start.sh /var/www/appserver/services/kafka/config/server.properties > /var/www/appserver/services/kafka/kafka.log 2>&1'
|
||||
ExecStop=/var/www/appserver/services/kafka/bin/kafka-server-stop.sh
|
||||
Restart=on-abnormal
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
END
|
||||
|
||||
# add nginx repo
|
||||
cat > /etc/yum.repos.d/nginx.repo <<END
|
||||
[nginx-stable]
|
||||
name=nginx stable repo
|
||||
baseurl=https://nginx.org/packages/centos/$REV/\$basearch/
|
||||
gpgcheck=1
|
||||
enabled=1
|
||||
gpgkey=https://nginx.org/keys/nginx_signing.key
|
||||
module_hotfixes=true
|
||||
END
|
||||
|
||||
if [ "$REV" = "8" ]; then
|
||||
|
||||
cat > /etc/yum.repos.d/rabbitmq-server.repo <<END
|
||||
[rabbitmq-server]
|
||||
name=rabbitmq-server
|
||||
baseurl=https://packagecloud.io/rabbitmq/rabbitmq-server/el/7/\$basearch
|
||||
repo_gpgcheck=1
|
||||
gpgcheck=0
|
||||
enabled=1
|
||||
gpgkey=https://packagecloud.io/rabbitmq/rabbitmq-server/gpgkey
|
||||
sslverify=0
|
||||
sslcacert=/etc/pki/tls/certs/ca-bundle.crt
|
||||
metadata_expire=300
|
||||
END
|
||||
|
||||
fi
|
||||
${package_manager} -y install yum-plugin-versionlock
|
||||
${package_manager} versionlock clear
|
||||
|
||||
${package_manager} -y install epel-release \
|
||||
expect \
|
||||
nano \
|
||||
nodejs \
|
||||
gcc-c++ \
|
||||
make \
|
||||
yarn \
|
||||
dotnet-sdk-3.1 \
|
||||
elasticsearch-7.8.1 --enablerepo=elasticsearch \
|
||||
mysql-server \
|
||||
nginx \
|
||||
supervisor \
|
||||
postgresql \
|
||||
postgresql-server \
|
||||
rabbitmq-server \
|
||||
redis --enablerepo=remi
|
||||
|
||||
postgresql-setup initdb || true
|
||||
|
||||
semanage permissive -a httpd_t
|
||||
|
||||
systemctl daemon-reload
|
||||
package_services="rabbitmq-server postgresql redis supervisord nginx kafka"
|
||||
systemctl enable mysqld && systemctl start mysqld
|
126
build/install/common/systemd/build.sh
Normal file
126
build/install/common/systemd/build.sh
Normal file
@ -0,0 +1,126 @@
|
||||
#!/bin/bash
|
||||
|
||||
PRODUCT="onlyoffice/appserver"
|
||||
BASE_DIR="/etc/${PRODUCT}"
|
||||
PATH_TO_CONF="${BASE_DIR}"
|
||||
STORAGE_ROOT="${BASE_DIR}/data"
|
||||
LOG_DIR="/var/log/${PRODUCT}"
|
||||
DOTNET_RUN="/usr/bin/dotnet"
|
||||
APP_URLS="http://0.0.0.0"
|
||||
ENVIRONMENT=" --ENVIRONMENT=production"
|
||||
|
||||
service_name=(
|
||||
api
|
||||
api_system
|
||||
urlshortener
|
||||
thumbnails
|
||||
socket
|
||||
studio_notify
|
||||
notify
|
||||
people
|
||||
files
|
||||
files_service
|
||||
studio
|
||||
backup)
|
||||
|
||||
SERVICE_PORT=""
|
||||
SERVICE_NAME=""
|
||||
WORK_DIR=""
|
||||
EXEC_FILE=""
|
||||
CORE=""
|
||||
|
||||
reassign_values (){
|
||||
case $1 in
|
||||
api )
|
||||
SERVICE_NAME="$1"
|
||||
SERVICE_PORT="5000"
|
||||
WORK_DIR="/var/www/appserver/studio/api/"
|
||||
EXEC_FILE="ASC.Web.Api.dll"
|
||||
;;
|
||||
api_system )
|
||||
SERVICE_NAME="$1"
|
||||
SERVICE_PORT="5010"
|
||||
WORK_DIR="/var/www/appserver/services/apisystem/"
|
||||
EXEC_FILE="ASC.ApiSystem.dll"
|
||||
;;
|
||||
urlshortener )
|
||||
SERVICE_NAME="$1"
|
||||
SERVICE_PORT="5015"
|
||||
WORK_DIR="/services/ASC.UrlShortener/service/"
|
||||
EXEC_FILE="ASC.UrlShortener.Svc.dll"
|
||||
;;
|
||||
thumbnails )
|
||||
SERVICE_NAME="$1"
|
||||
SERVICE_PORT="5016"
|
||||
WORK_DIR="/services/ASC.Thumbnails/service/"
|
||||
EXEC_FILE="ASC.Thumbnails.Svc.dll"
|
||||
;;
|
||||
socket )
|
||||
SERVICE_NAME="$1"
|
||||
SERVICE_PORT="9999"
|
||||
WORK_DIR="/services/ASC.Socket.IO/service/"
|
||||
EXEC_FILE="ASC.Socket.IO.Svc.dll"
|
||||
;;
|
||||
studio_notify )
|
||||
SERVICE_NAME="$1"
|
||||
SERVICE_PORT="5006"
|
||||
WORK_DIR="/var/www/appserver/services/studio.notify/"
|
||||
EXEC_FILE="ASC.Studio.Notify.dll"
|
||||
CORE=" --core:products:folder=/var/www/appserver/products --core:products:subfolder=server "
|
||||
;;
|
||||
notify )
|
||||
SERVICE_NAME="$1"
|
||||
SERVICE_PORT="5005"
|
||||
WORK_DIR="/var/www/appserver/services/notify/"
|
||||
EXEC_FILE="ASC.Notify.dll"
|
||||
CORE=" --core:products:folder=/var/www/appserver/products --core:products:subfolder=server "
|
||||
;;
|
||||
people )
|
||||
SERVICE_NAME="$1"
|
||||
SERVICE_PORT="5004"
|
||||
WORK_DIR="/var/www/appserver/products/ASC.People/server/"
|
||||
EXEC_FILE="ASC.People.dll"
|
||||
;;
|
||||
files )
|
||||
SERVICE_NAME="$1"
|
||||
SERVICE_PORT="5007"
|
||||
WORK_DIR="/var/www/appserver/products/ASC.Files/server/"
|
||||
EXEC_FILE="ASC.Files.dll"
|
||||
;;
|
||||
files_service )
|
||||
SERVICE_NAME="$1"
|
||||
SERVICE_PORT="5009"
|
||||
WORK_DIR="/var/www/appserver/products/ASC.Files/service/"
|
||||
EXEC_FILE="ASC.Files.Service.dll"
|
||||
CORE=" --core:products:folder=/var/www/appserver/products --core:products:subfolder=server"
|
||||
;;
|
||||
studio )
|
||||
SERVICE_NAME="$1"
|
||||
SERVICE_PORT="5003"
|
||||
WORK_DIR="/var/www/appserver/studio/server/"
|
||||
EXEC_FILE="ASC.Web.Studio.dll"
|
||||
;;
|
||||
backup )
|
||||
SERVICE_NAME="$1"
|
||||
SERVICE_PORT="5012"
|
||||
WORK_DIR="/var/www/appserver/services/backup/"
|
||||
EXEC_FILE="ASC.Data.Backup.dll"
|
||||
CORE=" --core:products:folder=/var/www/appserver/products --core:products:subfolder=server"
|
||||
;;
|
||||
esac
|
||||
|
||||
EXEC_START="${DOTNET_RUN} ${WORK_DIR}${EXEC_FILE} --urls=${APP_URLS}:${SERVICE_PORT} --pathToConf=${PATH_TO_CONF} --'\$STORAGE_ROOT'=${STORAGE_ROOT} --log:dir=${LOG_DIR} --log:name=${SERVICE_NAME}${CORE}${ENVIRONMENT}"
|
||||
}
|
||||
|
||||
write_to_file () {
|
||||
sed -i -e 's#${SERVICE_NAME}#'$SERVICE_NAME'#g' -e 's#${WORK_DIR}#'$WORK_DIR'#g' -e \
|
||||
"s#\${EXEC_START}#$EXEC_START#g" modules/appserver-${service_name[$i]}.service
|
||||
}
|
||||
|
||||
mkdir -p modules
|
||||
|
||||
for i in ${!service_name[@]}; do
|
||||
cp service ./modules/appserver-${service_name[$i]}.service
|
||||
reassign_values "${service_name[$i]}"
|
||||
write_to_file $i
|
||||
done
|
18
build/install/common/systemd/service
Normal file
18
build/install/common/systemd/service
Normal file
@ -0,0 +1,18 @@
|
||||
[Unit]
|
||||
Description=AppServer-${SERVICE_NAME}
|
||||
After=network.target syslog.target
|
||||
|
||||
[Service]
|
||||
PIDFile=/run/appserver/appserver-${SERVICE_NAME}.pid
|
||||
Type=simple
|
||||
User=onlyoffice
|
||||
Group=onlyoffice
|
||||
WorkingDirectory=${WORK_DIR}
|
||||
ExecStart=${EXEC_START}
|
||||
TimeoutSec=600
|
||||
|
||||
Restart=no
|
||||
PrivateTmp=false
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
0
build/install/rpm/SPECS/SOURCES/.placeholder
Normal file
0
build/install/rpm/SPECS/SOURCES/.placeholder
Normal file
68
build/install/rpm/SPECS/appserver.spec
Normal file
68
build/install/rpm/SPECS/appserver.spec
Normal file
@ -0,0 +1,68 @@
|
||||
%define debug_package %{nil}
|
||||
Name: onlyoffice-appserver
|
||||
Summary: Business productivity tools.
|
||||
Version: %version
|
||||
Release: %release
|
||||
Group: Applications/Internet
|
||||
URL: http://onlyoffice.com
|
||||
Vendor: Ascensio System SIA
|
||||
Packager: Ascensio System SIA <support@onlyoffice.com>
|
||||
ExclusiveArch: x86_64
|
||||
AutoReq: no
|
||||
AutoProv: no
|
||||
License: GPLv3
|
||||
Source0: https://github.com/ONLYOFFICE/appserver/archive/%GIT_BRANCH.tar.gz
|
||||
BuildRequires: nodejs >= 12.0
|
||||
BuildRequires: yarn
|
||||
BuildRequires: libgdiplus
|
||||
BuildRequires: dotnet-sdk-3.1
|
||||
Requires: %name-backup
|
||||
Requires: %name-files_services
|
||||
Requires: %name-notify
|
||||
Requires: %name-files
|
||||
Requires: %name-api_system
|
||||
Requires: %name-proxy
|
||||
Requires: %name-people.server
|
||||
Requires: %name-urlshortener
|
||||
Requires: %name-thumbnails
|
||||
Requires: %name-studio
|
||||
Requires: %name-studio.notify
|
||||
Requires: %name-socket
|
||||
Requires: %name-api
|
||||
AutoReqProv: no
|
||||
%description
|
||||
App Server is a platform for building your own online office by connecting ONLYOFFICE modules packed as separate apps.
|
||||
|
||||
%include package.spec
|
||||
|
||||
%prep
|
||||
|
||||
rm -rf %{_rpmdir}/%{_arch}/%{name}-*
|
||||
%setup -n AppServer-%GIT_BRANCH
|
||||
|
||||
%include build.spec
|
||||
|
||||
%include install.spec
|
||||
|
||||
%include files.spec
|
||||
|
||||
%pre
|
||||
|
||||
%pre common
|
||||
|
||||
getent group onlyoffice >/dev/null || groupadd -r onlyoffice
|
||||
getent passwd onlyoffice >/dev/null || useradd -r -g onlyoffice -s /sbin/nologin onlyoffice
|
||||
|
||||
%post
|
||||
|
||||
chmod +x %{_bindir}/appserver-configuration.sh
|
||||
|
||||
%preun
|
||||
|
||||
%postun
|
||||
|
||||
%clean
|
||||
|
||||
rm -rf %{buildroot}
|
||||
|
||||
%changelog
|
99
build/install/rpm/SPECS/build.spec
Normal file
99
build/install/rpm/SPECS/build.spec
Normal file
@ -0,0 +1,99 @@
|
||||
%build
|
||||
|
||||
cd %{_builddir}/AppServer-%GIT_BRANCH/build/install/common/systemd/
|
||||
bash build.sh
|
||||
|
||||
cd %{_builddir}/AppServer-%GIT_BRANCH/
|
||||
yarn install --cwd web/ASC.Web.Components --frozen-lockfile > build/ASC.Web.Components.log
|
||||
yarn pack --cwd web/ASC.Web.Components
|
||||
|
||||
cd %{_builddir}/AppServer-%GIT_BRANCH/
|
||||
component=$(ls web/ASC.Web.Components/asc-web-components-v1.*.tgz)
|
||||
yarn remove asc-web-components --cwd web/ASC.Web.Common --peer
|
||||
yarn add file:../../$component --cwd web/ASC.Web.Common --cache-folder ../../yarn --peer
|
||||
yarn install --cwd web/ASC.Web.Common --frozen-lockfile > build/ASC.Web.Common.log
|
||||
yarn pack --cwd web/ASC.Web.Common
|
||||
|
||||
cd %{_builddir}/AppServer-%GIT_BRANCH/
|
||||
npm run-script build:storybook --prefix web/ASC.Web.Components
|
||||
|
||||
cd %{_builddir}/AppServer-%GIT_BRANCH/
|
||||
component=$(ls web/ASC.Web.Components/asc-web-components-v1.*.tgz)
|
||||
common=$(ls web/ASC.Web.Common/asc-web-common-v1.*.tgz)
|
||||
yarn remove asc-web-components asc-web-common --cwd web/ASC.Web.Client
|
||||
yarn add ../../$component --cwd web/ASC.Web.Client --cache-folder ../../yarn
|
||||
yarn add ../../$common --cwd web/ASC.Web.Client --cache-folder ../../yarn
|
||||
yarn install --cwd web/ASC.Web.Client --frozen-lockfile || (cd web/ASC.Web.Client \
|
||||
npm i && cd ../../)
|
||||
npm run-script build --prefix web/ASC.Web.Client
|
||||
|
||||
cd %{_builddir}/AppServer-%GIT_BRANCH/
|
||||
component=$(ls web/ASC.Web.Components/asc-web-components-v1.*.tgz)
|
||||
common=$(ls web/ASC.Web.Common/asc-web-common-v1.*.tgz)
|
||||
yarn remove asc-web-components asc-web-common --cwd products/ASC.Files/Client
|
||||
yarn add ../../../$component --cwd products/ASC.Files/Client --cache-folder ../../../yarn
|
||||
yarn add ../../../$common --cwd products/ASC.Files/Client --cache-folder ../../../yarn
|
||||
yarn install --cwd products/ASC.Files/Client --frozen-lockfile || (cd products/ASC.Files/Client \
|
||||
npm i && cd ../../../)
|
||||
npm run-script build --prefix products/ASC.Files/Client
|
||||
|
||||
cd %{_builddir}/AppServer-%GIT_BRANCH/
|
||||
component=$(ls web/ASC.Web.Components/asc-web-components-v1.*.tgz)
|
||||
common=$(ls web/ASC.Web.Common/asc-web-common-v1.*.tgz)
|
||||
yarn remove asc-web-components asc-web-common --cwd products/ASC.People/Client
|
||||
yarn add ../../../$component --cwd products/ASC.People/Client --cache-folder ../../../yarn
|
||||
yarn add ../../../$common --cwd products/ASC.People/Client --cache-folder ../../../yarn
|
||||
yarn install --cwd products/ASC.People/Client --frozen-lockfile || (cd products/ASC.People/Client \
|
||||
npm i && cd ../../../)
|
||||
npm run-script build --prefix products/ASC.People/Client
|
||||
|
||||
cd %{_builddir}/AppServer-%GIT_BRANCH/
|
||||
dotnet restore ASC.Web.sln --configfile .nuget/NuGet.Config
|
||||
dotnet build -r linux-x64 ASC.Web.sln
|
||||
cd products/ASC.People/Server
|
||||
dotnet -d publish --no-build --self-contained -r linux-x64 -o %{_builddir}%{_var}/www/appserver/products/ASC.People/server
|
||||
cd ../../../
|
||||
cd products/ASC.Files/Server
|
||||
dotnet -d publish --no-build --self-contained -r linux-x64 -o %{_builddir}%{_var}/www/appserver/products/ASC.Files/server
|
||||
cp -avrf DocStore %{_builddir}%{_var}/www/appserver/products/ASC.Files/server/
|
||||
cd ../../../
|
||||
cd products/ASC.Files/Service
|
||||
dotnet -d publish --no-build --self-contained -r linux-x64 -o %{_builddir}%{_var}/www/appserver/products/ASC.Files/service
|
||||
cd ../../../
|
||||
cd web/ASC.Web.Api
|
||||
dotnet -d publish --no-build --self-contained -r linux-x64 -o %{_builddir}%{_var}/www/appserver/studio/api
|
||||
cd ../../
|
||||
cd web/ASC.Web.Studio
|
||||
dotnet -d publish --no-build --self-contained -r linux-x64 -o %{_builddir}%{_var}/www/appserver/studio/server
|
||||
cd ../../
|
||||
cd common/services/ASC.Data.Backup
|
||||
dotnet -d publish --no-build --self-contained -r linux-x64 -o %{_builddir}%{_var}/www/appserver/services/backup
|
||||
cd ../../../
|
||||
cd common/services/ASC.Notify
|
||||
dotnet -d publish --no-build --self-contained -r linux-x64 -o %{_builddir}%{_var}/www/appserver/services/notify
|
||||
cd ../../../
|
||||
cd common/services/ASC.ApiSystem
|
||||
dotnet -d publish --no-build --self-contained -r linux-x64 -o %{_builddir}%{_var}/www/appserver/services/apisystem
|
||||
cd ../../../
|
||||
cd common/services/ASC.Thumbnails.Svc
|
||||
dotnet -d publish --no-build --self-contained -r linux-x64 -o %{_builddir}/services/thumb/service
|
||||
cd ../../../
|
||||
|
||||
yarn install --cwd common/ASC.Thumbnails --frozen-lockfile
|
||||
|
||||
cd common/services/ASC.UrlShortener.Svc
|
||||
dotnet -d publish --no-build --self-contained -r linux-x64 -o %{_builddir}/services/urlshortener/service
|
||||
cd ../../../
|
||||
yarn install --cwd common/ASC.UrlShortener --frozen-lockfile
|
||||
|
||||
cd common/services/ASC.Socket.IO.Svc
|
||||
dotnet -d publish --no-build --self-contained -r linux-x64 -o %{_builddir}/services/socket/service
|
||||
cd ../../../
|
||||
yarn install --cwd common/ASC.Socket.IO --frozen-lockfile
|
||||
|
||||
cd common/services/ASC.Studio.Notify
|
||||
dotnet add ASC.Studio.Notify.csproj reference ../../../products/ASC.People/Server/ASC.People.csproj ../../../products/ASC.Files/Server/ASC.Files.csproj
|
||||
dotnet -d publish --no-build --self-contained -r linux-x64 -o %{_builddir}%{_var}/www/appserver/services/studio.notify
|
||||
cd ../../../
|
||||
|
||||
sed -i "s@var/www@var/www/appserver@" config/nginx/onlyoffice-*.conf
|
144
build/install/rpm/SPECS/files.spec
Normal file
144
build/install/rpm/SPECS/files.spec
Normal file
@ -0,0 +1,144 @@
|
||||
%files
|
||||
%config %attr(644, root, root) %{_bindir}/*
|
||||
|
||||
%files api
|
||||
%defattr(-, onlyoffice, onlyoffice, -)
|
||||
%{_var}/www/appserver/studio/api/
|
||||
%{_var}/www/appserver/products/ASC.People/server/ASC.People.dll
|
||||
%{_var}/www/appserver/products/ASC.Files/server/ASC.Files*.dll
|
||||
%{_sysconfdir}/systemd/system/appserver-api.service
|
||||
%dir %{_var}/www/appserver/studio
|
||||
%dir %{_var}/www/appserver/products/
|
||||
%dir %{_var}/www/appserver/products/ASC.People/
|
||||
%dir %{_var}/www/appserver/products/ASC.People/server/
|
||||
%dir %{_var}/www/appserver/products/ASC.Files/
|
||||
%dir %{_var}/www/appserver/products/ASC.Files/server/
|
||||
|
||||
%files backup
|
||||
%defattr(-, onlyoffice, onlyoffice, -)
|
||||
%{_var}/www/appserver/services/backup/
|
||||
%{_var}/www/appserver/products/ASC.People/server/ASC.People.dll
|
||||
%{_var}/www/appserver/products/ASC.Files/server/ASC.Files*.dll
|
||||
%{_sysconfdir}/systemd/system/appserver-backup.service
|
||||
%dir %{_var}/www/appserver/services/
|
||||
%dir %{_var}/www/appserver/products/
|
||||
%dir %{_var}/www/appserver/products/ASC.People/
|
||||
%dir %{_var}/www/appserver/products/ASC.People/server/
|
||||
%dir %{_var}/www/appserver/products/ASC.Files/
|
||||
%dir %{_var}/www/appserver/products/ASC.Files/server/
|
||||
|
||||
%files common
|
||||
%defattr(-, onlyoffice, onlyoffice, -)
|
||||
%config %{_sysconfdir}/onlyoffice/appserver/
|
||||
%{_var}/log/onlyoffice/appserver/
|
||||
%{_var}/www/appserver/sql/
|
||||
%dir %{_sysconfdir}/onlyoffice/
|
||||
%dir %{_var}/log/onlyoffice/
|
||||
|
||||
%files files_services
|
||||
%defattr(-, onlyoffice, onlyoffice, -)
|
||||
%{_var}/www/appserver/products/ASC.Files/service/
|
||||
%{_sysconfdir}/systemd/system/appserver-files_service.service
|
||||
%dir %{_var}/www/appserver/products/
|
||||
%dir %{_var}/www/appserver/products/ASC.Files/
|
||||
|
||||
%files notify
|
||||
%defattr(-, onlyoffice, onlyoffice, -)
|
||||
%{_var}/www/appserver/services/notify/
|
||||
%{_var}/www/appserver/products/ASC.People/server/ASC.People.dll
|
||||
%{_var}/www/appserver/products/ASC.Files/server/ASC.Files*.dll
|
||||
%{_sysconfdir}/systemd/system/appserver-notify.service
|
||||
%dir %{_var}/www/appserver/services/
|
||||
%dir %{_var}/www/appserver/products/
|
||||
%dir %{_var}/www/appserver/products/ASC.People/
|
||||
%dir %{_var}/www/appserver/products/ASC.People/server/
|
||||
%dir %{_var}/www/appserver/products/ASC.Files/
|
||||
%dir %{_var}/www/appserver/products/ASC.Files/server/
|
||||
|
||||
%files files
|
||||
%defattr(-, onlyoffice, onlyoffice, -)
|
||||
%{_var}/www/appserver/products/ASC.Files/server/
|
||||
%{_var}/www/appserver/products/ASC.People/server/ASC.People.dll
|
||||
%{_sysconfdir}/systemd/system/appserver-files.service
|
||||
%dir %{_var}/www/appserver/products/
|
||||
%dir %{_var}/www/appserver/products/ASC.People/
|
||||
%dir %{_var}/www/appserver/products/ASC.People/server/
|
||||
%dir %{_var}/www/appserver/products/ASC.Files/
|
||||
|
||||
%files api_system
|
||||
%defattr(-, onlyoffice, onlyoffice, -)
|
||||
%{_var}/www/appserver/services/apisystem/
|
||||
%{_sysconfdir}/systemd/system/appserver-api_system.service
|
||||
%dir %{_var}/www/appserver/services/
|
||||
|
||||
%files proxy
|
||||
%defattr(-, onlyoffice, onlyoffice, -)
|
||||
%{_sysconfdir}/nginx/includes/*
|
||||
%{_sysconfdir}/nginx/conf.d/*
|
||||
%{_var}/www/appserver/story/
|
||||
%{_var}/www/appserver/products/ASC.People/client/
|
||||
%{_var}/www/appserver/products/ASC.Files/client/
|
||||
%{_var}/www/appserver/public/
|
||||
%{_var}/www/appserver/studio/client/
|
||||
%dir %{_var}/www/appserver/studio/
|
||||
%dir %{_var}/www/appserver/products/ASC.People/
|
||||
%dir %{_var}/www/appserver/products/ASC.Files/
|
||||
|
||||
%files studio.notify
|
||||
%defattr(-, onlyoffice, onlyoffice, -)
|
||||
%{_var}/www/appserver/services/studio.notify/
|
||||
%{_var}/www/appserver/products/ASC.People/server/ASC.People.dll
|
||||
%{_var}/www/appserver/products/ASC.Files/server/ASC.Files*.dll
|
||||
%{_sysconfdir}/systemd/system/appserver-studio_notify.service
|
||||
%dir %{_var}/www/appserver/products/
|
||||
%dir %{_var}/www/appserver/products/ASC.People/
|
||||
%dir %{_var}/www/appserver/products/ASC.People/server/
|
||||
%dir %{_var}/www/appserver/products/ASC.Files/
|
||||
%dir %{_var}/www/appserver/services/
|
||||
|
||||
%files people.server
|
||||
%defattr(-, onlyoffice, onlyoffice, -)
|
||||
%{_var}/www/appserver/products/ASC.People/server/
|
||||
%{_var}/www/appserver/products/ASC.Files/server/ASC.Files*.dll
|
||||
%{_sysconfdir}/systemd/system/appserver-people.service
|
||||
%dir %{_var}/www/appserver/products/
|
||||
%dir %{_var}/www/appserver/products/ASC.People/
|
||||
%dir %{_var}/www/appserver/products/ASC.Files/
|
||||
%dir %{_var}/www/appserver/products/ASC.Files/server/
|
||||
|
||||
%files urlshortener
|
||||
%defattr(-, onlyoffice, onlyoffice, -)
|
||||
/services/ASC.UrlShortener/
|
||||
%{_sysconfdir}/systemd/system/appserver-urlshortener.service
|
||||
%dir /services/
|
||||
%dir /services/ASC.UrlShortener/
|
||||
%dir /services/ASC.UrlShortener/service
|
||||
|
||||
%files thumbnails
|
||||
%defattr(-, onlyoffice, onlyoffice, -)
|
||||
/services/ASC.Thumbnails/
|
||||
%{_sysconfdir}/systemd/system/appserver-thumbnails.service
|
||||
%dir /services/
|
||||
%dir /services/ASC.Thumbnails/
|
||||
%dir /services/ASC.Thumbnails/service
|
||||
|
||||
%files socket
|
||||
%defattr(-, onlyoffice, onlyoffice, -)
|
||||
/services/ASC.Socket.IO/
|
||||
%{_sysconfdir}/systemd/system/appserver-socket.service
|
||||
%dir /services/
|
||||
%dir /services/ASC.Socket.IO/
|
||||
%dir /services/ASC.Socket.IO/service
|
||||
|
||||
%files studio
|
||||
%defattr(-, onlyoffice, onlyoffice, -)
|
||||
%{_var}/www/appserver/studio/server/
|
||||
%{_var}/www/appserver/products/ASC.People/server/ASC.People.dll
|
||||
%{_var}/www/appserver/products/ASC.Files/server/ASC.Files*.dll
|
||||
%{_sysconfdir}/systemd/system/appserver-studio.service
|
||||
%dir %{_var}/www/appserver/studio/
|
||||
%dir %{_var}/www/appserver/products/
|
||||
%dir %{_var}/www/appserver/products/ASC.People/
|
||||
%dir %{_var}/www/appserver/products/ASC.People/server/
|
||||
%dir %{_var}/www/appserver/products/ASC.Files/
|
||||
%dir %{_var}/www/appserver/products/ASC.Files/server/
|
53
build/install/rpm/SPECS/install.spec
Normal file
53
build/install/rpm/SPECS/install.spec
Normal file
@ -0,0 +1,53 @@
|
||||
%install
|
||||
mkdir -p "%{buildroot}%{_bindir}/"
|
||||
mkdir -p "%{buildroot}%{_sysconfdir}/nginx/conf.d/"
|
||||
mkdir -p "%{buildroot}%{_sysconfdir}/nginx/includes"
|
||||
mkdir -p "%{buildroot}%{_sysconfdir}/onlyoffice/appserver/"
|
||||
mkdir -p "%{buildroot}%{_sysconfdir}/onlyoffice/appserver/data"
|
||||
mkdir -p "%{buildroot}%{_sysconfdir}/onlyoffice/appserver/.private/"
|
||||
mkdir -p "%{buildroot}%{_sysconfdir}/systemd/system/"
|
||||
mkdir -p "%{buildroot}%{_var}/log/onlyoffice/appserver/"
|
||||
mkdir -p "%{buildroot}%{_var}/www/appserver/products/ASC.Files/client/"
|
||||
mkdir -p "%{buildroot}%{_var}/www/appserver/products/ASC.Files/server/"
|
||||
mkdir -p "%{buildroot}%{_var}/www/appserver/products/ASC.Files/service/"
|
||||
mkdir -p "%{buildroot}%{_var}/www/appserver/products/ASC.People/client/"
|
||||
mkdir -p "%{buildroot}%{_var}/www/appserver/products/ASC.People/server/"
|
||||
mkdir -p "%{buildroot}%{_var}/www/appserver/public/"
|
||||
mkdir -p "%{buildroot}%{_var}/www/appserver/services/apisystem/"
|
||||
mkdir -p "%{buildroot}%{_var}/www/appserver/services/backup/"
|
||||
mkdir -p "%{buildroot}%{_var}/www/appserver/services/notify/"
|
||||
mkdir -p "%{buildroot}%{_var}/www/appserver/services/studio.notify/"
|
||||
mkdir -p "%{buildroot}%{_var}/www/appserver/sql/"
|
||||
mkdir -p "%{buildroot}%{_var}/www/appserver/story/"
|
||||
mkdir -p "%{buildroot}%{_var}/www/appserver/studio/api/"
|
||||
mkdir -p "%{buildroot}%{_var}/www/appserver/studio/client/"
|
||||
mkdir -p "%{buildroot}%{_var}/www/appserver/studio/server/"
|
||||
mkdir -p "%{buildroot}/services/ASC.Socket.IO/service"
|
||||
mkdir -p "%{buildroot}/services/ASC.Thumbnails/service/"
|
||||
mkdir -p "%{buildroot}/services/ASC.UrlShortener/service/"
|
||||
cp -rf %{_builddir}%{_var}/www/appserver/products/ASC.Files/server/* "%{buildroot}%{_var}/www/appserver/products/ASC.Files/server/"
|
||||
cp -rf %{_builddir}%{_var}/www/appserver/products/ASC.Files/service/* "%{buildroot}%{_var}/www/appserver/products/ASC.Files/service/"
|
||||
cp -rf %{_builddir}%{_var}/www/appserver/products/ASC.People/server/* "%{buildroot}%{_var}/www/appserver/products/ASC.People/server/"
|
||||
cp -rf %{_builddir}%{_var}/www/appserver/services/apisystem/* "%{buildroot}%{_var}/www/appserver/services/apisystem/"
|
||||
cp -rf %{_builddir}%{_var}/www/appserver/services/backup/* "%{buildroot}%{_var}/www/appserver/services/backup/"
|
||||
cp -rf %{_builddir}%{_var}/www/appserver/services/notify/* "%{buildroot}%{_var}/www/appserver/services/notify/"
|
||||
cp -rf %{_builddir}%{_var}/www/appserver/services/studio.notify/* "%{buildroot}%{_var}/www/appserver/services/studio.notify/"
|
||||
cp -rf %{_builddir}%{_var}/www/appserver/studio/api/* "%{buildroot}%{_var}/www/appserver/studio/api"
|
||||
cp -rf %{_builddir}%{_var}/www/appserver/studio/server/* "%{buildroot}%{_var}/www/appserver/studio/server/"
|
||||
cp -rf %{_builddir}/AppServer-%GIT_BRANCH/build/install/docker/config/*.sql "%{buildroot}%{_var}/www/appserver/sql"
|
||||
cp -rf %{_builddir}/AppServer-%GIT_BRANCH/build/install/rpm/*.sh "%{buildroot}%{_bindir}/"
|
||||
cp -rf %{_builddir}/AppServer-%GIT_BRANCH/build/install/common/systemd/modules/* "%{buildroot}%{_sysconfdir}/systemd/system"
|
||||
cp -rf %{_builddir}/AppServer-%GIT_BRANCH/common/ASC.Socket.IO/* "%{buildroot}/services/ASC.Socket.IO"
|
||||
cp -rf %{_builddir}/AppServer-%GIT_BRANCH/common/ASC.Thumbnails/* "%{buildroot}/services/ASC.Thumbnails"
|
||||
cp -rf %{_builddir}/AppServer-%GIT_BRANCH/common/ASC.UrlShortener/* "%{buildroot}/services/ASC.UrlShortener"
|
||||
cp -rf %{_builddir}/AppServer-%GIT_BRANCH/config/* "%{buildroot}%{_sysconfdir}/onlyoffice/appserver/"
|
||||
cp -rf %{_builddir}/AppServer-%GIT_BRANCH/config/nginx/includes/onlyoffice*.conf "%{buildroot}%{_sysconfdir}/nginx/includes/"
|
||||
cp -rf %{_builddir}/AppServer-%GIT_BRANCH/config/nginx/onlyoffice*.conf "%{buildroot}%{_sysconfdir}/nginx/conf.d/"
|
||||
cp -rf %{_builddir}/AppServer-%GIT_BRANCH/products/ASC.Files/Client/build/* "%{buildroot}%{_var}/www/appserver/products/ASC.Files/client"
|
||||
cp -rf %{_builddir}/AppServer-%GIT_BRANCH/products/ASC.People/Client/build/* "%{buildroot}%{_var}/www/appserver/products/ASC.People/client"
|
||||
cp -rf %{_builddir}/AppServer-%GIT_BRANCH/public/* "%{buildroot}%{_var}/www/appserver/public/"
|
||||
cp -rf %{_builddir}/AppServer-%GIT_BRANCH/web/ASC.Web.Client/build/* "%{buildroot}%{_var}/www/appserver/studio/client"
|
||||
cp -rf %{_builddir}/AppServer-%GIT_BRANCH/web/ASC.Web.Components/storybook-static/* "%{buildroot}%{_var}/www/appserver/story/"
|
||||
cp -rf %{_builddir}/services/socket/service/* "%{buildroot}/services/ASC.Socket.IO/service/"
|
||||
cp -rf %{_builddir}/services/thumb/service/* "%{buildroot}/services/ASC.Thumbnails/service/"
|
||||
cp -rf %{_builddir}/services/urlshortener/service/* "%{buildroot}/services/ASC.UrlShortener/service/"
|
112
build/install/rpm/SPECS/package.spec
Normal file
112
build/install/rpm/SPECS/package.spec
Normal file
@ -0,0 +1,112 @@
|
||||
%package backup
|
||||
Summary: backup
|
||||
Group: Applications/Internet
|
||||
Requires: %name-common
|
||||
Requires: dotnet-sdk-3.1
|
||||
AutoReqProv: no
|
||||
%description backup
|
||||
|
||||
%package common
|
||||
Summary: common
|
||||
Group: Applications/Internet
|
||||
%description common
|
||||
|
||||
%package files_services
|
||||
Summary: files_services
|
||||
Group: Applications/Internet
|
||||
Requires: %name-common
|
||||
Requires: dotnet-sdk-3.1
|
||||
AutoReqProv: no
|
||||
%description files_services
|
||||
|
||||
%package notify
|
||||
Summary: notify
|
||||
Group: Applications/Internet
|
||||
Requires: %name-common
|
||||
Requires: dotnet-sdk-3.1
|
||||
AutoReqProv: no
|
||||
%description notify
|
||||
|
||||
%package files
|
||||
Summary: files
|
||||
Group: Applications/Internet
|
||||
Requires: %name-common
|
||||
Requires: dotnet-sdk-3.1
|
||||
AutoReqProv: no
|
||||
%description files
|
||||
|
||||
%package api_system
|
||||
Summary: api_system
|
||||
Group: Applications/Internet
|
||||
Requires: %name-common
|
||||
Requires: dotnet-sdk-3.1
|
||||
AutoReqProv: no
|
||||
%description api_system
|
||||
|
||||
%package proxy
|
||||
Summary: proxy
|
||||
Group: Applications/Internet
|
||||
Requires: %name-common
|
||||
Requires: nginx >= 1.9.5
|
||||
Requires: mysql-community-client >= 5.7.0
|
||||
AutoReqProv: no
|
||||
%description proxy
|
||||
|
||||
%package studio.notify
|
||||
Summary: studio.notify
|
||||
Group: Applications/Internet
|
||||
Requires: %name-common
|
||||
Requires: dotnet-sdk-3.1
|
||||
AutoReqProv: no
|
||||
%description studio.notify
|
||||
|
||||
%package people.server
|
||||
Summary: people.server
|
||||
Group: Applications/Internet
|
||||
Requires: %name-common
|
||||
Requires: dotnet-sdk-3.1
|
||||
AutoReqProv: no
|
||||
%description people.server
|
||||
|
||||
%package urlshortener
|
||||
Summary: urlshortener
|
||||
Group: Applications/Internet
|
||||
Requires: %name-common
|
||||
Requires: dotnet-sdk-3.1
|
||||
Requires: nodejs >= 12.0
|
||||
AutoReqProv: no
|
||||
%description urlshortener
|
||||
|
||||
%package socket
|
||||
Summary: socket
|
||||
Group: Applications/Internet
|
||||
Requires: %name-common
|
||||
Requires: dotnet-sdk-3.1
|
||||
Requires: nodejs >= 12.0
|
||||
AutoReqProv: no
|
||||
%description socket
|
||||
|
||||
%package thumbnails
|
||||
Summary: thumbnails
|
||||
Group: Applications/Internet
|
||||
Requires: %name-common
|
||||
Requires: dotnet-sdk-3.1
|
||||
Requires: nodejs >= 12.0
|
||||
AutoReqProv: no
|
||||
%description thumbnails
|
||||
|
||||
%package studio
|
||||
Summary: studio
|
||||
Group: Applications/Internet
|
||||
Requires: %name-common
|
||||
Requires: dotnet-sdk-3.1
|
||||
AutoReqProv: no
|
||||
%description studio
|
||||
|
||||
%package api
|
||||
Summary: api
|
||||
Group: Applications/Internet
|
||||
Requires: %name-common
|
||||
Requires: dotnet-sdk-3.1
|
||||
AutoReqProv: no
|
||||
%description api
|
547
build/install/rpm/appserver-configuration.sh
Normal file
547
build/install/rpm/appserver-configuration.sh
Normal file
@ -0,0 +1,547 @@
|
||||
#!/bin/bash
|
||||
ENVIRONMENT="production"
|
||||
|
||||
APP_DIR="/etc/onlyoffice/appserver"
|
||||
APP_CONF="$APP_DIR/appsettings.json"
|
||||
USER_CONF="$APP_DIR/appsettings.$ENVIRONMENT.json"
|
||||
NGINX_CONF="/etc/nginx/conf.d"
|
||||
SYSTEMD_DIR="/etc/systemd/system"
|
||||
|
||||
MYSQL=""
|
||||
DB_HOST=""
|
||||
DB_PORT="3306"
|
||||
DB_NAME=""
|
||||
DB_USER=""
|
||||
DB_PWD=""
|
||||
|
||||
APP_HOST="localhost"
|
||||
APP_PORT="80"
|
||||
|
||||
DOCUMENT_SERVER_HOST="localhost";
|
||||
DOCUMENT_SERVER_PORT="8083";
|
||||
|
||||
KAFKA_HOST="localhost"
|
||||
KAFKA_PORT="9092"
|
||||
ZOOKEEPER_HOST="localhost"
|
||||
ZOOKEEPER_PORT="2181"
|
||||
|
||||
ELK_SHEME="http"
|
||||
ELK_HOST="localhost"
|
||||
ELK_PORT="9200"
|
||||
|
||||
JSON="json -I -f"
|
||||
JSON_USERCONF="$JSON $USER_CONF -e"
|
||||
JSON_DSCONF="$JSON $DS_CONF -e"
|
||||
|
||||
[ $(id -u) -ne 0 ] && { echo "Root privileges required"; exit 1; }
|
||||
|
||||
while [ "$1" != "" ]; do
|
||||
case $1 in
|
||||
|
||||
-ash | --appshost )
|
||||
if [ "$2" != "" ]; then
|
||||
APP_HOST=$2
|
||||
shift
|
||||
fi
|
||||
;;
|
||||
|
||||
-asp | --appsport )
|
||||
if [ "$2" != "" ]; then
|
||||
APP_PORT=$2
|
||||
shift
|
||||
fi
|
||||
;;
|
||||
|
||||
-dsh | --docshost )
|
||||
if [ "$2" != "" ]; then
|
||||
DOCUMENT_SERVER_HOST=$2
|
||||
shift
|
||||
fi
|
||||
;;
|
||||
|
||||
-dsp | --docsport )
|
||||
if [ "$2" != "" ]; then
|
||||
DOCUMENT_SERVER_PORT=$2
|
||||
shift
|
||||
fi
|
||||
;;
|
||||
|
||||
-kh | --kafkahost )
|
||||
if [ "$2" != "" ]; then
|
||||
KAFKA_HOST=$2
|
||||
shift
|
||||
fi
|
||||
;;
|
||||
|
||||
-kp | --kafkaport )
|
||||
if [ "$2" != "" ]; then
|
||||
KAFKA_PORT=$2
|
||||
shift
|
||||
fi
|
||||
;;
|
||||
|
||||
-zkh | --zookeeperhost )
|
||||
if [ "$2" != "" ]; then
|
||||
ZOOKEEPER_HOST=$2
|
||||
shift
|
||||
fi
|
||||
;;
|
||||
|
||||
-zkp | --zookeeperport )
|
||||
if [ "$2" != "" ]; then
|
||||
ZOOKEEPER_HOST=$2
|
||||
shift
|
||||
fi
|
||||
;;
|
||||
|
||||
-esh | --elastichost )
|
||||
if [ "$2" != "" ]; then
|
||||
ELK_HOST=$2
|
||||
shift
|
||||
fi
|
||||
;;
|
||||
|
||||
-esp | --elasticport )
|
||||
if [ "$2" != "" ]; then
|
||||
ELK_HOST=$2
|
||||
shift
|
||||
fi
|
||||
;;
|
||||
|
||||
-e | --environment )
|
||||
if [ "$2" != "" ]; then
|
||||
ENVIRONMENT=$2
|
||||
shift
|
||||
fi
|
||||
;;
|
||||
|
||||
-? | -h | --help )
|
||||
echo " Usage: bash appserver-configuration.sh [PARAMETER] [[PARAMETER], ...]"
|
||||
echo
|
||||
echo " Parameters:"
|
||||
echo " -ash, --appshost appserver ip"
|
||||
echo " -asp, --appsport appserver port (default 80)"
|
||||
echo " -dsh, --docshost document server ip"
|
||||
echo " -dsp, --docsport document server port (default 8083)"
|
||||
echo " -kh, --kafkahost kafka ip"
|
||||
echo " -kp, --kafkaport kafka port (default 9092)"
|
||||
echo " -zkh, --zookeeperhost zookeeper ip"
|
||||
echo " -zkp, --zookeeperport zookeeper port (default 2181)"
|
||||
echo " -esh, --elastichost elasticsearch ip"
|
||||
echo " -esp, --elasticport elasticsearch port (default 9200)"
|
||||
echo " -e, --environment environment (default 'production')"
|
||||
echo " -?, -h, --help this help"
|
||||
echo
|
||||
exit 0
|
||||
;;
|
||||
|
||||
* )
|
||||
echo "Unknown parameter $1" 1>&2
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
shift
|
||||
done
|
||||
|
||||
set_core_machinekey () {
|
||||
if [ -f $APP_DIR/.private/machinekey ]; then
|
||||
CORE_MACHINEKEY=$(cat $APP_DIR/.private/machinekey)
|
||||
else
|
||||
CORE_MACHINEKEY=$(cat /dev/urandom | tr -dc A-Za-z0-9 | head -c 12);
|
||||
echo $CORE_MACHINEKEY >> $APP_DIR/.private/machinekey
|
||||
fi
|
||||
}
|
||||
|
||||
install_json() {
|
||||
|
||||
if [ ! -e /usr/bin/json ]; then
|
||||
echo -n "Install json package... "
|
||||
npm i json -g >/dev/null 2>&1
|
||||
echo "OK"
|
||||
fi
|
||||
|
||||
#Creating a user-defined .json
|
||||
if [ ! -e $USER_CONF ]; then
|
||||
echo "{}" >> $USER_CONF
|
||||
chown onlyoffice:onlyoffice $USER_CONF
|
||||
|
||||
set_core_machinekey
|
||||
$JSON_USERCONF "this.core={'base-domain': \"$APP_HOST\", 'machinekey': \"$CORE_MACHINEKEY\"}" >/dev/null 2>&1
|
||||
$JSON $APP_CONF -e "this.core.products.subfolder='server'" >/dev/null 2>&1 #Fix error
|
||||
fi
|
||||
}
|
||||
|
||||
restart_services() {
|
||||
echo -n "Restarting services... "
|
||||
|
||||
for SVC in nginx mysqld appserver-api appserver-socket appserver-api_system appserver-backup \
|
||||
appserver-files appserver-files_service appserver-notify appserver-people appserver-studio appserver-studio_notify \
|
||||
appserver-thumbnails appserver-urlshortener elasticsearch kafka zookeeper
|
||||
do
|
||||
sed -i "s/ENVIRONMENT=.*/ENVIRONMENT=$ENVIRONMENT/" $SYSTEMD_DIR/$SVC.service >/dev/null 2>&1
|
||||
|
||||
if systemctl is-active $SVC | grep -q "active"; then
|
||||
systemctl restart $SVC.service >/dev/null 2>&1
|
||||
else
|
||||
systemctl enable $SVC.service >/dev/null 2>&1
|
||||
systemctl start $SVC.service >/dev/null 2>&1
|
||||
fi
|
||||
if systemctl is-active $SVC | grep -v "active" >/dev/null; then
|
||||
echo -e "\033[31m $SVC not started \033[0m"
|
||||
fi
|
||||
done
|
||||
echo "OK"
|
||||
}
|
||||
|
||||
input_db_params(){
|
||||
local user_connectionString=$(json -f $USER_CONF ConnectionStrings.default.connectionString)
|
||||
local def_DB_HOST=$(echo $user_connectionString | grep -oP 'Server=\K.*' | grep -o '^[^;]*')
|
||||
local def_DB_NAME=$(echo $user_connectionString | grep -oP 'Database=\K.*' | grep -o '^[^;]*')
|
||||
local def_DB_USER=$(echo $user_connectionString | grep -oP 'User ID=\K.*' | grep -o '^[^;]*')
|
||||
|
||||
read -e -p "Database host: " -i "$DB_HOST" DB_HOST
|
||||
read -e -p "Database name: " -i "$DB_NAME" DB_NAME
|
||||
read -e -p "Database user: " -i "$DB_USER" DB_USER
|
||||
read -e -p "Database password: " -s DB_PWD
|
||||
|
||||
if [ -z $DB_HOST ]; then
|
||||
DB_HOST="${def_DB_HOST}";
|
||||
fi
|
||||
|
||||
if [ -z $DB_NAME ]; then
|
||||
DB_NAME="${def_DB_NAME}";
|
||||
fi
|
||||
|
||||
if [ -z $DB_USER ]; then
|
||||
DB_USER="${def_DB_USER}";
|
||||
fi
|
||||
|
||||
echo
|
||||
}
|
||||
|
||||
establish_mysql_conn(){
|
||||
echo -n "Trying to establish MySQL connection... "
|
||||
|
||||
command -v mysql >/dev/null 2>&1 || { echo "MySQL client not found"; exit 1; }
|
||||
|
||||
MYSQL="mysql -h$DB_HOST -u$DB_USER"
|
||||
if [ -n "$DB_PWD" ]; then
|
||||
MYSQL="$MYSQL -p$DB_PWD"
|
||||
fi
|
||||
|
||||
$MYSQL -e ";" >/dev/null 2>&1
|
||||
ERRCODE=$?
|
||||
if [ $ERRCODE -ne 0 ]; then
|
||||
systemctl mysqld start >/dev/null 2>&1
|
||||
$MYSQL -e ";" >/dev/null 2>&1 || { echo "FAILURE"; exit 1; }
|
||||
fi
|
||||
|
||||
#Save db settings in .json
|
||||
$JSON_USERCONF "this.ConnectionStrings={'default': {'connectionString': \
|
||||
\"Server=$DB_HOST;Port=$DB_PORT;Database=$DB_NAME;User ID=$DB_USER;Password=$DB_PWD;Pooling=true;Character Set=utf8;AutoEnlist=false;SSL Mode=none\"}}" >/dev/null 2>&1
|
||||
|
||||
echo "OK"
|
||||
}
|
||||
|
||||
mysql_check_connection() {
|
||||
while ! $MYSQL -e ";" >/dev/null 2>&1; do
|
||||
sleep 1
|
||||
done
|
||||
}
|
||||
|
||||
change_mysql_config(){
|
||||
local CNF_PATH="/etc/my.cnf";
|
||||
local CNF_SERVICE_PATH="/usr/lib/systemd/system/mysqld.service";
|
||||
|
||||
if ! grep -q "\[mysqld\]" ${CNF_PATH}; then
|
||||
CNF_PATH="/etc/my.cnf.d/server.cnf";
|
||||
|
||||
if ! grep -q "\[mysqld\]" ${CNF_PATH}; then
|
||||
exit 1;
|
||||
fi
|
||||
fi
|
||||
|
||||
if ! grep -q "\[Unit\]" ${CNF_SERVICE_PATH}; then
|
||||
CNF_SERVICE_PATH="/lib/systemd/system/mysqld.service";
|
||||
|
||||
if ! grep -q "\[Unit\]" ${CNF_SERVICE_PATH}; then
|
||||
CNF_SERVICE_PATH="/lib/systemd/system/mariadb.service";
|
||||
|
||||
if ! grep -q "\[Unit\]" ${CNF_SERVICE_PATH}; then
|
||||
exit 1;
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
|
||||
sed '/skip-networking/d' -i ${CNF_PATH} || true # ignore errors
|
||||
|
||||
if ! grep -q "^sql_mode" ${CNF_PATH}; then
|
||||
sed "/\[mysqld\]/a sql_mode = 'NO_ENGINE_SUBSTITUTION'" -i ${CNF_PATH} # disable new STRICT mode in mysql 5.7
|
||||
else
|
||||
sed "s/sql_mode.*/sql_mode = 'NO_ENGINE_SUBSTITUTION'/" -i ${CNF_PATH} || true # ignore errors
|
||||
fi
|
||||
|
||||
if ! grep -q "^max_connections" ${CNF_PATH}; then
|
||||
sed '/\[mysqld\]/a max_connections = 1000' -i ${CNF_PATH}
|
||||
else
|
||||
sed "s/max_connections.*/max_connections = 1000/" -i ${CNF_PATH} || true # ignore errors
|
||||
fi
|
||||
|
||||
if ! grep -q "^group_concat_max_len" ${CNF_PATH}; then
|
||||
sed '/\[mysqld\]/a group_concat_max_len = 2048' -i ${CNF_PATH}
|
||||
else
|
||||
sed "s/group_concat_max_len.*/group_concat_max_len = 2048/" -i ${CNF_PATH} || true # ignore errors
|
||||
fi
|
||||
|
||||
if ! grep -q "^max_allowed_packet" ${CNF_PATH}; then
|
||||
sed '/\[mysqld\]/a max_allowed_packet = 1048576000' -i ${CNF_PATH}
|
||||
else
|
||||
sed "s/max_allowed_packet.*/max_allowed_packet = 1048576000/" -i ${CNF_PATH} || true # ignore errors
|
||||
fi
|
||||
|
||||
if ! grep -q "^character_set_server" ${CNF_PATH}; then
|
||||
sed '/\[mysqld\]/a character_set_server = utf8' -i ${CNF_PATH}
|
||||
else
|
||||
sed "s/character_set_server.*/character_set_server = utf8/" -i ${CNF_PATH} || true # ignore errors
|
||||
fi
|
||||
|
||||
if ! grep -q "^collation_server" ${CNF_PATH}; then
|
||||
sed '/\[mysqld\]/a collation_server = utf8_general_ci' -i ${CNF_PATH}
|
||||
else
|
||||
sed "s/collation_server.*/collation_server = utf8_general_ci/" -i ${CNF_PATH} || true # ignore errors
|
||||
fi
|
||||
|
||||
if ! grep -q "^default-authentication-plugin" ${CNF_PATH}; then
|
||||
sed '/\[mysqld\]/a default-authentication-plugin = mysql_native_password' -i ${CNF_PATH}
|
||||
else
|
||||
sed "s/default-authentication-plugin.*/default-authentication-plugin = mysql_native_password/" -i ${CNF_PATH} || true # ignore errors
|
||||
fi
|
||||
|
||||
if ! grep -q "^LimitNOFILE" ${CNF_SERVICE_PATH}; then
|
||||
sed '/\[Service\]/a LimitNOFILE = infinity' -i ${CNF_SERVICE_PATH}
|
||||
else
|
||||
sed "s/LimitNOFILE.*/LimitNOFILE = infinity/" -i ${CNF_SERVICE_PATH} || true # ignore errors
|
||||
fi
|
||||
|
||||
if ! grep -q "^LimitMEMLOCK" ${CNF_SERVICE_PATH}; then
|
||||
sed '/\[Service\]/a LimitMEMLOCK = infinity' -i ${CNF_SERVICE_PATH}
|
||||
else
|
||||
sed "s/LimitMEMLOCK.*/LimitMEMLOCK = infinity/" -i ${CNF_SERVICE_PATH} || true # ignore errors
|
||||
fi
|
||||
|
||||
systemctl daemon-reload >/dev/null 2>&1
|
||||
systemctl restart mysqld >/dev/null 2>&1
|
||||
}
|
||||
|
||||
execute_mysql_script(){
|
||||
|
||||
change_mysql_config
|
||||
|
||||
mysql_check_connection
|
||||
|
||||
if [ "$DB_USER" = "root" ] && [ ! "$(mysql -V | grep ' 5.5.')" ]; then
|
||||
# allow connect via mysql_native_password with root and empty password
|
||||
$MYSQL -D "mysql" -e "update user set plugin='mysql_native_password' where user='root';ALTER USER '${DB_USER}'@'localhost' IDENTIFIED WITH mysql_native_password BY '${DB_PWD}';" >/dev/null 2>&1
|
||||
fi
|
||||
|
||||
#Checking the quantity of the tables created in the db
|
||||
DB_TABLES_COUNT=$($MYSQL --silent --skip-column-names -e "SELECT COUNT(*) FROM information_schema.tables WHERE table_schema='${DB_NAME}'");
|
||||
|
||||
if [ "${DB_TABLES_COUNT}" -eq "0" ]; then
|
||||
local SQL_DIR="/var/www/appserver/sql"
|
||||
|
||||
echo -n "Installing MYSQL database... "
|
||||
|
||||
#Adding data to the db
|
||||
sed -i -e '1 s/^/SET SQL_MODE='ALLOW_INVALID_DATES';\n/;' $SQL_DIR/onlyoffice.sql
|
||||
$MYSQL -e "CREATE DATABASE IF NOT EXISTS $DB_NAME CHARACTER SET utf8 COLLATE 'utf8_general_ci';" >/dev/null 2>&1
|
||||
$MYSQL "$DB_NAME" < "$SQL_DIR/createdb.sql" >/dev/null 2>&1
|
||||
$MYSQL "$DB_NAME" < "$SQL_DIR/onlyoffice.sql" >/dev/null 2>&1
|
||||
$MYSQL "$DB_NAME" < "$SQL_DIR/onlyoffice.data.sql" >/dev/null 2>&1
|
||||
$MYSQL "$DB_NAME" < "$SQL_DIR/onlyoffice.resources.sql" >/dev/null 2>&1
|
||||
else
|
||||
echo -n "Upgrading MySQL database... "
|
||||
fi
|
||||
echo "OK"
|
||||
}
|
||||
|
||||
setup_nginx(){
|
||||
echo -n "Configuring nginx... "
|
||||
|
||||
mv -f $NGINX_CONF/default.conf $NGINX_CONF/default.conf.old >/dev/null 2>&1
|
||||
|
||||
sed -i "s/listen.*;/listen $APP_PORT;/" $NGINX_CONF/onlyoffice.conf
|
||||
|
||||
shopt -s nocasematch
|
||||
PORTS=()
|
||||
if $(getenforce) >/dev/null 2>&1; then
|
||||
case $(getenforce) in
|
||||
enforcing|permissive)
|
||||
PORTS+=('8081') #Storybook
|
||||
PORTS+=("$DOCUMENT_SERVER_PORT")
|
||||
PORTS+=('5001') #ASC.Web.Studio
|
||||
PORTS+=('5002') #ASC.People
|
||||
PORTS+=('5008') #ASC.Files
|
||||
setsebool -P httpd_can_network_connect on
|
||||
;;
|
||||
disabled)
|
||||
:
|
||||
;;
|
||||
esac
|
||||
|
||||
for PORT in ${PORTS[@]}; do
|
||||
semanage port -a -t http_port_t -p tcp $PORT >/dev/null 2>&1 || \
|
||||
semanage port -m -t http_port_t -p tcp $PORT >/dev/null 2>&1 || \
|
||||
true
|
||||
done
|
||||
fi
|
||||
chown nginx:nginx /etc/nginx/* -R
|
||||
sudo sed -e 's/#//' -i $NGINX_CONF/onlyoffice.conf
|
||||
echo "OK"
|
||||
}
|
||||
|
||||
setup_docs() {
|
||||
echo -n "Configuring Docs... "
|
||||
local DS_CONF="/etc/onlyoffice/documentserver/local.json"
|
||||
|
||||
#Changing the Docs port in nginx conf
|
||||
sed -i "s/0.0.0.0:.*;/0.0.0.0:$DOCUMENT_SERVER_PORT;/" $NGINX_CONF/ds.conf
|
||||
sed -i "s/]:.*;/]:$DOCUMENT_SERVER_PORT default_server;/g" $NGINX_CONF/ds.conf
|
||||
sed "0,/proxy_pass .*;/{s/proxy_pass .*;/proxy_pass http:\/\/${DOCUMENT_SERVER_HOST}:${DOCUMENT_SERVER_PORT};/}" -i $NGINX_CONF/onlyoffice.conf
|
||||
|
||||
#Enable JWT validation for Docs
|
||||
$JSON_DSCONF "this.services.CoAuthoring.token.enable.browser='true'" >/dev/null 2>&1
|
||||
$JSON_DSCONF "this.services.CoAuthoring.token.enable.request.inbox='true'" >/dev/null 2>&1
|
||||
$JSON_DSCONF "this.services.CoAuthoring.token.enable.request.outbox='true'" >/dev/null 2>&1
|
||||
|
||||
local DOCUMENT_SERVER_JWT_SECRET=$(cat ${DS_CONF} | json services.CoAuthoring.secret.inbox.string)
|
||||
local DOCUMENT_SERVER_JWT_HEADER=$(cat ${DS_CONF} | json services.CoAuthoring.token.inbox.header)
|
||||
|
||||
#Save Docs address and JWT in .json
|
||||
$JSON_USERCONF "this.files={'docservice': {\
|
||||
'secret': {'value': \"$DOCUMENT_SERVER_JWT_SECRET\",'header': \"$DOCUMENT_SERVER_JWT_HEADER\"}, \
|
||||
'url': {'public': '/ds-vpath/','internal': \"http://${DOCUMENT_SERVER_HOST}:${DOCUMENT_SERVER_PORT}\",'portal': \"http://$APP_HOST:$APP_PORT\"}}}" >/dev/null 2>&1
|
||||
|
||||
#Enable ds-example autostart
|
||||
sudo sed 's,autostart=false,autostart=true,' -i /etc/supervisord.d/ds-example.ini
|
||||
sudo supervisorctl start ds:example >/dev/null 2>&1
|
||||
|
||||
echo "OK"
|
||||
}
|
||||
|
||||
change_elasticsearch_config(){
|
||||
local ELASTIC_SEARCH_VERSION=$(rpm -qi elasticsearch | grep Version | tail -n1 | awk -F': ' '/Version/ {print $2}');
|
||||
local ELASTIC_SEARCH_CONF_PATH="/etc/elasticsearch/elasticsearch.yml"
|
||||
local ELASTIC_SEARCH_JAVA_CONF_PATH="/etc/elasticsearch/jvm.options";
|
||||
|
||||
if /usr/share/elasticsearch/bin/elasticsearch-plugin list | grep -q "ingest-attachment"; then
|
||||
/usr/share/elasticsearch/bin/elasticsearch-plugin remove -s ingest-attachment
|
||||
fi
|
||||
/usr/share/elasticsearch/bin/elasticsearch-plugin install -s -b ingest-attachment
|
||||
|
||||
if [ -f ${ELASTIC_SEARCH_CONF_PATH}.rpmnew ]; then
|
||||
cp -rf ${ELASTIC_SEARCH_CONF_PATH}.rpmnew ${ELASTIC_SEARCH_CONF_PATH};
|
||||
fi
|
||||
|
||||
if [ -f ${ELASTIC_SEARCH_JAVA_CONF_PATH}.rpmnew ]; then
|
||||
cp -rf ${ELASTIC_SEARCH_JAVA_CONF_PATH}.rpmnew ${ELASTIC_SEARCH_JAVA_CONF_PATH};
|
||||
fi
|
||||
|
||||
if ! grep -q "indices.fielddata.cache.size" ${ELASTIC_SEARCH_CONF_PATH}; then
|
||||
echo "indices.fielddata.cache.size: 30%" >> ${ELASTIC_SEARCH_CONF_PATH}
|
||||
else
|
||||
sed -i "s/indices.fielddata.cache.size.*/indices.fielddata.cache.size: 30%/" ${ELASTIC_SEARCH_CONF_PATH}
|
||||
fi
|
||||
|
||||
if ! grep -q "indices.memory.index_buffer_size" ${ELASTIC_SEARCH_CONF_PATH}; then
|
||||
echo "indices.memory.index_buffer_size: 30%" >> ${ELASTIC_SEARCH_CONF_PATH}
|
||||
else
|
||||
sed -i "s/indices.memory.index_buffer_size.*/indices.memory.index_buffer_size: 30%/" ${ELASTIC_SEARCH_CONF_PATH}
|
||||
fi
|
||||
|
||||
if grep -q "HeapDumpOnOutOfMemoryError" ${ELASTIC_SEARCH_JAVA_CONF_PATH}; then
|
||||
sed "/-XX:+HeapDumpOnOutOfMemoryError/d" -i ${ELASTIC_SEARCH_JAVA_CONF_PATH}
|
||||
fi
|
||||
|
||||
local TOTAL_MEMORY=$(free -m | grep -oP '\d+' | head -n 1);
|
||||
local MEMORY_REQUIREMENTS=12228; #RAM ~4*3Gb
|
||||
|
||||
if [ ${TOTAL_MEMORY} -gt ${MEMORY_REQUIREMENTS} ]; then
|
||||
if ! grep -q "[-]Xms1g" ${ELASTIC_SEARCH_JAVA_CONF_PATH}; then
|
||||
echo "-Xms4g" >> ${ELASTIC_SEARCH_JAVA_CONF_PATH}
|
||||
else
|
||||
sed -i "s/-Xms1g/-Xms4g/" ${ELASTIC_SEARCH_JAVA_CONF_PATH}
|
||||
fi
|
||||
|
||||
if ! grep -q "[-]Xmx1g" ${ELASTIC_SEARCH_JAVA_CONF_PATH}; then
|
||||
echo "-Xmx4g" >> ${ELASTIC_SEARCH_JAVA_CONF_PATH}
|
||||
else
|
||||
sed -i "s/-Xmx1g/-Xmx4g/" ${ELASTIC_SEARCH_JAVA_CONF_PATH}
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ -d /etc/elasticsearch/ ]; then
|
||||
chmod g+ws /etc/elasticsearch/
|
||||
fi
|
||||
}
|
||||
|
||||
setup_elasticsearch() {
|
||||
echo -n "Configuring elasticsearch... "
|
||||
|
||||
#Save elasticsearch parameters in .json
|
||||
$JSON_USERCONF "this.elastic={'Scheme': \"${ELK_SHEME}\",'Host': \"${ELK_HOST}\",'Port': \"${ELK_PORT}\" }" >/dev/null 2>&1
|
||||
|
||||
change_elasticsearch_config
|
||||
|
||||
echo "OK"
|
||||
}
|
||||
|
||||
setup_kafka() {
|
||||
|
||||
local KAFKA_SERVICE=$(systemctl --type=service | grep 'kafka' | tr -d '●' | awk '{print $1;}')
|
||||
|
||||
if [ $KAFKA_SERVICE ]; then
|
||||
|
||||
echo -n "Configuring kafka... "
|
||||
|
||||
#Change kafka config
|
||||
local KAFKA_CONF="$(cat $SYSTEMD_DIR/$KAFKA_SERVICE | grep ExecStop= | cut -c 10- | rev | cut -c 26- | rev)/config"
|
||||
sed -i "s/clientPort=.*/clientPort=${ZOOKEEPER_PORT}/g" $KAFKA_CONF/zookeeper.properties
|
||||
sed -i "s/zookeeper.connect=.*/zookeeper.connect=${ZOOKEEPER_HOST}:${ZOOKEEPER_PORT}/g" $KAFKA_CONF/server.properties
|
||||
sed -i "s/bootstrap.servers=.*/bootstrap.servers=${KAFKA_HOST}:${KAFKA_PORT}/g" $KAFKA_CONF/consumer.properties
|
||||
sed -i "s/bootstrap.servers=.*/bootstrap.servers=${KAFKA_HOST}:${KAFKA_PORT}/g" $KAFKA_CONF/connect-standalone.properties
|
||||
sed -i "s/logger.kafka.controller=.*,/logger.kafka.controller=INFO,/g" $KAFKA_CONF/log4j.properties
|
||||
sed -i "s/logger.state.change.logger=.*,/logger.state.change.logger=INFO,/g" $KAFKA_CONF/log4j.properties
|
||||
echo "log4j.logger.kafka.producer.async.DefaultEventHandler=INFO, kafkaAppender" >> $KAFKA_CONF/log4j.properties
|
||||
|
||||
#Save kafka parameters in .json
|
||||
$JSON_USERCONF "this.kafka={'BootstrapServers': \"${KAFKA_HOST}:${KAFKA_PORT}\"}" >/dev/null 2>&1
|
||||
|
||||
echo "OK"
|
||||
fi
|
||||
|
||||
}
|
||||
|
||||
install_json
|
||||
|
||||
if rpm -q mysql-community-client >/dev/null; then
|
||||
input_db_params
|
||||
establish_mysql_conn || exit $?
|
||||
execute_mysql_script || exit $?
|
||||
fi
|
||||
|
||||
if rpm -q nginx >/dev/null; then
|
||||
setup_nginx
|
||||
fi
|
||||
|
||||
if rpm -q onlyoffice-documentserver >/dev/null || rpm -q onlyoffice-documentserver-de >/dev/null || rpm -q onlyoffice-documentserver-ee >/dev/null; then
|
||||
setup_docs
|
||||
fi
|
||||
|
||||
if rpm -q elasticsearch >/dev/null; then
|
||||
setup_elasticsearch
|
||||
fi
|
||||
|
||||
setup_kafka
|
||||
|
||||
restart_services
|
Loading…
Reference in New Issue
Block a user