#!/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