Przejdź do treści

ICT - TOOLS

Administracja

Za administrację serwera odpowiada Wsparcie ICT.

Aplikacja

Na serwerze uruchomione zostały usługi w formie kontenerów:

  • Traefik - reverse proxy
  • Portainer - zarządzanie kontenerami
  • WebSSH - SSH z poziomu przeglądarki
  • Heimdall - panel ze skrótami do kontenerów
  • AdGuard - serwer DNS
  • Apache-Randstad - skrypty awaryjne Randstad (backup)
  • Apache-LiveChat - strona na potrzeby testów rozwiązania LiveChat
  • WEB Chomik - aplikacja na potrzeby diagnozowania łącz sieciowych dla DOKB
  • Zabbix - narzędzie do monitoringu, na które składają się następujące kontenery:
    • zabbix-server - centralny element systemu monitorowania Zabbix
    • zabbix-web - interfejs webowy dla systemu Zabbix
    • zabbix-agent - instalowany na monitorowanych maszynach, zbiera dane o systemie operacyjnym, aplikacjach i innych zasobach, a następnie wysyła je do Zabbix Server.
    • zabbix-docker-mysql-server-1 - kontener z serwerem MySQL, który przechowuje dane zbierane przez Zabbix Server
    • zabbix-docker-db-data-mysql-1 - kontener zarządzający woluminem danych dla serwera MySQL, używanego przez Zabbix

Środowisko produkcyjne

Informacje ogólne

VM NAME / COMPUTER NAME vAPP GUEST OS STORAGE POLICY VMWARE TOOLS VIRTUAL HARDWERE VERSION
ICT-TOOLS ICT-TOOLS Ubuntu 24.04.1 LTS (64 bit) S1 12421 19
uname -a
Linux ICT-TOOLS 6.8.0-47-generic #47-Ubuntu SMP PREEMPT_DYNAMIC Fri Sep 27 21:40:26 UTC 2024 x86_64 x86_64 x86_64 GNU/Linux

Podzespoły

CPU CORES PER SOCKET RAM STORAGE SIZE
4 1 8 GB 100 GB

Adapter sieciowy

NETWORK NETWORK ADPATER TYPE IP MODE IP ADDRESS EXTERNAL IP ADDRESS MAC ADDRESS
ICT-TOOLS_local VMXNET3 Static - Manual 10.10.0.2 - 00:50:56:01:1a:68
strongSwan_Network VMXNET3 Static - Manual 10.10.2.2 - 00:50:56:01:1f:b0

Sieć

NETWORK NAME ICT-TOOLS_local
GATEWAY CIDR 10.10.0.1/30
NETWORK TYPE Routed
CONNECTED TO edge-Uslugi_DOKB-NG9488369-934956751
STATIC IP POOLS 10.10.0.2 - 10.10.0.2
TOTAL IP ADDRESSES 1
PRIMARY DNS 62.233.233.233
SECONDARY DNS 1.1.1.1
NETWORK NAME strongSwan_Network
GATEWAY CIDR 10.10.2.1/27
NETWORK TYPE Routed
CONNECTED TO edge-Uslugi_DOKB-NG9488369-934956751
STATIC IP POOLS 10.10.2.2 - 10.10.2.30
TOTAL IP ADDRESSES 29
PRIMARY DNS 1.1.1.1
SECONDARY DNS 62.233.233.233
#### Wykorzystane adresy

ICT-TOOLS_local:

IP Address Deployed VM vApp
10.10.0.1 NSX Edge
10.10.0.2 ICT-TOOLS ICT-TOOLS

strongSwan_Network:

IP Address Deployed VM vApp
10.10.2.1 NSX Edge
10.10.2.2 ICT-TOOLS ICT-TOOLS
10.10.2.7 VPN VPN-d719698a-cab9-40e0-96e7-19dd1e90910b

Edge

NAT

NAME STATE TYPE EXTERNAL IP APPLICATION INTERNAL IP EXTERNAL PORT
ICT-TOOLS_DNAT-HTTP Enabled DNAT 217.30.138.17 HTTP 10.10.0.2 80
ICT-TOOLS_DNAT-HTTPS Enabled DNAT 217.30.138.17 HTTPS 10.10.0.2 443
ICT-TOOLS_DNAT-SSH Enabled DNAT 217.30.138.17 SSH 10.10.0.2 22
ICT-TOOLS_DNAT_Zabbix-Agent Enabled DNAT 217.30.138.17 ICT-TOOLS_Zabbix-Agent 10.10.0.2 10052
ICT-TOOLS_SNAT Enabled SNAT 217.30.138.17 - 10.10.0.2 Any

Firewall

NAME STATE APPLICATIONS SOURCE DESTINATION ACTION
ICT-TOOLS_vm-IN Enabled HTTP, HTTPS, SSH, Corpo_proxy ICT-TOOLS_vm, 217.30.138.17_pub Allow
ICT-TOOLS_vm-OUT Enabled - ICT-TOOLS_vm Any Allow
VPN-IN Enabled - strongSwan_Server 217.30.138.17_pub, strongSwan_Network Allow
VPN-OUT Enabled - strongSwan_Network Any Allow
default_rule Enabled - Any Any Drop

IP Sets

NAME DESCRIPTION
ICT-TOOLS_vm 10.10.0.2
ICT-TOOLS_vm_NIC-2 10.10.2.2
strongSwan_Network 10.10.2.0/27
strongSwan_Server 89.168.101.203
217.30.138.17_pub 217.30.138.17
Corpo_proxy 195.114.160.13(*) adresy proxy

Docker

Zainstalowane wersje:
- Docker Engine Version: 27.3.1
- Docker Compose Version: v2.29.7

Najważniejsze elementy maszyny ICT-TOOLS umieszczone są w kontenerach i dostępne są pod odpowiednimi adresami URL:
- Traefik: https://traefik.icttools.dokb01-prd.netia.org/
- Portainer: https://portainer.icttools.dokb01-prd.netia.org/
- WebSSH: https://webssh.icttools.dokb01-prd.netia.org/
- Heimdall: https://icttools.dokb01-prd.netia.org/
- AdGuard: https://adguard.icttools.dokb01-prd.netia.org/
- Apache-Randstad: https://rand.icttools.dokb01-prd.netia.org/
- Apache-LiveChat: https://livechat.icttools.dokb01-prd.netia.org/
- WEB Chomik: https://chomik.icttools.dokb01-prd.netia.org/
- Zabbix: https://zabbix.icttools.dokb01-prd.netia.org/

Docker compose

Plik docker-compose.yml został umieszczony w katalogu /srv/docker

docker-compose.yml
#compose version: 2.0          #zmieniane po każdej modyfikacji pliku

services:

#--------------------------------------------TRAEFIK-------------------------------------------------------------------
  traefik:
    image: traefik:latest
    container_name: traefik
    command:
      - "--log.level=INFO"
      #- "--log.level=DEBUG"
      - "--providers.docker=true"
      - "--providers.file.filename=/cert_conf/dynamic.yml"      #Wskazanie pliku z dynamiczna konfiguracja certyfikatow, sciezka do katalogu w kontenerze (zmapowanego)
      - "--entrypoints.web.address=:80"
      - "--entrypoints.websecure.address=:443"
      - "--providers.docker.network=traefik_network"
      - "--api"
      - "--api.dashboard=true"
      #- "--certificatesresolvers.letsencrypt.acme.caserver=https://acme-v02.api.letsencrypt.org/directory"             #Odnawianie certyfikatu z letsencrypt
      #- "--certificatesresolvers.letsencrypt.acme.email=jacek.tyrna@netia.pl"                                          #Na potrzeby letsencrypt
      #- "--certificatesresolvers.letsencrypt.acme.storage=acme/acme.json"                                              #Na potrzeby letsencrypt
      #- "--certificatesresolvers.letsencrypt.acme.tlschallenge=true"                                                   #Na potrzeby letsencrypt
      - "--entrypoints.websecure.http.tls=true"
      - "--entryPoints.web.http.redirections.entryPoint.to=websecure"
      - "--entryPoints.web.http.redirections.entryPoint.scheme=https"
      - "--entryPoints.web.http.redirections.entrypoint.permanent=true"
    ports:
      - "80:80"
      - "443:443"
      #- "9090:9090" # Dashboard
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock:ro"
      #- "/mnt/data/traefik/acme:/acme"
      - "/mnt/data/traefik/certs:/certs"  #Montowanie katalogu z certyfikatami
      - "/mnt/data/traefik/logs:/logs"
      - "/srv/docker/dynamic.yml:/cert_conf/dynamic.yml:ro"     #Montowanie pliku na potrzeby ręcznie wgranego certyfikatu
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.traefik.service=api@internal"
      - "traefik.http.routers.traefik.rule=Host(`traefik.icttools.dokb01-prd.netia.org`)"
      - "traefik.http.routers.traefik.entrypoints=websecure"
      - "traefik.http.routers.traefik.tls=true"
      #- "traefik.http.routers.traefik.tls.certresolver=letsencrypt"    #wykorzystanie certyfikatu z letsencrypt
      - "traefik.http.routers.traefik.middlewares=traefik_auth"
      - "traefik.http.middlewares.traefik_auth.basicauth.users=admin:$$2a$$12$$27/JwrSiybCBIDpPSKXBYOfUvOGMrqRli8gTK3AayXX5Rxb23Tuu./"
      #- "traefik.http.routers.http-catchall.rule=hostregexp(`{host:.+}`)"
      #- "traefik.http.routers.http-catchall.entrypoints=web"
      #- "traefik.http.routers.http-catchall.middlewares=redirect-to-https"
      #- "traefik.http.middlewares.redirect-to-https.redirectscheme.scheme=https"
    networks:
      - traefik_network
    restart: always

#---------------------------------------------WEBSSH-----------------------------------------------------------------
  webssh:
    image: snsyzb/webssh:latest
    container_name: webssh
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.webssh.rule=Host(`webssh.icttools.dokb01-prd.netia.org`)"
      - "traefik.http.routers.webssh.entrypoints=websecure"
      - "traefik.http.routers.webssh.tls=true"
      #- "traefik.http.routers.webssh.tls.certresolver=letsencrypt"     #wykorzystanie certyfikatu z letsencrypt
      #- "traefik.http.routers.webssh.middlewares=webssh_auth"
      #- "traefik.http.middlewares.webssh_auth.basicauth.users=admin:$$2a$$12$$27/JwrSiybCBIDpPSKXBYOfUvOGMrqRli8gTK3AayXX5Rxb23Tuu./"
    #environment:
      #- HOST=217.30.138.17
      #- PORT=22
      #- USERNAME=user
      #- PASSWORD=password
    networks:
      - traefik_network
    restart: always

#-----------------------------------------------PORTAINER---------------------------------------------------------------
  portainer:
    image: portainer/portainer-ee:latest
    container_name: portainer
    #command: -H unix:///var/run/docker.sock
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - portainer_data:/data
    labels:
      # Frontend
      - "traefik.enable=true"
      - "traefik.http.routers.frontend.rule=Host(`portainer.icttools.dokb01-prd.netia.org`)"
      - "traefik.http.routers.frontend.entrypoints=websecure"
      - "traefik.http.services.frontend.loadbalancer.server.port=9000"
      - "traefik.http.routers.frontend.service=frontend"
      - "traefik.http.routers.frontend.tls=true"
      #- "traefik.http.routers.frontend.tls.certresolver=letsencrypt"   #wykorzystanie certyfikatu z letsencrypt
      #- "traefik.http.routers.frontend.middlewares=frontend_auth"
      #- "traefik.http.middlewares.frontend_auth.basicauth.users=admin:$$2a$$12$$27/JwrSiybCBIDpPSKXBYOfUvOGMrqRli8gTK3AayXX5Rxb23Tuu./"

      # Edge
      #- "traefik.http.routers.edge.rule=Host(`edge.portainer.icttools.bartkowalczyk.com`)"
      #- "traefik.http.routers.edge.entrypoints=websecure"
      #- "traefik.http.services.edge.loadbalancer.server.port=8000"
      #- "traefik.http.routers.edge.service=edge"
      #- "traefik.http.routers.edge.tls.certresolver=letsencrypt"
    networks:
      - traefik_network
    restart: always

#------------------------------------------------HEIMDALL----------------------------------------------------------------
  heimdall:
    image: lscr.io/linuxserver/heimdall:latest
    container_name: heimdall
    #ports:
     #- "8090:80"
     #- "3443:443"
    volumes:
      - /var/lib/docker/heimdall:/config
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.heimdall.rule=Host(`icttools.dokb01-prd.netia.org`)"
      - "traefik.http.routers.heimdall.entrypoints=websecure"
      - "traefik.http.routers.heimdall.tls=true"
      #- "traefik.http.routers.heimdall.tls.certresolver=letsencrypt"   #wykorzystanie certyfikatu z letsencrypt
      #- "traefik.http.routers.heimdall.middlewares=heimdall_auth"
      #- "traefik.http.middlewares.heimdall_auth.basicauth.users=admin:$$2a$$12$$27/JwrSiybCBIDpPSKXBYOfUvOGMrqRli8gTK3AayXX5Rxb23Tuu./"
    environment:
      - PUID=1000
      - PGID=1000
      - TZ=Etc/UTC
    networks:
      - traefik_network
    restart: always

#------------------------------------------------ADGUARD----------------------------------------------------------------
  adguard:
    image: adguard/adguardhome
    container_name: adguard
    ports:
      - "53:53/tcp"
      - "53:53/udp"
    volumes:
      - adguard_data:/opt/adguardhome/work
      - adguard_conf:/opt/adguardhome/conf
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.adguard.rule=Host(`adguard.icttools.dokb01-prd.netia.org`)"
      - "traefik.http.routers.adguard.entrypoints=websecure"
      - "traefik.http.routers.adguard.tls=true"
      #- "traefik.http.routers.adguard.tls.certresolver=letsencrypt"    #wykorzystanie certyfikatu z letsencrypt
      - "traefik.http.services.adguard.loadbalancer.server.port=80"
    networks:
      - traefik_network
    restart: always

#------------------------------------------------APACHE-RANDSTAD----------------------------------------------------------------
  apache-randstad:
    image: httpd:latest
    container_name: apache-randstad
    #ports:
      #- "80:80"
    volumes:
      - /var/www/randstad/html:/usr/local/apache2/htdocs/
      #- /var/www/httpd.conf:/usr/local/apache2/conf/httpd.conf
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.apache_randstad.rule=Host(`rand.icttools.dokb01-prd.netia.org`)"
      - "traefik.http.routers.apache_randstad.entrypoints=websecure"
      - "traefik.http.routers.apache_randstad.tls=true"
      #- "traefik.http.routers.apache_randstad.tls.certresolver=letsencrypt"    #wykorzystanie certyfikatu z letsencrypt
      - "traefik.http.routers.apache_randstad.middlewares=apache_randstad_auth"
      - "traefik.http.middlewares.apache_randstad_auth.basicauth.users=rand_amz:$2a$12$6x5dGLHMW0kyflZCjKQ7uumYMTP0TZSXGpKmeXiuXKbpKKQKsjy8K"
    networks:
      - traefik_network
    restart: always

#-----------------------------------------------APACHE-LIVECHAT--------------------------------------------------------
  apache-livechat:
    image: httpd:latest
    container_name: apache-livechat
    #ports:
      #- "80:80"
    volumes:
      - /var/www/livechat/html:/usr/local/apache2/htdocs/
      #- /var/www/httpd.conf:/usr/local/apache2/conf/httpd.conf
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.apache_livechat.rule=Host(`livechat.icttools.dokb01-prd.netia.org`)"
      - "traefik.http.routers.apache_livechat.entrypoints=websecure"
      - "traefik.http.routers.apache_livechat.tls=true"
      #- "traefik.http.routers.apache_livechat.tls.certresolver=letsencrypt"    #wykorzystanie certyfikatu z letsencrypt
      #- "traefik.http.routers.apache_livechat.middlewares=apache_livechat_auth"
      #- "traefik.http.middlewares.apache_livechat_auth.basicauth.users=rand_amz:$2a$12$6x5dGLHMW0kyflZCjKQ7uumYMTP0TZSXGpKmeXiuXKbpKKQKsjy8K"
    networks:
      - traefik_network
    restart: always

#----------------------------------------------------------------------------------------------------------------

volumes:
  portainer_data:
  adguard_data:
  adguard_conf:

networks:
  traefik_network:
    external: true

Uruchomienie kontenerów

Terminal
 docker compose up -d --remove-orphans

Certyfikat z Let's Encrypt (ARCHIWALNE)

Przeprowadzono proces uzyskania certyfikatów SSL od Let's Encrypt:
- W vCloud Director zmodyfikowano regułę firewall ICT-TOOLS_vm-rules zmieniając Source z Corpo_proxy na Any
- W pliku docker-compose.yml w konfiguracji traefika wprowadzono linię:

- "--certificatesresolvers.letsencrypt.acme.caserver=https://acme-staging-v02.api.letsencrypt.org/directory"

- Sprawdzono, czy wszystkie usługi otrzymały certyfikat "staging"
- Usunięto staging z poniższej linii, aby uzyskać certyfikat produkcyjny:
- "--certificatesresolvers.letsencrypt.acme.caserver=https://acme-v02.api.letsencrypt.org/directory"
  • W katalogu /mnt/data/traefik/acme usunięto tymczasowy plik certyfikatu acme.json
  • Po otrzymaniu produkcyjnego certyfikatu zakomentowano linię:
      #- "--certificatesresolvers.letsencrypt.acme.caserver=https://acme-staging-v02.api.letsencrypt.org/directory"
    
  • W vCloud Director zmodyfikowano regułę firewall ICT-TOOLS_vm-rules zmieniając Source z Any na Corpo_proxy
Aktualizacja certyfikatu z Let's Encrypt

Aby zaktualizować certyfikat z Let's Encrypt należy wykonać następujące czynności:
- W vCloud Director należy zmodyfikować regułę firewall ICT-TOOLS_vm-rules zmieniając Source z Corpo_proxy na Any
- W pliku docker-compose.yml w konfiguracji Traefika odkomentować linię:

- "--certificatesresolvers.letsencrypt.acme.caserver=https://acme-v02.api.letsencrypt.org/directory"

- Następnie należy zrestartować kontenery:
Terminal
 docker compose up -d --remove-orphans

- Certyfikat powinien się automatycznie odnowić
- Po zweryfikowaniu odnowienia certyfikatu w pliku docker-compose.yml w konfiguracji Traefika należy zakomentować linię:
#- "--certificatesresolvers.letsencrypt.acme.caserver=https://acme-v02.api.letsencrypt.org/directory"

- Następnie należy ponownie zrestartować kontenery
- W vCloud Director należy zmodyfikować regułę firewall ICT-TOOLS_vm-rules zmieniając Source z Any na Corpo_proxy

Certyfikat dla domeny dokb01-prd.netia.org

Przeprowadzono proces uzyskania certyfikatów SSL od zespołu Windows Admins w związku z migracją domeny z icttools.bartkowalczyk.com na icttools.dokb01-prd.netia.org.

Proces uzyskania certyfikatu

Utworzono katalog na certyfikat i klucz prywatny /mnt/data/traefik/certs oraz nadano mu odpowiednie uprawnienia.

ICT-TOOLS:~# chmod 600 /mnt/data/traefik/certs/*

Utworzono katalog /etc/ssl/csr na potrzeby wygenerowania pliku CSR.

ICT-TOOLS:~# mkdir -p /etc/ssl/csr
ICT-TOOLS:~# cd /etc/ssl/csr

Wygenerowano klucz prywatny na potrzeby certyfikatu i pliku CSR oraz nadano mu odpowiednie uprawnienia.

ICT-TOOLS:/etc/ssl/csr# openssl genrsa -out icttools_dokb_netia.key 4096
ICT-TOOLS:/etc/ssl/csr# chmod 600 icttools_dokb_netia.key

Aby certyfikat obejmował zarówno domenę główną icttools.dokb01-prd.netia.org jak również *.icttools.dokb01-prd.netia.org utworzono plik konfiguracyjny na potrzeby generowania pliku CSR.

ICT-TOOLS:/etc/ssl/csr# touch csr.conf
/etc/ssl/csr/csr.conf
[req]
default_bits = 4096
prompt = no
default_md = sha256
distinguished_name = dn
req_extensions = req_ext

[dn]
C = PL
ST = Mazowieckie
L = Warsaw
O = Netia S.A.
OU = IT
CN = *.icttools.dokb01-prd.netia.org

[req_ext]
subjectAltName = @alt_names

[alt_names]
DNS.1 = *.icttools.dokb01-prd.netia.org
DNS.2 = icttools.dokb01-prd.netia.org

Wygenerowano plik CSR na podstawie utworzonego wcześniej pliku konfiguracyjnego oraz klucza prywatnego.

ICT-TOOLS:/etc/ssl/csr# openssl req -new -key icttools_dokb_netia.key -out icttools_dokb_netia.csr -config csr.conf

Zweryfikowano zawartość pliku CSR.

ICT-TOOLS:/etc/ssl/csr# openssl req -text -noout -verify -in icttools_dokb_netia.csr

Plik icttools_dokb_netia.csr został wysłany do Tomasza Styrny z zespołu Windows Admins, który odesłał plik certyfikatu icttools_dokb_netia.cer.

Plik icttools_dokb_netia.cer został przesłany na serwer ICT-TOOLS i umieszczony w katalogu /mnt/data/traefik/certs gdzie przeniesiono również wygenerowany wcześniej klucz prywatny.

Żeby Traefik mógł prawidłowo obsłużyć taki certyfikat w katalogu /srv/docker utworzono plik konfiguracyjny dynamic.yml wskazujący na lokalizację certyfikatu oraz jego klucza prywatnego.

W pliku dynamic.yml mieszczono następującą treść:

tls:
  certificates:
    - certFile: /certs/icttools_dokb_netia.cer
      keyFile: /certs/icttools_dokb_netia.key

W konfiguracji kontenera Traefik zmapowano utworzony plik dynamic.yml do katalogu /cert_conf znajdującego się w kontenerze

- "/srv/docker/dynamic.yml:/cert_conf/dynamic.yml:ro" 

W konfiguracji kontenera Traefik dodano linię wskazującą na plik dynamic.yml (jest to wskazanie na zmapowany plik znajdujący się w kontenerze).

- "--providers.file.filename=/cert_conf/dynamic.yml"

Zmapowano katalog /mnt/data/traefik/certs do katalogu /certs w kontenerze traefik

- "/mnt/data/traefik/certs:/certs"

W plikach docker-compose.yml, docker-compose_zabbix.yaml oraz docker-compose_web-chomik.yaml zakomentowano linie dotyczące Let's Encrypt oraz wprowadzono nowe nazwy domenowe np.:

- "traefik.http.routers.frontend.rule=Host(`portainer.icttools.dokb01-prd.netia.org`)"

Po wprowadzonych modyfikacjach zrestartowano wszystkie kontenery.

Portainer

Utworzono wolumin do przechowywania bazy danych Portainera:

Terminal
docker volume create portainer_data

Klucz licencyjny

Portainer Business Edition license key:
3-muoUJ7OgKuqdaOyOLPuKq9Ga61n2ZPATDVxQ/u2LEA3nWdLx1EHufPlZitSB5UzJBmUGkrPsNIxhVWI=

Logowanie

Aby zalogować się do panelu zarządzania Portainera ustawiono następujące dane:
- login: admin
- password: Netia123456&

Sieć

Utworzono sieć na potrzeby wdrażanych kontenerów:
- Name: traefik_network
- Driver: bridge
- Scope: local
- Attachable: false
- Internal: false
- IPV4 Subnet: 172.20.0.0/16
- IPV4 Gateway: 172.20.10.11
- IPV4 IP Range: 172.20.10.128/25

Traefik

Traefik wykorzystywany jest jako reverse proxy. Umożliwia automatyczne przekierowywanie ruchu HTTP/HTTPS do odpowiednich kontenerów na podstawie reguł routingu zdefiniowanych w konfiguracji.

Zostało ustawione hasło do autoryzacji:
- user: admin
- password: Bober1234%

WebSSH

WebSSH to narzędzie, które umożliwia zdalny dostęp do serwera lub urządzenia poprzez przeglądarkę internetową za pomocą protokołu SSH. Zamiast korzystać z oprogramowania do klientów SSH, takiego jak PuTTY czy OpenSSH, można użyć WebSSH do nawiązania połączenia SSH bezpośrednio z przeglądarki internetowej.

Zostało ustawione hasło do autoryzacji:
- user: admin
- password: Bober1234%

Heimdall

Dla użytkownika admin, dodano do panelu głównego: Traefika, Portainera i WebSSH.
Ustawiono dane do logowania dla użytkownika admin:
- login: admin
- password: Asgard1234%

Dla użytkownika User, dodano do panelu głównego: WebSSH
Ustawiono dane do logowania dla użytkownika User:
- login: User
- password: Ragnarok1234%

AdGuard

AdGuard to zorientowany na prywatność serwer DNS blokujący reklamy, śledzenie i złośliwe domeny. Działa na wszystkich urządzeniach i oferuje różne tryby pracy, takie jak blokowanie treści dla dorosłych. Pozwala na monitorowanie zapytań DNS wysyłanych przez urządzenia, korzystające z niego.

Aby umożliwić działanie aplikacji AdGuard wyłączono DNSStubListener, w tym celu wykonano następujące czynności:
1. Dezaktywowano DNSStubListener i zaktualizowano adres serwera DNS. Utworzono nowy plik adguardhome.conf w ścieżce:

Terminal
/etc/systemd/resolved.conf.d/adguardhome.conf

Następnie dodano do niego następującą zawartość:
[Resolve] 
DNS=127.0.0.1 
DNSStubListener=no

Określenie 127.0.0.1 jako adresu serwera DNS jest konieczne, ponieważ w przeciwnym razie nameserver będzie ustawiony na 127.0.0.53, który nie działa bez DNSStubListener.
2. Aktywowano nowy plik resolv.conf:
Terminal
mv /etc/resolv.conf /etc/resolv.conf.backup 
ln -s /run/systemd/resolve/resolv.conf /etc/resolv.conf

3. Zatrzymano DNSStubListener:
Terminal
systemctl reload-or-restart systemd-resolved

Utworzono potrzebne woluminy:

Terminal
docker volume create adguard_data
docker volume create adguard_conf

Przed pierwszym uruchomieniem, w konfiguracji kontenera AdGuard w pliku Docker Compose, w poniższej linii należy ustawić port na 3000:

Terminal
     - "traefik.http.services.adguard.loadbalancer.server.port=3000"

Po przejściu początkowej konfiguracji, aby dostać się do panelu zarządzania AdGuard należy zmienić port na 80:

Terminal
     - "traefik.http.services.adguard.loadbalancer.server.port=80"

Aby inne maszyny w środowisku Compute mogły korzystać z AdGuarda jako serwera DNS, należy podać adres lokalny maszyny (10.10.0.2). Pozwala to na dokładne zidentyfikowanie z której maszyny pochodzi zapytanie. W przypadku wprowadzenia adresu publicznego (217.30.138.17), odpytujące maszyny również będą przedstawiać się adresem publicznym.

Zostało ustawione hasło dla użytkownika admin:
- user: admin
- password: Netia123456&

Apache-Randstad

Serwer Apache to jeden z najpopularniejszych serwerów HTTP używanych na serwerach stron internetowych. Apache działa po stronie serwera i obsługuje zapytania przesyłane przez użytkowników poprzez przeglądarki internetowe. Umożliwia on udostępnianie stron WWW, które hostuje w sieci internet.

Instancja utworzona jak backup skryptów awaryjnych Randstad.

Utworzono katalog na pliki konfiguracyjne strony www:

Terminal
mkdir /var/www/randstad/html  

Zmapowano utworzony katalog do odpowiedniego katalogu w kontenerze:

- /var/www/randstad/html:/usr/local/apache2/htdocs/

Zaimportowano pliki tworzące awaryjną bazę skryptów na potrzeby obsługi Randstad:
docs/5. Projekty i infrastruktura/Środowisko Cloud 2.0 Prod/ICT - TOOLS/img/Pasted image 20240807145748.png

Ustawiono hasło autoryzacyjne do strony:
- user: rand_amz
- password: h*riM%2@3n#N**X942h@99D$

Apache-LiveChat

Instancja utworzona na potrzeby testów rozwiązania LiveChat.

Utworzono katalog na pliki konfiguracyjne strony www:

Terminal
mkdir /var/www/livechat/html  

Zmapowano utworzony katalog do odpowiedniego katalogu w kontenerze:

- /var/www/livechat/html:/usr/local/apache2/htdocs/

Zabbix

Zabbix to rozwiązanie klasy enterprise do obsługi problemów z monitoringiem. Służy do zbierania, analizowania i wizualizacji danych. Oprogramowanie potrafi również wykryć wszelkie anomalie w infrastrukturze i powiadomić o tym odpowiednio użytkownika.

Instalacja

W celu zainstalowania narzędzia Zabbix zaimportowano pliki z oficjalnego repozytorium:

Terminal
git clone https://github.com/zabbix/zabbix-docker.git
git checkout 6.4

Następnie, usunięto niepotrzebne pliki oraz scalono dla lepszej czytelności pliki Docker Compose do pliku docker-compose_zabbix.yaml

Uruchomienie kontenerów

Terminal
docker compose -f docker-compose_zabbix.yaml up -d

Zabbix Agent 2

Dodatkowo na maszynie zainstalowano Zabbix Agent 2 w celu monitorowania maszyny, jak również środowiska Dockerowego. Plik instalacyjny pobrano z oficjalnej strony Zabbixa

Terminal
wget https://repo.zabbix.com/zabbix/6.4/ubuntu/pool/main/z/zabbix-release/zabbix-release_6.4-1+ubuntu22.04_all.deb
dpkg -i zabbix-release_6.4-1+ubuntu22.04_all.deb
apt update
apt install zabbix-agent2 zabbix-agent2-plugin-*

Skonfigurowano agenta podając adres publiczny serwera ICT-TOOLS i określając na jakim porcie ma nasłuchiwać:
docs/5. Projekty i infrastruktura/Środowisko Cloud 2.0 Prod/ICT - TOOLS/img/Pasted image 20240712152643.png

docs/5. Projekty i infrastruktura/Środowisko Cloud 2.0 Prod/ICT - TOOLS/img/Pasted image 20240712152742.png

Konieczne jest również ustawienie identycznej nazwy hosta zarówno w konfiguracji agenta, jak również podczas dodawania hosta do monitoringu w panelu Zabbix:
docs/5. Projekty i infrastruktura/Środowisko Cloud 2.0 Prod/ICT - TOOLS/img/Pasted image 20240712153020.png

docs/5. Projekty i infrastruktura/Środowisko Cloud 2.0 Prod/ICT - TOOLS/img/Pasted image 20240712153224.png

Logowanie

Zostało ustawione hasło do autoryzacji:
- user: Admin
- password: Netia123456&

Dostęp do maszyny ICT-TOOLS

Dostęp do maszyny mają użytkownicy:
- kowalcb1
- zukowsp
- lypaczp2
- golend
- tyrnaj

Ze względów bezpieczeństwa wyłączono możliwość logowania się hasłem poprzez SSH, jak również wyłączono możliwość bezpośredniego logowania się na użytkownika root poprzez SSH. Dla każdego z powyższych użytkowników zostały wygenerowane pary kluczy SSH z wykorzystaniem algorytmu ECDSA 521.
W pliku /etc/ssh/sshd_config wprowadzono następujące ustawienia:

Port 22
PubkeyAuthentication yes
PasswordAuthentication no
PermitEmptyPasswords no

W pliku /etc/ssh/sshd_config.d/50-cloud-init.conf wprowadzono następujące ustawienia:

PasswordAuthentication no

Firewall maszyny

user.rules
*filter
:ufw-user-input - [0:0]
:ufw-user-output - [0:0]
:ufw-user-forward - [0:0]
:ufw-before-logging-input - [0:0]
:ufw-before-logging-output - [0:0]
:ufw-before-logging-forward - [0:0]
:ufw-user-logging-input - [0:0]
:ufw-user-logging-output - [0:0]
:ufw-user-logging-forward - [0:0]
:ufw-after-logging-input - [0:0]
:ufw-after-logging-output - [0:0]
:ufw-after-logging-forward - [0:0]
:ufw-logging-deny - [0:0]
:ufw-logging-allow - [0:0]
:ufw-user-limit - [0:0]
:ufw-user-limit-accept - [0:0]
### RULES ###

### tuple ### allow any 10052 0.0.0.0/0 any 217.30.138.17 in
-A ufw-user-input -p tcp --dport 10052 -s 217.30.138.17 -j ACCEPT
-A ufw-user-input -p udp --dport 10052 -s 217.30.138.17 -j ACCEPT

### tuple ### allow any 22 0.0.0.0/0 any 195.114.160.133 in
-A ufw-user-input -p tcp --dport 22 -s 195.114.160.133 -j ACCEPT
-A ufw-user-input -p udp --dport 22 -s 195.114.160.133 -j ACCEPT

### tuple ### allow any 22 0.0.0.0/0 any 195.114.160.134 in
-A ufw-user-input -p tcp --dport 22 -s 195.114.160.134 -j ACCEPT
-A ufw-user-input -p udp --dport 22 -s 195.114.160.134 -j ACCEPT

### tuple ### allow any 22 0.0.0.0/0 any 195.114.160.130 in
-A ufw-user-input -p tcp --dport 22 -s 195.114.160.130 -j ACCEPT
-A ufw-user-input -p udp --dport 22 -s 195.114.160.130 -j ACCEPT

### tuple ### allow any 22 0.0.0.0/0 any 195.114.160.135 in
-A ufw-user-input -p tcp --dport 22 -s 195.114.160.135 -j ACCEPT
-A ufw-user-input -p udp --dport 22 -s 195.114.160.135 -j ACCEPT

### tuple ### allow any 22 0.0.0.0/0 any 195.114.160.136 in
-A ufw-user-input -p tcp --dport 22 -s 195.114.160.136 -j ACCEPT
-A ufw-user-input -p udp --dport 22 -s 195.114.160.136 -j ACCEPT

### tuple ### allow any 22 0.0.0.0/0 any 195.114.160.137 in
-A ufw-user-input -p tcp --dport 22 -s 195.114.160.137 -j ACCEPT
-A ufw-user-input -p udp --dport 22 -s 195.114.160.137 -j ACCEPT

### tuple ### allow any 80 0.0.0.0/0 any 195.114.160.130 in
-A ufw-user-input -p tcp --dport 80 -s 195.114.160.130 -j ACCEPT
-A ufw-user-input -p udp --dport 80 -s 195.114.160.130 -j ACCEPT

### tuple ### allow any 80 0.0.0.0/0 any 195.114.160.133 in
-A ufw-user-input -p tcp --dport 80 -s 195.114.160.133 -j ACCEPT
-A ufw-user-input -p udp --dport 80 -s 195.114.160.133 -j ACCEPT

### tuple ### allow any 80 0.0.0.0/0 any 195.114.160.134 in
-A ufw-user-input -p tcp --dport 80 -s 195.114.160.134 -j ACCEPT
-A ufw-user-input -p udp --dport 80 -s 195.114.160.134 -j ACCEPT

### tuple ### allow any 80 0.0.0.0/0 any 195.114.160.135 in
-A ufw-user-input -p tcp --dport 80 -s 195.114.160.135 -j ACCEPT
-A ufw-user-input -p udp --dport 80 -s 195.114.160.135 -j ACCEPT

### tuple ### allow any 80 0.0.0.0/0 any 195.114.160.136 in
-A ufw-user-input -p tcp --dport 80 -s 195.114.160.136 -j ACCEPT
-A ufw-user-input -p udp --dport 80 -s 195.114.160.136 -j ACCEPT

### tuple ### allow any 80 0.0.0.0/0 any 195.114.160.137 in
-A ufw-user-input -p tcp --dport 80 -s 195.114.160.137 -j ACCEPT
-A ufw-user-input -p udp --dport 80 -s 195.114.160.137 -j ACCEPT

### tuple ### allow any 443 0.0.0.0/0 any 195.114.160.130 in
-A ufw-user-input -p tcp --dport 443 -s 195.114.160.130 -j ACCEPT
-A ufw-user-input -p udp --dport 443 -s 195.114.160.130 -j ACCEPT

### tuple ### allow any 443 0.0.0.0/0 any 195.114.160.133 in
-A ufw-user-input -p tcp --dport 443 -s 195.114.160.133 -j ACCEPT
-A ufw-user-input -p udp --dport 443 -s 195.114.160.133 -j ACCEPT

### tuple ### allow any 443 0.0.0.0/0 any 195.114.160.134 in
-A ufw-user-input -p tcp --dport 443 -s 195.114.160.134 -j ACCEPT
-A ufw-user-input -p udp --dport 443 -s 195.114.160.134 -j ACCEPT

### tuple ### allow any 443 0.0.0.0/0 any 195.114.160.135 in
-A ufw-user-input -p tcp --dport 443 -s 195.114.160.135 -j ACCEPT
-A ufw-user-input -p udp --dport 443 -s 195.114.160.135 -j ACCEPT

### tuple ### allow any 443 0.0.0.0/0 any 195.114.160.136 in
-A ufw-user-input -p tcp --dport 443 -s 195.114.160.136 -j ACCEPT
-A ufw-user-input -p udp --dport 443 -s 195.114.160.136 -j ACCEPT

### tuple ### allow any 443 0.0.0.0/0 any 195.114.160.137 in
-A ufw-user-input -p tcp --dport 443 -s 195.114.160.137 -j ACCEPT
-A ufw-user-input -p udp --dport 443 -s 195.114.160.137 -j ACCEPT

### tuple ### deny any 22 0.0.0.0/0 any 0.0.0.0/0 in
-A ufw-user-input -p tcp --dport 22 -j DROP
-A ufw-user-input -p udp --dport 22 -j DROP

### tuple ### deny any 53 0.0.0.0/0 any 0.0.0.0/0 in
-A ufw-user-input -p tcp --dport 53 -j DROP
-A ufw-user-input -p udp --dport 53 -j DROP

### tuple ### deny any 80 0.0.0.0/0 any 0.0.0.0/0 in
-A ufw-user-input -p tcp --dport 80 -j DROP
-A ufw-user-input -p udp --dport 80 -j DROP

### tuple ### deny any 443 0.0.0.0/0 any 0.0.0.0/0 in
-A ufw-user-input -p tcp --dport 443 -j DROP
-A ufw-user-input -p udp --dport 443 -j DROP

### END RULES ###

### LOGGING ###
-A ufw-after-logging-input -j LOG --log-prefix "[UFW BLOCK] " -m limit --limit 3/min --limit-burst 10
-A ufw-after-logging-forward -j LOG --log-prefix "[UFW BLOCK] " -m limit --limit 3/min --limit-burst 10
-I ufw-logging-deny -m conntrack --ctstate INVALID -j RETURN -m limit --limit 3/min --limit-burst 10
-A ufw-logging-deny -j LOG --log-prefix "[UFW BLOCK] " -m limit --limit 3/min --limit-burst 10
-A ufw-logging-allow -j LOG --log-prefix "[UFW ALLOW] " -m limit --limit 3/min --limit-burst 10
### END LOGGING ###

### RATE LIMITING ###
-A ufw-user-limit -m limit --limit 3/minute -j LOG --log-prefix "[UFW LIMIT BLOCK] "
-A ufw-user-limit -j REJECT
-A ufw-user-limit-accept -j ACCEPT
### END RATE LIMITING ###
COMMIT
user6.rules
*filter
:ufw6-user-input - [0:0]
:ufw6-user-output - [0:0]
:ufw6-user-forward - [0:0]
:ufw6-before-logging-input - [0:0]
:ufw6-before-logging-output - [0:0]
:ufw6-before-logging-forward - [0:0]
:ufw6-user-logging-input - [0:0]
:ufw6-user-logging-output - [0:0]
:ufw6-user-logging-forward - [0:0]
:ufw6-after-logging-input - [0:0]
:ufw6-after-logging-output - [0:0]
:ufw6-after-logging-forward - [0:0]
:ufw6-logging-deny - [0:0]
:ufw6-logging-allow - [0:0]
:ufw6-user-limit - [0:0]
:ufw6-user-limit-accept - [0:0]
### RULES ###

### tuple ### deny any 22 ::/0 any ::/0 in
-A ufw6-user-input -p tcp --dport 22 -j DROP
-A ufw6-user-input -p udp --dport 22 -j DROP

### tuple ### deny any 53 ::/0 any ::/0 in
-A ufw6-user-input -p tcp --dport 53 -j DROP
-A ufw6-user-input -p udp --dport 53 -j DROP

### tuple ### deny any 80 ::/0 any ::/0 in
-A ufw6-user-input -p tcp --dport 80 -j DROP
-A ufw6-user-input -p udp --dport 80 -j DROP

### tuple ### deny any 443 ::/0 any ::/0 in
-A ufw6-user-input -p tcp --dport 443 -j DROP
-A ufw6-user-input -p udp --dport 443 -j DROP

### END RULES ###

### LOGGING ###
-A ufw6-after-logging-input -j LOG --log-prefix "[UFW BLOCK] " -m limit --limit 3/min --limit-burst 10
-A ufw6-after-logging-forward -j LOG --log-prefix "[UFW BLOCK] " -m limit --limit 3/min --limit-burst 10
-I ufw6-logging-deny -m conntrack --ctstate INVALID -j RETURN -m limit --limit 3/min --limit-burst 10
-A ufw6-logging-deny -j LOG --log-prefix "[UFW BLOCK] " -m limit --limit 3/min --limit-burst 10
-A ufw6-logging-allow -j LOG --log-prefix "[UFW ALLOW] " -m limit --limit 3/min --limit-burst 10
### END LOGGING ###

### RATE LIMITING ###
-A ufw6-user-limit -m limit --limit 3/minute -j LOG --log-prefix "[UFW LIMIT BLOCK] "
-A ufw6-user-limit -j REJECT
-A ufw6-user-limit-accept -j ACCEPT
### END RATE LIMITING ###
COMMIT

Zabbix compose files

docker-compose_zabbix.yaml
#version: "3.8"
services:
  zabbix-server:
    image: zabbix/zabbix-server-mysql:ubuntu-6.4-latest
    container_name: zabbix-server
    depends_on:
      - mysql-server
    restart: always
    ports:
      - "10051:10051"
    volumes:
      - dbsocket:/var/run/mysqld/
      - /etc/localtime:/etc/localtime:ro
      - /etc/timezone:/etc/timezone:ro
      - ./zbx_env/usr/lib/zabbix/alertscripts:/usr/lib/zabbix/alertscripts:ro
      - ./zbx_env/usr/lib/zabbix/externalscripts:/usr/lib/zabbix/externalscripts:ro
      - ./zbx_env/var/lib/zabbix/dbscripts:/var/lib/zabbix/dbscripts:ro
      - ./zbx_env/var/lib/zabbix/export:/var/lib/zabbix/export:rw
      - ./zbx_env/var/lib/zabbix/modules:/var/lib/zabbix/modules:ro
      - ./zbx_env/var/lib/zabbix/enc:/var/lib/zabbix/enc:ro
      - ./zbx_env/var/lib/zabbix/ssh_keys:/var/lib/zabbix/ssh_keys:ro
      - ./zbx_env/var/lib/zabbix/mibs:/var/lib/zabbix/mibs:ro
      - snmptraps:/var/lib/zabbix/snmptraps:ro
    #links:
      #- mysql-server:mysql-server
    tmpfs: /tmp
    ulimits:
      nproc: 65535
      nofile:
        soft: 20000
        hard: 40000
    deploy:
      resources:
        limits:
          cpus: "0.70"
          memory: 1G
        reservations:
          cpus: "0.5"
          memory: 512M
    env_file:
      - ./env_vars/.env_db_mysql
      - ./env_vars/.env_srv
    secrets:
      - MYSQL_USER
      - MYSQL_PASSWORD
    networks:
      zbx_net_backend:
        ipv4_address: 172.16.239.101
        aliases:
          - zabbix-server
          - zabbix-server-mysql
          - zabbix-server-ubuntu-mysql
          - zabbix-server-mysql-ubuntu
      zbx_net_frontend:
        ipv4_address: 172.16.238.101
      zbx_net_database:
        aliases:
          - zabbix-server
      zbx_net_vpn:
    stop_grace_period: 30s
    sysctls:
      - net.ipv4.ip_local_port_range=1024 65000
      - net.ipv4.conf.all.accept_redirects=0
      - net.ipv4.conf.all.secure_redirects=0
      - net.ipv4.conf.all.send_redirects=0
    labels:
      com.zabbix.description: "Zabbix server with PostgreSQL database support"
      com.zabbix.company: "Zabbix LLC"
      com.zabbix.component: "zabbix-server"
      com.zabbix.dbtype: "mysql"
      com.zabbix.os: "ubuntu"




  zabbix-web-nginx-mysql:
    container_name: zabbix-web
    image: zabbix/zabbix-web-nginx-mysql:ubuntu-6.4-latest
    depends_on:
      - mysql-server
      - zabbix-server
    restart: always
    ports:
      - "8080:8080"
      - "8443:8443"
    #links:
      #- mysql-server:mysql-server
      #- zabbix-server:zabbix-server
    volumes:
      - dbsocket:/var/run/mysqld/
      - /etc/localtime:/etc/localtime:ro
      - /etc/timezone:/etc/timezone:ro
      - ./zbx_env/etc/ssl/nginx:/etc/ssl/nginx:ro
      - ./zbx_env/usr/share/zabbix/modules/:/usr/share/zabbix/modules/:ro
    tmpfs: /tmp
    deploy:
      resources:
        limits:
          cpus: "0.70"
          memory: 512M
        reservations:
          cpus: "0.5"
          memory: 256M
    env_file:
      - ./env_vars/.env_db_mysql
      - ./env_vars/.env_web
    secrets:
      - MYSQL_USER
      - MYSQL_PASSWORD
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:8080/"]
      interval: 10s
      timeout: 5s
      retries: 3
      start_period: 30s
    networks:
      zbx_net_backend:
        ipv4_address: 172.16.239.102
        aliases:
          - zabbix-web-nginx-mysql
          - zabbix-web-nginx-ubuntu-mysql
          - zabbix-web-nginx-mysql-ubuntu
      zbx_net_frontend:
        ipv4_address: 172.16.238.102
      zbx_net_database:
      traefik_network:
    stop_grace_period: 10s
    sysctls:
      - net.core.somaxconn=65535
    labels:
      com.zabbix.description: "Zabbix frontend on Nginx web-server with PostgreSQL database support"
      com.zabbix.company: "Zabbix LLC"
      com.zabbix.component: "zabbix-frontend"
      com.zabbix.webserver: "nginx"
      com.zabbix.dbtype: "mysql"
      com.zabbix.os: "ubuntu"
      traefik.enable: "true"
      traefik.http.routers.zabbix.rule: "Host(`zabbix.icttools.dokb01-prd.netia.org`)"
      #traefik.http.routers.zabbix.entrypoints: "websecure"
      #traefik.http.routers.zabbix.tls: "true"
      #traefik.http.routers.zabbix.tls.certresolver: "letsencrypt"





  zabbix-agent:
    container_name: zabbix-agent
    image: zabbix/zabbix-agent2:ubuntu-6.4-latest
    ports:
      - "10051:10051"
      - "10050:10050"
    restart: always
    #links:
      #- zabbix-server:zabbix-server
    volumes:
      - /etc/localtime:/etc/localtime:ro
      - /etc/timezone:/etc/timezone:ro
      - ./zbx_env/etc/zabbix/zabbix_agentd.d:/etc/zabbix/zabbix_agentd.d:ro
      - ./zbx_env/var/lib/zabbix/modules:/var/lib/zabbix/modules:ro
      - ./zbx_env/var/lib/zabbix/enc:/var/lib/zabbix/enc:ro
      - ./zbx_env/var/lib/zabbix/ssh_keys:/var/lib/zabbix/ssh_keys:ro
    tmpfs: /tmp
    deploy:
      resources:
        limits:
          cpus: '0.2'
          memory: 128M
        reservations:
          cpus: '0.1'
          memory: 64M
      mode: global
    env_file:
      - ./env_vars/.env_agent
    privileged: true
    pid: "host"
    networks:
      zbx_net_backend:
        ipv4_address: 172.16.239.103
        aliases:
          - zabbix-agent
          - zabbix-agent-passive
          - zabbix-agent-ubuntu
    stop_grace_period: 5s
    labels:
      com.zabbix.description: "Zabbix agent"
      com.zabbix.company: "Zabbix LLC"
      com.zabbix.component: "zabbix-agent2"
      com.zabbix.os: "ubuntu"





  mysql-server:
    image: mysql:8.0-oracle
    command:
      - mysqld
      - --character-set-server=utf8mb4
      - --collation-server=utf8mb4_bin
      - --log_bin_trust_function_creators=1
    volumes:
      - ./zbx_env/var/lib/mysql:/var/lib/mysql:rw
      - ./env_vars/mysql_init/init_proxy_db.sql:/docker-entrypoint-initdb.d/mysql_init_proxy.sql:ro
      - dbsocket:/var/run/mysqld/
    env_file:
      - ./env_vars/.env_db_mysql
    environment:
      - MYSQL_ROOT_PASSWORD_FILE=/run/secrets/MYSQL_ROOT_PASSWORD
    secrets:
      - MYSQL_USER
      - MYSQL_PASSWORD
      - MYSQL_ROOT_PASSWORD
    networks:
      zbx_net_database:
        aliases:
          - mysql-server





  db-data-mysql:
    image: busybox
    volumes:
      - ./zbx_env/var/lib/mysql:/var/lib/mysql:rw





networks:
  zbx_net_frontend:
    driver: bridge
    driver_opts:
      com.docker.network.enable_ipv6: "false"
    ipam:
      driver: default
      config:
        - subnet: 172.16.238.0/24
  zbx_net_backend:
    driver: bridge
    driver_opts:
      com.docker.network.enable_ipv6: "false"
    internal: true
    ipam:
      driver: default
      config:
        - subnet: 172.16.239.0/24
  zbx_net_database:
    driver: bridge
    driver_opts:
      com.docker.network.enable_ipv6: "false"
    internal: true
    ipam:
      driver: default
  zbx_net_vpn:
    driver: bridge
    driver_opts:
      com.docker.network.bridge.name: "zbx_bridge_vpn"
      com.docker.network.bridge.enable_ip_masquerade: "true"
    ipam:
      config:
        - subnet: 10.10.2.0/27
          gateway: 10.10.2.1
  traefik_network:
    external: true
    name: traefik_network



volumes:
  dbsocket:
  snmptraps:



secrets:
  MYSQL_USER:
    file: ./env_vars/.MYSQL_USER
  MYSQL_PASSWORD:
    file: ./env_vars/.MYSQL_PASSWORD
  MYSQL_ROOT_USER:
    file: ./env_vars/.MYSQL_ROOT_USER
  MYSQL_ROOT_PASSWORD:
    file: ./env_vars/.MYSQL_ROOT_PASSWORD
.env
# Zabbix images
ZABBIX_ALPINE_IMAGE_TAG=alpine-6.4
ZABBIX_CENTOS_IMAGE_TAG=centos-6.4
ZABBIX_OL_IMAGE_TAG=ol-6.4
ZABBIX_UBUNTU_IMAGE_TAG=ubuntu-6.4
ZABBIX_RHEL_IMAGE_TAG=rhel-6.4
ZABBIX_IMAGE_TAG_POSTFIX=-latest
ZABBIX_LOCAL_IMAGE_TAG_POSTFIX=-local

ZABBIX_SERVER_MYSQL_IMAGE=zabbix/zabbix-server-mysql
ZABBIX_SERVER_PGSQL_IMAGE=zabbix/zabbix-server-pgsql
ZABBIX_PROXY_MYSQL_IMAGE=zabbix/zabbix-proxy-mysql
ZABBIX_PROXY_SQLITE3_IMAGE=zabbix/zabbix-proxy-sqlite3
ZABBIX_WEB_NGINX_MYSQL_IMAGE=zabbix/zabbix-web-nginx-mysql
ZABBIX_WEB_APACHE_MYSQL_IMAGE=zabbix/zabbix-web-apache-mysql
ZABBIX_WEB_NGINX_PGSQL_IMAGE=zabbix/zabbix-web-nginx-pgsql
ZABBIX_WEB_APACHE_PGSQL_IMAGE=zabbix/zabbix-web-apache-pgsql
ZABBIX_AGENT_IMAGE=zabbix/zabbix-agent
ZABBIX_AGENT2_IMAGE=zabbix/zabbix-agent2
ZABBIX_JAVA_GATEWAY_IMAGE=zabbix/zabbix-java-gateway
ZABBIX_SNMPTRAPS_IMAGE=zabbix/zabbix-snmptraps
ZABBIX_WEB_SERVICE_IMAGE=zabbix/zabbix-web-service

# Database images
MYSQL_IMAGE=mysql
MYSQL_IMAGE_TAG=8.0-oracle
POSTGRESQL_IMAGE=postgres
POSTGRESQL_IMAGE_TAG=15-alpine

ELASTICSEARCH_IMAGE=elasticsearch
ELASTICSEARCH_IMAGE_TAG=latest

# Expose ports per service
ZABBIX_SERVER_PORT=10051
ZABBIX_PROXY_MYSQL_PORT=10071
ZABBIX_PROXY_SQLITE3_PORT=10061
ZABBIX_WEB_NGINX_HTTP_PORT=80
ZABBIX_WEB_NGINX_HTTPS_PORT=443
ZABBIX_WEB_APACHE_HTTP_PORT=8081
ZABBIX_WEB_APACHE_HTTPS_PORT=8443
ZABBIX_AGENT_PORT=10050
ZABBIX_AGENT2_PORT=10060
ZABBIX_JAVA_GATEWAY_PORT=10052
ZABBIX_SNMPTRAPS_PORT=162
ZABBIX_WEB_SERVICE_PORT=10053

# Network IP ranges
FRONTEND_NETWORK_DRIVER=default
FRONTEND_SUBNET=172.16.238.0/24
FRONTEND_ENABLE_IPV6=false
BACKEND_NETWORK_DRIVER=default
BACKEND_SUBNET=172.16.239.0/24
BACKEND_ENABLE_IPV6=false
DATABASE_NETWORK_ENABLE_IPV6=false
DATABASE_NETWORK_DRIVER=default

# Locations
DATA_DIRECTORY=./zbx_env
ENV_VARS_DIRECTORY=./env_vars

# Options
RESTART_POLICY=unless-stopped

# Cache base images
ALPINE_CACHE_FROM=alpine:3.20
CENTOS_CACHE_FROM=quay.io/centos/centos:stream9
OL_CACHE_FROM=oraclelinux:9-slim
UBUNTU_CACHE_FROM=ubuntu:jammy
RHEL_CACHE_FROM=registry.access.redhat.com/ubi9/ubi-minimal:9.4

# Base images
BUILD_BASE_IMAGE=zabbix-build-base
BUILD_BASE_MYSQL_IMAGE=zabbix-build-mysql
BUILD_BASE_PGSQL_IMAGE=zabbix-build-pgsql
BUILD_BASE_SQLITE3_IMAGE=zabbix-build-sqlite3

# Operating System tags
ALPINE_OS_TAG=Alpine
ALPINE_OS_TAG_SHORT=alpine

CENTOS_OS_TAG=CentOS
CENTOS_OS_TAG_SHORT=centos

OL_OS_TAG=Oracle Linux
OL_OS_TAG_SHORT=ol

UBUNTU_OS_TAG=Ubuntu
UBUNTU_OS_TAG_SHORT=ubuntu

RHEL_OS_TAG=Red Hat
RHEL_OS_TAG_SHORT=rhel