#!/usr/bin/env bash # Нативная установка Nextcloud (Ubuntu/Debian): Apache + MariaDB + PHP + Redis # Работает как: ./install.sh или sudo ./install.sh (автоповышение прав) set -euo pipefail SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" # shellcheck source=../lib/common.sh source "${SCRIPT_DIR}/../lib/common.sh" # Автоповышение до root, если скрипт запущен без sudo if [[ "${EUID}" -ne 0 ]]; then exec sudo -E bash "${SCRIPT_DIR}/install.sh" "$@" fi log_info() { echo "[INFO] $*"; } log_warn() { echo "[WARN] $*"; } log_error() { echo "[ERROR] $*" >&2; } prepare_env() { local domain="${1:-}" cd "${SCRIPT_DIR}" if [[ ! -f ".env" ]]; then run_setup_env "${SCRIPT_DIR}" "${domain}" fi grep -q CHANGE_ME .env && { log_error "В .env остались CHANGE_ME — удалите .env и перезапустите"; exit 1; } # shellcheck disable=SC1091 source .env fix_env_ownership "${SCRIPT_DIR}/.env" } install_packages() { log_info "Установка пакетов..." export DEBIAN_FRONTEND=noninteractive apt-get update -qq apt-get install -y -qq apache2 mariadb-server redis-server libapache2-mod-php \ php-gd php-mysql php-curl php-mbstring php-intl php-gmp php-xml php-imagick \ php-zip php-bcmath php-apcu php-redis php-fileinfo php-opcache \ wget curl bzip2 ca-certificates openssl systemctl enable --now mariadb redis-server apache2 } setup_database() { log_info "Создание БД MariaDB..." mariadb <> /etc/redis/redis.conf fi systemctl restart redis-server } download_nextcloud() { local version="${NEXTCLOUD_VERSION:-latest}" local base_url="https://download.nextcloud.com/server/releases" local archive tmp_dir tmp_dir="$(mktemp -d)" archive="nextcloud-${version}.tar.bz2" [[ "${version}" == "latest" ]] && archive="latest.tar.bz2" log_info "Загрузка Nextcloud (${version})..." wget -q "${base_url}/${archive}" -O "${tmp_dir}/${archive}" wget -q "${base_url}/${archive}.sha256" -O "${tmp_dir}/${archive}.sha256" (cd "${tmp_dir}" && sha256sum -c "${archive}.sha256") rm -rf "${NEXTCLOUD_INSTALL_DIR}" tar -xjf "${tmp_dir}/${archive}" -C /var/www rm -rf "${tmp_dir}" } configure_apache() { log_info "Настройка Apache (${APACHE_MODE})..." a2enmod rewrite headers env dir mime 2>/dev/null || true a2dissite 000-default.conf 2>/dev/null || true local tpl="${SCRIPT_DIR}/templates/apache-vhost.conf.template" [[ "${APACHE_MODE}" == "subdir" ]] && tpl="${SCRIPT_DIR}/templates/apache-subdir.conf.template" sed -e "s|__NEXTCLOUD_INSTALL_DIR__|${NEXTCLOUD_INSTALL_DIR}|g" \ -e "s|__NEXTCLOUD_DOMAIN__|${NEXTCLOUD_DOMAIN}|g" \ -e "s|__APACHE_PORT__|${APACHE_PORT:-80}|g" \ "${tpl}" > /etc/apache2/sites-available/nextcloud.conf a2ensite nextcloud.conf apache2ctl configtest systemctl reload apache2 } configure_php() { log_info "Настройка PHP..." local php_ver php_ini php_ver="$(php -r 'echo PHP_MAJOR_VERSION.".".PHP_MINOR_VERSION;')" php_ini="/etc/php/${php_ver}/apache2/conf.d/99-nextcloud.ini" sed -e "s|__PHP_MEMORY_LIMIT__|${PHP_MEMORY_LIMIT:-512M}|g" \ -e "s|__PHP_UPLOAD_LIMIT__|${PHP_UPLOAD_LIMIT:-10G}|g" \ "${SCRIPT_DIR}/templates/php-nextcloud.ini.template" > "${php_ini}" systemctl reload apache2 } run_occ_install() { log_info "Инициализация Nextcloud (occ)..." chown -R www-data:www-data "${NEXTCLOUD_INSTALL_DIR}" mkdir -p "${NEXTCLOUD_INSTALL_DIR}/data" chmod 750 "${NEXTCLOUD_INSTALL_DIR}/data" run_occ "${NEXTCLOUD_INSTALL_DIR}" maintenance:install \ --database mysql --database-name "${DB_NAME}" \ --database-user "${DB_USER}" --database-pass "${DB_PASSWORD}" \ --admin-user "${NEXTCLOUD_ADMIN_USER}" --admin-pass "${NEXTCLOUD_ADMIN_PASSWORD}" \ --data-dir "${NEXTCLOUD_INSTALL_DIR}/data" run_occ "${NEXTCLOUD_INSTALL_DIR}" config:system:set trusted_domains 0 --value=localhost run_occ "${NEXTCLOUD_INSTALL_DIR}" config:system:set trusted_domains 1 --value=127.0.0.1 run_occ "${NEXTCLOUD_INSTALL_DIR}" config:system:set trusted_domains 2 --value="${NEXTCLOUD_DOMAIN}" run_occ "${NEXTCLOUD_INSTALL_DIR}" config:system:set memcache.local --value='\\OC\\Memcache\\APCu' run_occ "${NEXTCLOUD_INSTALL_DIR}" config:system:set memcache.distributed --value='\\OC\\Memcache\\Redis' run_occ "${NEXTCLOUD_INSTALL_DIR}" config:system:set memcache.locking --value='\\OC\\Memcache\\Redis' run_occ "${NEXTCLOUD_INSTALL_DIR}" config:system:set redis host --value=127.0.0.1 run_occ "${NEXTCLOUD_INSTALL_DIR}" config:system:set redis port --value=6379 run_occ "${NEXTCLOUD_INSTALL_DIR}" config:system:set redis password --value="${REDIS_PASSWORD}" run_occ "${NEXTCLOUD_INSTALL_DIR}" background:cron } setup_cron() { sed "s|__NEXTCLOUD_INSTALL_DIR__|${NEXTCLOUD_INSTALL_DIR}|g" \ "${SCRIPT_DIR}/templates/cron-nextcloud.template" > /etc/cron.d/nextcloud chmod 644 /etc/cron.d/nextcloud } print_summary() { local url="http://${NEXTCLOUD_DOMAIN}" [[ "${APACHE_MODE}" == "subdir" ]] && url="http://${NEXTCLOUD_DOMAIN}/nextcloud" echo "" log_info "=== Nextcloud (нативная установка) готов ===" echo " URL: ${url}" echo " Каталог: ${NEXTCLOUD_INSTALL_DIR}" echo " Администратор: ${NEXTCLOUD_ADMIN_USER} (пароль в native/.env)" log_warn "HTTPS: sudo certbot --apache -d ${NEXTCLOUD_DOMAIN}" } main() { prepare_env "${1:-}" install_packages setup_database configure_redis download_nextcloud configure_apache configure_php run_occ_install setup_cron mkdir -p "${SCRIPT_DIR}/backups" cp .env "${SCRIPT_DIR}/backups/.env.installed.$(date +%Y%m%d)" fix_env_ownership "${SCRIPT_DIR}/.env" print_summary } main "$@"