
[{"content":"","date":"2025-08-28","externalUrl":null,"permalink":"/","section":"Blog Daniela","summary":"","title":"Blog Daniela","type":"page"},{"content":"","date":"2025-08-28","externalUrl":null,"permalink":"/posts/","section":"Posts","summary":"","title":"Posts","type":"posts"},{"content":"","date":"2025-08-16","externalUrl":null,"permalink":"/tags/aws/","section":"Tags","summary":"","title":"Aws","type":"tags"},{"content":" AWS - wysłanie obrazów do ECR # profile=\u0026#39;work\u0026#39; region=\u0026#39;eu-central-1\u0026#39; account=\u0026#39;000000000000\u0026#39; # lista wszystkich repozytoriów aws ecr describe-repositories --query \u0026#34;repositories[].repositoryName\u0026#34; --profile \u0026#34;${profile}\u0026#34; # zalogowanie się dockerem do repozytorium ECR aws ecr get-login-password --region \u0026#34;${region}\u0026#34; --profile \u0026#34;${profile}\u0026#34;| docker login --username AWS --password-stdin \u0026#34;${account}.dkr.ecr.${region}.amazonaws.com\u0026#34; # utworzenie repozytorium pod example/mysql aws ecr create-repository --repository-name \u0026#39;example/mysql\u0026#39; --profile \u0026#34;${profile}\u0026#34; # pobranie obrazu mysql docker image pull mysql:5.7.36 # otagowanie i wysłanie obrazu do repozytorium AWS docker tag c20987f18b13 \u0026#34;${account}.dkr.ecr.${region}.amazonaws.com/example/mysql:5.7.36\u0026#34; docker push \u0026#34;${account}.dkr.ecr.${region}.amazonaws.com/example/mysql:5.7.36\u0026#34; Źródła # https://docs.aws.amazon.com/AmazonECR/latest/userguide/registry_auth.html ","date":"2025-08-16","externalUrl":null,"permalink":"/wpis/aws-wys%C5%82anie-obrazow-do-ecr/","section":"Wpis","summary":"","title":"AWS - wysłanie obrazów do ECR","type":"wpis"},{"content":"","date":"2025-08-16","externalUrl":null,"permalink":"/tags/docker/","section":"Tags","summary":"","title":"Docker","type":"tags"},{"content":"","date":"2025-08-16","externalUrl":null,"permalink":"/tags/","section":"Tags","summary":"","title":"Tags","type":"tags"},{"content":"","date":"2025-08-16","externalUrl":null,"permalink":"/wpis/","section":"Wpis","summary":"","title":"Wpis","type":"wpis"},{"content":"","date":"2025-08-09","externalUrl":null,"permalink":"/tags/curl/","section":"Tags","summary":"","title":"Curl","type":"tags"},{"content":" TL;DR # curl http://example.com/index.html --resolve \u0026#34;example.com:80:127.0.0.1\u0026#34; curl https://example.com/index.html --resolve \u0026#34;example.com:443:127.0.0.1\u0026#34; Nadpisanie rozwiązywanie nazwy hosta example.com na portach 80 oraz 443, w trakcie używania curl.\nMAN # --resolve \u0026lt;[+]host:port:addr[,addr]...\u0026gt; Provide a custom address for a specific host and port pair. Us‐ ing this, you can make the curl requests(s) use a specified ad‐ dress and prevent the otherwise normally resolved address to be used. Consider it a sort of /etc/hosts alternative provided on the command line. The port number should be the number used for the specific protocol the host will be used for. It means you need several entries if you want to provide address for the same host but different ports. By specifying \u0026#39;*\u0026#39; as host you can tell curl to resolve any host and specific port pair to the specified address. Wildcard is re‐ solved last so any --resolve with a specific host and port will be used first. The provided address set by this option will be used even if -4, --ipv4 or -6, --ipv6 is set to make curl use another IP version. By prefixing the host with a \u0026#39;+\u0026#39; you can make the entry time out after curl\u0026#39;s default timeout (1 minute). Note that this will only make sense for long running parallel transfers with a lot of files. In such cases, if this option is used curl will try to resolve the host as it normally would once the timeout has ex‐ pired. Support for providing the IP address within [brackets] was added in 7.57.0. Support for providing multiple IP addresses per entry was added in 7.59.0. Support for resolving with wildcard was added in 7.64.0. Support for the \u0026#39;+\u0026#39; prefix was was added in 7.75.0. This option can be used many times to add many host names to re‐ solve. Example: curl --resolve example.com:443:127.0.0.1 https://example.com See also --connect-to and --alt-svc. Źródła # https://acquia.my.site.com/s/article/360005257154-Use-cURL-s-resolve-option-to-pin-a-request-to-an-IP-address man curl ","date":"2025-08-09","externalUrl":null,"permalink":"/wpis/curl-nadpisanie-adresu-host/","section":"Wpis","summary":"","title":"curl - nadpisanie adresu IP hosta","type":"wpis"},{"content":"","date":"2025-08-02","externalUrl":null,"permalink":"/tags/habitica/","section":"Tags","summary":"","title":"Habitica","type":"tags"},{"content":" TL;DR # Od niedawna API Habitica wymaga dodatkowego nagłówka HTTP przy wysyłaniu zapytania. Nagłówek ma zawierać id użytkownika i nazwę aplikacji.\n\u0026#39;x-client\u0026#39;: habiticaUserId + \u0026#39;-staingalive\u0026#39;, Email z Google App Scripts. Habitica odrzuca zapytanie # Używam Google App Scripts do automatyzacji niektórych zadań w Habitice. Ostatnio dostałem emaila.\nDziałanie Twojego skryptu, Habitica-Stayin-Alive-Script, nie zostało ostatnio zakończone pomyślnie. Podsumowanie błędów jest widoczne poniżej. Aby skonfigurować wyzwalacze dla tego skryptu lub zmienić ustawienia dotyczące otrzymywania przyszłych powiadomień o błędach, kliknij tutaj. Podsumowanie: Exception: Nie udało się zrealizować żądania skierowanego do https://habitica.com. Zwrócony kod błędu: 400. Skrócona odpowiedź serwera: {\u0026#34;success\u0026#34;:false,\u0026#34;error\u0026#34;:\u0026#34;BadRequest\u0026#34;,\u0026#34;message\u0026#34;:\u0026#34;Missing x-client headers.\u0026#34;} (aby zobaczyć pełną odpowiedź, użyj opcji muteHttpExceptions). Exception: Niedostępny adres: https://habitica.com/api/v3/user Wygląda na to, że kilka dni temu zmieniły się wymagania requestów do habitica.\nNależy dodać nagłówek x-client. Nagłówek ma zawierać id użytkownika i nazwę aplikacji (która może być dość dowolna).\nW wypadku aplikacji której używam:\nconst headers = { \u0026#39;x-api-user\u0026#39;: habiticaUserId, \u0026#39;x-api-key\u0026#39;: habiticaAPIToken, \u0026#39;x-client\u0026#39;: habiticaUserId + \u0026#39;-staingalive\u0026#39;, }; Linki # Stayin Alive Script Źródła # https://habitica.fandom.com/wiki/Webhooks https://habitica.fandom.com/wiki/Application_Programming_Interface#Version_3_of_the_API ","date":"2025-08-02","externalUrl":null,"permalink":"/wpis/habitica-naglowki-webhook/","section":"Wpis","summary":"","title":"Habitica - nagłówki webhook","type":"wpis"},{"content":"","date":"2025-08-02","externalUrl":null,"permalink":"/tags/javascript/","section":"Tags","summary":"","title":"Javascript","type":"tags"},{"content":"","date":"2025-07-26","externalUrl":null,"permalink":"/tags/mysql/","section":"Tags","summary":"","title":"Mysql","type":"tags"},{"content":" UWAGA!!! Jest to wpis historyczny. Niedawno wyciągnięty z szuflady. Opis konfiguracji # Klaster składa się z trzech maszyn wirtualnych. Komunikują się między sobą wewnątrz sieci lokalnej. Adresy IP znajdują się w pliku /etc/hosts każdej z nich.\nW tym przykładzie:\n192.168.5.1 node1 192.168.5.2 node2 192.168.5.3 node3 Na nich znajdują się pakiety mysql-xtradb (obecnie nazywany galera). Wszystkie węzły są skonfigurowane, aby działać w trybie replikacji Master - Master. Tzn można zapisywać oraz odczytywać dane z dowolnego węzła.\nPrzykładowy plik konfiguracyjny # Wszystkie węzły klastra synchronizują swój stan między sobą przy pomocy plików binlog używając tego samego protokołu co rsync.\nKonfiguracja node1 (192.168.5.1)\n/etc/mysql/conf.d/galera.cnf\n[mysqld] binlog_format=ROW default-storage-engine=innodb innodb_autoinc_lock_mode=2 query_cache_size=0 query_cache_type=0 bind-address=0.0.0.0 #galera settings wsrep_provider=/usr/lib/galera/libgalera_smm.so wsrep_cluster_name=\u0026#34;my_wsrep_cluster\u0026#34; wsrep_cluster_address=\u0026#34;gcomm://192.168.5.1,192.168.5.2,192.168.5.3\u0026#34; wsrep_sst_method=rsync Problem z synchronizacją # Z powodu problemów sieciowych jeden z węzłów, nie mógł komunikować się z resztą. Nowe dane zapisywały się tylko na pozostałych węzłach. Po przywróceniu połączenia, jeden węzeł ma nie aktualne dane. Przez co wymaga synchronizacji danych z pozostałych.\n# Przed problemami # z połączeniem +---------+ +---------+ | | | | | node1 +-------\u0026gt;| node2 | | |\u0026lt;-------+ | +-+-------+ +-------+-+ | ^ ^ | | | | | | | | | | | +---------+ | | | | | | | | | +----+ node3 +---+ | +------\u0026gt;| |\u0026lt;-----+ +---------+ # W trakcie problemów # z połączeniem +---------+ +---------+ | | | | | node1 +-------\u0026gt;| node2 | | |\u0026lt;-------+ | +---------+ +---------+ +---------+ | | | node3 | | | +---------+ Synchronizacja węzła # +---------+ +---------+ | | | | | node2 +-------\u0026gt;| node3 | | | | | +---------+ +---------+ Sprawdzanie stanu synchronizacji z klastrem # Logujemy się klientem mysql do węzła klastra mysql -u root -p Sprawdzamy stan klastra oraz węzła SHOW STATUS LIKE 'wsrep_cluster_size’; wsrep_cluster_size - ilość podłączonych węzłów do klastra, dążymy do wartości 3 SHOW STATUS LIKE 'wsrep_local_state_comment'; wsrep_local_state_comment - stan obecnego węzła względem klastra, dążymy do wartości Synced Synchronizacja # UWAGA!!! Podając nazwę węzła z którym się synchronizujemy (wsrep_sst_donor) użyłem hosta wpisanego w plik /etc/hosts . Nie jestem pewien, czy podanie adresu IPv4 nie będzie mieć tego samego efektu. UWAGA!!! Jeśli w/w host jest niedostępny, to węzeł na którym pracujemy się nie uruchomi. UWAGA!!! Można podać kilka węzłów źródłowych po przecinku. Jeśli nie można pobrać danych z pierwszego, wtedy próbuje z kolejnego. Np: wsrep_sst_donor=\u0026quot;example1,example2\u0026quot; UWAGA!!! Przecinek na końcu tego ustawienia powoduje uruchomienie się węzła nawet, jeśli nie może zsynchronizować swojego stanu z żadnym z wcześniej wskazanych węzłów. Np: wsrep_sst_donor=\u0026quot;example1,example2,\u0026quot; Przed synchronizacją należy wyłączyć synchronizowany węzeł oraz ustalić, który węzeł będzie brany jako wzór stanu do skopiowania.\nZatrzymujemy niezsynchronizowany węzeł service mysql stop Edytujemy plik konfiguracyjny /etc/mysql/conf.d/galera.cnf Dodajemy linię typu: wsrep_sst_donor=\u0026quot;node2\u0026quot; Uruchamiamy niezsynchronizowany węzeł service mysql start Nie przejmujemy się, jeśli serwis powiadomi nas o nie uruchomieniu mysqla. # service mysql start [....] Starting MariaDB database server: mysqld . . . . . . . . . . . . . . . . [FAIL . . . . . . . . . . . failed! Sprawdzamy, czy istnieją procesy o nazwie mysql ps aux | grep mysql Sprawdzamy, czy w syslogu odkładają się informacje o trwającej/zakończonej synchronizacji stanu [...] Sep 1 22:56:41 node3 rsyncd[23849]: connect from node2 (192.168.5.2) Sep 1 22:56:41 node3 rsyncd[23849]: rsync to rsync_sst/./gstest3 from node2 (192.168.5.2) Sep 1 22:56:41 node3 rsyncd[23849]: receiving file list Sep 1 22:56:41 node3 rsyncd[23851]: connect from node2 (192.168.5.2) Sep 1 22:56:42 node3 rsyncd[23849]: sent 92 bytes received 99292 bytes total size 99025 Sep 1 22:56:42 node3 rsyncd[23851]: rsync to rsync_sst/./bp5 from node2 (192.168.5.2) Sep 1 22:56:42 node3 rsyncd[23851]: receiving file list [...] [...] Sep 1 23:02:28 node3 mysqld: 220901 23:02:28 [Note] /usr/sbin/mysqld: ready for connections. Sep 1 23:02:28 node3 mysqld: Version: \u0026#39;10.0.12-MariaDB-1-wsrep-log\u0026#39; socket: \u0026#39;/var/run/mysqld/mysqld.sock\u0026#39; port: 3306 mariadb.org binary distribution, wsrep_25.10.r4002 Sep 1 23:02:28 node3 mysqld: 220901 23:02:28 [Note] WSREP: 1.0 (node3): State transfer from 2.0 (node2) complete. Sep 1 23:02:28 node3 mysqld: 220901 23:02:28 [Note] WSREP: Shifting JOINER -\u0026gt; JOINED (TO: 81470609) Sep 1 23:02:28 node3 mysqld: 220901 23:02:28 [Note] WSREP: Member 1.0 (node3) synced with group. Sep 1 23:02:28 node3 mysqld: 220901 23:02:28 [Note] WSREP: Shifting JOINED -\u0026gt; SYNCED (TO: 81470609) Sep 1 23:02:29 node3 mysqld: 220901 23:02:29 [Note] WSREP: Synchronized with group, ready for connections Sep 1 23:02:29 node3 mysqld: 220901 23:02:29 [Note] WSREP: wsrep_notify_cmd is not defined, skipping notification. [...] Sprawdzamy, czy węzeł się zsynchronizował (patrz instrukcje wyżej) Zatrzymujemy zsynchronizowany węzeł service mysql stop Usuwamy z pliku konfiguracyjnego /etc/mysql/conf.d/galera.cnf linię zawierającą wsrep_sst_donor= Uruchamiamy ponownie zsynchronizowany węzeł service mysql start Sprawdzamy, czy węzeł się zsynchronizował (patrz instrukcje wyżej) ","date":"2025-07-26","externalUrl":null,"permalink":"/wpis/mysql-synchronizacja-wezlow-w-klastrze/","section":"Wpis","summary":"","title":"Mysql - synchronizacja węzłów w klastrze master-master","type":"wpis"},{"content":"","date":"2025-07-19","externalUrl":null,"permalink":"/tags/monit/","section":"Tags","summary":"","title":"Monit","type":"tags"},{"content":" Alerty monita # Monit raportuje dwa razy większą ilość pamięci używanej przez redisa. Czemu?\nRedis co jakiś czas zrzuca wszystkie swoje klucze z pamięci RAM do pliku /var/lib/redis/dump.rdb.\nWtedy forkuje (kopiuje) swój proces. Monit widzi dwa procesy z zarezerwowaną taką samą ilością pamięci. Jednocześnie nie widzi, że mają przypisaną tą samą przestrzeń w pamięci.\nCo można zrobić? # Zawsze można zmodyfikować czułość alertu w monicie, albo używać skryptu z komendą redis-cli info memory.\nJeśli nie zależy nam na danych, możemy wyłączyć zapis do pliku. Wtedy każde wyłączenie serwisu skasuje wszystkie klucze. Coś takiego sprawdzi się, jeśli używamy redisa tylko do danych tymczasowych (cache).\nW pliku konfiguracyjnym /etc/redis/redis.conf mamy bardzo jasną instrukcję w komentarzu.\n################################ SNAPSHOTTING ################################ # # Save the DB on disk: # # save \u0026lt;seconds\u0026gt; \u0026lt;changes\u0026gt; # # Will save the DB if both the given number of seconds and the given # number of write operations against the DB occurred. # # In the example below the behaviour will be to save: # after 900 sec (15 min) if at least 1 key changed # after 300 sec (5 min) if at least 10 keys changed # after 60 sec if at least 10000 keys changed # # Note: you can disable saving completely by commenting out all \u0026#34;save\u0026#34; lines. # # It is also possible to remove all the previously configured save # points by adding a save directive with a single empty string argument # like in the following example: # # save \u0026#34;\u0026#34; Używana pamięć # # redis-cli info memory | grep human | grep used used_memory_human:2.76G used_memory_rss_human:2.81G used_memory_peak_human:2.76G used_memory_lua_human:41.00K used_memory_scripts_human:0B Źródła # https://groups.google.com/g/redis-db/c/6YXSyV5ywTw ","date":"2025-07-19","externalUrl":null,"permalink":"/wpis/monit-raportowane-duze-zuzycie-pamieci-w-redisie/","section":"Wpis","summary":"","title":"Monit - raportowane duże zużycie pamięci w redisie","type":"wpis"},{"content":"","date":"2025-07-19","externalUrl":null,"permalink":"/tags/redis/","section":"Tags","summary":"","title":"Redis","type":"tags"},{"content":" TL;DR # Dodanie tych nagłówków we wiadomości email zapobiega odpowiedziom autorespondera.\nX-Auto-Response-Suppress: All Precedence: Bulk Auto-Submitted: auto-generated Return-Path: \u0026lt;\u0026gt; Co działa na największych graczy na rynku? # W changelogu monita widnieje taka informacja:\nNew: Add the following headers to email alerts, to prevent out-of-office autoresponders in Exchange, Outlook, Office365, Gmail:\nX-Auto-Response-Suppress: All Precedence: Bulk Standard RFC 3834 # Serwer emailowy nie powinien wysyłać automatycznej wiadomości, jeśli istnieje nagłówek Auto-Submitted oraz ma wartość inną niż no\nAuto-Submitted: auto-generated Serwer nie może wysłać automatyycznej wiadomości, jeśli nagłówek Return-Path ma pustą wartość.\nReturn-Path: \u0026lt;\u0026gt; Jest też jeszcze kilika innych przypadków, ale te wydały mi się najbardziej uniwersalne.\nŹródła # https://mmonit.com/monit/changes/ https://serverfault.com/questions/56476/is-there-an-email-header-that-will-avoid-responses-from-most-auto-responders https://www.rfc-editor.org/rfc/rfc3834#section-2 ","date":"2025-07-12","externalUrl":null,"permalink":"/wpis/blokowanie-automatycznych-odpowiedzi-email/","section":"Wpis","summary":"","title":"Blokowanie automatycznych odpowiedzi email","type":"wpis"},{"content":"","date":"2025-07-12","externalUrl":null,"permalink":"/tags/email/","section":"Tags","summary":"","title":"Email","type":"tags"},{"content":" Sprawdzenie używanej pamięci oraz ilości kluczy # # redis-cli info memory | grep human | grep used used_memory_human:2.76G used_memory_rss_human:2.81G used_memory_peak_human:2.76G used_memory_lua_human:41.00K used_memory_scripts_human:0B # redis-cli info | grep -A1 \u0026#39;# Keyspace\u0026#39; # Keyspace db0:keys=21379,expires=10450,avg_ttl=3600 Wyświetlenie kluczy bez TTL # UWAGA!!! Przy dużych bazach danych najlepiej unikać wyświetlania kluczy przy pomocy redis-cli keys \\*.\nZamiast tego lepiej użyć redis-cli --scan który nie blokuje zasobów i wyświetla klucze małymi grupami.\nWarning: consider KEYS as a command that should only be used in production environments with extreme care. It may ruin performance when it is executed against large databases.\nKlucze bez czasu wygasania mają ustawioną wartość TTL na -1\nPrzykład przy użyciu basha\nredis-cli --scan | while read LINE ; do TTL=$(redis-cli ttl \u0026#34;$LINE\u0026#34;); if [ $TTL -eq -1 ]; then echo \u0026#34;$LINE\u0026#34;; fi; done; Przykład z użyciem LUA\nhttps://stackoverflow.com/questions/9817951/finding-non-expiring-keys-in-redis/78269330#78269330\nSkasowanie nie wygasających kluczy # Analogicznie jak wyżej.\nredis-cli --scan | while read LINE ; do TTL=$(redis-cli ttl \u0026#34;$LINE\u0026#34;); if [ $TTL -eq -1 ]; then redis-cli del \u0026#34;$LINE\u0026#34;; fi; done; Ustawienie kluczom wartości TTL # redis-cli --scan | while read LINE ; do TTL=$(redis-cli ttl \u0026#34;$LINE\u0026#34;); if [ $TTL -eq -1 ]; then redis-cli expire \u0026#34;$LINE\u0026#34; 3600; fi; done; Źródła # https://redis.io/docs/latest/commands/keys/ https://redis.io/docs/latest/commands/scan/ https://redis.io/docs/latest/commands/expire/ https://stackoverflow.com/questions/9817951/finding-non-expiring-keys-in-redis ","date":"2025-07-05","externalUrl":null,"permalink":"/wpis/redis-nie-wygasajace-klucze/","section":"Wpis","summary":"","title":"Redis - nie wygasające klucze","type":"wpis"},{"content":"","externalUrl":null,"permalink":"/authors/","section":"Authors","summary":"","title":"Authors","type":"authors"},{"content":"","externalUrl":null,"permalink":"/categories/","section":"Categories","summary":"","title":"Categories","type":"categories"},{"content":"","externalUrl":null,"permalink":"/series/","section":"Series","summary":"","title":"Series","type":"series"},{"content":"","externalUrl":null,"permalink":"/wpisy/","section":"Wpisy","summary":"","title":"Wpisy","type":"wpisy"}]