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
#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
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:
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
[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:
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:
/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:
mv /etc/resolv.conf /etc/resolv.conf.backup
ln -s /run/systemd/resolve/resolv.conf /etc/resolv.conf
3. Zatrzymano DNSStubListener:
systemctl reload-or-restart systemd-resolved
Utworzono potrzebne woluminy:
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:
- "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:
- "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:
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:

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

Konieczne jest również ustawienie identycznej nazwy hosta zarówno w konfiguracji agenta, jak również podczas dodawania hosta do monitoringu w panelu Zabbix:

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
*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
*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
#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
# 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

