f7cloud_client/install.sh
root 0af50038fe Add installation script with Talk config support
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-18 13:54:46 +00:00

501 lines
20 KiB
Bash
Executable File
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/bin/bash
#
# Скрипт инициализации F7cloud клиента
# Устанавливает зависимости, настраивает Apache, Redis, PostgreSQL
#
set -e
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
INSTALL_DIR="$SCRIPT_DIR"
CONFIG_FILE="$INSTALL_DIR/config/config.php"
DATA_DIR="/data"
APACHE_USER="www-data"
echo "=========================================="
echo "F7cloud Client Installation Script"
echo "=========================================="
echo ""
# Проверка прав root
if [ "$EUID" -ne 0 ]; then
echo "Ошибка: Скрипт должен запускаться от root"
exit 1
fi
# Функция генерации случайной строки
generate_random() {
openssl rand -hex 32
}
# Функция генерации instanceid
generate_instanceid() {
openssl rand -hex 4
}
# Проверка и установка зависимостей
echo "[1/7] Проверка зависимостей..."
# PHP
if ! command -v php &> /dev/null; then
echo "Установка PHP..."
apt-get update -qq
apt-get install -y php-fpm php-cli php-common php-mysql php-pgsql php-curl php-gd php-mbstring php-xml php-zip php-bcmath php-intl php-redis php-apcu php-imagick 2>/dev/null
fi
PHP_VERSION=$(php -r 'echo PHP_VERSION;')
echo "✓ PHP $PHP_VERSION установлен"
# Apache
if ! command -v apache2 &> /dev/null && ! command -v httpd &> /dev/null; then
echo "Установка Apache..."
apt-get install -y apache2 libapache2-mod-php 2>/dev/null
fi
if command -v apache2 &> /dev/null; then
APACHE_CMD="apache2ctl"
APACHE_SERVICE="apache2"
elif command -v httpd &> /dev/null; then
APACHE_CMD="apachectl"
APACHE_SERVICE="httpd"
else
echo "Ошибка: Apache не найден"
exit 1
fi
echo "✓ Apache установлен"
# Включить необходимые модули Apache
echo "Включение модулей Apache..."
a2enmod rewrite headers env dir mime setenvif 2>/dev/null || true
a2enmod php* 2>/dev/null || true
# PostgreSQL клиент
if ! command -v psql &> /dev/null; then
echo "Установка PostgreSQL клиента..."
apt-get install -y postgresql-client 2>/dev/null
fi
echo "✓ PostgreSQL клиент установлен"
# Redis
if ! command -v redis-cli &> /dev/null; then
echo "[2/7] Установка Redis..."
apt-get install -y redis-server 2>/dev/null
# Настройка Redis
sed -i 's/^# maxmemory <bytes>/maxmemory 256mb/' /etc/redis/redis.conf 2>/dev/null || true
sed -i 's/^# maxmemory-policy noeviction/maxmemory-policy allkeys-lru/' /etc/redis/redis.conf 2>/dev/null || true
systemctl enable redis-server 2>/dev/null || systemctl enable redis 2>/dev/null || true
systemctl restart redis-server 2>/dev/null || systemctl restart redis 2>/dev/null || true
echo "✓ Redis установлен и запущен"
else
echo "[2/7] ✓ Redis уже установлен"
systemctl start redis-server 2>/dev/null || systemctl start redis 2>/dev/null || true
fi
# Проверка подключения к Redis
if redis-cli ping &> /dev/null; then
echo "✓ Redis работает"
else
echo "⚠ Предупреждение: Redis не отвечает на ping"
fi
# Настройка Apache
echo "[3/7] Настройка Apache..."
# Определить домен
read -p "Введите доменное имя для F7cloud (например: cloud.example.com): " DOMAIN
if [ -z "$DOMAIN" ]; then
echo "Ошибка: Домен обязателен"
exit 1
fi
# Определить путь установки (DocumentRoot)
read -p "Путь установки F7cloud [$INSTALL_DIR]: " INSTALL_PATH
INSTALL_PATH=${INSTALL_PATH:-$INSTALL_DIR}
# Создать виртуальный хост Apache
APACHE_SITE_FILE="/etc/apache2/sites-available/f7cloud.conf"
if [ -f "/etc/httpd/conf.d/f7cloud.conf" ] || [ -f "/etc/apache2/sites-available/f7cloud.conf" ]; then
read -p "Конфиг Apache для f7cloud уже существует. Перезаписать? (y/N): " OVERWRITE
if [[ ! "$OVERWRITE" =~ ^[Yy]$ ]]; then
echo "Пропуск создания конфига Apache"
else
rm -f /etc/apache2/sites-available/f7cloud.conf /etc/httpd/conf.d/f7cloud.conf
fi
fi
if [ ! -f "/etc/apache2/sites-available/f7cloud.conf" ] && [ ! -f "/etc/httpd/conf.d/f7cloud.conf" ]; then
cat > "$APACHE_SITE_FILE" <<EOF
<VirtualHost *:80>
ServerName $DOMAIN
DocumentRoot $INSTALL_PATH
<Directory $INSTALL_PATH>
Options -Indexes +FollowSymLinks
AllowOverride All
Require all granted
</Directory>
ErrorLog \${APACHE_LOG_DIR}/f7cloud_error.log
CustomLog \${APACHE_LOG_DIR}/f7cloud_access.log combined
</VirtualHost>
EOF
# Если Apache 2.4+
if [ -d "/etc/apache2/sites-available" ]; then
a2ensite f7cloud.conf 2>/dev/null || true
fi
echo "✓ Конфиг Apache создан: $APACHE_SITE_FILE"
fi
# Запрос данных PostgreSQL
echo "[4/7] Настройка PostgreSQL..."
read -p "Хост PostgreSQL [localhost]: " DB_HOST
DB_HOST=${DB_HOST:-localhost}
read -p "Порт PostgreSQL [5432]: " DB_PORT
DB_PORT=${DB_PORT:-5432}
read -p "Имя базы данных: " DB_NAME
if [ -z "$DB_NAME" ]; then
echo "Ошибка: Имя базы данных обязательно"
exit 1
fi
read -p "Пользователь PostgreSQL: " DB_USER
if [ -z "$DB_USER" ]; then
echo "Ошибка: Пользователь обязателен"
exit 1
fi
read -sp "Пароль PostgreSQL: " DB_PASSWORD
echo ""
if [ -z "$DB_PASSWORD" ]; then
echo "Ошибка: Пароль обязателен"
exit 1
fi
read -p "Префикс таблиц [oc_]: " DB_PREFIX
DB_PREFIX=${DB_PREFIX:-oc_}
# Проверка подключения к БД
echo "Проверка подключения к PostgreSQL..."
export PGPASSWORD="$DB_PASSWORD"
if psql -h "$DB_HOST" -p "$DB_PORT" -U "$DB_USER" -d "$DB_NAME" -c "SELECT 1;" &> /dev/null; then
echo "✓ Подключение к PostgreSQL успешно"
else
echo "⚠ Предупреждение: Не удалось подключиться к PostgreSQL"
echo " Убедитесь, что база данных создана и пользователь имеет права"
fi
unset PGPASSWORD
# Дополнительные настройки
echo "[5/8] Дополнительные настройки..."
read -p "Директория данных [$DATA_DIR]: " DATA_DIR_INPUT
DATA_DIR=${DATA_DIR_INPUT:-$DATA_DIR}
read -p "Trusted domains (через запятую) [$DOMAIN]: " TRUSTED_DOMAINS_INPUT
TRUSTED_DOMAINS=${TRUSTED_DOMAINS_INPUT:-$DOMAIN}
read -p "Trusted proxies (IP через запятую, Enter для пропуска): " TRUSTED_PROXIES
read -p "CLI URL (для occ команд) [https://$DOMAIN]: " CLI_URL
CLI_URL=${CLI_URL:-https://$DOMAIN}
# Данные администратора
echo "[6/8] Создание администратора..."
read -p "Логин администратора [admin]: " ADMIN_USER
ADMIN_USER=${ADMIN_USER:-admin}
read -sp "Пароль администратора: " ADMIN_PASSWORD
echo ""
if [ -z "$ADMIN_PASSWORD" ]; then
echo "Ошибка: Пароль администратора обязателен"
exit 1
fi
# Генерация секретов
echo "[7/8] Генерация секретов..."
PASSWORD_SALT=$(generate_random)
SECRET=$(generate_random)
INSTANCE_ID=$(generate_instanceid)
# Создание config.php
echo "[8/8] Создание config.php..."
# Создать директорию config если нет
mkdir -p "$INSTALL_DIR/config"
# Бэкап существующего config.php
if [ -f "$CONFIG_FILE" ]; then
cp "$CONFIG_FILE" "$CONFIG_FILE.backup.$(date +%Y%m%d_%H%M%S)"
echo "✓ Старый config.php сохранен в бэкап"
fi
# Создать config.php
cat > "$CONFIG_FILE" <<EOF
<?php
\$CONFIG = array (
'passwordsalt' => '$PASSWORD_SALT',
'secret' => '$SECRET',
'trusted_domains' =>
array (
EOF
# Добавить trusted domains
IFS=',' read -ra DOMAINS <<< "$TRUSTED_DOMAINS"
for i in "${!DOMAINS[@]}"; do
DOMAIN_CLEAN=$(echo "${DOMAINS[$i]}" | xargs)
echo " $i => '$DOMAIN_CLEAN'," >> "$CONFIG_FILE"
done
cat >> "$CONFIG_FILE" <<EOF
),
EOF
# Trusted proxies
if [ -n "$TRUSTED_PROXIES" ]; then
echo " 'trusted_proxies' => " >> "$CONFIG_FILE"
echo " array (" >> "$CONFIG_FILE"
IFS=',' read -ra PROXIES <<< "$TRUSTED_PROXIES"
for i in "${!PROXIES[@]}"; do
PROXY_CLEAN=$(echo "${PROXIES[$i]}" | xargs)
echo " $i => '$PROXY_CLEAN'," >> "$CONFIG_FILE"
done
echo " )," >> "$CONFIG_FILE"
fi
cat >> "$CONFIG_FILE" <<EOF
'datadirectory' => '$DATA_DIR',
'dbtype' => 'pgsql',
'version' => '1.0.0',
'dbname' => '$DB_NAME',
'dbhost' => '$DB_HOST',
'dbport' => '$DB_PORT',
'dbtableprefix' => '$DB_PREFIX',
'dbuser' => '$DB_USER',
'dbpassword' => '$DB_PASSWORD',
'installed' => false,
'instanceid' => '$INSTANCE_ID',
'memcache.local' => '\\\\OC\\\\Memcache\\\\APCu',
'memcache.distributed' => '\\\\OC\\\\Memcache\\\\Redis',
'memcache.locking' => '\\\\OC\\\\Memcache\\\\Redis',
'redis' =>
array (
'host' => '127.0.0.1',
'port' => 6379,
'timeout' => 1.5,
'dbindex' => 0,
),
'maintenance' => false,
'loglevel' => 0,
'overwrite.cli.url' => '$CLI_URL',
'htaccess.RewriteBase' => '/',
);
EOF
chmod 640 "$CONFIG_FILE"
chown root:$APACHE_USER "$CONFIG_FILE"
echo "✓ config.php создан"
# Создание директории данных
if [ ! -d "$DATA_DIR" ]; then
mkdir -p "$DATA_DIR"
echo "✓ Директория данных создана: $DATA_DIR"
fi
chown -R $APACHE_USER:$APACHE_USER "$DATA_DIR"
chmod 750 "$DATA_DIR"
echo "✓ Права на директорию данных установлены"
# Права на установочную директорию
chown -R $APACHE_USER:$APACHE_USER "$INSTALL_DIR"
find "$INSTALL_DIR" -type f -exec chmod 640 {} \;
find "$INSTALL_DIR" -type d -exec chmod 750 {} \;
find "$INSTALL_DIR" -name "*.sh" -exec chmod 750 {} \;
find "$INSTALL_DIR" -name "*.php" -exec chmod 640 {} \;
echo "✓ Права на файлы установлены"
# Перезапуск Apache
echo ""
echo "Перезапуск Apache..."
systemctl reload apache2 2>/dev/null || systemctl reload httpd 2>/dev/null || $APACHE_CMD graceful 2>/dev/null || true
echo "✓ Apache перезапущен"
# Запуск occ maintenance:install
echo ""
echo "[9/9] Инициализация F7cloud через occ..."
cd "$INSTALL_DIR"
# Проверка что база данных существует
export PGPASSWORD="$DB_PASSWORD"
if ! psql -h "$DB_HOST" -p "$DB_PORT" -U "$DB_USER" -d "$DB_NAME" -c "SELECT 1;" &> /dev/null; then
echo "⚠ Предупреждение: База данных '$DB_NAME' не доступна"
echo " Создайте базу данных перед продолжением:"
echo " CREATE DATABASE $DB_NAME OWNER $DB_USER;"
read -p "Продолжить установку? (y/N): " CONTINUE
if [[ ! "$CONTINUE" =~ ^[Yy]$ ]]; then
echo "Установка прервана"
exit 1
fi
fi
unset PGPASSWORD
# Запуск maintenance:install
echo "Запуск occ maintenance:install..."
if sudo -u $APACHE_USER php occ maintenance:install \
--database pgsql \
--database-name "$DB_NAME" \
--database-host "$DB_HOST:$DB_PORT" \
--database-user "$DB_USER" \
--database-pass "$DB_PASSWORD" \
--admin-user "$ADMIN_USER" \
--admin-pass "$ADMIN_PASSWORD" \
--data-dir "$DATA_DIR" 2>&1; then
echo "✓ F7cloud успешно инициализирован"
# Обновить config.php - установить installed => true
if grep -q "'installed' => false" "$CONFIG_FILE"; then
sed -i "s/'installed' => false/'installed' => true/" "$CONFIG_FILE"
echo "✓ config.php обновлен (installed => true)"
fi
# Если есть overwriteprotocol, установить https (если прокси использует HTTPS)
if ! grep -q "overwriteprotocol" "$CONFIG_FILE"; then
sed -i "/'htaccess.RewriteBase' => '/a\\ 'overwriteprotocol' => 'https'," "$CONFIG_FILE"
echo "✓ Добавлен overwriteprotocol => https (для работы за прокси)"
fi
# Настройка F7Talk (если приложение установлено)
echo ""
TALK_CONFIG_FILE="$INSTALL_DIR/config/talk-config.php"
if [ -f "$TALK_CONFIG_FILE" ]; then
echo "Найдён файл конфигурации F7Talk: $TALK_CONFIG_FILE"
echo "Применение настроек из файла..."
USE_TALK_CONFIG_FILE=true
else
read -p "Настроить F7Talk (Talk)? (y/N): " CONFIGURE_TALK
USE_TALK_CONFIG_FILE=false
if [[ ! "$CONFIGURE_TALK" =~ ^[Yy]$ ]]; then
echo "Пропуск настройки F7Talk"
USE_TALK_CONFIG_FILE=false
fi
fi
if [ "$USE_TALK_CONFIG_FILE" = true ] || [[ "$CONFIGURE_TALK" =~ ^[Yy]$ ]]; then
echo "Настройка F7Talk..."
# Проверка, включён ли Talk
TALK_APP_ID=""
if sudo -u $APACHE_USER php occ app:list 2>/dev/null | grep -qE "(f7talk|spreed).*enabled"; then
TALK_APP_ID=$(sudo -u $APACHE_USER php occ app:list 2>/dev/null | grep -E "(f7talk|spreed)" | grep enabled | awk '{print $1}' | head -1)
fi
if [ -z "$TALK_APP_ID" ]; then
echo "⚠ F7Talk не включен. Попытка включить..."
sudo -u $APACHE_USER php occ app:enable f7talk 2>/dev/null || sudo -u $APACHE_USER php occ app:enable spreed 2>/dev/null || true
TALK_APP_ID=$(sudo -u $APACHE_USER php occ app:list 2>/dev/null | grep -E "(f7talk|spreed)" | grep enabled | awk '{print $1}' | head -1)
fi
if [ -n "$TALK_APP_ID" ]; then
# Если есть файл конфига - читаем из него
if [ -f "$TALK_CONFIG_FILE" ]; then
# Читаем настройки из PHP файла через php
TALK_FEDERATION=$(php -r "require '$TALK_CONFIG_FILE'; echo \$config['federation_enabled'] ?? 'no';" 2>/dev/null || echo "no")
TALK_ALLOWED_GROUPS=$(php -r "require '$TALK_CONFIG_FILE'; echo json_encode(\$config['allowed_groups'] ?? []);" 2>/dev/null || echo "[]")
TALK_START_CONVERSATIONS=$(php -r "require '$TALK_CONFIG_FILE'; echo json_encode(\$config['start_conversations'] ?? []);" 2>/dev/null || echo "[]")
TALK_STUN_SERVERS=$(php -r "require '$TALK_CONFIG_FILE'; echo json_encode(\$config['stun_servers'] ?? []);" 2>/dev/null || echo "[]")
TALK_BREAKOUT_ROOMS=$(php -r "require '$TALK_CONFIG_FILE'; echo \$config['breakout_rooms'] ?? 'yes';" 2>/dev/null || echo "yes")
TALK_CALL_RECORDING=$(php -r "require '$TALK_CONFIG_FILE'; echo \$config['call_recording'] ?? 'yes';" 2>/dev/null || echo "yes")
TALK_ATTACHMENT_FOLDER=$(php -r "require '$TALK_CONFIG_FILE'; echo \$config['default_attachment_folder'] ?? '/Talk';" 2>/dev/null || echo "/Talk")
echo "✓ Настройки прочитаны из $TALK_CONFIG_FILE"
else
# Интерактивный ввод
read -p "Включить федерацию Talk? (y/N): " TALK_FEDERATION_INPUT
TALK_FEDERATION=$([ "$TALK_FEDERATION_INPUT" = "y" ] || [ "$TALK_FEDERATION_INPUT" = "Y" ] && echo "yes" || echo "no")
read -p "Группы для доступа к Talk (через запятую, Enter для всех): " TALK_ALLOWED_GROUPS_INPUT
if [ -n "$TALK_ALLOWED_GROUPS_INPUT" ]; then
TALK_ALLOWED_GROUPS=$(echo "$TALK_ALLOWED_GROUPS_INPUT" | awk -F',' '{printf "["; for(i=1;i<=NF;i++) {gsub(/^[ \t]+|[ \t]+$/, "", $i); if(i>1) printf ","; printf "\"%s\"", $i} printf "]"}')
else
TALK_ALLOWED_GROUPS="[]"
fi
read -p "STUN серверы (через запятую, Enter для пропуска): " TALK_STUN_SERVERS_INPUT
if [ -n "$TALK_STUN_SERVERS_INPUT" ]; then
TALK_STUN_SERVERS=$(echo "$TALK_STUN_SERVERS_INPUT" | awk -F',' '{printf "["; for(i=1;i<=NF;i++) {gsub(/^[ \t]+|[ \t]+$/, "", $i); if(i>1) printf ","; printf "\"%s\"", $i} printf "]"}')
else
TALK_STUN_SERVERS="[]"
fi
TALK_START_CONVERSATIONS="[]"
TALK_BREAKOUT_ROOMS="yes"
TALK_CALL_RECORDING="yes"
TALK_ATTACHMENT_FOLDER="/Talk"
fi
# Применение настроек через occ
if [ "$TALK_FEDERATION" = "yes" ]; then
sudo -u $APACHE_USER php occ config:app:set "$TALK_APP_ID" federation_enabled --value="yes" 2>/dev/null || true
echo "✓ Федерация Talk включена"
fi
if [ "$TALK_ALLOWED_GROUPS" != "[]" ]; then
sudo -u $APACHE_USER php occ config:app:set "$TALK_APP_ID" allowed_groups --value="$TALK_ALLOWED_GROUPS" 2>/dev/null || true
echo "✓ Группы для Talk настроены: $TALK_ALLOWED_GROUPS"
fi
if [ "$TALK_START_CONVERSATIONS" != "[]" ]; then
sudo -u $APACHE_USER php occ config:app:set "$TALK_APP_ID" start_conversations --value="$TALK_START_CONVERSATIONS" 2>/dev/null || true
echo "✓ Группы для создания бесед настроены"
fi
if [ "$TALK_STUN_SERVERS" != "[]" ]; then
sudo -u $APACHE_USER php occ config:app:set "$TALK_APP_ID" stun_servers --value="$TALK_STUN_SERVERS" 2>/dev/null || true
echo "✓ STUN серверы настроены: $TALK_STUN_SERVERS"
fi
sudo -u $APACHE_USER php occ config:app:set "$TALK_APP_ID" breakout_rooms --value="$TALK_BREAKOUT_ROOMS" 2>/dev/null || true
sudo -u $APACHE_USER php occ config:app:set "$TALK_APP_ID" call_recording --value="$TALK_CALL_RECORDING" 2>/dev/null || true
sudo -u $APACHE_USER php occ config:app:set "$TALK_APP_ID" default_attachment_folder --value="$TALK_ATTACHMENT_FOLDER" 2>/dev/null || true
echo "✓ Настройки F7Talk применены"
else
echo "⚠ F7Talk не найден. Убедитесь, что приложение установлено."
fi
fi
else
echo "⚠ Ошибка при запуске occ maintenance:install"
echo " Проверьте логи и убедитесь, что база данных создана"
exit 1
fi
echo ""
echo "=========================================="
echo "Установка завершена!"
echo "=========================================="
echo ""
echo "F7cloud успешно установлен и настроен."
echo ""
echo "Данные для входа:"
echo " URL: https://$DOMAIN"
echo " Логин: $ADMIN_USER"
echo " Пароль: <указанный вами>"
echo ""
echo "Конфигурация сохранена в: $CONFIG_FILE"
echo "Директория данных: $DATA_DIR"
echo ""
echo "Примечание: SSL сертификаты должны быть настроены на прокси-сервере."
echo ""