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 szybko 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, że nie będę się męczył z rzeźbieniem wszystkiego od podstaw tylko do pomocy zaprzęgnę ChatGPT. Wiedziałem, że 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 – zapewne 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 😀