AWS fejlesztői tesztkörnyezet létrehozása és konfigurálása
1. EC2 Instance létrehozása (VM létrehozása)
1.1 Hardverspecifikáció
Az EC2 Instance létrehozásakor az infrastruktúra dokumentációban leírt hardveres követelmények az irányadóak. A tesztkörnyezetekhez ajánlott hardverspecifikáció itt található.
1.2 A VM létrehozás lépései
- Jelentkezzünk be az Amazonra.
-
A keresőbe írjuk be hogy „EC2“, majd a megjelenő Services szekcióban válasszuk ki az EC2-t.
-
Győződjünk meg róla, hogy a jobb felső sarokban a Frankfurt régió van kiválasztva.
-
A megnyíló EC2 Dashboard-on keressük meg a Launch instance dobozt és kattintsunk a Launch instance gombra. (A lenyíló menüben is a Launch instance-t válasszuk.)
-
Ekkor megnyílik a Launch an instance képernyő.
-
A Name and tags dobozban adjunk nevet az instancenak. A későbbiekben az itt megadott néven fogjuk megtalálni a létrehozott instancet az Instances képernyőn. Továbbá adjuk hozzá a következő tageket is a géphez:
- project: projekt nevét adjuk meg (adott projekthez tartozó gépekre ugyanazt rakjuk)
- environment: develop (ha több környezet is lenne, akkor manual-1,manual-2 stb is lehet ez)
- application: ez opcionális, akkor adjuk meg, ha több gépre külön telepítjük a komponenseket, pl backend/frontend/db/etc
-
Az Application and OS Images (Amazon Machine Image) dobozban az operációs rendszerek közül válasszuk ki az Ubuntu-t.
-
Az Instance type dobozban válasszuk ki a
t3.large-ot. -
A Key pair (login) dobozban válasszuk ki a saját login kulcspárunkat (amennyiben létezik).
A login kulcspár szerepe
A login kulcspárra azért van szükség, hogy az instance létrehozás után (amikor még nincsenek általunk létrehozott felhasználók az VM-en) rögtön tudjunk SSH-n keresztül csatlakozni a VM-hez.
Login kulcspár létrehozása
Ha még nem hoztunk létre ilyet korábban magunknak vagy a projektnek akkor a „Create new key pair“ linkre kattintva tudunk kulcspárt létrehozni. A létrehozás menetéről itt található leírás.
-
A Network settings doboz jobb felső sarkában kattintusnk az Edit gombra.
-
A VPC (Virtual Private Cloud) mezőben válasszuk ki a vpc-a31611c8 azonosítójú VPC-t.
-
A Firewall (security groups) szekcióban válasszuk ki a Create security group opciót.
-
A Security group name mezőben adjunk nevet a security groupnak.
-
A Description mezőben adjunk meg tetszőleges leírást a security groupról.
-
Az Inbound security groups rules szekcióban győződjünk meg róla, hogy az alábbi szabály definiálva van-e:
-
A tanúsítványok létrehozásához szükség lesz arra is, hogy az Inbound security groups rules szekcióban az Add security group rule gomb segítségével az alábbi két szabályt is definiáljuk:
-
-
A Configure storage dobozban állítsunk be 40GB tárhelyet.
-
Az Advanced details dobozban nem szükséges módosítani a beállításokat.
-
Végezetül ellenőrizzük a Summary dobozban a beállításokat, és ha mindent a fentieknek megfelelően állítottunk be kattintsunk a Launch Instance gombra.
-
Ha mindent jól csináltunk, akkor a következő üzenetet kell látnunk:
2. Domainek létrehozása
Az Amazon Route 53 DNS szolgáltatásában regisztráljuk a domain nevet/neveket az EC2 instance IP címéhez.
A domain nevek regisztrálásáról és a konvenciókról itt található leírás.
Annyi domaint regisztráljunk, amennyi indokolt a projekten. Ha csak ügyféloldali alkalmazás van, akkor regisztráljunk client és maildev(mock smtp szerver) domaineket, de admin pl nem szükséges.
IP cím változás Instance újraindítás esetén
Fontos, hogy amennyiben teljesen leállítjuk az EC2 Instance-t az AWS Stop instance funkciójával, akkor a Start instance megnyomása után új IP-vel fog elindulni az instance.
Ilyenkor ne felejtsük el, hogy a Route 53 szolgáltatásban is frissíteni kell a domain-ekhez tartozó IP címeket.
Javaslat: Stop/Start instance helyett használjuk a Reboot instance funkciót, ilyenkor ugyanis nem változik meg az EC2 Instance IP címe.
3. VM konfigurálása
3.1 Csatlakozás újonnan létrehozott instancehoz
Az EC2 Instance létrehozásakor beállított login kulcspár egyik szerepe, hogy a hozzá tartozó private kulccsal be tudunk SSH-zni az instancera.
A csatlakozás lépései:
- A baloldali menüsorból válasszuk ki az Instances opciót.
-
A megjelenő listából keressük ki az instance-unkat, majd kattintsunk az Instance ID-ra:
-
A megnyíló Instance Summary képernyő jobb felső sarkában nyomjuk meg a Connect gombot.
-
Végül a Connect to instance képernyőn válasszuk ki az SSH client tabot, és az Example szekcióban található paranccsal tudunk SSH-n keresztül csatlakozni az instancehoz. (Ezt bármilyen általunk preferált UNIX parancssorból megtehetjük, pl.: Git Bash.)
3.2 Felhasználók létrehozása
3.2.1 appuser
Az alkalmazásokat nem a root felhasználóval kell elindítani, ezért hozzunk létre egy dedikált felhasználót aki az alkalmazásokat fogja kezelni.
Továbbá az appuser-rel történik a CI-ből való telepítés is.
A létrehozás menetét és a CI deployhoz szükséges konfigurációt az alábbi lépések fejtik ki.
3.2.1.1 User létrehozása
-
Hozzuk létre a user-t és az
.sshmappáját az alábbi parancsokkal:- A megjelenő
New password:ésRetype new password:inputoknál, mivel az instance-ra csak kulcs alapú authentikáció engedélyezett, így adjunk tetszőleges jelszót (ezt a jelszót nem fogjuk a későbbiekben használni). - A
Full Name []:inputnál adjuk meg hogyappuser. - A további inputoknál csak üssünk Enter-t.
- Az
Is the information correct? [Y/n]kérdésnél adjuk meg, hogyY.
- A megjelenő
-
Hozzuk létre az SSH kulcspárt az alábbi parancsokkal:
- A felugró
Enter file in which to save the keyinput sornál ha nem szeretnénk specifikus nevet megadni a fájloknak, akkor csak nyomjunk Enter-t. - Az
Enter passphrase (empty for no passphrase):ésEnter same passphrase again:input soroknál ne adjunk meg jelszót (csak üssünk Enter-t).
- Másoljuk be az előbb létrehozott publikus kulcs tartalmát az
authorized_keysfájlba.
3.2.1.2 CI/CD változók beállítása
Ahhoz, hogy a megfelelő CI jobok (pl.:
deploy-to-awsjob) képes legyen SSH-val csatlakozni az AWS környezethez, be kell állítani az authentikációhoz szükséges változókat a GitLabon. - A felugró
-
A projekt subgroupjába navigálva a baloldali menüsorból válasszuk ki a Settings -> CI/CD menüpontot.
- Nyissuk ki a Variables szekciót.
- Az appuser felhasználó létrehozása után az Add variable gombbal adjuk hozzá az alábbi változókat:
| Key | Value | Protect variable | Mask variable | Expand variable reference |
|---|---|---|---|---|
SERVER_IP_ADDRESS |
Az AWS-en definiált EC2 Instance publikus IPv4-es címe. | |||
SERVER_USERNAME |
appuser |
|||
SSH_PRIVATE_KEY |
Az appuser számára generált SSH kulcspár privát kulcsának tartalmát kell ide bemásolni. |
A projekt subgroupjában definiálandó CI változókról általánoságban itt olvashattok.
3.2.2 Normál user
3.2.2.1 SSH kulcspár létrehozása
A csapattagoknak nem szükséges új kulcspárt generálniuk, használhatják a Git-hez generált kulcspárjuk publikus kulcsát is. A user létrehozásnál ennek a publikus kulcsnak a tartalmára van szükség.
3.2.2.2 User létrehozása
- A felugró
New password:mezőben adjuk meg a felhasználó kezdő jelszavát, majd aRetype new password:mezőben adjuk meg ugyanazt. - A
Changing the user information for ${username}kérdéseknél aFull Name []:mezőben adjuk meg a felhasználó teljes nevét: „Keresztnév Vezetéknév“. A többi mező opcionális, ha nem akarjuk kitölteni nyomjunk az adott mezőnél Enter-t. - Végül az
Is the information correct? [Y/n]kérdésre nyomjunkY-t.
- Másoljuk be a publikus kulcs tartalmát az
authorized_keysfájlba.
${username} helyére kell behelyettesíteni.
3.2.2.3 Username konvenció
A konvenció a tesztkörnyezeten a felhaszálónevekre a következő:
Például
Ha a csapattag neve Példa Béla akkor a felhasználóneve legyen: peldab.
Script user létrehozáshoz
#!/bin/bash
USERNAME=$1
AUTHORIZED_KEYS=$2
adduser "$USERNAME"
mkdir "/home/$USERNAME/.ssh"
chmod 700 "/home/$USERNAME/.ssh"
chown "$USERNAME:$USERNAME" "/home/$USERNAME/.ssh"
echo "$AUTHORIZED_KEYS" > "/home/$USERNAME/.ssh/authorized_keys"
chmod 600 "/home/$USERNAME/.ssh/authorized_keys"
chown "$USERNAME:$USERNAME" "/home/$USERNAME/.ssh/authorized_keys"
usermod -a -G sudo "$USERNAME"
echo "Username: $USERNAME"
Az alábbi módon lehet lefuttatni a scriptet:
- A
${username}placeholder helyére a létrehozni kívánt felhasználó, felhasználónevét kell behelyettesíteni. - A
${public-key-content}placeholder helyére a létrehozni kívánt felhasználó, publiks kulcsának tartalmát kell behelyettesíteni. Tegyük idézőjelbe a publikus kulcs tartalmát, a láthatatlan karakterek miatt!
Fontos
A scriptet az opt/project/infrastructure/ mappába hozzuk létre, hogy központilag kezelhető és elérhető legyen a csapat számára.
Ezt a script-et csak egyszer kell létrehozni az AWS környezeten az első telepítés során.
3.3 Mappastruktúra kialakítása
Ezt a lépést is a root felhasználóval kell végrehajtani.
- Lépjünk be az
optkönyvtárba az alábbi paranccsal: - Hozzuk létre a projekt mappákat az alábbi parancsokkal:
Az elvárt mappaszerkezet:
opt
└ project
└ infrastructure
├ config
│ ├ backend-service
│ ├ emulator-service
│ └ bot-service
├ logs
├ maildev
└ keycloak
- Végül adjuk át
ownerésgroupjogokat az alkalmazást futtató felhasználónak:
3.4 Alkalmazás konfigurációs fájlok létrehozása
3.4.1 Az /opt/project/infrastructure/config/emulator-service/application.yml fájl
Az /opt/project/infrastructure/config/emulator-service/ mappába hozzuk létre az application.yml fájlt:
Jelenleg nincs környezetspecifikusan felülírandó paramétere az emulator-service-nak, így ezzel a fájllal nincs további teendő.
3.4.2 Az /opt/project/infrastructure/config/emulator-service/logback-spring.xml fájl
Az /opt/project/infrastructure/config/emulator-service/ mappába hozzuk létre az logback-spring.xml fájlt:
A logback-spring.xml fájl tartalma legyen az alábbi:
<?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="ch.qos.logback.classic.PatternLayout">
<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(%msg){'[\s\n\r]+',' '}%n</pattern>
</layout>
</encoder>
</appender>
<appender name="SAVE-TO-FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>infrastructure/logs/emulator-service.log</file>
<encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
<layout class="ch.qos.logback.classic.PatternLayout">
<pattern>%d{yyyy-MM-dd'T'HH:mm:ss.SSSXXX} %-5level ${PID:- } %X{traceId:-} --- %red(%X{remoteAddress}) %yellow(%X{userSessionIdentifier}) [%14thread] %-40.40logger{39} : %replace(%msg){'[\s\n\r]+',' '}%n</pattern>
</layout>
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>infrastructure/logs/emulator-service-%d{yyyy-MM-dd}.%i.gz</fileNamePattern>
<maxFileSize>50MB</maxFileSize>
<maxHistory>30</maxHistory>
<totalSizeCap>1GB</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="liquibase.database" level="debug" additivity="false">
<appender-ref ref="STDOUT" />
<appender-ref ref="SAVE-TO-FILE" />
</logger>
<logger name="liquibase.changelog" level="debug" additivity="false">
<appender-ref ref="STDOUT" />
<appender-ref ref="SAVE-TO-FILE" />
</logger>
<logger name="org.apache.http" level="info" additivity="false">
<appender-ref ref="STDOUT" />
<appender-ref ref="SAVE-TO-FILE" />
</logger>
<logger name="org.springframework.ws.transport.http" level="debug" 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>
3.4.3 Az /opt/project/infrastructure/.env fájl
Az /opt/project/infrastructure/ mappába hozzuk létre az .env fájlt:
A .env fájl tartalma legyen az alábbi:
APP_VERSION=develop
DB_SCHEMA=develop
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"
APM_SERVICE_NAME=${APM_PROJECT_NAME}
NODE_1_JAVA_TOOL_OPTIONS="-Xms1g -Xmx1g -javaagent:/infrastructure/elastic-apm-agent-1.38.0.jar -Delastic.apm.environment=DEV -Delastic.apm.service_name=${APM_SERVICE_NAME} -Delastic.apm.service_node_name=backend-service-1 -Delastic.apm.server_urls=http://apm.dev.gbsolutions.io:8200 -Delastic.apm.application_packages=io.gbsolutions.project -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=*:5555"
NODE_2_JAVA_TOOL_OPTIONS="-Xms1g -Xmx1g -javaagent:/infrastructure/elastic-apm-agent-1.38.0.jar -Delastic.apm.environment=DEV -Delastic.apm.service_name=${APM_SERVICE_NAME} -Delastic.apm.service_node_name=backend-service-2 -Delastic.apm.server_urls=http://apm.dev.gbsolutions.io:8200 -Delastic.apm.application_packages=io.gbsolutions.project -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=*:5555"
BACKEND_SERVICE_CONFIG_LOCATION=file:./infrastructure/config/backend-service/
EMULATOR_SERVICE_CONFIG_LOCATION=file:./infrastructure/config/emulator-service/
SPRING_PROFILES_ACTIVE=default
SPRING_DATASOURCE_URL=jdbc:postgresql://db:5432/postgres?currentSchema=${DB_SCHEMA}
SPRING_DATASOURCE_PASSWORD=${DB_PASSWORD}
SPRING_MAIL_HOST=maildev
SPRING_MAIL_PORT=1025
PROJECT_ENVIRONMENT=DEV
PROJECT_BASE_URLS_APPLICATION_TYPE_BASE_URLS_CLIENT=https://client.${projekt}.${ügyfél}.${környezet}.dev.gbsolutions.io
PROJECT_BASE_URLS_APPLICATION_TYPE_BASE_URLS_ADMIN=https://admin.${projekt}.${ügyfél}.${környezet}.dev.gbsolutions.io
PROJECT_BASE_URLS_APPLICATION_TYPE_BASE_URLS_PARTNER=https://partner.${projekt}.${ügyfél}.${környezet}.dev.gbsolutions.io
PROJECT_COOKIE_CLIENT_DOMAIN=client.${projekt}.${ügyfél}.${környezet}.dev.gbsolutions.io
PROJECT_COOKIE_ADMIN_DOMAIN=admin.${projekt}.${ügyfél}.${környezet}.dev.gbsolutions.io
PROJECT_COOKIE_PARTNER_DOMAIN=partner.${projekt}.${ügyfél}.${környezet}.dev.gbsolutions.io
PROJECT_ANTIVIRUS_HOST=clamav
PROJECT_KEYCLOAK_URL=https://keycloak.${projekt}.${ügyfél}.${környezet}.dev.gbsolutions.io
PROJECT_KEYCLOAK_REALM=admin-realm
PROJECT_KEYCLOAK_CLIENTID=admin-frontend
SPRING_SECURITY_OAUTH2_RESOURCESERVER_JWT_ISSUER_URI=${PROJECT_KEYCLOAK_URL}/realms/${PROJECT_KEYCLOAK_REALM}
PROJECT_CAPTCHA_V2_SITE_KEY=6LflzcElAAAAAMPQ0d6XU6D9IKpet3qeNWU4408T
PROJECT_CAPTCHA_V2_SECRET_KEY=6LflzcElAAAAAHy2HcOrG-HX34G124UBqICnJcs7
PROJECT_CAPTCHA_V3_SITE_KEY=6LcdyMEhAAAAANtJ2VXjAqq-2HahaxICkKOHhKXU
PROJECT_CAPTCHA_V3_SECRET_KEY=6LcdyMEhAAAAAMga6yj5QNt24qxr3r6qJi8VBY5F
PROJECT_GOOGLE_ANALYTICS_ENABLED=true
PROJECT_GTM_CONTAINER_ID=GTM-WCPMXFL
PROJECT_CSP="default-src 'self'; frame-src ${PROJECT_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' ${PROJECT_KEYCLOAK_URL} https://*.google-analytics.com https://*.analytics.google.com;"
- A
${projekt}placeholder helyére a domain létrehozásakor megadott projekt azonosítót kell behelyettesíteni. - Az
${ügyfél}placeholder helyére az ügyfél nevét kell behelyettesíteni (Pl.:granit-bank,erste,vodafone). - A
${környezet}placeholder helyére a domain létrehozásakor megadott környezet azonosítót kell behelyettesíteni. - A
${APM_PROJECT_NAME}itt a project nevének megfelelő értéket adjunk meg. Ez fog megjeleni az APM felületén. Pl.:semi-product. -
A
${DB_PASSWORD}placeholder helyére az adatbázis container létrehozása során megadott jelszót kell behelyettesíteni. -
Ha demo adatokat is szeretnénk az adatbázisba szúrni, akkor a
SPRING_PROFILES_ACTIVE-nál soroljuk fel ademodataprofilt is (vesszővel elválasztva). -
A
NODE_1_JAVA_TOOL_OPTIONS,NODE_2_JAVA_TOOL_OPTIONSváltozókban, azXmsésXmxJVM paraméterek esetén az-Xms1gés-Xmx1gaz alapértelmezett értékek. Fontos azonban, hogy az itt ajánlottXmxé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, de mivel 2 konténert futtatunk a teszt gépen, így a fele legyen az előző képletnek, hogy legyen elég memória. -
A
PROJECT_ENVIRONMENTváltozóban adható meg az alkalmazást futtató környezet azonosítója (Pl.:AWS,DEVstb.). Jelenleg ez a változó befolyásolja, hogy megjelenjen-e a kliens alkalmazások láblécében az alkalmazás verzió mellett a commit hash is, valamint a fejlécben a környezet azonosító. Ha a környezeti változó értékePRODUCTION, abban az esetben sem a fejléc, sem a láblécben a commit hash nem jelenik meg. Ez abban az esetben is igaz, ha kikommenteljük, vagy egyáltalán nem definiáljuk aPROJECT_ENVIRONMENTváltozót. -
A
PROJECT_CAPTCHA_V2_SITE_KEY,PROJECT_CAPTCHA_V2_SECRET_KEYésPROJECT_CAPTCHA_V3_SITE_KEY,PROJECT_CAPTCHA_V3_SECRET_KEYváltozókba kell rakni a google által adott site key-eket és secret keyeket, 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. APROJECT_GTM_CONTAINER_IDmár egy előre létrehozott felhasználóé, ezzel tudunk tesztelni. Felhasználónév:gbsdummyemail@gmail.com, Jelszó:5807961064 -
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
-
3.4.4 Az /opt/project/infrastructure/config/backend-service/logback-spring-1.xml fájl
Az /opt/project/infrastructure/config/backend-service/ mappába hozzuk létre az logback-spring-1.xml fájlt:
A logback-spring-1.xml fájl tartalma legyen az alábbi:
<?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(%msg){'[\s\n\r]+',' '}%n</pattern>
</layout>
</encoder>
</appender>
<appender name="SAVE-TO-FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>infrastructure/logs/backend-service-1.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:-} --- %red(%X{remoteAddress}) %yellow(%X{userSessionIdentifier}) [%14thread] %-40.40logger{39} : %replace(%msg){'[\s\n\r]+',' '}%n</pattern>
</layout>
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>infrastructure/logs/backend-service-1-%d{yyyy-MM-dd}.%i.gz</fileNamePattern>
<maxFileSize>50MB</maxFileSize>
<maxHistory>30</maxHistory>
<totalSizeCap>1GB</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="liquibase.database" level="debug" additivity="false">
<appender-ref ref="STDOUT"/>
<appender-ref ref="SAVE-TO-FILE"/>
</logger>
<logger name="liquibase.changelog" level="debug" additivity="false">
<appender-ref ref="STDOUT"/>
<appender-ref ref="SAVE-TO-FILE"/>
</logger>
<logger name="org.apache.http" level="info" additivity="false">
<appender-ref ref="STDOUT"/>
<appender-ref ref="SAVE-TO-FILE"/>
</logger>
<logger name="org.springframework.ws.client.core.WebServiceTemplate" level="debug" 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>
3.4.5 Az /opt/project/infrastructure/config/backend-service/logback-spring-2.xml fájl
Mivel az AWS tesztkörnyezeten a backend alkalmazás két példányban fut ugyanazon a VM-en, így a második példány számára is szükséges egy saját log konfiguráció.
Arról, hogy mi az oka amiért két példányban indítjuk a backend alkalmazásokat itt olvashattok.
Az /opt/project/infrastructure/config/backend-service/ mappába hozzuk létre az logback-spring-2.xml fájlt:
A logback-spring-2.xml fájl tartalma legyen az alábbi:
<?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(%msg){'[\s\n\r]+',' '}%n</pattern>
</layout>
</encoder>
</appender>
<appender name="SAVE-TO-FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>infrastructure/logs/backend-service-2.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:-} --- %red(%X{remoteAddress}) %yellow(%X{userSessionIdentifier}) [%14thread] %-40.40logger{39} : %replace(%msg){'[\s\n\r]+',' '}%n</pattern>
</layout>
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>infrastructure/logs/backend-service-2-%d{yyyy-MM-dd}.%i.gz</fileNamePattern>
<maxFileSize>50MB</maxFileSize>
<maxHistory>30</maxHistory>
<totalSizeCap>1GB</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="liquibase.database" level="debug" additivity="false">
<appender-ref ref="STDOUT"/>
<appender-ref ref="SAVE-TO-FILE"/>
</logger>
<logger name="liquibase.changelog" level="debug" additivity="false">
<appender-ref ref="STDOUT"/>
<appender-ref ref="SAVE-TO-FILE"/>
</logger>
<logger name="org.apache.http" level="info" additivity="false">
<appender-ref ref="STDOUT"/>
<appender-ref ref="SAVE-TO-FILE"/>
</logger>
<logger name="org.springframework.ws.client.core.WebServiceTemplate" level="debug" 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>
<root level="error" additivity="false">
<appender-ref ref="STDOUT"/>
<appender-ref ref="SAVE-TO-FILE"/>
</root>
</configuration>
3.4.6 Az /opt/project/infrastructure/keycloak/admin-keycloak-realm.json fájl
Az /opt/project/infrastructure/keycloak/ mappába hozzuk létre az admin-keycloak-realm.json fájlt:
A fájl tartalma egyezzen meg a backend repositoryban található infrastructure/config/admin-keycloak-realm.json fájl tartalmával.
3.4.7 Az /opt/project/infrastructure/config/bot-service/application.yml fájl
Az /opt/project/infrastructure/config/bot-service/ mappába hozzuk létre az application.yml fájlt:
Az application.yml fájl tartalmi követelményei itt találhatóak.
3.4.8 Az /opt/project/infrastructure/config/bot-service/logback-spring.xml fájl
Az /opt/project/infrastructure/config/bot-service/ mappába hozzuk létre az logback-spring.xml fájlt:
A logback-spring.xml fájl tartalma legyen az alábbi:
<?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.bot.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(%msg){'[\s\n\r]+',' '}%n</pattern>
</layout>
</encoder>
</appender>
<appender name="SAVE-TO-FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>infrastructure/logs/bot-service.log</file>
<encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
<layout class="io.gbsolutions.project.bot.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:-} --- %red(%X{remoteAddress}) %yellow(%X{userSessionIdentifier}) [%14thread] %-40.40logger{39} : %replace(%msg){'[\s\n\r]+',' '}%n</pattern>
</layout>
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>infrastructure/logs/bot-service-%d{yyyy-MM-dd}.%i.gz</fileNamePattern>
<maxFileSize>50MB</maxFileSize>
<maxHistory>30</maxHistory>
<totalSizeCap>1GB</totalSizeCap>
</rollingPolicy>
</appender>
<logger name="io.gbsolutions" level="info" additivity="false">
<appender-ref ref="STDOUT"/>
<appender-ref ref="SAVE-TO-FILE"/>
</logger>
<logger name="org.apache.http" level="info" 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>
<root level="error" additivity="false">
<appender-ref ref="STDOUT"/>
<appender-ref ref="SAVE-TO-FILE"/>
</root>
</configuration>
3.4.9 Az /opt/project/infrastructure/firebase.json fájl
A projektspecifikus firebase.json fájlunkat ezen az oldalon tudjuk létrehozni.
A firebase.json fájlt az /opt/project/infrastructure/ mappába kell elhelyezni.
Push notification funkció kikapcsolása
Amennyiben nem szükséges a projekten, hogy legyenek push értesítéseink, kikapcsolhatjuk application.yml-ben a push notification funkciót:
Ebben az esetben pedig nem szükséges a firebase.json fájlt sem feltöltenünk az /opt/project/infrastructure/ mappába.
3.4.10 Az /opt/project/infrastructure/elastic-apm-agent-1.38.0.jar fájl
Töltsük le az elastic-apm-agent-1.38.0.jar fájlt az alábbi parancsokkal:
wget https://repo1.maven.org/maven2/co/elastic/apm/elastic-apm-agent/1.38.0/elastic-apm-agent-1.38.0.jar
3.5 Szükséges szoftverek telepítése és konfigurálása
3.5.1 Nginx
Az Nginx telepítését a root felhasználóval kell végrehajtani.
Mivel appuserben vagyunk, így tudunk visszalépni könnyen
3.5.1.1 Az Nginx telepítése
Load balancerként a HAProxy-t használjuk, azonban a certek frissítése jelenleg Nginx-el történik.
Az Nginx az alábbi parancsokkal telepíthető:
Mivel az nginx-et csak certek kiállítása során használjuk, így a gép újraindulása után nem szeretnénk, hogy elinduljon automatikusan és akadást okozzon a haproxy-val, ezért a következő parancsot adjuk ki.
A tesztkörnyezetink tanúsítványaink kiállításához a Certbot-ot használjuk ezért azt is telepíteni kell az alábbi scripttel:
3.5.1.2 Tanúsítványok kezelése
3.5.1.2.1 Tanúsítványok létrehozása és megfelelő helyre mozgatása
-
Indítsuk el az Nginxet az alábbi paranccsal:
-
Az domainjeinkhez a tanúsítványokat a Certbot állítja ki, amit az alábbi paranccsal tudunk kezdeményezni:
A
-dkapcsoló segítségével minden domain nevet soroljunk fel amihez tanúsítványt szeretnénk. (Azokat is fel kell sorolni amikhez már létezett korábban tanúsítvány.)Egy lehetséges példa, ami csak a client, admin és maildev-et tartalmazza, de szabjuk testre a parancsot annak mentén, hogy milyen domainek kerültek felvételre.
sudo certbot --cert-name ${projekt}.${ügyfél}.${környezet}.dev.gbsolutions.io --nginx -d admin.${projekt}.${ügyfél}.${környezet}.dev.gbsolutions.io -d client.${projekt}.${ügyfél}.${környezet}.dev.gbsolutions.io -d partner.${projekt}.${ügyfél}.${környezet}.dev.gbsolutions.io -d wiki.${projekt}.${ügyfél}.${környezet}.dev.gbsolutions.io -d maildev.${projekt}.${ügyfél}.${környezet}.dev.gbsolutions.io -d keycloak.${projekt}.${ügyfél}.${környezet}.dev.gbsolutions.io -d bot.${projekt}.${ügyfél}.${környezet}.dev.gbsolutions.io- A
${projekt}placeholder helyére a domain létrehozásakor megadott projekt azonosítót kell behelyettesíteni. - Az
${ügyfél}placeholder helyére az ügyfél nevét kell behelyettesíteni (Pl.:granit-bank,erste,vodafone). - A
${környezet}placeholder helyére a domain létrehozásakor megadott környezet azonosítót kell behelyettesíteni.
Kötelezően kinyitandó portok
Amennyiben a VM létrehozása során a Security Group definiálása során nem nyitottuk ki a 80 és 443-as pontot mindenki számára, akkor a certbot parancs kiadása idejére ezt tegyük meg, egyébként nem lesz sikeres a futása.
Példa
sudo certbot --cert-name semiproduct.intuitech.develop.dev.gbsolutions.io --nginx -d client.semiproduct.intuitech.develop.dev.gbsolutions.io -d admin.semiproduct.intuitech.develop.dev.gbsolutions.io -d partner.semiproduct.intuitech.develop.dev.gbsolutions.io -d wiki.semiproduct.intuitech.develop.dev.gbsolutions.io -d maildev.semiproduct.intuitech.develop.dev.gbsolutions.io -d keycloak.semiproduct.intuitech.develop.dev.gbsolutions.io -d bot.semiproduct.intuitech.develop.dev.gbsolutions.ioCertbot kérdések a tanúsítvány létrehozása során
A Certbot a generálás során az alábbi kérdésekre vár tőlünk választ:
Ennél a kérdésnél adjuk meg a projekt számára létrehozott email group címét. Erre az email címre fognak érkezni a tanúsítványok lejáratával kapcsolatos értesítések.Itt válaszoljunkPlease read the Terms of Service at https://letsencrypt.org/documents/LE-SA-v1.3-September-21-2022.pdf. You must agree in order to register with the ACME server. Do you agree?y-al.Itt válaszoljunkWould you be willing, once your first certificate is successfully issued, to share your email address with the Electronic Frontier Foundation, a founding partner of the Let's Encrypt project and the non-profit organization that develops Certbot? We'd like to send you email about our work encrypting the web, EFF news, campaigns, and ways to support digital freedom.n-el.Ha mindent jól csináltunk az alábbi üzenettel kezdődő eredményt kell látnunk:
nginx restart failedhiba a generálás soránAmennyiben a tanúsítványok létrehozása során az alábbihoz hasonló hibát kapjuk, nyugodtan ignorálhatjuk:
The certificate was saved, but could not be installed (installer: nginx). After fixing the error shown below, try installing it again by running: certbot install --cert-name semiproduct.intuitech.develop.dev.gbsolutions.io nginx restart failed: nginx: [emerg] could not build server_names_hash, you should increase server_names_hash_bucket_size: 64 - A
-
Ezt követően leállíthatjuk az Nginxet:
-
Hozzuk létre az
/etc/sslkönyvtárban a domainünkhöz tartozó mappát: -
A
${projekt}placeholder helyére a domain létrehozásakor megadott projekt azonosítót kell behelyettesíteni. - Az
${ügyfél}placeholder helyére az ügyfél nevét kell behelyettesíteni (Pl.:granit-bank,erste,vodafone). -
A
${környezet}placeholder helyére a domain létrehozásakor megadott környezet azonosítót kell behelyettesíteni. -
Majd fésüljük össze a
fullchain.pemésprivkey.pemfájlokat és másoljuk át az így előállt.pemfájlt az/etc/ssl/mappa alá az alábbi paranccsal:cat /etc/letsencrypt/live/${projekt}.${ügyfél}.${környezet}.dev.gbsolutions.io/fullchain.pem /etc/letsencrypt/live/${projekt}.${ügyfél}.${környezet}.dev.gbsolutions.io/privkey.pem | tee /etc/ssl/${projekt}.${ügyfél}.${környezet}.dev.gbsolutions.io/${projekt}.${ügyfél}.${környezet}.dev.gbsolutions.io.pem- A
${projekt}placeholder helyére a domain létrehozásakor megadott projekt azonosítót kell behelyettesíteni. - Az
${ügyfél}placeholder helyére az ügyfél nevét kell behelyettesíteni (Pl.:granit-bank,erste,vodafone). - A
${környezet}placeholder helyére a domain létrehozásakor megadott környezet azonosítót kell behelyettesíteni.
- A
3.5.1.2.2 Tanúsítványok frissítése
A Certbot olyan tanúsítványokat állít ki a domainjeinkhez amik 3 hónapig lesznek érvényesek. Ebből következően ha szeretnénk, hogy a domainjeink ezt követően is érvényes tanusítvánnyal rendelkezzenek, akkor ezeket a tanúsítványokat frissítenünk kell.
A tanúsítványok manuális frissítésének lépései itt találhatóak.
Tanúsítványok automatikus frissítése
A tanúsítványok frissítését automatizálhatjuk is, melynek lépései megtalálhatóak itt.
3.5.2 HAProxy
A HAProxy telepítését a root felhasználóval kell végrehajtani.
3.5.2.1 HAProxy telepítése
A HAProxy az alábbi parancsokkal telepíthető:
3.5.2.2 HAProxy konfigurálása
A HAProxy konfigurációs fájl az /etc/haproxy/haproxy.cfg útvonalon érhető el.
A haproxy.cfg fájl tartalma legyen az alábbi:
global
log /dev/log local0
log /dev/log local1 notice
chroot /var/lib/haproxy
maxconn 5000
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 3m
balance roundrobin
http-check expect string UP
frontend https
option forwardfor
bind *:80
bind *:443 ssl crt /etc/ssl/${projekt}.${ügyfél}.${környezet}.dev.gbsolutions.io/${projekt}.${ügyfél}.${környezet}.dev.gbsolutions.io.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.${projekt}.${ügyfél}.${környezet}.dev.gbsolutions.io
acl host_admin hdr(host) -i admin.${projekt}.${ügyfél}.${környezet}.dev.gbsolutions.io
acl host_partner hdr(host) -i partner.${projekt}.${ügyfél}.${környezet}.dev.gbsolutions.io
acl host_wiki hdr(host) -i wiki.${projekt}.${ügyfél}.${környezet}.dev.gbsolutions.io
acl host_maildev hdr(host) -i maildev.${projekt}.${ügyfél}.${környezet}.dev.gbsolutions.io
acl host_keycloak hdr(host) -i keycloak.${projekt}.${ügyfél}.${környezet}.dev.gbsolutions.io
acl host_bot hdr(host) -i bot.${projekt}.${ügyfél}.${környezet}.dev.gbsolutions.io
acl is-documentation path / /${projekt-group-név} /${projekt-group-név}/documentation
acl is-backend path_beg /public/api /api /WEB/hello /MBL/hello /WEB/log-transfer /MBL/log-transfer /microsite/WEB
http-request redirect code 301 location https://%[hdr(host)]/${projekt-group-név}/documentation/semi-product/summary/ if host_wiki is-documentation
use_backend bot if host_bot
use_backend backend-service if is-backend
use_backend client-spa if host_client
use_backend admin-spa if host_admin
use_backend partner-spa if host_partner
use_backend wiki if host_wiki
use_backend maildev if host_maildev
use_backend keycloak if host_keycloak
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 127.0.0.1:8080 check fall 2
server backend-service-2 127.0.0.1:8081 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 127.0.0.1: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 127.0.0.1:4201 check fall 2
backend partner-spa
acl is-health-check path -i /health-check
http-request deny if is-health-check
option httpchk GET /health-check
server partner-spa-1 127.0.0.1:4203 check fall 2
backend wiki
acl is-health-check path -i /health-check
http-request deny if is-health-check
option httpchk GET /health-check
server wiki 127.0.0.1:5000 check fall 2
backend maildev
server maildev 127.0.0.1:1080
backend keycloak
server keycloak 127.0.0.1:8071
backend bot
server bot 127.0.0.1:3978
- A
${projekt}placeholder helyére a domain létrehozásakor megadott projekt azonosítót kell behelyettesíteni. - Az
${ügyfél}placeholder helyére az ügyfél nevét kell behelyettesíteni (Pl.:granit-bank,erste,vodafone). - A
${környezet}placeholder helyére a domain létrehozásakor megadott környezet azonosítót kell behelyettesíteni. -
A
${projekt-group-név}placeholder helyére az itt megadott projekt group nevet kell megadni. -
Ha a projekten nincs bekapcsolva a captcha, a következő url-eket ki lehet venni a Content-Security-Policy-ból:
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 venni a Content-Security-Policy-ból:
https://www.googletagmanager.comhttps://*.google-analytics.comwww.googletagmanager.com
A konfiguráció végeztével elindíthatjuk a HAProxy-t az alábbi paranccsal:
3.5.2.3 Tanúsítvány alapú elérés konfigurálása
Annak érdekében, hogy limitálni tudjuk, hogy ki érheti el a tesztkörnyezetet (pl.: projekt csapattagok, ügyfél alkalmazottjai stb.), állítsuk be, hogy csak kliensoldali tanúsítvánnyal legyen elérhető a környezet.
Az ehhez szükséges lépések megtalálhatóak itt.
Fontos, hogy ez egy szükséges lépés, ha nem tesszük meg akkor, az EC2 instance security groupjából törölni kell az alábbi két szabályt:

3.5.3 Docker
3.5.3.1 Docker telepítése
A Docker telepítésének lépései megegyeznek a Telepítési Útmutatóban leírt lépésekkel. A telepítés lépései megtalálhatóak itt, de az 5.2 Docker network létrehozását már ne csináljuk meg, csak az 5.1 Docker telepítése részt.
3.5.3.2 Docker konfigurálása
3.5.3.2.1 Az appuser felhasználó hozzáadása a docker grouphoz
Ezt a lépést is a root felhasználóval kell végrehajtani.
Adjuk hozzá a korábban létrehozott appuser felhasználót a docker grouphoz.
3.5.3.2.2 Az alkalmazások által használt docker network létrehozása
Ezt a lépést is a root felhasználóval kell végrehajtani.
Hozzunk létre egy docker network-öt az alábbi paranccsal:
3.5.3.2.3 Docker login a package registry eléréséhez
Ahhoz, hogy a docker image-eket le tudja tölteni a docker be kell loginolni a package registry-be.
Ezt az alábbi paranccsal tudjuk megtenni:
echo "$DOCKER_REGISTRY_PASSWORD" | docker login -u $DOCKER_REGISTRY_USERNAME --password-stdin $DOCKER_REGISTRY_URL
A $DOCKER_REGISTRY_URL, $DOCKER_REGISTRY_USERNAME, $DOCKER_REGISTRY_PASSWORD placeholderek értéke a
CI/CD változók beállítása szekcióban ugyanilyen néven beállított GitLab változók értékével kell megegyezzen.
Docker login szükségessége
Amennyiben CI-ból deployoljuk az alkalmazásokat nem szükséges a docker login lépés. (CI automatikusan loginol deploy előtt.) Az útmutatóban azért szerepel ez a lépés, hogy amennyiben szeretnénk kézzel indítai az alkalmazásokat akkor meg tudjuk tenni.
3.5.3.2.4 A docker-compose-infra.yml létrehozása
Ezt a lépést is az appuser felhasználóval kell végrehajtani.
A docker-compose-infra.yml fájlban vannak definiálva az infrastruktúrális komponensek.
Ebből következően ezzel a fájllal tudjuk ezek docker container-jeit létrehozni, leállítani és újraindítani.
Hozzuk létre a docker-compose-infra.yml fájlt az alábbi parancsokkal:
A docker-compose-infra.yml fájl tartalma legyen az alábbi:
version: '3.1'
services:
maildev:
container_name: maildev
image: maildev/maildev
restart: unless-stopped
user: root
ports:
- "1080:1080"
- "1025:1025"
volumes:
- ./maildev:/var/lib/maildev:rw
environment:
MAILDEV_OUTGOING_HOST: smtp.gmail.com
MAILDEV_OUTGOING_PORT: 587
MAILDEV_OUTGOING_USER: gbsdummyemail@gmail.com
MAILDEV_OUTGOING_PASS: obpdotokcjxkhkqm
MAILDEV_MAIL_DIRECTORY: /var/lib/maildev
clamav:
image: clamav/clamav:1.3.0
restart: unless-stopped
container_name: clamav
ports:
- "3310:3310"
db:
container_name: db
image: postgres:15.3
restart: unless-stopped
environment:
POSTGRES_PASSWORD: ${DB_PASSWORD}
volumes:
- ./database-volume:/var/lib/postgresql/data
- /etc/localtime:/etc/localtime:ro
- /etc/timezone:/etc/timezone:ro
ports:
- "5432:5432"
keycloak:
container_name: keycloak
image: quay.io/keycloak/keycloak:21.1.1
environment:
KEYCLOAK_ADMIN: admin
KEYCLOAK_ADMIN_PASSWORD: Asdf1234
ports:
- "8071:8071"
command:
- "start --optimized --proxy edge"
- "--hostname-url=https://keycloak.${projekt}.${ügyfél}.${környezet}.dev.gbsolutions.io"
- "--http-port=8071"
- "--import-realm"
volumes:
- ./keycloak/admin-keycloak-realm.json:/opt/keycloak/data/import/admin-keycloak-realm.json
redis:
container_name: redis
image: redis:7.2.5
restart: unless-stopped
ports:
- "6379:6379"
environment:
- TZ=Europe/Budapest
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
- A
${DB_PASSWORD}placeholder értékének adjunk meg kellő erősségű jelszót az adatbázishoz. Apostgresfelhasználó ezzel a jelszóval tud majd csatlakozni az adatbázishoz. - A Keycloak
commandbeállításai közt találhatóhostname-urlparaméternél adjuk meg a Keycloak szolgáltatásunk címét.
3.5.3.2.5 A docker-compose-services.yml létrehozása
Ezt a lépést is az appuser felhasználóval kell végrehajtani.
A docker-compose-services.yml fájlban vannak definiálva az alkalmazásokhoz szükséges docker service-ek.
Ebből következően ezzel a fájllal tudjuk ezek docker container-jeit létrehozni, leállítani és újraindítani.
Hozzuk létre a docker-compose-services.yml fájlt az alábbi parancsokkal:
A docker-compose-services.yml fájl tartalma legyen az alábbi:
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-1:
image: 'registry.gitlab.com/gbsolutions/${project-név}/backend/backend-service:${APP_VERSION}'
container_name: backend-service-1
restart: always
stop_grace_period: 30s
ports:
- 8080:8080
- 5555:5555
- 5701:5701
<<: *infrastructure-timezone-volume
env_file:
- .env
environment:
- JAVA_TOOL_OPTIONS=${NODE_1_JAVA_TOOL_OPTIONS}
- LOGGING_CONFIG=${BACKEND_SERVICE_CONFIG_LOCATION}logback-spring-1.xml
- SPRING_LIQUIBASE_DROP_FIRST=${SPRING_LIQUIBASE_DROP_FIRST:-false}
backend-service-2:
image: 'registry.gitlab.com/gbsolutions/${project-név}/backend/backend-service:${APP_VERSION}'
container_name: backend-service-2
restart: always
stop_grace_period: 30s
ports:
- 8081:8080
- 5556:5555
- 5702:5701
<<: *infrastructure-timezone-volume
env_file:
- .env
environment:
- JAVA_TOOL_OPTIONS=${NODE_2_JAVA_TOOL_OPTIONS}
- LOGGING_CONFIG=${BACKEND_SERVICE_CONFIG_LOCATION}logback-spring-2.xml
- SPRING_LIQUIBASE_DROP_FIRST=false
emulator-service:
image: 'registry.gitlab.com/gbsolutions/${project-név}/backend/emulator-service:${APP_VERSION}'
container_name: emulator-service
restart: always
ports:
- 10000:10000
<<: *infrastructure-timezone-volume
env_file:
- .env
environment:
- SPRING_CONFIG_ADDITIONAL_LOCATION=${EMULATOR_SERVICE_CONFIG_LOCATION}application.yml
- LOGGING_CONFIG=${EMULATOR_SERVICE_CONFIG_LOCATION}logback-spring.xml
admin-spa:
image: 'registry.gitlab.com/gbsolutions/${project-név}/backend/admin-spa:${APP_VERSION}'
container_name: admin-spa
restart: always
ports:
- 4201:4200
<<: *timezone-volume
env_file:
- .env
client-spa:
image: 'registry.gitlab.com/gbsolutions/${project-név}/backend/client-spa:${APP_VERSION}'
container_name: client-spa
restart: always
ports:
- 4202:4200
<<: *timezone-volume
env_file:
- .env
partner-spa:
image: 'registry.gitlab.com/gbsolutions/${project-név}/backend/partner-spa:${APP_VERSION}'
container_name: partner-spa
restart: always
ports:
- 4203:4200
<<: *timezone-volume
env_file:
- .env
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
- A
${project-név}placeholder helyére a gitlab registry url alapján kell a megfelelő értéket behelyettesíteni.
3.5.3.2.6 A docker-compose-wiki.yml létrehozása
Ezt a lépést is az appuser felhasználóval kell végrehajtani.
A docker-compose-wiki.yml fájlban van definiálva a wiki oldalhoz szükséges docker service.
Ebből következően ezzel a fájllal tudjuk ezek docker container-jeit létrehozni, leállítani és újraindítani.
Hozzuk létre a docker-compose-wiki.yml fájlt az alábbi parancsokkal:
A docker-compose-wiki.yml fájl tartalma legyen az alábbi:
version: '3.1'
services:
wiki:
image: 'registry.gitlab.com/gbsolutions/${project-név}/backend/wiki:latest'
container_name: wiki
restart: always
ports:
- 5000:4200
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
- A
${project-név}placeholder helyére a gitlab registry url alapján kell a megfelelő értéket behelyettesíteni.
3.5.3.2.7 A docker-compose-bot.yml létrehozása
Ezt a lépést is az appuser felhasználóval kell végrehajtani.
A docker-compose-bot.yml fájlban van definiálva a Teams Bot-hoz szükséges docker service.
Ebből következően ezzel a fájllal tudjuk a docker container-jét létrehozni, leállítani és újraindítani.
Hozzuk létre a docker-compose-bot.yml fájlt az alábbi parancsokkal:
A docker-compose-bot.yml fájl tartalma legyen az alábbi:
version: '3.1'
services:
bot:
image: 'registry.gitlab.com/gbsolutions/${project-név}/backend/bot-service:latest'
container_name: bot
restart: always
stop_grace_period: 30s
ports:
- 3978:3978
volumes:
- infrastructure:/infrastructure
- "/etc/timezone:/etc/timezone:ro"
- "/etc/localtime:/etc/localtime:ro"
environment:
- LOGGING_CONFIG=file:./infrastructure/config/bot-service/logback-spring.xml
- SPRING_CONFIG_ADDITIONAL_LOCATION=file:./infrastructure/config/bot-service/application.yml
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
- A
${project-név}placeholder helyére a gitlab registry url alapján kell a megfelelő értéket behelyettesíteni.
3.6 Időzóna beállítása
Ezt a lépést a root felhasználóval kell végrehajtani.
Mivel appuserben vagyunk, így tudunk visszalépni könnyen
A Budapesti időzónát az alábbi paranccsal tudjuk beállítani a VM-en:
3.7 Swap beállítása
Ezt a lépést a root felhasználóval kell végrehajtani.
A ClamAV a vírusdefiníciós adatbázis frissítése során, a frissítés időtartama alatt, az eredeti rendszermemória igényének a kétszeresét használja fel.
Annak érdekében, hogy ilyenkor ne fogyjon el a rendszermemória, és ne is kelljen kétszer akkora AWS gépet indítani, állítsunk be swap memóriát az EC2 példányon az alábbi módon:
-
Ellenőrizzük, hogy még nincs swap létrehozva az instance-on az alábbi paranccsal:
Ha a parancs kiadása után nem jelenik meg semmi a parancssorban, akkor folytathatjuk a további lépésekkel.
-
Hozzuk létre a swap fájlt az alábbi parancsokkal:
A
4Gérték határozza meg, hogy hány GB-os swap fájlt hozunk létre. Ez minimum akkora legyen, amekkora az EC2 példányunk rendszermemóriája. Ez alapértelmezetten 4GB. -
Állítsuk be, hogy a swap a gép újraindítása után is megmaradjon:
- Ehhez nyissuk meg az
fstabfájlt az alábbi paranccsal: - Majd a fájl végére (egy új sorba) szúrjuk be az alábbi sort és mentsük el:
- Ehhez nyissuk meg az
-
Végül ellenőrizzük, hogy sikeresen létrejött-e a swap az alábbi paranccsal:
Ha mindent jól csináltunk az alábbihoz hasonló eredményt kell kapnunk:
3.8 Infrastruktúra indítása
Az infrastruktúrális komponenseket az alábbi paranccsal tudjuk elindítani:
Első adatbázis séma létrehozása:
Az első deploy előtt hozzuk létre a develop sémát.
Amennyiben PostgreSQL adatbázis van a projekten, az első sémát létrehozhatjuk a create-schema job segítségével.
A create-schema job használatáról itt található részletes leírás.
Egyéb adatbázis esetén kézzel hozzuk létre az adatbázist, melynek lépéseiről itt található leírás.
3.10 Wiki indítása
Ezt a lépést is az appuser felhasználóval kell végrehajtani.
Az wiki/dokumentáció oldalt publikáló docker service-t az alábbi paranccsal tudjuk elindítani:
3.11 Alkalmazások indítása
Ezt a lépést is az appuser felhasználóval kell végrehajtani.
Liquibase contextek
Nincs teendőnk a Liquibase context-eket illetően.
Fontos, hogy az AWS DEV környezeten is no-filestream Liquibase context-tet használva indítsuk az alkalmazást. Azonban amennyiben ezt
az application.yml-ben az itt leírtak szerint beállítottuk, akkor ezen a ponton nincs teendőnk.
Amennyiben feltétlenül szükséges, hogy kipróbáljuk a FILESTREAM-es működést, akkor az itt leírtak szerint tudunk egy FILEASTREAM funkciót támogató adatbázist létrehozni, és ahhoz csatlakozni. Azonban alapértelmezetten az AWS DEV környezetet használjuk nyugodtan FILESTREAM nélküli módban.
Az alkalmazások elindítása előtt az appuser felhasználóval állítsuk be az APP_VERSION és DB_SCHEMA változók értékét az /opt/project/infrastructure/ mappában található .env fájlban:
- Az
${app-version}placeholder helyére értelemszerűen a telepíteni kívánt alkalmazás verziószámát kell behelyettesíteni, ami a docker tag alapján fog telepíteni. Pl.:develop,1.0.0-SNAPSHOT. - Az
${schema-version}placeholder helyére értelemszerűen a használni kívánt adatbázis séma nevét kell behelyettesíteni. Pl.:develop,V1_0_0stb.
Az alkalmazások docker containerjeit az alábbi paranccsal tudjuk elindítani:
3.12 Teams bot indítása
Ezt a lépést is az appuser felhasználóval kell végrehajtani.
Az Teams bot alkalmazást az alábbi paranccsal tudjuk elindítani:
3.13 Alkalmazás által kiküldött e-mailek
Az alkalmazás a maildev szolgáltatásra küldi ki az e-maileket, ami a fentebbi konfigurációk után a maildev.${projekt}.${ügyfél}.${környezet}.dev.gbsolutions.io oldalon érhető el.
Innen tetszés szerint a menüből a relay funkcióval a leveleket lehet továbbítani igazi e-mail fiókokba is.