Початок роботи

Встановлення PonControl на новому сервері - системні пакети, веб-сервер, PHP і MySQL.

Написано для Ubuntu/Debian. Назви пакетів нижче - для apt (Debian/Ubuntu); для іншого дистрибутива назви пакетів dnf/yum відрізняються (наприклад, php-snmp замість php8.1-snmp).

Потрібен PHP 7.4 або новіший (стрілкові функції - найстаріша мовна можливість, яку цей код реально використовує, нічого 8.x-специфічного тут немає). Приклади нижче використовують назви пакетів php8.1-* лише як заповнювач - підставте ту версію PHP, яку ви реально встановлюєте чи вже маєте (php7.4-*, php8.2-*, ...) - немає потреби ганятись за конкретною новішою версією, якщо на сервері вже є підтримувана старіша.

1. Встановлення пакетів

Apache (рекомендовано)

Саме під нього написані власні файли .htaccess застосунку.

sudo apt update
sudo apt install apache2 libapache2-mod-php8.1 \
    php8.1-cli php8.1-mysql php8.1-snmp php8.1-curl php8.1-mbstring \
    mysql-server git

Це повний список модулів, які цей код реально використовує - перевірено грепом кожного PHP-файлу на функції, специфічні для конкретного розширення:

ПакетНавіщо
php8.1-mysqlmysqli_* - кожен запит до БД у застосунку
php8.1-snmpsnmp2_get()/snmprealwalk() - весь опит OLT/ONU
php8.1-curlобмін токенами Google Sign-In, кілька інших вихідних HTTP-запитів
php8.1-mbstringперевірка довжини багатобайтного рядка в пошуку користувачів

Все інше, що використовує застосунок - сесії, JSON, хешування паролів і gzip-стиснення (використовується Backup/Restore) - вже частина ядра PHP. Зокрема, не потрібен php8.1-zip: резервні копії - це gzip-стиснений JSON, а не zip-файли, спеціально тому, що на такому типі серверів розширення ZipArchive часто відсутнє. GD, LDAP, XML, bcmath, gmp чи intl тут також ніде не використовуються.

Nginx (альтернатива)

Застосунок постачається з файлами .htaccess, які Apache читає автоматично. Nginx повністю ігнорує .htaccess - якщо оберете цей шлях, доведеться вручну прописати ті самі правила у своєму server-блоці, інакше деякі папки залишаться повністю відкритими по HTTP:

  • Весь сайт: HTTP Basic Auth
  • /api/: без Basic Auth (окремий Bearer-token API для мобільного застосунку)
  • /backups/, /update_procedure/, /config/: повна заборона прямого доступу по HTTP
location / {
    auth_basic "Authorize, please!";
    auth_basic_user_file /var/www/poncontrol2/.htpasswd;
    try_files $uri $uri/ /index.php?$query_string;
}
location /api/ {
    try_files $uri =404;
    fastcgi_pass unix:/run/php/php8.1-fpm.sock;
    include fastcgi_params;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
location ~ ^/(backups|update_procedure|config)/ {
    deny all;
    return 403;
}
location ~ \.php$ {
    fastcgi_pass unix:/run/php/php8.1-fpm.sock;
    include fastcgi_params;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}

2. Віртуальний хост Apache

Єдине налаштування, якого типова конфігурація Apache в Ubuntu не дає за замовчуванням, але яке цьому застосунку реально потрібне - це AllowOverride AuthConfig. Без нього кожен файл .htaccess вище мовчки ігнорується, і весь сайт обслуговується взагалі без жодного захисту.

<VirtualHost *:80>
    ServerName pon.example.org
    DocumentRoot /var/www/poncontrol2

    <Directory /var/www/poncontrol2>
        AllowOverride AuthConfig
        Require all granted
    </Directory>
</VirtualHost>
sudo a2ensite pon.example.org.conf
sudo systemctl reload apache2

HTTPS - не опціонально

Cookie сесії входу встановлюється з secure => true - браузер не надішле таку cookie назад по звичайному HTTP, тож вхід буде мовчки "нічого не робити". Розгорніть TLS перед тестуванням входу (certbot --apache - найпростіший шлях для публічного хосту).

Створення файлу HTTP Basic Auth для всього сайту

sudo htpasswd -c /var/www/poncontrol2/.htpasswd youradminuser

3. Створення бази даних MySQL

CREATE DATABASE poncontrol CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'poncontroluse'@'localhost' IDENTIFIED BY 'poncontrolpassword';
GRANT ALL PRIVILEGES ON poncontrol.* TO 'poncontroluse'@'localhost';
FLUSH PRIVILEGES;

Створювати таблиці вручну не потрібно - кожна таблиця, яку використовує застосунок, створюється автоматично, при першій потребі. Порожня база з правильними правами доступу - це повноцінна початкова точка.

4. Розгортання коду

sudo mkdir -p /var/www/poncontrol2
sudo git clone https://github.com/<your-fork>/poncontrol2.git /var/www/poncontrol2
sudo chown -R www-data:www-data /var/www/poncontrol2

5. Майстер першого запуску

Відкрийте https://ваш-домен/setup.php і заповніть MySQL host/db/user/pass та облікові дані telnet ваших OLT (потрібні для таблиці FDB та обмежень швидкості для окремих ONU). Після відправлення форми створюється config/vars.php і базова таблиця olts.

Логін за замовчуванням

Найперше відкриття сторінки після цього додає один обліковий запис: admin / admin1234. Увійдіть і одразу змініть пароль - цей стандартний пароль публічний.

6. Додавання OLT і запуск фонової служби

Додайте свій перший OLT через інтерфейс (IP + SNMP community). Потім запустіть фонову службу PonControl. Вона опитує OLT, перевіряє оновлення та надсилає сповіщення про обрані ONU, кожне з інтервалом, який ви задаєте в Налаштування → Планувальник:

sudo cp /var/www/poncontrol2/deploy/systemd/poncontrol.service /etc/systemd/system/
sudo sed -i "s#__PROJECT_DIR__#/var/www/poncontrol2#g" /etc/systemd/system/poncontrol.service
sudo install -m 644 /var/www/poncontrol2/deploy/logrotate/poncontrol /etc/logrotate.d/poncontrol
sudo systemctl daemon-reload
sudo systemctl enable --now poncontrol

Служба сама обирає PHP 7.4 або новіший. Якщо типовий php на сервері старіший (наприклад 5.6), це не проблема, якщо встановлено новіший. Щоб побачити, що є: ls /usr/bin/php* і update-alternatives --list php. Щоб закріпити конкретний, виконайте sudo systemctl edit poncontrol і додайте під [Service] Environment=PONCONTROL_PHP=/usr/bin/php7.4. Журнал - /var/log/poncontrol/poncontrol.log, ротується щодня і зберігається 14 днів.

Перевірити роботу можна командою systemctl status poncontrol. Якщо ви переходите з установки на cron, видаліть старі рядки PonControl з crontab www-data (sudo crontab -u www-data -e), щоб нічого не запускалось двічі.

Що далі

  • Двофакторна автентифікація - кожен співробітник може увімкнути код із застосунку- автентифікатора для входу за паролем (Змінити пароль → Двофакторна автентифікація). Адміністратори можуть зробити це обов'язковим у Налаштування → Безпека.
  • Оновлення - перевірка оновлень працює під службою. Якщо сервер отримує код із приватного репозиторію, покладіть deploy-ключ у /etc/poncontrol-deploy/ - перевірка знайде його автоматично.
  • Android-застосунок - встановіть APK зі сторінки застосунку в PonControl, введіть адресу цього сервера і увійдіть. Для миттєвих сповіщень про обрані ONU покладіть ключ сервісного облікового запису Firebase у config/fcm_service_account.json, доступний групі www-data (режим 640). До того сповіщення надходитимуть за розкладом служби.
  • Zabbix на цьому сервері - якщо він працює на тій самій машині, його скрипти сповіщень мають мати доступ до читання файлів конфігурації. Адміністраторська панель покаже точні команди, якщо ні.
  • Сповіщення Zabbix/Telegram, інтеграція з UserSide і вхід через Google - усе опціонально і налаштовується в Налаштування → Інтеграції; нічого з цього не потрібно для базового моніторингу OLT/ONU.