diff --git a/lesson30/docker-compose.yml b/lesson30/docker-compose.yml
new file mode 100644
index 0000000..fcae40d
--- /dev/null
+++ b/lesson30/docker-compose.yml
@@ -0,0 +1,99 @@
+services:
+ ui:
+ image: ghcr.io/codeby-devops/ui:logging
+ container_name: ui
+ ports:
+ - "9292:9292/tcp"
+ environment:
+ - POST_SERVICE_HOST=post
+ - POST_SERVICE_PORT=5000
+ - COMMENT_SERVICE_HOST=comment
+ - COMMENT_SERVICE_PORT=9292
+ logging:
+ driver: "fluentd"
+ options:
+ fluentd-address: "127.0.0.1:24224"
+ tag: "service.ui"
+ depends_on:
+ - comment
+ - post
+ - fluentd
+ networks:
+ - logging
+
+ post:
+ image: ghcr.io/codeby-devops/post:logging
+ container_name: post
+ environment:
+ - POST_DATABASE_HOST=post_db
+ - POST_DATABASE=posts
+ logging:
+ driver: "fluentd"
+ options:
+ fluentd-address: "127.0.0.1:24224"
+ tag: "service.post"
+ depends_on:
+ - post_db
+ - fluentd
+ ports:
+ - 5000:5000
+ networks:
+ - logging
+
+ comment:
+ image: ghcr.io/codeby-devops/comment:logging
+ container_name: comment
+ environment:
+ - COMMENT_DATABASE_HOST=post_db
+ - COMMENT_DATABASE=comments
+ depends_on:
+ - post_db
+ networks:
+ - logging
+
+ post_db:
+ image: mongo:4.4
+ container_name: post_db
+ volumes:
+ - ./data/post_db:/data/db
+ networks:
+ - logging
+
+ elasticsearch:
+ container_name: elasticsearch
+ image: elasticsearch:6.8.20
+ environment:
+ - discovery.type=single-node
+ - ES_JAVA_OPTS=-Xms512m -Xmx512m
+ ports:
+ - "9200:9200"
+ networks:
+ - logging
+
+ kibana:
+ container_name: kibana
+ image: kibana:6.8.20
+ ports:
+ - "5601:5601"
+ depends_on:
+ - elasticsearch
+ networks:
+ - logging
+
+ fluentd:
+ container_name: fluentd
+ build:
+ context: ./fluentd-image
+ ports:
+ - "24224:24224"
+ - "24224:24224/udp"
+ volumes:
+ - ./fluentd/fluent.conf:/fluentd/etc/fluent.conf
+ depends_on:
+ - elasticsearch
+ networks:
+ - logging
+
+networks:
+ logging:
+ driver: bridge
diff --git a/lesson30/fluentd-image/Dockerfile b/lesson30/fluentd-image/Dockerfile
new file mode 100644
index 0000000..26d8598
--- /dev/null
+++ b/lesson30/fluentd-image/Dockerfile
@@ -0,0 +1,9 @@
+FROM fluent/fluentd:v1.19-debian-1
+
+USER root
+RUN fluent-gem install fluent-plugin-elasticsearch -v 6.0.0 \
+ && gem uninstall elasticsearch -aIx || true \
+ && gem install elasticsearch -v 6.8.0 \
+ && fluent-gem install fluent-plugin-grok-parser
+
+USER fluent
diff --git a/lesson30/fluentd/fluent.conf b/lesson30/fluentd/fluent.conf
new file mode 100644
index 0000000..c0a003d
--- /dev/null
+++ b/lesson30/fluentd/fluent.conf
@@ -0,0 +1,53 @@
+
+ @type forward
+ port 24224
+ bind 0.0.0.0
+
+
+
+ @type parser
+ format json
+ key_name log
+
+
+
+ @type parser
+ key_name log
+
+ @type regexp
+ expression /^I,\s+\[(?
+
+
+
+ @type parser
+ key_name log
+ reserve_data true
+ emit_invalid_record_to_error false
+
+ @type grok
+ grok_name_key parsed_by
+ grok_failure_key grok_failure
+ grok_pattern I,\s+\[%{TIMESTAMP_ISO8601:time}\s+#%{INT:pid}\]\s+%{LOGLEVEL:level}\s+--\s+:\s+service=%{WORD:service}\s+\|\s+event=%{WORD:event}\s+\|\s+request_id=%{UUID:request_id}\s+\|\s+message='%{DATA:message}'\s+\|\s+params:\s+%{GREEDYDATA:params}
+
+
+
+
+ @type copy
+
+ @type elasticsearch
+ host elasticsearch
+ port 9200
+ logstash_format true
+ suppress_type_name true
+ logstash_prefix fluentd
+ logstash_dateformat %Y%m%d
+ include_tag_key true
+ type_name access_log
+ tag_key @log_name
+ flush_interval 1s
+
+
+ @type stdout
+
+
diff --git a/lesson30/screenshots/Screenshot 2026-01-21 220246.png b/lesson30/screenshots/Screenshot 2026-01-21 220246.png
new file mode 100644
index 0000000..e9c148e
Binary files /dev/null and b/lesson30/screenshots/Screenshot 2026-01-21 220246.png differ
diff --git a/lesson30/screenshots/Screenshot 2026-01-21 220317.png b/lesson30/screenshots/Screenshot 2026-01-21 220317.png
new file mode 100644
index 0000000..2d705e1
Binary files /dev/null and b/lesson30/screenshots/Screenshot 2026-01-21 220317.png differ
diff --git a/lesson30/screenshots/Screenshot 2026-01-21 220333.png b/lesson30/screenshots/Screenshot 2026-01-21 220333.png
new file mode 100644
index 0000000..5ce49fa
Binary files /dev/null and b/lesson30/screenshots/Screenshot 2026-01-21 220333.png differ
diff --git a/lesson30/screenshots/Screenshot 2026-01-21 220338.png b/lesson30/screenshots/Screenshot 2026-01-21 220338.png
new file mode 100644
index 0000000..34f66b8
Binary files /dev/null and b/lesson30/screenshots/Screenshot 2026-01-21 220338.png differ
diff --git a/lesson30/screenshots/Screenshot 2026-01-21 220715.png b/lesson30/screenshots/Screenshot 2026-01-21 220715.png
new file mode 100644
index 0000000..ccdf498
Binary files /dev/null and b/lesson30/screenshots/Screenshot 2026-01-21 220715.png differ