Kihagyás

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

  1. Jelentkezzünk be az Amazonra.
  2. A keresőbe írjuk be hogy „EC2“, majd a megjelenő Services szekcióban válasszuk ki az EC2-t.

    AWS_Services

  3. Győződjünk meg róla, hogy a jobb felső sarokban a Frankfurt régió van kiválasztva.

    RegionFrankfurt

  4. 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.)

    LaunchInstanceBox

  5. Ekkor megnyílik a Launch an instance képernyő.

  6. 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

    InstanceNameConfigWithoutDetails

  7. Az Application and OS Images (Amazon Machine Image) dobozban az operációs rendszerek közül válasszuk ki az Ubuntu-t.

    SelectOSImages

  8. Az Instance type dobozban válasszuk ki a t3.large-ot.

    InstanceType

  9. A Key pair (login) dobozban válasszuk ki a saját login kulcspárunkat (amennyiben létezik).

    SelectKeyPair

    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.

  10. A Network settings doboz jobb felső sarkában kattintusnk az Edit gombra.

    1. A VPC (Virtual Private Cloud) mezőben válasszuk ki a vpc-a31611c8 azonosítójú VPC-t.

      NetworkVPC

    2. A Firewall (security groups) szekcióban válasszuk ki a Create security group opciót.

      NetworkCreateSecurityGroup

    3. A Security group name mezőben adjunk nevet a security groupnak.

      NetworkSecurityGroupName

    4. A Description mezőben adjunk meg tetszőleges leírást a security groupról.

      NetworkSecurityGroupDescription

    5. Az Inbound security groups rules szekcióban győződjünk meg róla, hogy az alábbi szabály definiálva van-e:

      SecurityRuleSSH

    6. 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:

      SecurityRuleHTTPAndHTTPS

  11. A Configure storage dobozban állítsunk be 40GB tárhelyet.

    StorageConfig

  12. Az Advanced details dobozban nem szükséges módosítani a beállításokat.

  13. 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.

    InstanceSummary

  14. Ha mindent jól csináltunk, akkor a következő üzenetet kell látnunk:

    LaunchSuccessMessage

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:

  1. A baloldali menüsorból válasszuk ki az Instances opciót.
  2. A megjelenő listából keressük ki az instance-unkat, majd kattintsunk az Instance ID-ra:

    InstancesList

  3. A megnyíló Instance Summary képernyő jobb felső sarkában nyomjuk meg a Connect gombot.

    InstanceSummaryAfterLaunch

  4. 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

Ezt a lépést a root felhasználóval kell végrehajtani.

sudo su

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
  1. Hozzuk létre a user-t és az .ssh mappáját az alábbi parancsokkal:

    adduser appuser
    
    • A megjelenő New password: és Retype 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 hogy appuser.
    • A további inputoknál csak üssünk Enter-t.
    • Az Is the information correct? [Y/n] kérdésnél adjuk meg, hogy Y.
    su - appuser
    
    mkdir .ssh
    
    chmod 700 .ssh
    
  2. Hozzuk létre az SSH kulcspárt az alábbi parancsokkal:

    cd .ssh
    

    ssh-keygen -t rsa -b 2048 -C "appuser"
    
    1. A felugró Enter file in which to save the key input sornál ha nem szeretnénk specifikus nevet megadni a fájloknak, akkor csak nyomjunk Enter-t.
    2. Az Enter passphrase (empty for no passphrase): és Enter same passphrase again: input soroknál ne adjunk meg jelszót (csak üssünk Enter-t).

    cd ..    
    
    1. Állítsuk be a publikus kulcsot

    vim .ssh/authorized_keys
    
    • Másoljuk be az előbb létrehozott publikus kulcs tartalmát az authorized_keys fájlba.
    chmod 600 .ssh/authorized_keys
    
    exit
    
    3.2.1.2 CI/CD változók beállítása

    Ahhoz, hogy a megfelelő CI jobok (pl.: deploy-to-aws job) 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.

  3. A projekt subgroupjába navigálva a baloldali menüsorból válasszuk ki a Settings -> CI/CD menüpontot.

  4. Nyissuk ki a Variables szekciót.
  5. 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
sudo adduser ${username}
  • A felugró New password: mezőben adjuk meg a felhasználó kezdő jelszavát, majd a Retype new password: mezőben adjuk meg ugyanazt.
  • A Changing the user information for ${username} kérdéseknél a Full 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 nyomjunk Y-t.
sudo su - ${username}
mkdir .ssh
chmod 700 .ssh
vim .ssh/authorized_keys
  • Másoljuk be a publikus kulcs tartalmát az authorized_keys fájlba.
chmod 600 .ssh/authorized_keys

exit
* A felhasználó nevét a ${username} helyére kell behelyettesíteni.

sudo usermod -aG sudo ${username}
3.2.2.3 Username konvenció

A konvenció a tesztkörnyezeten a felhaszálónevekre a következő:

[vezetéknév_ékezetek_nelkül] + [keresztnév_kezdőbetűje_ékezetek_nelkül]

Például

Ha a csapattag neve Példa Béla akkor a felhasználóneve legyen: peldab.

Script user létrehozáshoz
create_user.sh
#!/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:

./create_user.sh ${username} "${public-key-content}"

  • 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.

  1. Lépjünk be az opt könyvtárba az alábbi paranccsal:
    cd /opt 
    
  2. Hozzuk létre a projekt mappákat az alábbi parancsokkal:
    mkdir -p project/infrastructure/config/backend-service
    
mkdir -p project/infrastructure/config/emulator-service
mkdir -p project/infrastructure/config/bot-service
mkdir -p project/infrastructure/logs
mkdir -p project/infrastructure/maildev
mkdir -p project/infrastructure/keycloak

Az elvárt mappaszerkezet:

opt
 └ project
    └ infrastructure
       ├ config
       │  ├ backend-service
       │  ├ emulator-service
       │  └ bot-service
       ├ logs
       ├ maildev
       └ keycloak

  1. Végül adjuk át owner és group jogokat az alkalmazást futtató felhasználónak:
    chown -R appuser:appuser project
    

3.4 Alkalmazás konfigurációs fájlok létrehozása

Az alábbi lépéseket az appuser felhasználóval kell végrehajtani.

su - appuser

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:

cd /opt/project/infrastructure/config/emulator-service
vim application.yml

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:

cd /opt/project/infrastructure/config/emulator-service
vim logback-spring.xml
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:

cd /opt/project/infrastructure/

vim .env
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 a demodata profilt is (vesszővel elválasztva).

  • A NODE_1_JAVA_TOOL_OPTIONS, NODE_2_JAVA_TOOL_OPTIONS változókban, az Xms és Xmx JVM paraméterek esetén az -Xms1g és -Xmx1g az alapértelmezett értékek. Fontos azonban, hogy az itt ajánlott Xmx érték a minimálisan megadandó maximum heap size értéket jelenti. Ideális esetben az Xmx é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_ENVIRONMENT változóban adható meg az alkalmazást futtató környezet azonosítója (Pl.:AWS, DEV stb.). 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éke PRODUCTION, 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 a PROJECT_ENVIRONMENTváltozót.

  • A PROJECT_CAPTCHA_V2_SITE_KEY, PROJECT_CAPTCHA_V2_SECRET_KEY és PROJECT_CAPTCHA_V3_SITE_KEY, PROJECT_CAPTCHA_V3_SECRET_KEY vá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_ENABLED változót true-ra kell állítani, ha szeretnénk bekapcsolni a funkciót. A PROJECT_GTM_CONTAINER_ID már egy előre létrehozott felhasználóé, ezzel tudunk tesztelni. Felhasználónév: gbsdummyemail@gmail.com, Jelszó: 5807961064

  • A PROJECT_CSP vá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.com
      • https://*.google-analytics.com
      • www.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:

cd /opt/project/infrastructure/config/backend-service
vim logback-spring-1.xml
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:

cd /opt/project/infrastructure/config/backend-service
vim logback-spring-2.xml
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:

cd /opt/project/infrastructure/keycloak
vim admin-keycloak-realm.json

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:

cd /opt/project/infrastructure/config/bot-service
vim application.yml

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:

cd /opt/project/infrastructure/config/bot-service
vim logback-spring.xml
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:

project:
  ...
  techcore:
    ...
    notification:
      push:
        enabled: false

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:

cd /opt/project/infrastructure
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

exit

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ő:

sudo apt update
sudo apt install nginx

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.

systemctl disable nginx

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:

sudo apt install certbot python3-certbot-nginx
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
  1. Indítsuk el az Nginxet az alábbi paranccsal:

    service nginx start
    
  2. Az domainjeinkhez a tanúsítványokat a Certbot állítja ki, amit az alábbi paranccsal tudunk kezdeményezni:

    A -d kapcsoló 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.io
    

    Certbot 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:

    Enter email address (used for urgent renewal and security notices)
    (Enter 'c' to cancel):
    
    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.
    Please 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?
    
    Itt válaszoljunk y-al.
    Would 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.
    
    Itt válaszoljunk n-el.

    Ha mindent jól csináltunk az alábbi üzenettel kezdődő eredményt kell látnunk:

    result:
    Successfully received certificate.
    ...
    

    nginx restart failed hiba a generálás során

    Amennyiben 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 
    

  3. Ezt követően leállíthatjuk az Nginxet:

    service nginx stop
    

  4. Hozzuk létre az /etc/ssl könyvtárban a domainünkhöz tartozó mappát:

    cd /etc/ssl
    
    mkdir ${projekt}.${ügyfél}.${környezet}.dev.gbsolutions.io
    
  5. A ${projekt} placeholder helyére a domain létrehozásakor megadott projekt azonosítót kell behelyettesíteni.

  6. Az ${ügyfél} placeholder helyére az ügyfél nevét kell behelyettesíteni (Pl.: granit-bank, erste, vodafone).
  7. A ${környezet} placeholder helyére a domain létrehozásakor megadott környezet azonosítót kell behelyettesíteni.

  8. Majd fésüljük össze a fullchain.pem és privkey.pem fájlokat és másoljuk át az így előállt .pem fá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.

    Példa

    cat /etc/letsencrypt/live/semiproduct.intuitech.develop.dev.gbsolutions.io/fullchain.pem /etc/letsencrypt/live/semiproduct.intuitech.develop.dev.gbsolutions.io/privkey.pem | tee /etc/ssl/semiproduct.intuitech.develop.dev.gbsolutions.io/semiproduct.intuitech.develop.dev.gbsolutions.io.pem   
    
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ő:

sudo apt update
sudo apt install -y haproxy

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.com
    • https://*.google-analytics.com
    • www.googletagmanager.com

A konfiguráció végeztével elindíthatjuk a HAProxy-t az alábbi paranccsal:

service haproxy start

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:

HttpHttpsSecurityRules

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.

usermod -aG docker appuser

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:

docker network create infrastructure-network

3.5.3.2.3 Docker login a package registry eléréséhez

Ezt a lépést az appuser felhasználóval kell végrehajtani.

su - appuser

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:

cd /opt/project/infrastructure/
vim docker-compose-infra.yml
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. A postgres felhasználó ezzel a jelszóval tud majd csatlakozni az adatbázishoz.
  • A Keycloak command beállításai közt található hostname-url paramé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:

cd /opt/project/infrastructure/
vim docker-compose-services.yml
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:

cd /opt/project/infrastructure/
vim docker-compose-wiki.yml
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:

cd /opt/project/infrastructure/
vim docker-compose-bot.yml
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

exit

A Budapesti időzónát az alábbi paranccsal tudjuk beállítani a VM-en:

timedatectl set-timezone Europe/Budapest

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:

  1. Ellenőrizzük, hogy még nincs swap létrehozva az instance-on az alábbi paranccsal:

    sudo swapon -s
    

    Ha a parancs kiadása után nem jelenik meg semmi a parancssorban, akkor folytathatjuk a további lépésekkel.

  2. Hozzuk létre a swap fájlt az alábbi parancsokkal:

    sudo fallocate -l 4G /swapfile
    
    sudo chmod 600 /swapfile
    
    sudo mkswap /swapfile
    
    sudo swapon /swapfile
    

    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.

  3. Állítsuk be, hogy a swap a gép újraindítása után is megmaradjon:

    1. Ehhez nyissuk meg az fstab fájlt az alábbi paranccsal:
      sudo vim /etc/fstab
      
    2. Majd a fájl végére (egy új sorba) szúrjuk be az alábbi sort és mentsük el:
      /swapfile swap swap defaults 0 0
      
  4. Végül ellenőrizzük, hogy sikeresen létrejött-e a swap az alábbi paranccsal:

    sudo swapon -s
    
    Ha mindent jól csináltunk az alábbihoz hasonló eredményt kell kapnunk:
    Filename             Type      Size      Used      Priority
    /swapfile            file      4194300   512       -2
    

3.8 Infrastruktúra indítása

Ezt a lépést az appuser felhasználóval kell végrehajtani.

su - appuser

Az infrastruktúrális komponenseket az alábbi paranccsal tudjuk elindítani:

cd /opt/project/infrastructure/
docker compose -f docker-compose-infra.yml up -d

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:

cd /opt/project/infrastructure/
docker compose -f docker-compose-wiki.yml up -d

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:

APP_VERSION=${app-version}
DB_SCHEMA=${schema-version}

...
  • 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_0 stb.

Az alkalmazások docker containerjeit az alábbi paranccsal tudjuk elindítani:

docker compose -f docker-compose-services.yml up -d

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:

cd /opt/project/infrastructure/
docker compose -f docker-compose-bot.yml up -d

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.