From 7a694837588b1df2dc03288f6d22e18224bde8c4 Mon Sep 17 00:00:00 2001 From: kosenka <1+kosenka@noreply.git.kosenka.ru> Date: Mon, 22 Jun 2026 23:08:28 +0300 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8=D1=82?= =?UTF-8?q?=D1=8C=202-install.sh?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 2-install.sh | 408 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 408 insertions(+) create mode 100644 2-install.sh diff --git a/2-install.sh b/2-install.sh new file mode 100644 index 0000000..85d7d49 --- /dev/null +++ b/2-install.sh @@ -0,0 +1,408 @@ +#!/bin/bash +# wget https://git.kosenka.ru/kosenka/ubuntu.22.04/raw/branch/master/2-install.sh -O 2-install.sh && bash 2-install.sh +# Адаптировано для Ubuntu 20.04 (Focal Fossa) + +# Устанавливаемая версия PHP +FPM_V="8.2" +# Значения по умолчанию — будут переопределены интерактивным опросом +USERNAME="admin" +USERNAME_EMAIL="" +USERNAME_PASS="" +SITE_NAME="eis" +SITE_ROOT="/home/$USERNAME/$SITE_NAME" +ANGIE_SITECONF="/etc/angie/sites-available/$SITE_NAME.conf" +ANGIE_ENABLED="/etc/angie/sites-enabled/$SITE_NAME" +MARIADB_ROOT_PASS="" +MARIADB_DB="" +MARIADB_USER="" +MARIADB_PASS="" +FOTOSVIDPASS="rDrh6inT2lYPhzjBEp!" + +# Проверка на запуск от имени root +if [[ $EUID -ne 0 ]]; then + echo "Этот скрипт должен быть запущен с правами root (sudo)." + exit 1 +fi + +# Функция проверки результата +check_result() { + if [ $1 -ne 0 ]; then + echo "Ошибка: $2" + exit $1 + fi +} + +# Функция генерации пароля +gen_pass() { + matrix=$1 + length=$2 + if [ -z "$matrix" ]; then + matrix="A-Za-z0-9" + fi + if [ -z "$length" ]; then + length=20 + fi + head /dev/urandom | tr -dc $matrix | head -c$length +} + +# Функция отображает запрос и ждет ответа +function confirm() { + while true; do + read -p "$1 ? (y/n) " yn + case $yn in + [Yy]* ) return 0;; + [Nn]* ) return 1;; + esac + done +} + +# Интерактивный опрос параметров установки +prompt_settings() { + echo "" + echo "========================================" + echo " Настройка параметров установки" + echo "========================================" + echo "" + + # 1. Имя пользователя + read -p "1. Имя системного пользователя [${USERNAME}]: " _input + USERNAME="${_input:-$USERNAME}" + + # 2. Email пользователя + read -p "2. Email пользователя: " _input + while [[ -z "$_input" ]]; do + read -p " Email не может быть пустым. Email пользователя: " _input + done + USERNAME_EMAIL="$_input" + + # 3. Пароль пользователя (с предзаполненным сгенерированным значением) + _gen_pass=$(gen_pass "A-Za-z0-9!@#%^" 20) + read -p "3. Пароль пользователя [${_gen_pass}]: " _input + USERNAME_PASS="${_input:-$_gen_pass}" + + # 4. Root-пароль MariaDB (с предзаполненным сгенерированным значением) + _gen_dbroot=$(gen_pass "A-Za-z0-9" 20) + read -p "4. Root-пароль MariaDB [${_gen_dbroot}]: " _input + MARIADB_ROOT_PASS="${_input:-$_gen_dbroot}" + + # 4.1. Имя базы данных + _default_db="${USERNAME}_db" + read -p "4.1. Имя базы данных MariaDB [${_default_db}]: " _input + MARIADB_DB="${_input:-$_default_db}" + MARIADB_USER="$MARIADB_DB" + # Пароль пользователя БД — генерируем отдельно + _gen_dbpass=$(gen_pass "A-Za-z0-9" 20) + MARIADB_PASS="$_gen_dbpass" + + # 5. Имя сайта + read -p "5. Имя сайта (папка /home/${USERNAME}/<имя>) [${SITE_NAME}]: " _input + SITE_NAME="${_input:-$SITE_NAME}" + + # Пересчитываем зависимые переменные + SITE_ROOT="/home/$USERNAME/$SITE_NAME" + ANGIE_SITECONF="/etc/angie/sites-available/$SITE_NAME.conf" + ANGIE_ENABLED="/etc/angie/sites-enabled/$SITE_NAME" + + # Проверка — пользователь не должен существовать + if [ -n "$(grep ^${USERNAME}: /etc/passwd /etc/group 2>/dev/null)" ]; then + echo "Ошибка: пользователь '$USERNAME' уже существует." + echo "Удалите его: userdel -r $USERNAME" + exit 1 + fi + + echo "" + echo "========================================" + echo " Итоговые параметры:" + echo "========================================" + echo " Пользователь : $USERNAME" + echo " Email : $USERNAME_EMAIL" + echo " Пароль : $USERNAME_PASS" + echo " Сайт : $SITE_NAME ($SITE_ROOT)" + echo " MariaDB root : $MARIADB_ROOT_PASS" + echo " БД / Юзер БД : $MARIADB_DB" + echo " Пароль БД : $MARIADB_PASS" + echo "========================================" + echo "" + confirm "Продолжить установку с этими параметрами" + if [ $? -ne 0 ]; then + echo "Установка отменена." + exit 0 + fi +} + + +install_user() { + /usr/sbin/useradd "$USERNAME" -s "/bin/bash" -c "$USERNAME_EMAIL" -m -d "/home/$USERNAME" -U + check_result $? "user creation failed" + echo "$USERNAME:$USERNAME_PASS" | /usr/sbin/chpasswd + if [ $? -ne 0 ]; then + /usr/sbin/deluser "$USERNAME" > /dev/null 2>&1 + check_result 2 "Пароль не соответствует правилам парольной защиты" + exit 2 + fi + chmod a+x /home/$USERNAME + usermod -aG users "$USERNAME" +} + +# Функция для установки Angie (форк Nginx) +install_angie() { + echo "[ * ] Установка Angie (форк Nginx)..." + # https://angie.software/angie/docs/installation/oss_packages/#angie-install-deb-oss + mkdir -p /etc/ssl/angie/ + apt-get -qq install -y curl + curl -o /etc/apt/trusted.gpg.d/angie-signing.gpg https://angie.software/keys/angie-signing.gpg + # Ubuntu 20.04 = focal + echo "deb https://download.angie.software/angie/$(. /etc/os-release && echo "$ID/$VERSION_ID $VERSION_CODENAME") main" | tee /etc/apt/sources.list.d/angie.list > /dev/null + apt-get update + apt-get install -y angie + # Создаём структуру для виртуальных хостов + mkdir -p /etc/angie/sites-available /etc/angie/sites-enabled 2>/dev/null || true + # Добавляем include в основной конфиг, если ещё нет + ANGIE_CONF_FILE="/etc/angie/angie.conf" + if ! grep -q "sites-enabled" "$ANGIE_CONF_FILE"; then + sed -i '/http {/a \ include /etc/angie/sites-enabled/*;' "$ANGIE_CONF_FILE" + echo "Добавлен include для sites-enabled в $ANGIE_CONF_FILE" + fi + sed -i -e "s/user angie;/user $USERNAME;/g" "$ANGIE_CONF_FILE" + systemctl enable angie + systemctl start angie +} + +# Создание сайта +create_site() { + echo "[ * ] Создание сайта: $SITE_NAME" + mkdir -p "$SITE_ROOT" + mkdir -p "$SITE_ROOT/web" + chown -R $USERNAME:$USERNAME "$SITE_ROOT" + chmod -R 755 "$SITE_ROOT" + # Создаём index.php + cat << 'EOF' > "$SITE_ROOT/web/index.php" +Привет от Angie + PHP !"; +echo "

Сайт работает: ".$_SERVER['SERVER_NAME']."

"; +if (extension_loaded('mysqli') || extension_loaded('pdo_mysql')) { + echo "

✅ Расширение MySQL загружено.

"; +} else { + echo "

❌ Расширение MySQL НЕ загружено.

"; +} +if (function_exists('mssql_connect') || function_exists('sqlsrv_connect')) { + echo "

✅ Поддержка MSSQL (FreeTDS) доступна.

"; +} else { + echo "

❌ Поддержка MSSQL недоступна. Установите pdo_dblib или sqlsrv при необходимости.

"; +} +phpinfo(); +?> +EOF + # Создаём конфиг Angie + cat << EOF > "$ANGIE_SITECONF" +server { + charset utf-8; + client_max_body_size 128M; + listen 80; + server_name eis; + root $SITE_ROOT/web; + index index.php; + access_log /var/log/angie/$SITE_NAME-access.log; + error_log /var/log/angie/$SITE_NAME-error.log; + location / { + try_files \$uri \$uri/ /index.php\$is_args\$args; + } + location ~ \.(js|css|png|jpg|gif|swf|ico|pdf|mov|fla|zip|rar)$ { + try_files \$uri =404; + } + location ~ ^/assets/.*\.php$ { + deny all; + } + location ~ \.php$ { + include fastcgi_params; + fastcgi_param SCRIPT_FILENAME \$document_root\$fastcgi_script_name; + fastcgi_pass 127.0.0.1:9000; + try_files \$uri =404; + } + location ~* /\. { + deny all; + } +} +EOF + ln -sf "$ANGIE_SITECONF" "$ANGIE_ENABLED" + systemctl reload angie +} + +# Установка MariaDB 10.11 (LTS) +install_mariadb() { + echo "[ * ] Установка MariaDB 10.11..." + # Официальный репозиторий MariaDB для Ubuntu 20.04 + curl -fsSL https://downloads.mariadb.com/MariaDB/mariadb_repo_setup | bash -s -- --mariadb-server-version="mariadb-10.11" + apt-get update + DEBIAN_FRONTEND=noninteractive apt-get -qq install -y mariadb-server mariadb-client libmariadb-dev + systemctl enable mariadb + systemctl start mariadb + # Задаём пароль root и настраиваем базу + mysql -u root << MARIADB_SCRIPT +ALTER USER 'root'@'localhost' IDENTIFIED BY '$MARIADB_ROOT_PASS'; +CREATE DATABASE IF NOT EXISTS \`$MARIADB_DB\` CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; +CREATE USER IF NOT EXISTS '$MARIADB_USER'@'localhost' IDENTIFIED BY '$MARIADB_PASS'; +GRANT ALL PRIVILEGES ON \`$MARIADB_DB\`.* TO '$MARIADB_USER'@'localhost'; +FLUSH PRIVILEGES; +MARIADB_SCRIPT + echo "[ * ] MariaDB: база '$MARIADB_DB', пользователь '$MARIADB_USER' — созданы." +} + +# Установка fail2ban +install_fail2ban() { + echo "[ * ] Установка fail2ban..." + apt-get -qq install -y fail2ban + cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local 2>/dev/null || true + systemctl enable fail2ban + systemctl start fail2ban +} + +# Установка PHP-FPM +install_php_fpm() { + echo "[ * ] Установка PHP-FPM $FPM_V..." + apt-get -qq install -y lsb-release ca-certificates software-properties-common + # ИЗМЕНЕНО: add-apt-repository корректно работает в Ubuntu 20.04 + add-apt-repository -y ppa:ondrej/php + apt-get -qq update + apt-get -qq install -y php$FPM_V-fpm php$FPM_V-cli php$FPM_V-common php$FPM_V-xsl + apt-get -qq install -y php$FPM_V-memcached php$FPM_V-odbc + apt-get -qq install -y php$FPM_V-readline php$FPM_V-pdo php$FPM_V-smbclient + apt-get -qq install -y php$FPM_V-imap php$FPM_V-imagick php$FPM_V-igbinary php$FPM_V-exif php$FPM_V-mbstring php$FPM_V-mysql + apt-get -qq install -y php$FPM_V-curl php$FPM_V-zip php$FPM_V-gd php$FPM_V-opcache php$FPM_V-intl php$FPM_V-xml php$FPM_V-xmlrpc + apt-get -qq install -y php$FPM_V-ldap php$FPM_V-soap php$FPM_V-fileinfo composer + # ИЗМЕНЕНО: убран php$FPM_V-sockets и php$FPM_V-xmlreader (включены в php-common в 20.04) + + # ИЗМЕНЕНО: исправлены ссылки на www.conf (убраны некорректные гиперссылки) + WWW_CONF="/etc/php/$FPM_V/fpm/pool.d/www.conf" + sed -i -e "s/user = www-data/user = $USERNAME/g" "$WWW_CONF" + sed -i -e "s/group = www-data/group = $USERNAME/g" "$WWW_CONF" + sed -i -e "s/listen.owner = www-data/listen.owner = $USERNAME/g" "$WWW_CONF" + sed -i -e "s|listen = /run/php/php${FPM_V}-fpm.sock|listen = 127.0.0.1:9000|g" "$WWW_CONF" + sed -i -e 's/pm = dynamic/pm = ondemand/g' "$WWW_CONF" + sed -i -e 's/pm.max_children = 5/pm.max_children = 8/g' "$WWW_CONF" + sed -i -e 's/pm.max_requests = 500/pm.max_requests = 4000/g' "$WWW_CONF" + sed -i -e 's/;pm.process_idle_timeout/pm.process_idle_timeout/g' "$WWW_CONF" + sed -i -e 's/;pm.status_path/pm.status_path/g' "$WWW_CONF" + sed -i -e 's/;env/env/g' "$WWW_CONF" + + FPM_INI="/etc/php/$FPM_V/fpm/php.ini" + sed -i -e 's/;cgi.fix_pathinfo=1/cgi.fix_pathinfo=0/g' "$FPM_INI" + sed -i -e 's/;session.save_path = "\/tmp"/session.save_path = "\/tmp"/g' "$FPM_INI" + sed -i -e 's/short_open_tag = On/short_open_tag = Off/g' "$FPM_INI" + sed -i -e 's/post_max_size = 8M/post_max_size = 128M/g' "$FPM_INI" + sed -i -e 's/upload_max_filesize = 2M/upload_max_filesize = 128M/g' "$FPM_INI" + sed -i -e "s|;open_basedir =|open_basedir =/mnt/FOTOSVID:/home/$USERNAME/$SITE_NAME:/tmp:/bin:/usr/bin:/usr/local/bin:/usr/share:/opt|g" "$FPM_INI" + sed -i -e 's/disable_functions =/disable_functions = pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,system,passthru,shell_exec,popen/g' "$FPM_INI" + + CLI_INI="/etc/php/$FPM_V/cli/php.ini" + sed -i -e 's/;cgi.fix_pathinfo=1/cgi.fix_pathinfo=0/g' "$CLI_INI" + sed -i -e 's/;session.save_path = "\/tmp"/session.save_path = "\/tmp"/g' "$CLI_INI" + sed -i -e 's/short_open_tag = On/short_open_tag = Off/g' "$CLI_INI" + sed -i -e 's/post_max_size = 8M/post_max_size = 128M/g' "$CLI_INI" + sed -i -e 's/upload_max_filesize = 2M/upload_max_filesize = 128M/g' "$CLI_INI" + sed -i -e "s|;open_basedir =|open_basedir =/mnt/FOTOSVID:/home/$USERNAME/$SITE_NAME:/home/$USERNAME/.config:/home/$USERNAME/.cache:/home/$USERNAME/.local:/tmp:/bin:/usr/bin:/usr/local/bin:/usr/share:/opt|g" "$CLI_INI" + sed -i -e 's/disable_functions =/disable_functions = pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,system,passthru,shell_exec,popen/g' "$CLI_INI" + + systemctl enable php$FPM_V-fpm + systemctl start php$FPM_V-fpm +} + +# Установка FreeTDS (для подключения к MS SQL) +install_freetds() { + echo "[ * ] Установка FreeTDS..." + apt-get -qq install -y freetds-dev freetds-bin freetds-common tdsodbc odbcinst + export TDS_FDW_VERSION="2.0.4" + wget https://github.com/tds-fdw/tds_fdw/archive/v${TDS_FDW_VERSION}.tar.gz + tar -xvzf v${TDS_FDW_VERSION}.tar.gz + cd tds_fdw-${TDS_FDW_VERSION}/ + make USE_PGXS=1 + make USE_PGXS=1 install + cd .. + systemctl restart mariadb + echo "[FreeTDS] +Description=FreeTDS driver +Driver=/usr/lib/x86_64-linux-gnu/odbc/libtdsodbc.so +Setup=/usr/lib/x86_64-linux-gnu/odbc/libtdsodbc.so +Threading=2" >> /etc/odbcinst.ini + odbcinst -i -d -f /etc/odbcinst.ini +} + +# Основная логика установки +main() { + echo "[ * ] Начинаем установку компонентов..." + + # Интерактивный опрос параметров + prompt_settings + apt-get -qq update + apt-get -qq dist-upgrade -y + + # Установка базовых утилит + # ИЗМЕНЕНО: убран 'aptitude' (может отсутствовать), 'control sudowheel' — специфика AltLinux, удалено + apt-get -qq install -y memcached cifs-utils pwgen wget curl gnupg lsb-release git htop ca-certificates + apt-get -qq install -y apt-utils squashfs-tools tzdata fdisk gdisk mc net-tools locales iproute2 smbclient + # ИЗМЕНЕНО: default-jre → default-jre-headless (меньше зависимостей на сервере) + apt-get -qq install -y libreoffice-core --no-install-recommends libreoffice-writer default-jre-headless libreoffice-java-common + apt-get -qq install -y lsof gnupg2 apt-transport-https software-properties-common gnupg gcc make + + systemctl enable memcached + systemctl start memcached + + # ИЗМЕНЕНО: убрана строка "control sudowheel enabled" — это команда AltLinux, не Ubuntu + # Для управления sudo в Ubuntu используйте: usermod -aG sudo + + install_fail2ban + + if confirm "Install user"; then + install_user + fi + + if confirm "Install Angie"; then + install_angie + create_site + fi + + if confirm "Install MariaDB"; then + install_mariadb + fi + + if confirm "Install PHP"; then + install_php_fpm + fi + + if confirm "Install FreeTDS"; then + install_freetds + fi + + if confirm "Install FOTOSVID"; then + mkdir -p /mnt/FOTOSVID + cat > /etc/systemd/system/mnt-fotosvid.service << EOF +[Unit] +Description=Mount SMB share FOTOSVID +After=network.target +Wants=network.target + +[Service] +Type=oneshot +ExecStartPre=/bin/sleep 15 +ExecStart=/bin/mount -t cifs //10.77.1.250/FOTOSVID /mnt/FOTOSVID -o username=fotosvid,password=$FOTOSVIDPASS,rw,file_mode=0666,dir_mode=0777 +RemainAfterExit=yes + +[Install] +WantedBy=multi-user.target +EOF + systemctl daemon-reload + systemctl enable mnt-fotosvid.service + systemctl start mnt-fotosvid.service + fi + + echo "" + echo "[ * ] Установка завершена!" + echo "Проверьте службы:" + echo " systemctl status angie" + echo " systemctl status mariadb" + echo " systemctl status php$FPM_V-fpm" + echo " systemctl status fail2ban" +} + +# Запуск +main \ No newline at end of file