Warstwa pośrednia do komunikacji Modbus TCP (odczyt/zapis rejestrów) zintegrowana z Symfony 7.1 oraz Doctrine ORM 3 i uwierzytelnianiem JWT.
Informacje ogólne #
- Cel: Pośrednik do pozyskiwania danych urządzeń przemysłowych przez Modbus TCP oraz ich udostępniania wyższym warstwom systemu.
- Język/Framework: PHP 8.2+, Symfony 7.1
- Komunikacja z urządzeniami:
aldas/modbus-tcp-client^3.5 - Uwierzytelnianie: LexikJWTAuthenticationBundle (JWT)
- Warstwa danych: Doctrine ORM 3 + DB (MySQL)
Repozytorium #
Bitbucket: https://Poligrand@bitbucket.org/Poligrand/modbus-middleware.git
Klonowanie (HTTPS; w razie potrzeby użyj tokenu/aplikacyjnego hasła):
git clone https://Poligrand@bitbucket.org/Poligrand/modbus-middleware.git
cd modbus-middleware
Wymagania #
- System: Linux / macOS / WSL2
- PHP: >= 8.2 (z rozszerzeniami:
ctype,iconv,openssl,pdo_mysql,json,mbstring,xml) - Composer: 2.5+
- Baza danych: MySQL 8.0.32+
- Serwer HTTP: Nginx lub Apache 2.4+
- (Opcjonalnie) Symfony CLI
Pakiety kluczowe (z composer.json): Symfony 7.1 (framework-bundle, console, serializer, validator, form, yaml), Doctrine (orm, dbal, migrations), lexik/jwt-authentication-bundle, aldas/modbus-tcp-client ^3.5.
Architektura #
[Klient/API] ⇄ (JWT) ⇄ [Middleware (Symfony 7.1)] ⇄ [Modbus TCP] ⇄ [Urządzenia]
└─ SQL (Doctrine) ─→ [MySQL]
Warstwa API/CLI zarządza cyklami odczytu/zapisu rejestrów Modbus, obsługuje konfigurację połączeń i persystencję. Dostęp zabezpieczony tokenami JWT.
Struktura katalogów (tylko katalogi) #
modbus-middleware/
├── bin/
├── config/
│ ├── packages/
│ └── routes/
├── migrations/
├── public/
├── src/
│ ├── Command/
│ ├── Controller/
│ ├── Entity/
│ ├── Repository/
│ ├── Service/
│ └── Util/
├── tests/
└── var/
└── jwt/
Konfiguracja środowisk #
Pliki .env* ładowane są zgodnie z konwencją Symfony (zmienne środowiskowe mają pierwszeństwo). Poniżej redagowany przykład .env.local — uzupełnij własnymi wartościami:
APP_ENV=dev
APP_SECRET=<zmien_w_produkcji>
# JWT
JWT_SECRET_KEY="%kernel.project_dir%/var/jwt/private.pem"
JWT_PUBLIC_KEY="%kernel.project_dir%/var/jwt/public.pem"
JWT_PASSPHRASE=<twoje_haslo_do_kluczy>
# DB – MySQL 8.0.32
DATABASE_URL="mysql://ias:secret@mysql-service:3306/ias?serverVersion=8.0.32&charset=utf8mb4"
Uwaga: rozważ zmianę nazwy bazy/użytkownika (np. modbus_middleware), a sekrety trzymaj poza repo (zmienne środowiskowe/menedżer sekretów). W produkcji użyj: composer dump-env prod.
Szybki start (dev) #
# 1) Klonowanie
git clone https://Poligrand@bitbucket.org/Poligrand/modbus-middleware.git
cd modbus-middleware
# 2) Zależności
composer install
# 3) Konfiguracja ENV
cp .env .env.local # lub utwórz .env.local z wartościami powyżej
# 4) Baza danych (MySQL)
php bin/console doctrine:database:create || true
php bin/console doctrine:migrations:migrate -n
# 5) JWT – wygeneruj klucze (patrz poniżej)
# 6) Uruchomienie serwera dev
symfony serve -d # lub: php -S 127.0.0.1:8000 -t public
Baza danych i migracje #
php bin/console doctrine:database:create
php bin/console doctrine:migrations:migrate -n
# (opcjonalnie) Fixtures – jeśli projekt je udostępnia
# php bin/console doctrine:fixtures:load -n
JWT – generowanie kluczy #
Ścieżki kluczy zgodne z .env.local: var/jwt/private.pem, var/jwt/public.pem.
# ustaw hasło (to samo co JWT_PASSPHRASE w .env.local)
export JWT_PASSPHRASE="<twoje_haslo_do_kluczy>"
mkdir -p var/jwt
openssl genpkey -algorithm RSA -out var/jwt/private.pem -pkeyopt rsa_keygen_bits:4096
openssl pkey -in var/jwt/private.pem -pubout -out var/jwt/public.pem
# uprawnienia (tylko aplikacja)
chmod 600 var/jwt/private.pem
chmod 644 var/jwt/public.pem
Uruchamianie #
Lokalnie:
symfony serve -d
# lub
php -S 127.0.0.1:8000 -t public
CLI (przykładowe wzorce komend) — jeśli w projekcie są komendy do odczytów/zapytań Modbus, ich listę sprawdzisz:
php bin/console list | grep app:
Budowanie i wdrożenie (prod) #
- Konfiguracja prod:
APP_ENV=prod,APP_DEBUG=0(zmienne środowiskowe / secrets). - Build i optymalizacja:
composer install --no-dev --optimize-autoloader
composer dump-env prod
php bin/console cache:clear --env=prod
php bin/console doctrine:migrations:migrate --no-interaction --env=prod
- Nginx – minimalny przykład:
server {
server_name api.example.com;
root /var/www/modbus-middleware/public;
location / { try_files $uri /index.php$is_args$args; }
location ~ \.php$ {
include fastcgi_params;
fastcgi_pass unix:/run/php/php8.2-fpm.sock;
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
fastcgi_param DOCUMENT_ROOT $realpath_root;
}
}
