# 📦 Полное руководство: Установка ZenTao в Docker-контейнер (Ubuntu 22.04 + Nginx + PHP 8.1 + MariaDB) > ⚠️ **Внимание**: Все пароли и настройки в этом руководстве предназначены **только для локальной разработки/тестирования**. Для продакшена используйте сложные пароли, SSL, разделение сервисов и другие меры безопасности. --- ## 🗂 Структура итоговой системы ``` 🐳 Docker-контейнер "zentao-stack" ├── 🐧 Ubuntu 22.04 LTS ├── 🌐 Nginx 1.18 (порт 80 внутри → 8080 на хосте) ├── 🐘 PHP 8.1-FPM + расширения для ZenTao ├── 🐬 MariaDB 10.6 (порт 3306 внутри → 3307 на хосте) ├── 📦 ZenTao (из репозитория https://gitlab.com/mzhoot/znt.git) └── 🔧 Git, curl, wget и другие утилиты ``` --- ## 🚀 Шаг 1: Подготовка на хосте (ваш компьютер) ### 1.1. Создайте рабочую папку ```bash mkdir -p ~/Документы/zdocker/zentao cd ~/Документы/zdocker/zentao ``` ### 1.2. Настройте права Docker (опционально, чтобы не вводить `sudo`) ```bash # Добавить текущего пользователя в группу docker sudo usermod -aG docker $USER # Применить изменения (или перезайдите в систему) newgrp docker # Проверка: должно работать без sudo docker --version ``` --- ## 🐳 Шаг 2: Запуск базового контейнера ### 2.1. Скачайте образ Ubuntu 22.04 ```bash docker pull ubuntu:22.04 ``` ### 2.2. Запустите контейнер с пробросом портов ```bash docker run -it --name zentao-stack \ -p 8080:80 \ -p 3307:3306 \ ubuntu:22.04 bash ``` > ✅ Вы окажетесь внутри контейнера: `root@:/#` --- ## ⚙️ Шаг 3: Установка системных пакетов (внутри контейнера) ```bash # Обновление индексов пакетов apt update # Установка базовых утилит apt install -y curl wget git unzip nano vim net-tools ``` --- ## 🐬 Шаг 4: Установка и настройка MariaDB ### 4.1. Установка сервера ```bash DEBIAN_FRONTEND=noninteractive apt install -y mariadb-server ``` ### 4.2. Запуск службы ```bash service mariadb start ``` ### 4.3. Настройка пароля для root ```bash mysql -e "ALTER USER 'root'@'localhost' IDENTIFIED BY '1234'; FLUSH PRIVILEGES;" ``` ### 4.4. Создание базы и пользователя для ZenTao ```bash mysql -u root -p1234 -e " CREATE DATABASE IF NOT EXISTS zentao CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; GRANT ALL PRIVILEGES ON zentao.* TO 'zentao'@'localhost' IDENTIFIED BY 'zentao_pass123'; FLUSH PRIVILEGES; " ``` 📝 **Сохраните эти данные** — они понадобятся при веб-установке: | Параметр | Значение | |----------|----------| | Хост БД | `localhost` | | Порт | `3306` | | Имя БД | `zentao` | | Пользователь | `zentao` | | Пароль | `zentao_pass123` | | Префикс таблиц | `zt_` (по умолчанию) | --- ## 🌐 Шаг 5: Установка и настройка Nginx ### 5.1. Установка ```bash apt install -y nginx ``` ### 5.2. Запуск ```bash service nginx start ``` ### 5.3. Проверка (должно вернуть `200 OK`) ```bash curl -I http://localhost ``` --- ## 🐘 Шаг 6: Установка PHP 8.1 и расширений для ZenTao ### 6.1. Установка PHP-FPM и модулей ```bash apt install -y php8.1-fpm php8.1-mysql php8.1-mbstring php8.1-gd \ php8.1-curl php8.1-zip php8.1-xml php8.1-intl php8.1-bcmath \ php8.1-opcache php8.1-cli php8.1-imagick ``` ### 6.2. Настройка параметров PHP для ZenTao ```bash cat > /etc/php/8.1/fpm/conf.d/99-zentao.ini << 'EOF' upload_max_filesize = 50M post_max_size = 50M memory_limit = 256M max_execution_time = 120 date.timezone = Europe/Moscow opcache.enable = 1 opcache.memory_consumption = 128 display_errors = Off EOF ``` ### 6.3. Запуск PHP-FPM ```bash service php8.1-fpm start ``` --- ## 🔗 Шаг 7: Настройка Nginx для работы с PHP ### 7.1. Перезапись конфигурации виртуального хоста ```bash cat > /etc/nginx/sites-available/default << 'EOF' server { listen 80; server_name localhost; root /var/www/html/www; index index.php index.html index.htm; location / { try_files $uri $uri/ /index.php?$query_string; } location ~ \.php$ { include snippets/fastcgi-php.conf; fastcgi_pass unix:/run/php/php8.1-fpm.sock; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; } location ~ /\.ht { deny all; } } EOF ``` ### 7.2. Проверка и перезагрузка Nginx ```bash nginx -t && service nginx reload ``` --- ## 📦 Шаг 8: Установка ZenTao из Git-репозитория ### 8.1. Подготовка веб-корня ```bash cd /var/www/html rm -rf ./* ./.??* 2>/dev/null || true ``` ### 8.2. Клонирование репозитория ```bash git clone https://gitlab.com/mzhoot/znt.git . ``` ### 8.3. Настройка прав доступа ```bash # Владелец веб-сервера chown -R www-www-data /var/www/html # Стандартные права find /var/www/html -type d -exec chmod 755 {} \; find /var/www/html -type f -exec chmod 644 {} \; # Папки с правами на запись (кэш, конфиги, загрузки) chmod -R 775 /var/www/html/www/data /var/www/html/tmp /var/www/html/config 2>/dev/null || true ``` ### 8.4. Активация установщика ```bash # Переименование установщика (файл по умолчанию имеет расширение .tmp) mv /var/www/html/www/install.php.tmp /var/www/html/www/install.php # (Опционально) скрипт обновления mv /var/www/html/www/upgrade.php.tmp /var/www/html/www/upgrade.php 2>/dev/null || true ``` --- ## 🧪 Шаг 9: Финальная проверка ### 9.1. Проверка обработки PHP ```bash echo " /var/www/html/www/test.php curl http://localhost/test.php # Ожидаемый вывод: PHP_OK rm /var/www/html/www/test.php ``` ### 9.2. Проверка редиректа на установщик ```bash curl -I http://localhost/ # Ожидаем: 302 Found + location: install.php ``` ### 9.3. Проверка подключения к БД ```bash mysql -u zentao -pzentao_pass123 -e "SELECT 'DB OK' AS status;" zentao ``` --- ## 🔁 Шаг 10: Настройка автозапуска служб (опционально, но удобно) ```bash # Добавьте в ~/.bashrc внутри контейнера: cat >> ~/.bashrc << 'EOF' # Auto-start services for ZenTao stack service mariadb start &>/dev/null service nginx start &>/dev/null service php8.1-fpm start &>/dev/null EOF # Применить изменения source ~/.bashrc ``` Теперь при каждом входе в контейнер (`docker start -ai zentao-stack` или `docker exec -it zentao-stack bash`) службы запустятся автоматически. --- ## 🌐 Шаг 11: Завершение установки через веб-интерфейс 1. Откройте в браузере на хосте: 👉 **`http://localhost:8080`** 2. Пройдите шаги установщика: - ✅ Проверка окружения (все пункты должны быть зелёными) - 🗄 Настройка БД (введите данные из шага 4.4) - 👤 Создание администратора - 🌍 Выбор языка и региона 3. **После успешной установки удалите установщик** (требование безопасности): ```bash # Внутри контейнера: rm -f /var/www/html/www/install.php ``` --- ## 💾 Шаг 12: Сохранение данных (критично!) ⚠️ **По умолчанию все данные хранятся внутри контейнера.** При удалении контейнера (`docker rm zentao-stack`) всё пропадёт. ### Вариант А: Сохранить образ контейнера (быстро, но негибко) ```bash # На хосте, после настройки: docker commit zentao-stack zentao-stack-saved ``` ### Вариант Б: Использовать тома при запуске (рекомендуется) ```bash # Удалите старый контейнер и запустите новый с томами: docker run -it --name zentao-stack \ -p 8080:80 -p 3307:3306 \ -v zentao_files:/var/www/html \ -v zentao_db:/var/lib/mysql \ zentao-stack-saved bash ``` ✅ Преимущества томов: - Данные переживут удаление/пересоздание контейнера - Легко делать бэкапы (`docker run --rm -v zentao_db:/db -v $(pwd):/backup alpine tar czf /backup/db.tar.gz -C /db .`) - Можно подключить к другому контейнеру --- ## 🛠 Полезные команды для управления | Задача | Команда (на хосте) | |--------|-------------------| | Остановить контейнер | `docker stop zentao-stack` | | Запустить контейнер | `docker start -ai zentao-stack` | | Подключиться к работающему | `docker exec -it zentao-stack bash` | | Посмотреть логи Nginx | `docker exec zentao-stack tail -f /var/log/nginx/error.log` | | Бэкап БД | `docker exec zentao-stack mysqldump -u root -p1234 zentao > backup.sql` | | Обновить код ZenTao | `docker exec zentao-stack bash -c "cd /var/www/html && git pull"` | --- ## 🔐 Безопасность (для продакшена) ```bash # 1. Смените пароли по умолчанию mysql -u root -p1234 -e "ALTER USER 'zentao'@'localhost' IDENTIFIED BY 'СложныйПароль!';" # 2. Отключите отображение ошибок PHP (уже сделано в 99-zentao.ini) # display_errors = Off # 3. Настройте HTTPS (самоподписанный сертификат для тестов) openssl req -x509 -nodes -days 365 -newkey rsa:2048 \ -keyout /etc/ssl/private/nginx-selfsigned.key \ -out /etc/ssl/certs/nginx-selfsigned.crt \ -subj "/C=RU/ST=Moscow/L=Moscow/O=Local/CN=localhost" # 4. Обновите конфиг Nginx для HTTPS (добавьте listen 443 ssl + пути к сертификатам) ``` --- ## 🧭 Возможные проблемы и решения | Проблема | Решение | |----------|---------| | ❌ `502 Bad Gateway` | `service php8.1-fpm start` (PHP-FPM не запущен) | | ❌ `403 Forbidden` | `chown -R www-www-data /var/www/html && chmod -R 755 /var/www/html` | | ❌ Белый экран | Временно: `echo "display_errors=On" >> /etc/php/8.1/fpm/conf.d/99-debug.ini && service php8.1-fpm restart` | | ❌ Не сохраняется конфиг | `chmod -R 775 /var/www/html/www/data /var/www/html/config` | | ❌ Ошибка подключения к БД | Проверьте: хост `localhost`, порт `3306`, пользователь `zentao`, пароль `zentao_pass123` | | ❌ Git не клонирует | Проверьте интернет: `ping gitlab.com` | --- ## ✅ Итог После выполнения всех шагов у вас есть полностью рабочий стек: ``` 🌐 Браузер → [хост:8080] → [контейнер:80] → Nginx → PHP-FPM → ZenTao ↓ MariaDB (порт 3306) ``` **Доступ:** - 🌍 Веб-интерфейс: `http://localhost:8080` - 🗄 Управление БД с хоста: `mysql -h 127.0.0.1 -P 3307 -u zentao -pzentao_pass123 zentao` --- > 💡 **Совет на будущее**: Для удобства управления несколькими сервисами рассмотрите переход на `docker-compose.yml` — это позволит запускать весь стек одной командой `docker compose up -d` и упростит масштабирование. Если что-то пойдёт не так — напишите текст ошибки, помогу быстро разобраться. Удачи с использованием ZenTao! 🐳📊🚀