Telepítési és üzemeltetési útmutató
1. Hardveres és szoftverek követelmények
1.1 Hardveres követelmények (éles, UAT)
-
Load Balancer szerver - 1 darab VM.
- Processzor: 2 vCPU
- Memória: 2GB RAM
- Tárhely: 20GB SSD
-
Alkalmazás szerverek - annyi darab VM ahány példányban szeretnénk futtatni az alkalmazásokat (az alábbi konfiguráció VM-enként értendő).
- Processzor: 2 vCPU
- Memória: 8GB RAM
- Tárhely: 40GB SSD
1.2 Szoftveres követelmények
- Operációs rendszer: Az aktuálisan legfrissebb verziójú LTS Ubuntu Server (Minden szerverre érvényes.)
2. Időzóna beállítása
Mielőtt végrehajtjuk a lenti lépéseket bizonyosodjunk meg arról, hogy minden VM ugyanabban az időzónában van.
Az időzóna beállítását root felhasználóként végezzük a szerveren.
A budapesti időzóna az alábbi paranccsal állítható be:
Ezt minden szervernél ellenőrizzük és szükséges esetén állítsuk be.
3. Domain név regisztrálása
Az általunk használt domain kezelőben regisztráljuk be a domain nevet a load balancer szerver IP címéhez.
4. Load Balancer - HAProxy telepítése a Load Balancer szerveren
A HAProxy telepítését és konfigurálását root felhasználóként végezzük a szerveren.
4.1 HAProxy telepítése
A HAProxy-t a következő parancsokkal telepíthetjük:
4.2 HAProxy konfigurálása
A HAProxy konfigurációs fájljában (/etc/haproxy/haproxy.cfg) a következő szerepeljen:
global
log 127.0.0.1 local2
chroot /var/lib/haproxy
pidfile /var/run/haproxy.pid
maxconn 4000
user haproxy
group haproxy
daemon
stats socket /var/lib/haproxy/stats
ssl-default-bind-ciphers ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:RSA+AESGCM:RSA+AES:!aNULL:!MD5:!DSS
ssl-default-bind-options ssl-min-ver TLSv1.2
tune.ssl.default-dh-param 2048
defaults
mode http
log global
option httplog
option dontlognull
option log-health-checks
option redispatch
timeout connect 10s
timeout client 1m
timeout server 5m
timeout tunnel 8h
balance leastconn
http-check expect string UP
frontend https
option forwardfor
bind *:80
bind *:443 ssl crt /etc/ssl/${domain_név}/${domain_név}.pem
http-request set-header X-Forwarded-Proto https if { ssl_fc }
http-request redirect scheme https code 301 unless { ssl_fc }
acl host_client hdr(host) -i ${client_app_domain_név}
acl host_admin hdr(host) -i ${admin_app_domain_név}
acl host_webcomponent hdr(host) -i ${webcomponent_app_domain_név}
acl is-backend path_beg /public/api /api /websocket /WEB/hello /MBL/hello /microsite/WEB
use_backend backend_service if is-backend
use_backend client_spa if host_client
use_backend admin_spa if host_admin
use_backend webcomponent_spa if host_webcomponent
http-response set-header Strict-Transport-Security "max-age=31536000; includeSubDomains;"
backend backend_service
acl is-path-actuator path -i -m beg /actuator
http-request deny if is-path-actuator
option httpchk GET /actuator/health
server backend_service_1 ${APP_SERVER_1_IP}:8080 check fall 2
server backend_service_2 ${APP_SERVER_2_IP}:8080 check fall 2
backend client_spa
acl is-health-check path -i /health-check
http-request deny if is-health-check
option httpchk GET /health-check
server client_spa_1 ${APP_SERVER_1_IP}:4202 check fall 2
server client_spa_2 ${APP_SERVER_2_IP}:4202 check fall 2
backend admin_spa
acl is-health-check path -i /health-check
http-request deny if is-health-check
option httpchk GET /health-check
server admin_spa_1 ${APP_SERVER_1_IP}:4201 check fall 2
server admin_spa_2 ${APP_SERVER_2_IP}:4201 check fall 2
backend webcomponent_spa
acl is-health-check path -i /health-check
http-request deny if is-health-check
option httpchk GET /health-check
server webcomponen_spa_1 ${APP_SERVER_1_IP}:4204 check fall 2
server webcomponen_spa_2 ${APP_SERVER_2_IP}:4204 check fall 2
-
Az
${APP_SERVER_1_IP}és${APP_SERVER_2_IP}értékeket értelemszerűen a clusterben szereplő alkalmazás szerverek IP-címével helyettesítsük. Egy alkalmazás szerver esetén csak az egyik sorra van szükség, minden további szerver esetén a mintának megfelelően újabb sorok felvételével tudjuk ezeket konfigurálni. -
A
${domain_név}értéket értelemszerűn a saját domainünk nevével kell behelyettesíteni.
A domain címekre kiállított tanúsítványokat a/etc/sslmappába helyezzük, Pl.: Ha a doman névprojectdomain.huakkor az elvárt mappaszerkezet:/etc/ssl/projectdomain.hu/projectdomain.hu.pem.
Eltérő útvonal vagy több tanúsítvány esetén ahaproxy.cfgfájlfrontend httpsszekciójában abind *:443 sslkezdetű sort módosítsuk, melynek értéke a következő minta szerint épül fel: -
A HAProxy konfigurációban tetszőleges számú frontend alkalmazást konfigurálhatunk. Értelemszerűen az
${admin_app_domain_név},${client_app_domain_név},${partner_app_domain_név}értékeket a megfelelő frontend alkalmazás domain nevével kell helyettesíteni.
4.3 HAProxy indítása
A konfigurációk elvégeztével indítsuk el a HAProxy szolgáltatást:
Illetve, hogy rebootot követően is elinduljon a HAProxy adjuk ki az alábbi parancsot is:A HAProxy log fájlt: haproxy.log, a /var/log/ útvonalon érhetjük el.
5. Alkalmazás szerver
A következő lépéseket a clusterben lévő összes alkalmazás szerveren végezzük el.
5.1 Docker telepítése
A docker telepítését root felhasználóként végezzük a szerveren.
A Docker telepítésének egyik módja, hogy beállítjuk a docker repositoryjait és onnan telepítjük a Docker-t. Az egyéb telepítési módokról itt taláható információ.
A Docker repositoryk beállításához adjuk ki az alábbi parancsokat:
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
A Docker teleítéséhez adjuk ki az alábbi parancsokat:
A Docker compose telepítéséhez adjuk ki az alábbi parancsokat:
A Docker sikeres telepítését az alábbi scripttel ellenőrizhetjük:
A docker compose verzióját az alábbi paranncsal ellenőrizhetjük:
5.2 Docker network létrehozása
A docker network létrehozását root felhasználóként végezzük a szerveren.
Hozzunk létre egy docker network-öt az alábbi paranccsal:
5.3 User létrehozása
Az alkalmazásokat nem a root felhasználóval kell elindítani, ezért hozzunk létre egy dedikált felhasználót(appuser) aki az alkalmazásokat fogja kezelni.
Az appuser felhasználót root felhasználóként hozzuk létre a szerveren.
A felhasználó létrehozható például az alábbi parancsok segítségével:
5.4 Mappastruktúra létrehozása
A mappastruktúra létrehozását root felhasználóként végezzük a szerveren.
- Lépjünk be az
optkönyvtárba az alábbi paranccsal: - Hozzuk létre projekt a mappákat az alábbi parancsokkal:
- Végül adjuk át
ownerésgroupjogokat az alkalmazást futtató felhasználónak:
5.5 Alkalmazás konfiguráció
Az alkalmazás konfigurációval kapcsolatos lépéseket az appuser felhasználóval végezzük el a szerveren.
Az /opt/project/infrastructure könyvtárba helyezzük el a következő konfigurációs fájlt:
/opt/project/infrastructure/.env:
BACKEND_SERVICE_VERSION=1.0.0
CLIENT_SPA_VERSION=1.0.0
ADMIN_SPA_VERSION=1.0.0
PYTHON_SERVICE_VERSION=1.0.0
JDK_JAVA_OPTIONS="--add-modules java.se --add-exports java.base/jdk.internal.ref=ALL-UNNAMED --add-opens java.base/java.lang=ALL-UNNAMED --add-opens java.base/java.nio=ALL-UNNAMED --add-opens java.base/sun.nio.ch=ALL-UNNAMED --add-opens java.management/sun.management=ALL-UNNAMED --add-opens jdk.management/com.sun.management.internal=ALL-UNNAMED"
JAVA_TOOL_OPTIONS="-Xms1g -Xmx2g"
LOGGING_CONFIG=file:./infrastructure/config/backend-service/logback-spring.xml
SPRING_PROFILES_ACTIVE=default
SPRING_DATASOURCE_URL=jdbc:${DB_TYPE}://${DB_SERVER_IP}:50000/${DB_NAME}
SPRING_DATASOURCE_USERNAME=${DB_USERNAME}
SPRING_DATASOURCE_PASSWORD=${DB_PASSWORD}
SPRING_LIQUIBASE_DROP_FIRST=false # FONTOS: Ha az érték true, akkor eldobja az adatbázist és nulláról húzza fel
SPRING_MAIL_HOST=${SMTP_HOST_IP}
SPRING_MAIL_PORT=${SMTP_PORT}
SPRING_MAIL_USERNAME=${SMTP_USERNAME}
SPRING_MAIL_PASSWORD=${SMTP_PASSWORD}
SPRING_MAIL_PROPERTIES_MAIL_SMTP_AUTH=true
SPRING_MAIL_PROPERTIES_MAIL_SMTP_CONNECTIONTIMEOUT=5000
SPRING_MAIL_PROPERTIES_MAIL_SMTP_TIMEOUT=5000
SPRING_MAIL_PROPERTIES_MAIL_SMTP_WRITETIMEOUT=5000
SPRING_MAIL_PROPERTIES_MAIL_SMTP_STARTTLS_ENABLE=true
PROJECT_ENVIRONMENT=PRODUCTION
PROJECT_BASE_URLS_APPLICATION_TYPE_BASE_URLS_CLIENT=https://${client_app_domain_név}
PROJECT_BASE_URLS_APPLICATION_TYPE_BASE_URLS_ADMIN=https://${admin_app_domain_név}
PROJECT_COOKIE_CLIENT_DOMAIN=${client_app_domain_név}
PROJECT_COOKIE_ADMIN_DOMAIN=${admin_app_domain_név}
PROJECT_ANTIVIRUS_HOST=${CLAMAV_HOST_IP}
PROJECT_ANTIVIRUS_PORT=3310
PROJECT_KEYCLOAK_URL=${KEYCLOAK_URL}
PROJECT_KEYCLOAK_REALM=${KEYCLOAK_REALM}
PROJECT_KEYCLOAK_CLIENTID=${KEYCLOAK_CLIENTID}
SPRING_SECURITY_OAUTH2_RESOURCESERVER_JWT_ISSUER_URI=${KEYCLOAK_URL}/realms/${KEYCLOAK_REALM}
PROJECT_REDIS_HOST=${REDIS_HOST_IP}
PROJECT_REDIS_PORT=${REDIS_PORT}
PROJECT_NOTIFICATION_EMAIL_EMAIL_FROM_ADDRESS=${EMAIL_FROM_ADDRESS}
PROJECT_CAPTCHA_V2_SITE_KEY=${CAPTCHA_V2_SITE_KEY}
PROJECT_CAPTCHA_V2_SECRET_KEY=${CAPTCHA_V2_SECRET_KEY}
PROJECT_CAPTCHA_V3_SITE_KEY=${CAPTCHA_V3_SITE_KEY}
PROJECT_CAPTCHA_V3_SECRET_KEY=${CAPTCHA_V3_SECRET_KEY}
PROJECT_GOOGLE_ANALYTICS_ENABLED=${PROJECT_GOOGLE_ANALYTICS_ENABLED}
PROJECT_GTM_CONTAINER_ID=${PROJECT_GTM_CONTAINER_ID}
PROJECT_CSP="default-src 'self'; frame-src ${KEYCLOAK_URL} https://www.google.com/recaptcha/ https://recaptcha.google.com/recaptcha/ 'self' blob:; script-src https://www.googletagmanager.com https://www.google.com/recaptcha/ https://www.gstatic.com/recaptcha/ 'unsafe-inline' 'self' 'unsafe-eval'; form-action 'self'; font-src 'self' fonts.gstatic.com; style-src 'unsafe-inline' 'self' fonts.googleapis.com; img-src 'self' https://*.google-analytics.com www.googletagmanager.com https://intuitech.studio data:; object-src 'none'; connect-src 'self' ${KEYCLOAK_URL} https://*.google-analytics.com https://*.analytics.google.com;"
Az alábbi placeholdereket cseréljük le a környezetspecifikus értékekre:
${DB_TYPE}: Az adatbázis típusa pl.:postgresql.${DB_SERVER_IP}: Az adatbázis szerver IP címe.${DB_NAME}: Az adatbázis neve.${DB_USERNAME}: Az alkalmazás szerver DB felhasználójának neve.${DB_PASSWORD}: Az alkalmazás szerver DB felhasználójának jelszava.${SMTP_HOST_IP}: Az SMTP szerver host neve vagy IP címe.${SMTP_PORT}: Az SMTP szerver portja.${SMTP_USERNAME}: Az SMTP szerverhez tartozó felhasználónk neve.${SMTP_PASSWORD}: Az SMTP szerverhez tartozó felhasználónk jelszava.${CLAMAV_HOST_IP}: A ClamAV host neve vagy IP címe.${REDIS_HOST_IP}: A Redis szerver host neve vagy IP címe.${REDIS_PORT}: A Redis szerver portja.${EMAIL_FROM_ADDRESS}: Az az e-maíl cím, amit feladóként szeretnénk látni a kiküldött leveleknél.${KEYCLOAK_URL}: A Keycloak szolgáltatás címe. (Protokoll + Domain név, pl.https://keycloak.alkalmazas.pelda)${KEYCLOAK_REALM}: A Keycloak realm neve.-
${KEYCLOAK_CLIENTID}: Az alkalmazás által használt Keycloak Client ID. -
Értelemszerűen az
${admin_app_domain_név},${client_app_domain_név},${partner_app_domain_név}értékeket a megfelelő frontend alkalmazás domain nevével kell helyettesíteni. -
A
Fontos továbbá, hogy az itt ajánlottJAVA_TOOL_OPTIONSváltozóban azXmsésXmxJVM paraméterek esetén az-Xms1gés-Xmx2gértékek 4GB memóriával rendelkező alkalmazás szerverek esetén érvényesek.
Amennyiben 8GB memóriával rendelkező alkalmazás szervereink vannak, úgy az-Xms1gés-Xmx4gértékeket használjuk:Xmxérték a minimálisan megadandó maximum heap size értéket jelenti. Ideális esetben azXmxértéke közlítőleg legyen a gép rendelkezésre álló memória mennyisége, minusz a gépen futó egyéb alkalmazások, rendszerszoftverek, infrastruktúrális komponensek memóriaigénye. -
A
PROJECT_ENVIRONMENTváltozó értéke befolyásolja, hogy megjelenjen-e a kliens alkalmazások láblécében az alkalmazás verzió mellett a fejlesztés technikai azonosítója is. A production környezeten ennek a változónak az értéke minden esetbenPRODUCTIONkell legyen, hogy ez a technikai verzió ne jelenjen meg. Minden más érték pl.:UATesetén meg fog jelenni a technikai azonosító is a láblécben. -
A
PROJECT_CAPTCHA_V2_SITE_KEY,PROJECT_CAPTCHA_V2_SECRET_KEYésPROJECT_CAPTCHA_V3_SITE_KEY,PROJECT_CAPTCHA_V3_SECRET_KEYváltozókban kell beállítani a google által adott site key-eket és secret key-eket, amennyiben be van kapcsolva a captcha funkció. Site és secret key-eket a reCAPTCHA hivatalos oldalán lehet generáltatni. -
A
PROJECT_GOOGLE_ANALYTICS_ENABLEDváltozót true-ra kell állítani, ha szeretnénk bekapcsolni a funkciót. -
A
PROJECT_GTM_CONTAINER_IDváltozóba a Google Tag Manager container id-t kell behelyettesíteni. Amennyiben nem szeretnénk bekapcsolni a funkciót, a container id maradhat üresen. -
A
PROJECT_CSPváltozó értékéből:-
Ha a projekten nincs bekapcsolva a captcha, a következő url-eket ki lehet törölni:
https://www.google.com/recaptcha/https://www.gstatic.com/recaptcha/https://recaptcha.google.com/recaptcha/
-
Ha a projekten nincs bekapcsolva a Google Analytics, a következő url-eket ki lehet törölni:
https://www.googletagmanager.comhttps://*.google-analytics.comwww.googletagmanager.com
-
Az /opt/project/infrastructure/config/backend-service könyvtárba helyezzük el a következő konfigurációs fájlokat:
/opt/project/infrastructure/config/backend-service/logback-spring.xml:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
<layout class="io.gbsolutions.project.techcore.log.PatternMaskingLayout">
<maskPattern>\"password\"\s*:\s*\"(.*?)\"</maskPattern>
<maskPattern>password\s*:\s*(.*)</maskPattern>
<maskPattern>\"newPassword\"\s*:\s*\"(.*?)\"</maskPattern>
<maskPattern>newPassword\s*:\s*(.*)</maskPattern>
<maskPattern>\"currentPassword\"\s*:\s*\"(.*?)\"</maskPattern>
<maskPattern>currentPassword\s*:\s*(.*)</maskPattern>
<pattern>%d{yyyy-MM-dd'T'HH:mm:ss.SSSXXX} %green(%-5level) %magenta(${PID:- }) %yellow(%X{traceId:-}) --- %red(%X{remoteAddress}) %yellow(%X{userSessionIdentifier}) [%14thread] %cyan(%-40.40logger{39}) : %replace(%replace(%replace(%replace(%replace(%replace(%msg){'[\s\n\r]+',' '}){'[<]','%3C'}){'[>]','%3E'}){'["]','%22'}){'[\']','%27'}){'[&]','%26'}%n
</pattern>
</layout>
</encoder>
</appender>
<appender name="SAVE-TO-FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>/infrastructure/logs/backend-service.log</file>
<encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
<layout class="io.gbsolutions.project.techcore.log.PatternMaskingLayout">
<maskPattern>\"password\"\s*:\s*\"(.*?)\"</maskPattern>
<maskPattern>password\s*:\s*(.*)</maskPattern>
<maskPattern>\"newPassword\"\s*:\s*\"(.*?)\"</maskPattern>
<maskPattern>newPassword\s*:\s*(.*)</maskPattern>
<maskPattern>\"currentPassword\"\s*:\s*\"(.*?)\"</maskPattern>
<maskPattern>currentPassword\s*:\s*(.*)</maskPattern>
<pattern>%d{yyyy-MM-dd'T'HH:mm:ss.SSSXXX} %-5level ${PID:- } %X{traceId:-} --- %X{remoteAddress} %yellow(%X{userSessionIdentifier}) [%14thread] %-40.40logger{39} :%replace(%replace(%replace(%replace(%replace(%replace(%msg){'[\s\n\r]+',' '}){'[<]','%3C'}){'[>]','%3E'}){'["]','%22'}){'[\']','%27'}){'[&]','%26'}%n
</pattern>
</layout>
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>/infrastructure/logs/backend-service-%d{yyyy-MM-dd}.%i.gz</fileNamePattern>
<maxFileSize>50MB</maxFileSize>
<maxHistory>30</maxHistory>
<totalSizeCap>10GB</totalSizeCap>
</rollingPolicy>
</appender>
<logger name="io.gbsolutions" level="info" additivity="false">
<appender-ref ref="STDOUT"/>
<appender-ref ref="SAVE-TO-FILE"/>
</logger>
<logger name="liquibase" level="info" additivity="false">
<appender-ref ref="STDOUT"/>
<appender-ref ref="SAVE-TO-FILE"/>
</logger>
<logger name="org.apache.http" level="error" additivity="false">
<appender-ref ref="STDOUT"/>
<appender-ref ref="SAVE-TO-FILE"/>
</logger>
<logger name="org.springframework.ws.client.MessageTracing.sent" level="trace" additivity="false">
<appender-ref ref="STDOUT"/>
<appender-ref ref="SAVE-TO-FILE"/>
</logger>
<logger name="org.springframework.ws.server.MessageTracing.sent" level="trace" additivity="false">
<appender-ref ref="STDOUT"/>
<appender-ref ref="SAVE-TO-FILE"/>
</logger>
<logger name="org.springframework.ws.client.MessageTracing.received" level="trace" additivity="false">
<appender-ref ref="STDOUT"/>
<appender-ref ref="SAVE-TO-FILE"/>
</logger>
<logger name="org.springframework.ws.server.MessageTracing.received" level="trace" additivity="false">
<appender-ref ref="STDOUT"/>
<appender-ref ref="SAVE-TO-FILE"/>
</logger>
<logger name="org.apache.hc.client5.http.headers" level="debug" additivity="false">
<appender-ref ref="STDOUT"/>
<appender-ref ref="SAVE-TO-FILE"/>
</logger>
<logger name="org.apache.hc.client5.http.wire" level="debug" additivity="false">
<appender-ref ref="STDOUT"/>
<appender-ref ref="SAVE-TO-FILE"/>
</logger>
<root level="error" additivity="false">
<appender-ref ref="STDOUT"/>
<appender-ref ref="SAVE-TO-FILE"/>
</root>
</configuration>
A fenti maxFileSize konfigurációs paraméter definiálja, hogy maximum 50MB méretű lehet egy log fájl.
A fenti maxHistory konfigurációs paraméter definiálja, hogy maximum 30 napig őrizzük meg a logfájlokat.
A fenti totalSizeCap konfigurációs paraméter definiálja, hogy összesen maximum 10GB-nyi logot őrzünk meg.
Amennyiben bármelyik értéket növelni/csökkenteni szeretnénk értelemszerűen a megfelelő konfigurációs paraméter értékét kell növelni/csökkenteni.
Például ha szeretnénk hogy 100MB méretű logfájljaink legyenek, amiket 60 napig őrzünk meg, de maximum 20GB-nyi logot tároljunk összesen, akkor a konfigurációs paraméterek értékének az alábbiakra kell módosulnia:
Fontos, hogy az alapértelmezetten konfigurált 30 napnál régebbi logok megőrzésére az is megoldást ad, ha megfelelő időközönként a logfájlok egy külön tárhelyre archiválásra kerülnek.
Ezzel azt is elkerülhetjük, hogy túl sok helyet foglaljanak a logok az alkalmazás szerver számítógépén. Azonban szükség esetén mégis elérhetőek maradjanak a régebbi logfájlok.
Az /opt/project/infrastructure/ könyvtárba helyezzük el a firebase.json fájlt.
A projektspecifikus firebase.json fájlt ezen az oldalon tudjuk előállítani.
5.6 Image fájlok
-
Másoljuk fel az alkalmazás image fájlokat az alkalmazás szerverre.
-
Lépjünk be az alkalmazásokat futtató felhasználóval. (Az 5.3-as pontban létrehozott felhasználóval.)
-
Majd az alábbi parancsokkal töltsük be az image-eket a container storage-ba:
5.7 Alkalmazások indítása
Az alkalmazás indításával kapcsolatos lépéseket az appuser felhasználóval végezzük el a szerveren.
Az itt található lépéseket az alkalmazást futtatni jogosult (az 5.3-as pontban létrehozott) felhasználóval végezzük el.
Az alkalmazások elindítása előtt módosítsuk a hozzuk létre az alábbi fájt. Ez a fájl megkönnyíti a jövőbeli telepítéseket is.
Hozzuk létre a docker-compose-services.yml fájlt az /opt/project/infrastructure/ mappába az alábbi parancsokkal:
docker-compose-services.yml tartalma az alábbi legyen:
version: '3.1'
x-infrastructure-timezone-volume: &infrastructure-timezone-volume
volumes:
- infrastructure:/infrastructure
- "/etc/timezone:/etc/timezone:ro"
- "/etc/localtime:/etc/localtime:ro"
x-timezone-volume: &timezone-volume
volumes:
- "/etc/timezone:/etc/timezone:ro"
- "/etc/localtime:/etc/localtime:ro"
services:
backend-service:
image: 'registry.gitlab.com/gbsolutions/granit-bank/virtualis-asszisztens/backend/backend-service:${BACKEND_SERVICE_VERSION}'
container_name: backend-service
restart: always
stop_grace_period: 30s
ports:
- 8080:8080
- 5701:5701
<<: *infrastructure-timezone-volume
env_file:
- .env
client-spa:
image: 'registry.gitlab.com/gbsolutions/granit-bank/virtualis-asszisztens/backend/client-spa:${CLIENT_SPA_VERSION}'
container_name: client-spa
restart: always
ports:
- 4202:4200
<<: *timezone-volume
env_file:
- .env
admin-spa:
image: 'registry.gitlab.com/gbsolutions/granit-bank/virtualis-asszisztens/backend/admin-spa:${CLIENT_SPA_VERSION}'
container_name: admin-spa
restart: always
ports:
- 4201:4200
<<: *timezone-volume
env_file:
- .env
webcomponent-spa:
image: 'registry.gitlab.com/gbsolutions/granit-bank/virtualis-asszisztens/backend/webcomponent-spa:${CLIENT_SPA_VERSION}'
container_name: webcomponent-spa
restart: always
ports:
- 4204:4200
<<: *timezone-volume
env_file:
- .env
python-service:
image: 'registry.gitlab.com/gbsolutions/granit-bank/virtualis-asszisztens/backend/python-service:${PYTHON_SERVICE_VERSION}'
container_name: python-service
restart: always
ports:
- 8000:8000
env_file:
- .env
volumes:
- "./logs:/app/infrastructure/logs"
- "/etc/timezone:/etc/timezone:ro"
- "/etc/localtime:/etc/localtime:ro"
volumes:
infrastructure:
driver: local
driver_opts:
device: $PWD # Wont work on Windows, set absolute path to the infrastructure folder
o: bind
type: none
networks:
default:
name: infrastructure-network
external: true
Az alkalmazások az alábbi paranccsal indíthatóak el:
Az alkalmazások az alábbi paranccsal állíthatóak le:
5.8 Az APM használata
Az APM konfigurációjával kapcsolatos lépéseket az appuser felhasználóval végezzük el a szerveren.
Amennyiben szeretnénk monitorozni az alkalmazás performanciáját, akkor ez az APM segítségével könnyen megtehető.
Ehhez először is szükség lesz egy elasticsearch, kibana és agent-server telepítésére az alkalmazás szerverektől független másik gép(ek)re.
5.8.1 APM agent elhelyezése az alkalmazás szerver gépen
Az /opt/project/infrastructure mappába helyezzük el az elastic-apm-agent-1.38.0.jar-t.
5.8.2 APM bekötése a backend-service-be
Az APM bekötéséhez a /opt/project/infrastructure/.env fájlt szükséges módosítani:
A JAVA_TOOL_OPTIONS változót egészítsük ki az alábbi konfigurációkkal:
-javaagent:/infrastructure/elastic-apm-agent-1.38.0.jar -Delastic.apm.environment=${környezet} -Delastic.apm.service_name=${project-név} -Delastic.apm.service_node_name=backend-service-1 -Delastic.apm.server_urls=http://${IP}:${PORT} -Delastic.apm.application_packages=io.gbsolutions.project
A módosítás után így kell kinéznie a JAVA_TOOL_OPTIONS szekciónak:
JAVA_TOOL_OPTIONS="-Xms1g -Xmx2g -javaagent:/infrastructure/elastic-apm-agent-1.38.0.jar -Delastic.apm.environment=${környezet} -Delastic.apm.service_name=${project-név} -Delastic.apm.service_node_name=backend-service-1 -Delastic.apm.server_urls=http://${APM_IP}:${APM_PORT} -Delastic.apm.application_packages=io.gbsolutions.project"
Fontos, hogy a JAVA_TOOL_OPTIONS sorban ne módosítsuk az Xms és Xmx JVM paraméterek korábban megadott értékeit. (Értelemszerűen a 8GB memóriával rendelkező alkalmazás szerverek esetén az alábbi értékek fognak szerepelni: -Xms1g -Xmx4g.)
-
Ha több gépre is telepítve van a monitorozni kívánt alkalmazás, akkor a
-Delastic.apm.service_node_nameértékében található számlálót növeljük, hogy alkalmazáspéldányonként külön is tudjuk majd szűrni az adatokat. -
Az
${APM_IP}és${APM_PORT}placeholderek helyére annak a gépnek kell az IP címét és port számát megadni, amelyre az elasticsearch-t, kibana-t és agent-server-t telepítettük. - Az
${környezet}placeholder helyére az aktuális környezet azonosítóját kell behelyettesíteni (UAT,PROD). Pl.: éles környezet esetén:PROD. - Az
${projekt-név}placeholder helyére az alkalmazás nevét kell beírni.
6. Adatbázis
Az adatbázis üzemeltetése során kiemelt fontosságú a rendszeres backup-ok készítése, hogy katasztrófális hiba esetén a korábbi adatbázis állapotok visszaállíthatóak legyenek. Ezeket a backup fájlokat javasolt fizikailag is legalább két külön tárhelyen is megőrizni.
Ezen felül fontos, hogy rendelkezzünk forgatókönyvvel is az ilyen esetekre, mely forgatókönyvnek tartalmaznia kell az adatbázis rollback, vagy a backup visszatöltésének lépéseit.