13 KiB
📦 Полное руководство: Установка 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. Создайте рабочую папку
mkdir -p ~/Документы/zdocker/zentao
cd ~/Документы/zdocker/zentao
1.2. Настройте права Docker (опционально, чтобы не вводить sudo)
# Добавить текущего пользователя в группу docker
sudo usermod -aG docker $USER
# Применить изменения (или перезайдите в систему)
newgrp docker
# Проверка: должно работать без sudo
docker --version
🐳 Шаг 2: Запуск базового контейнера
2.1. Скачайте образ Ubuntu 22.04
docker pull ubuntu:22.04
2.2. Запустите контейнер с пробросом портов
docker run -it --name zentao-stack \
-p 8080:80 \
-p 3307:3306 \
ubuntu:22.04 bash
✅ Вы окажетесь внутри контейнера:
root@<container_id>:/#
⚙️ Шаг 3: Установка системных пакетов (внутри контейнера)
# Обновление индексов пакетов
apt update
# Установка базовых утилит
apt install -y curl wget git unzip nano vim net-tools
🐬 Шаг 4: Установка и настройка MariaDB
4.1. Установка сервера
DEBIAN_FRONTEND=noninteractive apt install -y mariadb-server
4.2. Запуск службы
service mariadb start
4.3. Настройка пароля для root
mysql -e "ALTER USER 'root'@'localhost' IDENTIFIED BY '1234'; FLUSH PRIVILEGES;"
4.4. Создание базы и пользователя для ZenTao
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. Установка
apt install -y nginx
5.2. Запуск
service nginx start
5.3. Проверка (должно вернуть 200 OK)
curl -I http://localhost
🐘 Шаг 6: Установка PHP 8.1 и расширений для ZenTao
6.1. Установка PHP-FPM и модулей
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
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
service php8.1-fpm start
🔗 Шаг 7: Настройка Nginx для работы с PHP
7.1. Перезапись конфигурации виртуального хоста
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
nginx -t && service nginx reload
📦 Шаг 8: Установка ZenTao из Git-репозитория
8.1. Подготовка веб-корня
cd /var/www/html
rm -rf ./* ./.??* 2>/dev/null || true
8.2. Клонирование репозитория
git clone https://gitlab.com/mzhoot/znt.git .
8.3. Настройка прав доступа
# Владелец веб-сервера
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. Активация установщика
# Переименование установщика (файл по умолчанию имеет расширение .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
echo "<?php echo 'PHP_OK';" > /var/www/html/www/test.php
curl http://localhost/test.php
# Ожидаемый вывод: PHP_OK
rm /var/www/html/www/test.php
9.2. Проверка редиректа на установщик
curl -I http://localhost/
# Ожидаем: 302 Found + location: install.php
9.3. Проверка подключения к БД
mysql -u zentao -pzentao_pass123 -e "SELECT 'DB OK' AS status;" zentao
🔁 Шаг 10: Настройка автозапуска служб (опционально, но удобно)
# Добавьте в ~/.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: Завершение установки через веб-интерфейс
-
Откройте в браузере на хосте:
👉http://localhost:8080 -
Пройдите шаги установщика:
- ✅ Проверка окружения (все пункты должны быть зелёными)
- 🗄 Настройка БД (введите данные из шага 4.4)
- 👤 Создание администратора
- 🌍 Выбор языка и региона
-
После успешной установки удалите установщик (требование безопасности):
# Внутри контейнера: rm -f /var/www/html/www/install.php
💾 Шаг 12: Сохранение данных (критично!)
⚠️ По умолчанию все данные хранятся внутри контейнера. При удалении контейнера (docker rm zentao-stack) всё пропадёт.
Вариант А: Сохранить образ контейнера (быстро, но негибко)
# На хосте, после настройки:
docker commit zentao-stack zentao-stack-saved
Вариант Б: Использовать тома при запуске (рекомендуется)
# Удалите старый контейнер и запустите новый с томами:
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" |
🔐 Безопасность (для продакшена)
# 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! 🐳📊🚀