Autorska aplikacja PHP+MySQL uruchomiona na Dockerze

wojst.pl 2 miesięcy temu

W pewnej firmie zaszła konieczność utworzenia aplikacji ułatwiającej i jednocześnie przyspieszającej proces wyliczania dodatku za pracę w warunkach szkodliwych dla pracowników. Pierwotnie dane były wyciągane z systemu średnio co kwartał, następnie trzeba było je obrobić, wrzucić później do szablonu w Excelu, odpowiednio skonfigurować i przygotować do wydruku. 13 pracowników na zmianie x ilość miesięcy x ilość dni pracujących. Trochę tego było i trochę to trwało. Oczywiście w jakim stopniu byś nie ogarniał Excela, tam zawsze się musi coś rozjechać Pomysł padł na wykorzystanie duetu PHP + MySQL. Aby można było to gwałtownie przenieść na inny serwer wykorzystałem kontenery Dockerowe.

# Hardware
Z powodu braku możliwości uruchomienia VM albo Dockera na obecnych serwerach postanowiłem wykorzystać Raspberry Pi 3 model A+. Został wpięty do lokalnej sieci Wi-Fi. Serwer nie jest wystawiony na zewnątrz – jedynie dostęp lokalny.

# PHP
Programowanie w PHP-ie to nie do końca moja działka. Coś tam się kiedyś wyrzeźbiło, ale to nie było nic dużego. Mimo wszystko podstawy jakieś miałem – ogólnie na studiach było dużo programowania (algorytmy, różne języki), więc programowanie mimo wszystko jako Inżynier z grubsza ogarniam. Jako, iż to miał być tylko program hobbistyczny / dodatkowy / zapełnienie wolnego czasu (niepotrzebne skreślić ) stwierdziłem, iż nie będę się męczył z rzeźbieniem wszystkiego od podstaw tylko do pomocy zaprzęgnę ChatGPT. Wiedziałem, iż potrzebuję sesje użytkowników (panel logowania, bez konieczności rejestracji / resetowania hasłem – czyli ogólnej obsługi użytkowników), chciałem też, aby zmieniała się tylko część strony, a nie przeładowywało całość (w związku z tym wykorzystaniem include).

Usiadłem więc do pracy i konwersacji z AI. Prompty wklepywane, kod z odpowiedzi doklejany do apki. Wbrew pozorom diagnostyki i 'troubleshootingu’ była cała masa. Podstawy programowania + analityczne myślenie + ewentualne poprawki w promptcie i udało się wyrzeźbić działającą aplikację. Nic skomplikowanego, nic rozbudowanego – prawdopodobnie początkujący programista PHP by to napisał milion razy lepiej. Ale jednak udało się to ogarnąć przez admina systemowego. I co najważniejsze – działa

Panel logowania umożliwiający podanie loginu i hasła (poświadczeń zdefiniowanych w odpowiedniej tabeli bazy danych), następnie po zalogowaniu okno główne apki (z instrukcją dla użytkowników) i kilka zakładek – wyświetlenie stanowisk, stawek dla poszczególnych stopni, pracowników z podziałem na zmiany (z możliwością edycji każdego z nich – dane personalne, stanowisko, itp). Importowanie danych pobranych z zewnętrznego systemu (teraz ograniczało się jedynie do skrócenia danych w jednej kolumnie i dopasowanie stopnia szkodliwości dla nich) oraz wyświetlenie ich (z podziałem na pracowników, zmiany). Ostatnia zakładka to generowanie zestawienia – tutaj operator musi jedynie wybrać pracownika oraz zakres dat. I to tyle. W efekcie otrzymuje odpowiednio uzupełniony plik PDF (do tego wykorzystałem bibliotekę TCPDF).

Zaimportowane pliki z danymi mają modyfikowaną nazwę (dorzucany timestamp) oraz są wrzucane do odpowiedniego katalogu na serwerze.

# Docker
Całość działa na 4 kontenerach:
nginx (jako serwer www)
MariaDB (jako baza danych)
PHP
phpMyAdmin (w celu ułatwienia zarządzania danymi w bazie).

Do uruchomienia wykorzystałem Docker compose. Kontener PHP był budowany na podstawie takiego dockerfile:

FROM php:8.2-fpm

RUN apt-get update && \
apt-get install -y zip libzip-dev libpng-dev

RUN docker-php-ext-install mysqli pdo pdo_mysql gd zip


Plik docker-compose.yml dla całego środowiska prezentuje się następująco:
version: '3.3′

services:

php:
build:
dockerfile: php-dockerfile
volumes:
– ’./html:/var/www/html’
depends_on:
– mariadb

nginx:
image: nginx:latest
ports:
– 80:80
links:
– 'php’
volumes:
– ’./html:/var/www/html’
– ’./nginx-conf:/etc/nginx/conf.d’
depends_on:
– php

mariadb:
image: mariadb:10.9
environment:
MYSQL_ROOT_PASSWORD: root_password
MYSQL_DATABASE: db_name
MYSQL_USER: db_user
MYSQL_PASSWORD: db_pass
volumes:
– mysqldata:/var/lib/mysql

phpmyadmin:
image: phpmyadmin/phpmyadmin:latest
ports:
– 8080:80
environment:
PMA_HOST: mariadb
depends_on:
– mariadb

volumes:

mysqldata:

Cała apka znajduje się w katalogu html, który podmontowywany jest do /var/www/html na nginx. Dodatkowo w katalogu nginx-conf znajduje się plik nginx.conf, który zawiera wymaganą konfigurację:

server {
listen 80 default_server;
listen [::]:80 default_server;

server_name localhost;

root /var/www/html;
index index.php index.html;

location / {
try_files $uri $uri/ /index.php?$args;
}

location ~* \.php$ {
fastcgi_pass php:9000;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
}

}

# Podsumowanie
Udało się utworzyć działającą aplikację, która przede wszystkim realizuje założone cele. Działa to na Dockerze, co w prosty sposób umożliwi ewentualne przeniesienie w przyszłości na inny serwer. Każdy z użytkowników posiada własne konto.

Co do pomysłów na modyfikację:
– dodanie obsługi wyjątków
– życzenie od operatorów, aby zaprzęgnąć AI do modyfikacji danych w wspomnianej wcześniej kolumnie

Idź do oryginalnego materiału