Czy DeepSeek to już ewolucja na rynku AI?

Wśród rozwiązań sztucznej inteligencji, które niedawno testowałem, pojawił się chiński DeepSeek. Można powiedzieć, że niemal natychmiast zyskał status nowatorskiej alternatywy z uwagi na niższe koszty utrzymania modeli językowych oraz model open-source. Jak okaże się w poniższym teście, w którym użyłem tych samych pytań co w ostatnim porównaniu, odpowiedzi DeepSeek prezentują nieco wyższy poziom niż konkurencyjne […]

Lut 7, 2025 - 17:01
 0
Czy DeepSeek to już ewolucja na rynku AI?

Wśród rozwiązań sztucznej inteligencji, które niedawno testowałem, pojawił się chiński DeepSeek. Można powiedzieć, że niemal natychmiast zyskał status nowatorskiej alternatywy z uwagi na niższe koszty utrzymania modeli językowych oraz model open-source. Jak okaże się w poniższym teście, w którym użyłem tych samych pytań co w ostatnim porównaniu, odpowiedzi DeepSeek prezentują nieco wyższy poziom niż konkurencyjne modele.

Pojawiły się jednak przypuszczenia o możliwej cenzurze odpowiedzi, które okazały się słuszne. Poniżej można sprawdzić odpowiedź chińskiego AI na moje pytanie dotyczące wad ich systemu prawnego. Zdecydowanie nie jest to konstruktywna krytyka.

Przykład autocenzury zastosowanej w DeepSeek.

Z drugiej strony inne modele także stosują cenzurę, szczególnie w przypadku pytań o niektóre rasy. Należy jednak przyznać, że DeepSeek nie wykazuje postaw, które cenią pewne grupy ludzi bardziej od innych i wyjątkowo logicznie odpowiada na znane pytania stosowane w celu sprawdzenia tego aspektu. To wyjątkowa zaleta tego modelu. Niemniej cenzura zaimplementowana w modelach AI nie ma znacznego wpływu na kwestie techniczne, które powinny być oceniane niezależnie.

Tym bardziej że według doniesień ewentualna cenzura w DeepSeek obowiązuje wyłącznie w aplikacji mobilnej i wersji przeglądarkowej. To samo pytanie zadane poprzez udostępnione API może zwrócić „niefiltrowane” odpowiedzi. Korzystanie z API jest jednak odpłatne.

Warto zwrócić uwagę, że interfejs graficzny użyty w DeepSeek jest wyjątkowo zbliżony do układu zastosowanego przez ChatGPT. Natomiast zdecydowana większość pozostałych modeli w praktyce prezentuje się niemal identycznie. Można chyba nawet zaryzykować stwierdzenie, że ten układ graficzny stał się już standardem w środowisku sztucznej inteligencji.

Sprawdziłem DeepSeek z wykorzystaniem tych samych pytań, które pojawiły się w ostatnim teście. Wyniki dowodzą, że nowy model stosunkowo dobrze radzi sobie z kwestiami technicznymi, a przynajmniej we wskazanych obszarach IT. Jako że DeepSeek to jedyne testowane rozwiązanie, to ograniczyłem się do wskazania, czy odpowiedź całościowo można uznać za poprawną, a jeśli nie — dodałem krótkie wyjaśnienie. Po znacznie dokładniejsze oceny odsyłam do pierwotnego tekstu.

Kategoria: Bezpieczeństwo IT

Pytanie 1

Poprzez zewnętrzną usługę hostingu udostępniłem aplikację internetową przeznaczoną dla pracowników naszej firmy. Aplikacja wymaga oczywiście zalogowania, a aktualnie założone jest wyłącznie konto serwisowe z uprawnieniami administratora aplikacji. Chciałbym, aby pracownicy logowali się z użyciem poświadczeń Active Directory, czyli tak, jak obecnie logują się na firmowych urządzeniach. Z wiadomych powodów nie możemy wystawić usługi LDAP na zewnątrz, a hosting odmówił zestawienia połączenia VPN do naszej sieci. Posiadamy jednak możliwość wystawienia innej usługi, która pozwoli na logowanie kontami Active Directory. Czy możesz podać przykład takiego rozwiązania? Pracownicy niekoniecznie będą korzystać z tej aplikacji, znajdując się w firmie. Dodatkowo chciałbym uniknąć kosztów, więc zależy mi na bezpłatnych narzędziach (nie dotyczy to ewentualnych licencji na systemy operacyjne). Preferuj rozwiązania self-hosted, które nie są zależne od żadnych zewnętrznych usług. Większe doświadczenie mam też z rozwiązaniami Microsoft.

Odpowiedź

Aby umożliwić pracownikom logowanie do aplikacji internetowej za pomocą poświadczeń Active Directory (AD) bez konieczności wystawiania usługi LDAP na zewnątrz lub zestawiania połączenia VPN, możesz skorzystać z rozwiązania opartego na Active Directory Federation Services (AD FS). AD FS to usługa federacyjna firmy Microsoft, która umożliwia uwierzytelnianie użytkowników AD za pomocą protokołów takich jak SAML, OAuth lub OpenID Connect. Dzięki temu pracownicy mogą logować się do aplikacji z dowolnego miejsca, korzystając z tych samych poświadczeń, których używają do logowania do firmowych urządzeń.

Kroki do wdrożenia rozwiązania:

1. Wystawienie AD FS w sieci firmowej:
– Zainstaluj i skonfiguruj serwer AD FS w swojej sieci firmowej. AD FS działa na systemie Windows Server, więc potrzebujesz maszyny z odpowiednią licencją.
– Skonfiguruj AD FS jako Identity Provider (IdP), który będzie odpowiadał za uwierzytelnianie użytkowników AD.

2. Konfiguracja relacji zaufania (Trust Relationship):
– W AD FS skonfiguruj relację zaufania z aplikacją internetową. Aplikacja będzie działać jako Relying Party (RP), która ufa AD FS w zakresie uwierzytelniania użytkowników.
– Możesz skonfigurować aplikację do obsługi protokołu SAML, OAuth lub OpenID Connect, w zależności od jej możliwości.

3. Wystawienie AD FS na zewnątrz:
– Aby umożliwić dostęp z zewnątrz, możesz wystawić AD FS przez reverse proxy (np. Web Application Proxy w Windows Server) lub przez Azure AD Application Proxy, jeśli masz subskrypcję Azure AD.
– Reverse proxy pozwala na bezpieczne wystawienie AD FS na zewnątrz bez konieczności bezpośredniego udostępniania serwera AD FS w Internecie.

4. Integracja aplikacji z AD FS:
– W aplikacji skonfiguruj integrację z AD FS, używając odpowiedniego protokołu (SAML, OAuth lub OpenID Connect).
– W przypadku aplikacji opartych na .NET możesz skorzystać z biblioteki OWIN lub ASP.NET Core Identity do integracji z AD FS.

5. Testowanie i wdrożenie:
– Przetestuj logowanie do aplikacji za pomocą poświadczeń AD, zarówno z sieci firmowej, jak i z zewnątrz.
– Upewnij się, że wszystkie konfiguracje są bezpieczne, a dostęp do AD FS jest odpowiednio zabezpieczony (np. przez wymuszenie połączeń HTTPS).

Alternatywne rozwiązanie: Kerberos z przekazywaniem biletów (Kerberos Constrained Delegation)
Jeśli aplikacja obsługuje uwierzytelnianie Kerberos, możesz rozważyć skonfigurowanie Kerberos Constrained Delegation. To rozwiązanie pozwala na przekazywanie poświadczeń użytkowników z AD do aplikacji bez konieczności wystawiania AD FS na zewnątrz. Wymaga to jednak, aby aplikacja była hostowana w środowisku, które ma dostęp do kontrolera domeny.

Podsumowanie:
– AD FS to rozwiązanie zgodne z ekosystemem Microsoft, które umożliwia logowanie za pomocą poświadczeń AD z dowolnego miejsca.
– Reverse proxy (np. Web Application Proxy) pozwala na bezpieczne wystawienie AD FS na zewnątrz.
– Rozwiązanie jest self-hosted i nie wymaga dodatkowych kosztów poza licencjami na systemy operacyjne.

Jeśli masz doświadczenie z rozwiązaniami Microsoft, AD FS będzie naturalnym wyborem, który spełni Twoje wymagania.

Odpowiedź poprawna? TAK

Pytanie 2

Użytkownik otrzymał poświadczenia, których może używać do połączenia SSH. Za pomocą polecenia ssh-copy-id przesłał na serwer swój klucz publiczny. Potwierdził, że w pliku .ssh/authorized_keys znajduje się odpowiedni klucz. Mimo to serwer SSH wydaje się ignorować ten plik — cały czas widoczny jest monit o podanie hasła. Administrator twierdzi, że SSH działa na ustawieniach domyślnych, a sam może połączyć się z użyciem klucza. Użytkownik zwrócił uwagę, że jego katalog domowy jest poza /home, niemniej posiada w nim odpowiednie uprawnienia, tak samo dla katalogu .ssh i pliku authorized_keys.

Odpowiedź

Problem z ignorowaniem pliku authorized_keys przez serwer SSH może wynikać z kilku przyczyn, mimo że uprawnienia do plików i katalogów wydają się być prawidłowe. Oto kroki, które warto przejrzeć, aby zdiagnozować i rozwiązać problem:

1. Sprawdź uprawnienia do katalogów i plików
Upewnij się, że uprawnienia są ustawione prawidłowo:
– Katalog domowy użytkownika: 755 (drwxr-xr-x)
– Katalog .ssh: 700 (drwx——)
– Plik authorized_keys: 600 (-rw——-)

Możesz to sprawdzić za pomocą polecenia:

ls -ld /ścieżka/do/katalogu/domowego
ls -ld /ścieżka/do/katalogu/domowego/.ssh
ls -l /ścieżka/do/katalogu/domowego/.ssh/authorized_keys

Jeśli uprawnienia są nieprawidłowe, możesz je poprawić za pomocą:

chmod 755 /ścieżka/do/katalogu/domowego
chmod 700 /ścieżka/do/katalogu/domowego/.ssh
chmod 600 /ścieżka/do/katalogu/domowego/.ssh/authorized_keys

2. Sprawdź właściciela katalogów i plików
Upewnij się, że właścicielem katalogu domowego, katalogu .ssh oraz pliku authorized_keys jest właściwy użytkownik. Możesz to sprawdzić za pomocą:

ls -ld /ścieżka/do/katalogu/domowego
ls -ld /ścieżka/do/katalogu/domowego/.ssh
ls -l /ścieżka/do/katalogu/domowego/.ssh/authorized_keys

Jeśli właściciel jest nieprawidłowy, możesz go zmienić za pomocą:

chown użytkownik:grupa /ścieżka/do/katalogu/domowego
chown użytkownik:grupa /ścieżka/do/katalogu/domowego/.ssh
chown użytkownik:grupa /ścieżka/do/katalogu/domowego/.ssh/authorized_keys

3. Sprawdź konfigurację SSH serwera
Upewnij się, że serwer SSH jest skonfigurowany do akceptowania kluczy publicznych. Sprawdź plik konfiguracyjny SSH (zwykle /etc/ssh/sshd_config) pod kątem następujących opcji:

PubkeyAuthentication yes
AuthorizedKeysFile %h/.ssh/authorized_keys

Jeśli któreś z tych ustawień jest wyłączone lub zmienione, popraw je i zrestartuj serwer SSH:

sudo systemctl restart sshd

4. Sprawdź logi SSH
Logi SSH mogą zawierać informacje o tym, dlaczego klucz publiczny jest ignorowany. Sprawdź logi (zwykle znajdujące się w /var/log/auth.log lub /var/log/secure) za pomocą:

sudo tail -f /var/log/auth.log

Szukaj komunikatów związanych z próbą logowania użytkownika. Może to pomóc w zidentyfikowaniu problemu.

5. Sprawdź SELinux (jeśli jest włączony)
Jeśli na serwerze jest włączony SELinux, może on blokować dostęp do pliku authorized_keys. Możesz to sprawdzić za pomocą:

sestatus

Jeśli SELinux jest włączony, spróbuj tymczasowo go wyłączyć, aby sprawdzić, czy to rozwiązuje problem:

sudo setenforce 0

Jeśli to pomoże, możesz dostosować politykę SELinux, aby zezwolić na dostęp do pliku authorized_keys.

6. Sprawdź, czy katalog domowy jest zamontowany z odpowiednimi opcjami
Jeśli katalog domowy użytkownika znajduje się na oddzielnej partycji lub jest zamontowany z sieci (np. NFS), upewnij się, że jest zamontowany z odpowiednimi opcjami, które pozwalają na korzystanie z kluczy SSH. Na przykład, opcja noexec może uniemożliwiać wykonywanie skryptów z katalogu domowego.

7. Sprawdź, czy klucz publiczny jest poprawny
Upewnij się, że klucz publiczny w pliku authorized_keys jest poprawny i nie zawiera dodatkowych znaków lub białych spacji. Możesz porównać go z oryginalnym kluczem publicznym na swoim lokalnym komputerze.

8. Sprawdź, czy użytkownik ma dostęp do powłoki
Upewnij się, że użytkownik ma przypisaną prawidłową powłokę (np. /bin/). Możesz to sprawdzić w pliku /etc/passwd:

grep użytkownik /etc/passwd

Jeśli powłoka jest ustawiona na /bin/false lub /usr/sbin/nologin, użytkownik nie będzie mógł zalogować się przez SSH.

9. Sprawdź, czy nie ma problemów z siecią
Jeśli używasz zaawansowanych konfiguracji sieciowych (np. VPN, firewalle), upewnij się, że nie blokują one połączenia SSH.

Jeśli po przejściu przez te kroki problem nadal występuje, warto skonsultować się z administratorem serwera, aby uzyskać dodatkową pomoc.

Odpowiedź poprawna? TAK

Pytanie 3

W systemie Windows Server poleceniem net user dodany został użytkownik standardowy. Dlaczego nie może połączyć się poprzez RDP? Klient znajduje się w tej samej sieci, a inni użytkownicy nie zgłaszają podobnych problemów. Ruch do RDP został odblokowany na poziomie firewall’a dla adresu hosta, z którego następuje próba połączenia. Nie zmieniano konfiguracji Windows Firewall ani uprawnień użytkowników.

Odpowiedź

Jeśli nowo dodany użytkownik standardowy nie może połączyć się poprzez RDP (Remote Desktop Protocol) na serwerze Windows Server, mimo że inni użytkownicy nie zgłaszają problemów, może to wynikać z kilku przyczyn. Oto kroki, które warto sprawdzić:

1. Czy użytkownik ma uprawnienia do logowania przez RDP?
– Domyślnie, tylko użytkownicy należący do grupy Remote Desktop Users mają uprawnienia do logowania przez RDP.
– Sprawdź, czy nowo dodany użytkownik został dodany do tej grupy:

net localgroup „Remote Desktop Users”

– Jeśli użytkownik nie jest członkiem tej grupy, dodaj go:

net localgroup „Remote Desktop Users” /add


2. Czy użytkownik ma przypisane prawa logowania przez RDP?
– Sprawdź, czy użytkownik ma przypisane prawa logowania przez RDP w zasadach lokalnych:
1. Otwórz Local Security Policy (secpol.msc).
2. Przejdź do Local Policies -> User Rights Assignment.
3. Sprawdź zasady Allow log on through Remote Desktop Services.
4. Upewnij się, że grupa Remote Desktop Users lub konkretny użytkownik jest tam wymieniony.

3. Czy konto użytkownika jest aktywne i nie jest zablokowane?
– Sprawdź, czy konto użytkownika jest aktywne i nie jest zablokowane:

net user

– Upewnij się, że konto nie jest wyłączone (Account active powinno być ustawione na Yes).

4. Czy hasło użytkownika jest poprawne?
– Upewnij się, że użytkownik wprowadza poprawne hasło. Jeśli hasło zostało niedawno zmienione, upewnij się, że zostało poprawnie zaktualizowane.

5. Czy RDP jest włączony na serwerze?
– Sprawdź, czy RDP jest włączony na serwerze:
1. Otwórz System Properties (sysdm.cpl).
2. Przejdź do zakładki Remote.
3. Upewnij się, że opcja Allow remote connections to this computer jest zaznaczona.

6. Czy istnieją ograniczenia czasowe dla użytkownika?
– Sprawdź, czy użytkownik ma ograniczenia czasowe (np. godziny logowania), które mogą uniemożliwiać mu dostęp:

net user /times

7. Czy istnieją inne ograniczenia polityki grupy (GPO)?
– Sprawdź, czy nie ma zastosowanych zasad grupy (GPO), które mogą ograniczać dostęp do RDP dla tego użytkownika.

8. Czy istnieją problemy z profilem użytkownika?
– Jeśli użytkownik próbował się zalogować wcześniej i wystąpił błąd, może to spowodować problemy z profilem. Spróbuj usunąć profil użytkownika i pozwól systemowi na utworzenie nowego przy następnym logowaniu.

9. Czy istnieją problemy z licencjami RDP?
– Jeśli serwer jest skonfigurowany do używania licencji RDP, upewnij się, że dostępne są wystarczające licencje.

10. Czy istnieją problemy z siecią?
– Mimo że inni użytkownicy nie zgłaszają problemów, upewnij się, że nie ma problemów z siecią dla konkretnego hosta, z którego użytkownik próbuje się połączyć.

Jeśli po sprawdzeniu powyższych kroków problem nadal występuje, warto przejrzeć dzienniki zdarzeń (Event Viewer) na serwerze, aby znaleźć więcej informacji na temat przyczyny błędu. Szczególnie warto sprawdzić dzienniki Security i System.

Odpowiedź poprawna? TAK

Kategoria: Administracja IT

Pytanie 1

Z użyciem serwera NGINX skonfigurowałem reverse proxy dla usługi działającej na adresie 127.0.0.1:8080 (kontener Docker z aplikacją). Dzięki temu lokalny serwis jest dostępny z zewnątrz pod domeną app.avlab.pl. Inny administrator skonfigurował zasób SFTP dla klienta kierujący na katalog /home/www/NAZWA_KLIENTA/media. Przesłane pliki powinny być dostępne (wylistowane) pod adresem https://app.avlab.pl/media, ale zamiast tego widoczna jest strona logowania aplikacji lub następuje przekierowanie do strony https://app.avlab.pl/user. Programista nie chciałby dodawać obsługi listowania jako funkcjonalności. Jak rozwiązać ten problem?

Odpowiedź

Aby rozwiązać ten problem, możesz skonfigurować NGINX tak, aby obsługiwał listowanie plików w katalogu /home/www/NAZWA_KLIENTA/media bez konieczności modyfikowania aplikacji. Oto kroki, które możesz podjąć:

1. Dodaj nową lokalizację w konfiguracji NGINX:
– Otwórz plik konfiguracyjny NGINX (zwykle znajduje się w /etc/nginx/nginx.conf lub /etc/nginx/sites-available/default).
– Dodaj nową lokalizację (location) dla ścieżki /media, która będzie obsługiwała listowanie plików.

2. Skonfiguruj listowanie plików:
– Upewnij się, że moduł ngx_http_autoindex_module jest włączony (jest domyślnie włączony w większości instalacji NGINX).
– Skonfiguruj lokalizację /media tak, aby listowała pliki w katalogu /home/www/NAZWA_KLIENTA/media.

Przykładowa konfiguracja NGINX może wyglądać następująco:

server {
listen 80;
server_name app.avlab.pl;

# Konfiguracja dla głównej aplikacji
location / {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}

# Konfiguracja dla listowania plików w /media
location /media {
alias /home/www/NAZWA_KLIENTA/media;
autoindex on; # Włącza listowanie plików
}

# Przekierowanie na HTTPS (opcjonalne)
if ($scheme = http) {
return 301 https://$server_name$request_uri;
}
}

server {
listen 443 ssl;
server_name app.avlab.pl;

# Konfiguracja SSL (opcjonalne, ale zalecane)
ssl_certificate /etc/nginx/ssl/app.avlab.pl.crt;
ssl_certificate_key /etc/nginx/ssl/app.avlab.pl.key;

# Konfiguracja dla głównej aplikacji
location / {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}

# Konfiguracja dla listowania plików w /media
location /media {
alias /home/www/NAZWA_KLIENTA/media;
autoindex on; # Włącza listowanie plików
}
}

3. Przetestuj konfigurację:
– Przed ponownym uruchomieniem NGINX, przetestuj konfigurację za pomocą polecenia:

sudo nginx -t

– Jeśli test zakończy się sukcesem, przeładuj konfigurację NGINX:

sudo systemctl reload nginx

4. Sprawdź dostępność plików:
– Przejdź do przeglądarki i otwórz adres https://app.avlab.pl/media. Powinieneś zobaczyć listę plików znajdujących się w katalogu /home/www/NAZWA_KLIENTA/media.

Dzięki tej konfiguracji pliki przesłane przez SFTP będą dostępne pod adresem https://app.avlab.pl/media, a aplikacja będzie działać normalnie pod głównym adresem https://app.avlab.pl.

Odpowiedź poprawna? TAK

Pytanie 2

Zainstalowałem Phusion Passenger i polecenie sudo passenger-config validate-install nie zwraca żadnych błędów. Przedstaw przykładową konfigurację, która umożliwi obsługę aplikacji Node.js przez serwer NGINX. Aplikacja znajduje się w katalogu /home/www/avlab/public_html/app, ale katalog root to public. Dodatkowo Node.js został pobrany za pomocą NVM do katalogu domowego użytkownika aplikacyjnego (~/.nvm/versions/node/v22.13.0).

Odpowiedź

Aby skonfigurować Phusion Passenger z NGINX do obsługi aplikacji Node.js, musisz zmodyfikować plik konfiguracyjny NGINX. Poniżej znajduje się przykładowa konfiguracja, która powinna działać w Twoim przypadku.

1. Konfiguracja NGINX

Otwórz plik konfiguracyjny NGINX, zazwyczaj znajdujący się w /etc/nginx/nginx.conf lub /etc/nginx/sites-available/default, i dodaj następujący blok konfiguracyjny:

server {
listen 80;
server_name twoja_domena.com; # Zmień na swoją domenę lub adres IP

# Katalog główny aplikacji
root /home/www/avlab/public_html/public;

# Konfiguracja Passenger dla aplikacji Node.js
passenger_enabled on;
passenger_app_env production; # Ustaw na 'development’ jeśli to środowisko deweloperskie
passenger_nodejs /home/uzytkownik/.nvm/versions/node/v22.13.0/bin/node; # Ścieżka do Node.js
passenger_app_type node;
passenger_startup_file app.js; # Nazwa pliku startowego Twojej aplikacji Node.js

# Jeśli Twoja aplikacja używa portu innego niż domyślny (3000), możesz go tutaj określić
# passenger_app_port 3000;

# Logi błędów
error_log /var/log/nginx/avlab_error.log;
access_log /var/log/nginx/avlab_access.log;

# Bezpieczeństwo – ograniczenie dostępu do katalogów
location ~* ^/\. {
deny all;
}

# Obsługa statycznych plików
location / {
try_files $uri $uri/ @app;
}

location @app {
proxy_pass http://127.0.0.1:3000; # Jeśli aplikacja nasłuchuje na porcie 3000
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}

2. Ustawienia środowiska Node.js

Upewnij się, że Twoja aplikacja Node.js jest skonfigurowana do uruchamiania się w odpowiednim środowisku (np. production lub development). Możesz to zrobić, ustawiając zmienną środowiskową NODE_ENV:

export NODE_ENV=production

3. Uruchomienie i testowanie

Po wprowadzeniu zmian w konfiguracji NGINX, zrestartuj serwer NGINX, aby zastosować zmiany:

sudo systemctl restart nginx

Następnie sprawdź, czy aplikacja działa poprawnie, odwiedzając adres URL Twojej domeny lub adres IP.

4. Dodatkowe uwagi

– Upewnij się, że użytkownik, pod którym działa NGINX, ma odpowiednie uprawnienia do katalogu /home/www/avlab/public_html/app.
– Jeśli używasz NVM, upewnij się, że ścieżka do Node.js jest poprawna i że wersja Node.js jest zgodna z wymaganiami Twojej aplikacji.
– Jeśli aplikacja wymaga dodatkowych zmiennych środowiskowych, możesz je dodać do pliku .env w katalogu aplikacji lub bezpośrednio w konfiguracji NGINX za pomocą dyrektywy passenger_env_var.

Jeśli napotkasz jakiekolwiek problemy, sprawdź logi błędów NGINX (/var/log/nginx/error.log) oraz logi Passenger, aby uzyskać więcej informacji na temat ewentualnych błędów.

Odpowiedź poprawna? NIE (zbędna konfiguracja)

Pytanie 3

Na serwerze zainstalowałem Redis i NGINX. Maszyna jest już dodana do Zabbix i monitorowana z użyciem template Linux by Zabbix agent. Zamierzam monitorować też te dwie usługi poprzez Nginx by Zabbix agent i Redis by Zabbix agent 2. Widzę, że wymagają one podania kilku „macros”, odpowiednio {$NGINX.STUB_STATUS.HOST}, {$NGINX.STUB_STATUS.PATH} i {$REDIS.CONN.URI}. Jakie konkretnie czynności są wymagane, aby monitoring działał prawidłowo? Redis używa hasła.

Odpowiedź

Aby prawidłowo skonfigurować monitoring usług Redis i NGINX w Zabbixie, musisz wykonać kilka kroków związanych z konfiguracją makr oraz samych usług. Poniżej znajduje się szczegółowy opis wymaganych czynności:

1. Konfiguracja NGINX

a. Włączenie statusu NGINX
Aby Zabbix mógł monitorować NGINX, musisz włączyć moduł stub_status, który dostarcza podstawowe informacje o stanie serwera.

1. Edytuj konfigurację NGINX:
Otwórz plik konfiguracyjny NGINX (zwykle znajduje się w /etc/nginx/nginx.conf lub /etc/nginx/conf.d/default.conf).

2. Dodaj blok location:
Dodaj następujący blok do konfiguracji NGINX, aby udostępnić status:

server {
listen 80;
server_name localhost;

location /nginx_status {
stub_status on;
allow 127.0.0.1; # Zezwól tylko na dostęp z localhost
deny all; # Zablokuj dostęp dla wszystkich innych
}
}

3. Przeładuj NGINX:
Po wprowadzeniu zmian przeładuj konfigurację NGINX:

sudo systemctl reload nginx

b. Konfiguracja makr w Zabbixie
W Zabbixie musisz ustawić makra, które będą używane przez template Nginx by Zabbix agent.

1. Przejdź do hosta w Zabbixie:
Otwórz hosta, który monitorujesz, i przejdź do zakładki „Macros”.

2. Dodaj makra:
Dodaj następujące makra:

– {$NGINX.STUB_STATUS.HOST}: Ustaw na 127.0.0.1 (lub adres IP, na którym NGINX nasłuchuje).
– {$NGINX.STUB_STATUS.PATH}: Ustaw na /nginx_status.

2. Konfiguracja Redis

a. Konfiguracja Redis
Aby Zabbix mógł monitorować Redis, musisz upewnić się, że Redis jest skonfigurowany do akceptowania połączeń z Zabbixa.

1. Edytuj plik konfiguracyjny Redis:
Otwórz plik konfiguracyjny Redis (zwykle znajduje się w /etc/redis/redis.conf).

2. Ustaw hasło:
Upewnij się, że Redis wymaga hasła, ustawiając requirepass w pliku konfiguracyjnym:

requirepass twoje_haslo

3. Zezwól na połączenia z Zabbixa:
Jeśli Zabbix znajduje się na innym serwerze, upewnij się, że Redis akceptuje połączenia z tego serwera, modyfikując bind w pliku konfiguracyjnym:

bind 0.0.0.0

4. Restart Redis:
Po wprowadzeniu zmian zrestartuj Redis:

sudo systemctl restart redis

b. Konfiguracja makr w Zabbixie
W Zabbixie musisz ustawić makra, które będą używane przez template Redis by Zabbix agent 2.

1. Przejdź do hosta w Zabbixie:
Otwórz hosta, który monitorujesz, i przejdź do zakładki „Macros”.

2. Dodaj makra:
Dodaj następujące makra:

– {$REDIS.CONN.URI}: Ustaw na tcp://127.0.0.1:6379 (lub adres IP i port, na którym Redis nasłuchuje).
– {$REDIS.PASSWORD}: Ustaw na hasło, które skonfigurowałeś w Redisie.

3. Przypisanie template’ów do hosta

1. Przejdź do hosta w Zabbixie:
Otwórz hosta, który monitorujesz.

2. Przypisz template:
W zakładce „Templates” przypisz template Nginx by Zabbix agent oraz Redis by Zabbix agent 2.

3. Zapisz zmiany.

4. Weryfikacja

1. Sprawdź status usług:
Upewnij się, że zarówno NGINX, jak i Redis działają poprawnie:

sudo systemctl status nginx
sudo systemctl status redis

2. Sprawdź logi Zabbixa:
Sprawdź logi Zabbix Agent (zwykle znajdują się w /var/log/zabbix/zabbix_agentd.log), aby upewnić się, że nie ma błędów związanych z połączeniem do NGINX i Redis.

3. Sprawdź dane w Zabbixie:
Przejdź do sekcji „Latest data” dla hosta i upewnij się, że dane z NGINX i Redis są zbierane poprawnie.

Po wykonaniu tych kroków, zarówno NGINX, jak i Redis powinny być prawidłowo monitorowane przez Zabbix.

Odpowiedź poprawna? NIE (niepoprawna konfiguracja monitoringu Redis)

Kategoria: DevOps

Pytanie 1

Korzystam z GitLab CI/CD do wdrożenia aplikacji ASP.NET w systemie Windows Server 2022. Pipeline’y wykonują się prawidłowo, tzn. aplikacja buduje się na runner’ach (obraz mcr.microsoft.com/dotnet/sdk:8.0), a archiwum zawierające folder wynikowy jest z użyciem mechanizmu artefaktów pobierane na serwer aplikacji i wypakowywane do folderu C:\inetpub\wwwroot\aplikacja\X, gdzie X to wartość zmiennej CI_JOB_ID. Niestety po każdym wdrożeniu muszę ręcznie zmienić physical path w IIS Manager i zrestartować stronę, aby zmiany były widoczne. Czy nie można tego zautomatyzować, ale bez użycia PowerShell?

Odpowiedź

Aby zautomatyzować proces zmiany ścieżki fizycznej w IIS Manager bez użycia PowerShell, możesz skorzystać z narzędzia appcmd.exe, które jest dostarczane z IIS. appcmd.exe pozwala na zarządzanie konfiguracją IIS z poziomu wiersza poleceń.

Oto kroki, które możesz wykonać, aby zautomatyzować ten proces:

1. Dodaj krok w pipeline’ie GitLab CI/CD:
Dodaj krok w swoim pipeline’ie, który będzie wykonywał polecenie appcmd.exe na serwerze aplikacji, aby zaktualizować ścieżkę fizyczną dla odpowiedniej witryny w IIS.

2. Użyj appcmd.exe do zmiany ścieżki fizycznej:
Możesz użyć poniższego polecenia, aby zmienić ścieżkę fizyczną dla witryny w IIS:

appcmd.exe set vdir /vdir.name:”/” /physicalPath:”C:\inetpub\wwwroot\aplikacja\

Gdzie:
to nazwa Twojej witryny w IIS.
to nazwa katalogu wirtualnego (jeśli istnieje).
to wartość zmiennej środowiskowej CI_JOB_ID.

3. Przykład konfiguracji w GitLab CI/CD:
Oto przykład, jak możesz dodać ten krok do swojego pliku .gitlab-ci.yml:

deploy:
stage: deploy
script:
– echo „Pobieranie artefaktów…”
– scp user@server:/path/to/artifact.zip .
– unzip artifact.zip -d C:\inetpub\wwwroot\aplikacja\$CI_JOB_ID
– echo „Aktualizowanie ścieżki fizycznej w IIS…”
– ssh user@server „appcmd.exe set vdir /vdir.name:\”Default Web Site/aplikacja\” /physicalPath:\”C:\inetpub\wwwroot\aplikacja\$CI_JOB_ID\””
– echo „Restartowanie witryny w IIS…”
– ssh user@server „appcmd.exe stop site \”Default Web Site\””
– ssh user@server „appcmd.exe start site \”Default Web Site\””

W tym przykładzie:
– scp służy do pobrania artefaktu z serwera.
– unzip wypakowuje artefakt do odpowiedniego folderu.
– ssh łączy się z serwerem i wykonuje polecenia appcmd.exe w celu zaktualizowania ścieżki fizycznej i restartu witryny.

4. Upewnij się, że masz dostęp do serwera:
Upewnij się, że runner GitLab ma dostęp do serwera aplikacji poprzez SSH oraz że użytkownik, pod którym łączysz się z serwerem, ma uprawnienia do wykonywania poleceń appcmd.exe.

5. Testowanie:
Przetestuj cały proces, aby upewnić się, że wszystko działa zgodnie z oczekiwaniami.

Dzięki temu podejściu unikniesz konieczności ręcznej zmiany ścieżki fizycznej w IIS Manager po każdym wdrożeniu.

Odpowiedź poprawna? NIE (próba użycia SCP do pobrania artefaktu z GitLab, który jest pobierany automatycznie oraz całkowicie błędne CI/CD)

Pytanie 2

W jednym ze stage’y GitLab CI/CD budowany jest obraz Docker z aplikacją. Problemem stanowi czas potrzebny na zbudowanie tego obrazu. Nie jest to raczej związane z brakiem zasobów, ponieważ nawet na mocno obciążonych środowiskach lokalnych cały proces trwa wyjątkowo szybko — programiści zwrócili uwagę, że niektóre warstwy są „CACHED”. Jak mogę zoptymalizować budowanie obrazu w CI/CD?
Obecnie używam polecenia docker build -t $APP_IMAGE .

Odpowiedź

Aby zoptymalizować budowanie obrazu Docker w GitLab CI/CD, możesz skorzystać z kilku technik, które pozwolą na lepsze wykorzystanie cache’owania warstw oraz przyspieszenie całego procesu. Oto kilka kroków, które możesz podjąć:

1. Wykorzystanie cache’owania warstw Docker
Docker cache’uje warstwy obrazu, co oznacza, że jeśli warstwa nie uległa zmianie, Docker użyje jej z cache’a zamiast budować ją od nowa. Aby to działało efektywnie, warto:

– Uporządkować instrukcje w Dockerfile: Umieść instrukcje, które zmieniają się rzadko (np. instalacja zależności) na początku Dockerfile, a te, które zmieniają się często (np. kopiowanie kodu aplikacji) na końcu. Dzięki temu Docker będzie mógł wykorzystać cache dla warstw, które się nie zmieniają.

Przykład:
FROM python:3.9-slim

# Instalacja zależności
COPY requirements.txt .
RUN pip install -r requirements.txt

# Kopiowanie kodu aplikacji
COPY . .

# Uruchomienie aplikacji
CMD [„python”, „app.py”]

– Użyj –cache-from: Jeśli masz już zbudowany obraz w rejestrze, możesz go użyć jako cache. W tym celu możesz dodać –cache-from do polecenia docker build.

Przykład:
docker pull $APP_IMAGE:latest || true
docker build –cache-from $APP_IMAGE:latest -t $APP_IMAGE .

2. Wykorzystanie docker buildx i cache’owania w GitLab CI/CD
docker buildx to narzędzie, które pozwala na bardziej zaawansowane techniki budowania obrazów, w tym cache’owanie warstw w sposób bardziej efektywny.

– Użyj docker buildx z cache’owaniem: Możesz skonfigurować docker buildx do cache’owania warstw w sposób, który jest bardziej efektywny w środowisku CI/CD.

Przykład:
docker buildx create –use
docker buildx build –cache-from type=registry,ref=$APP_IMAGE:cache –cache-to type=registry,ref=$APP_IMAGE:cache -t $APP_IMAGE .

3. Wykorzystanie Multi-stage Builds
Jeśli Twój Dockerfile jest złożony, możesz rozważyć użycie multi-stage builds, które pozwalają na oddzielenie etapów budowania od etapów uruchamiania aplikacji. Dzięki temu możesz zminimalizować rozmiar finalnego obrazu i przyspieszyć jego budowanie.

Przykład:
# Stage 1: Build
FROM python:3.9-slim as builder
COPY requirements.txt .
RUN pip install –user -r requirements.txt

# Stage 2: Runtime
FROM python:3.9-slim
COPY –from=builder /root/.local /root/.local
COPY . .
CMD [„python”, „app.py”]

4. Wykorzystanie cache’owania w GitLab CI/CD
GitLab CI/CD ma wbudowane wsparcie dla cache’owania, które możesz wykorzystać do przechowywania warstw Docker.

– Dodaj cache do .gitlab-ci.yml:
cache:
key: „$CI_COMMIT_REF_SLUG”
paths:
– .docker/cache

– Użyj cache w poleceniu docker build:
docker build –cache-from type=local,src=.docker/cache –cache-to type=local,dest=.docker/cache -t $APP_IMAGE .

5. Użyj docker layer caching w GitLab CI/CD
GitLab Premium oferuje wbudowane wsparcie dla docker layer caching (DLC), które może znacznie przyspieszyć budowanie obrazów.

– Włącz DLC w .gitlab-ci.yml:
variables:
DOCKER_DRIVER: overlay2
DOCKER_TLS_CERTDIR: „”
DOCKER_HOST: tcp://docker:2375/

services:
– docker:dind

build:
image: docker:stable
services:
– docker:dind
script:
– docker build –cache-from $APP_IMAGE:latest -t $APP_IMAGE .

6. Optymalizacja .dockerignore
Upewnij się, że plik .dockerignore jest dobrze skonfigurowany, aby uniknąć kopiowania niepotrzebnych plików do obrazu Docker, co może spowolnić proces budowania.

Przykład .dockerignore:

node_modules
.git
*.log

Podsumowanie
Poprzez odpowiednie zarządzanie cache’owaniem warstw, optymalizację Dockerfile, wykorzystanie docker buildx oraz odpowiednie skonfigurowanie GitLab CI/CD, możesz znacząco przyspieszyć proces budowania obrazów Docker. Warto eksperymentować z różnymi podejściami, aby znaleźć najlepsze rozwiązanie dla Twojego projektu.

Odpowiedź poprawna? TAK

Pytanie 3

Pobrałem archiwum ZIP z JDK 23.0.1 dla Windows i wypakowałem do folderu C:\jdk-23.0.1. Pomimo tego mam błąd widoczny na zrzucie ekranu. Wskaż źródło problemu.

Próba uruchomienia polecenia java w cmd.
Odpowiedź

Błąd, który widzisz, wskazuje, że system nie może rozpoznać polecenia java jako poprawnej komendy. Jest to zazwyczaj spowodowane brakiem odpowiedniej konfiguracji zmiennej środowiskowej PATH, która informuje system, gdzie znajdują się pliki wykonywalne, takie jak java.exe.

Aby rozwiązać ten problem, musisz dodać ścieżkę do folderu bin w katalogu JDK do zmiennej środowiskowej PATH. Oto jak to zrobić:

1. Otwórz Panel sterowania i przejdź do System i zabezpieczenia > System > Zaawansowane ustawienia systemu.
2. Kliknij przycisk Zmienne środowiskowe.
3. W sekcji Zmienne systemowe znajdź zmienną Path i kliknij Edytuj.
4. Kliknij Nowy i dodaj ścieżkę do folderu bin w katalogu JDK, np. C:\jdk-23.0.1\bin.
5. Kliknij OK, aby zamknąć wszystkie okna dialogowe.

Po wykonaniu tych kroków, otwórz nowe okno Command Prompt i spróbuj ponownie wpisać java. Jeśli wszystko zostało poprawnie skonfigurowane, polecenie powinno zostać rozpoznane.

Jeśli nadal występują problemy, upewnij się, że ścieżka została dodana poprawnie i że w folderze C:\jdk-23.0.1\bin znajduje się plik java.exe.

Odpowiedź poprawna? TAK

Większość odpowiedzi może zostać uznana za prawidłowe, a niektóre pod kątem merytorycznym są kilka poziomów wyżej niż te generowane przez alternatywny modele.

DeepSeek bardzo dobrze sprawdza się także w celu przeszukiwania zasobów internetowych. Przykłady poniżej.

Przypomniała mi się luka w pewnym narzędziu dla Ubuntu, która w łatwy sposób pozwalała na uzyskanie uprawnień root. Odkryta została w listopadzie 2024 roku. Czy możesz znaleźć nazwę tego narzędzia i ewentualny opis podatności?

Odpowiedź

Luka, o której mowa, dotyczy narzędzia needrestart w systemie Ubuntu. Została odkryta w listopadzie 2024 roku przez zespół Qualys Threat Research Unit (TRU) i obejmuje kilka podatności związanych z lokalną eskalacją uprawnień (LPE), które pozwalają atakującemu uzyskać uprawnienia roota. Poniżej znajduje się szczegółowy opis:

Narzędzie: needrestart
Needrestart to narzędzie używane w systemach Ubuntu i innych dystrybucjach opartych na Debianie, które sprawdza, czy system lub usługi wymagają ponownego uruchomienia po aktualizacji pakietów. Jest domyślnie zainstalowane w wersjach serwerowych Ubuntu od wersji 21.04.

Podatności:
1. CVE-2024-48990: Atakujący może wykorzystać zmienną środowiskową PYTHONPATH, aby zmusić needrestart do uruchomienia Pythona z kontrolowanym przez siebie środowiskiem, co pozwala na wykonanie dowolnego kodu z uprawnieniami roota.
2. CVE-2024-48991: Luka związana z warunkiem wyścigu (race condition), gdzie atakujący może podmienić prawdziwy interpreter Pythona na własny, fałszywy, co również umożliwia wykonanie kodu z uprawnieniami roota.
3. CVE-2024-48992: Podobnie jak w przypadku Pythona, atakujący może wykorzystać zmienną środowiskową RUBYLIB, aby zmusić needrestart do uruchomienia interpretera Ruby z kontrolowanym przez siebie środowiskiem.
4. CVE-2024-10224 i CVE-2024-11003: Te podatności pozwalają na wykonanie dowolnych poleceń systemowych poprzez manipulację danymi wejściowymi przekazywanymi do modułu Perl Module::ScanDeps, który jest używany przez needrestart.

Wpływ:
Podatności te umożliwiają lokalnemu atakującemu uzyskanie pełnych uprawnień roota, co może prowadzić do przejęcia kontroli nad systemem, instalacji złośliwego oprogramowania lub dostępu do poufnych danych.

Naprawa:
Canonical wydał łatki dla wszystkich wersji Ubuntu, które naprawiają te podatności. Zaleca się natychmiastową aktualizację pakietów needrestart i libmodule-scandeps-perl do najnowszych wersji. Alternatywnie, można tymczasowo wyłączyć skanowanie interpreterów w pliku konfiguracyjnym /etc/needrestart/needrestart.conf, dodając linię $nrconf{interpscan} = 0;.

Jeśli potrzebujesz więcej informacji, możesz odwołać się do źródeł, takich jak [Ubuntu Security Notice USN-7117-1](https://ubuntu.com/security/notices/USN-7117-1) lub [blog Qualys](https://blog.qualys.com/vulnerabilities-threat-research/2024/11/19/qualys-tru-uncovers-five-local-privilege-escalation-vulnerabilities-in-needrestart).

Poszukuję hotelu w Krynicy-Zdroju, który w swojej ofercie ma pakiet dla pary z okazji Walentynek. Interesują nas obiekty o najwyższym standardzie dysponujące oczywiście prywatnym parkingiem.

Odpowiedź

Oto lista hoteli w Krynicy-Zdroju, które oferują specjalne pakiety dla par z okazji Walentynek i spełniają wymagania dotyczące wysokiego standardu oraz prywatnego parkingu:

1. Hotel Belmonte Krynica Zdrój
– Oferta Walentynkowa: Kolacja degustacyjna w Restauracji Aura, relaks w Moon Spa & Wellness, oraz możliwość zakupu voucherów prezentowych na pobyt lub zabiegi SPA.
– Udogodnienia: Kompleks saun, basen z hydromasażem, 2 jacuzzi zewnętrzne, siłownia, oraz luksusowe pokoje i apartamenty.
– Parking: Prywatny parking dostępny na miejscu.

2. Hotel Czarny Potok Resort & Spa
– Oferta Walentynkowa: Romantyczne pakiety z masażami dla par, prywatne sesje w saunie, oraz wykwintne dania w restauracji Jan Kiepura.
– Udogodnienia: Kryty basen, centrum fitness, strefa SPA z zabiegami odnowy biologicznej.
– Parking: Bezpłatny prywatny parking.

3. Dr Irena Eris Hotel SPA Krynica Zdrój
– Oferta Walentynkowa: Pakiet obejmujący 2 noclegi, kolacje à la carte z afrodyzjakami, bukiet kwiatów, butelkę wina musującego, oraz dostęp do strefy SPA z basenem, jacuzzi i saunami.
– Udogodnienia: Basen, trzy jacuzzi, sauna fińska, łaźnia parowa, oraz strefa relaksu.
– Parking: Miejsce parkingowe wliczone w pakiet.

4. Hotel Prezydent Krynica Zdrój
– Oferta Walentynkowa: Romantyczne pakiety z kolacją przy świecach, muzyką na żywo, oraz zabiegami SPA dla par.
– Udogodnienia: Basen, jacuzzi, sauny, oraz dostęp do kompleksu sportowego Słotwiny Arena.
– Parking: Prywatny parking dostępny na miejscu.

5. Hotel Mercure Krynica Resort & Spa
– Oferta Walentynkowa: Luksusowe pokoje z dostępem do basenu, jacuzzi i saun, oraz możliwość zorganizowania romantycznej kolacji.
– Udogodnienia: Basen, siłownia, sauny, oraz eleganckie pokoje z balkonami.
– Parking: Podziemny garaż (opłata zgodna z cennikiem).

6. Hotel Orlik
– Oferta Walentynkowa: Romantyczny weekend z kolacją przy świecach, kąpielą w jacuzzi, oraz seansem w saunie.
– Udogodnienia: Pokój z balkonem, dostęp do strefy wellness, oraz śniadania w formie bufetu.
– Parking: Prywatny parking dostępny na miejscu.

Podsumowanie
Wszystkie wymienione hotele oferują wysokiej jakości usługi, specjalne pakiety na Walentynki oraz prywatny parking. Jeśli zależy Państwu na wyjątkowym relaksie, warto rozważyć Hotel Belmonte lub Dr Irena Eris Hotel SPA, które wyróżniają się luksusowymi strefami wellness i romantycznymi dodatkami. Dla osób ceniących aktywny wypoczynek, Hotel Czarny Potok oferuje doskonałe połączenie relaksu i górskich atrakcji.

Więcej szczegółów można znaleźć na stronach internetowych poszczególnych hoteli lub platformach rezerwacyjnych.

DeepSeek nie posiada jeszcze funkcjonalności generowania grafik, natomiast potrafi przedstawić ciekawe koncepcje, które można wykorzystać we własnej pracy.

Wygeneruj grafikę wyróżniającą do artykułu o DeepSeek. Wymagane motywy to Chiny, klaster serwerów i sztuczna inteligencja.

Odpowiedź

Niestety, nie mogę bezpośrednio generować grafik, ale mogę Ci pomóc w stworzeniu koncepcji graficznej, którą możesz przekazać projektantowi lub zrealizować samodzielnie za pomocą narzędzi do projektowania, takich jak Canva, Adobe Photoshop czy Illustrator.

Koncepcja grafiki wyróżniającej:

1. Tło:
– Użyj stylizowanej mapy Chin w odcieniach niebieskiego i fioletowego, aby nawiązać do lokalizacji i nowoczesności.
– Dodaj subtelne elementy obwodów elektronicznych lub siatki danych w tle, aby podkreślić technologiczny charakter.

2. Główny motyw:
– Umieść w centrum wizualizację klastra serwerów (np. stylizowane szafy rackowe z migającymi diodami LED).
– Nad serwerami lub wokół nich dodaj holograficzną reprezentację sztucznej inteligencji, np. wirujący model 3D sieci neuronowej lub ikonę mózgu złożoną z cyfrowych linii.

3. Kolorystyka:
– Dominujące kolory: niebieski, fioletowy, srebrny i czerń – nawiązujące do nowoczesności i technologii.
– Dodaj akcenty w kolorze złota lub czerwieni, aby podkreślić chińskie korzenie (kolory flagi Chin).

4. Tekst:
– Na pierwszym planie umieść tytuł artykułu, np. „DeepSeek: Przełom w sztucznej inteligencji z Chin”.
– Użyj nowoczesnej, bezszeryfowej czcionki z efektem neonowym lub podświetleniem, aby pasowała do technologicznego motywu.

5. Dodatkowe elementy:
– W tle lub na bokach dodaj stylizowane chińskie znaki (np. „深度搜索” – DeepSeek po chińsku) w formie hologramu.
– Możesz też dodać subtelne ikony związane z AI, takie jak roboty, chipy lub strzałki danych.

Jeśli potrzebujesz bardziej szczegółowych wskazówek lub pomocy w realizacji, daj znać!                         </div>
                                            <div class= Czytaj Więcej