Pretekst

Od jakiegoś czasu szukałem pretekstu, żeby pobawić się maszynkami z Ampere A1 od Oracle. Poza tym, w zadaniach przetestowanie Cloudflare na blogu wisiało… prawie 5 lat. I jeszcze na dodatek gorącym tematem jest AI, często reprezentowana ostatnio przez ChatGPT. Ale jakoś na nic nie było czasu i potrzeby.

Zatem wpadłem na pomysł, żeby postawić bloga, który będzie WordPressem, stojącym na VMce z arm64, za Cloudflare, a treść dostarczać będzie głównie AI. Trzy pieczenie na jednym ogniu. W sumie cztery, bo jeszcze sprawdzę indeksowanie tego tworu i zarobię miliony na reklamach. Poznajcie blog everything about coffee.

Przyznam, że było trudniej, niż się spodziewałem. Najpierw był problem z wyborem domeny. Stwierdziłem bowiem, że taki eksperyment wymaga stosownej separacji. W domenach raczej nie siedzę, więc znalezienie czegoś sensownego w niewielkich pieniądzach było trudne. Stanęło na tym, że analogicznie jak na głównej domenie niech się składa w jedno słowo. I tak powstał coffee express. Bez es. W sumie także bez e w środku, bo byłyby aż trzy kolejno, ale to już wybór, nie ograniczenie techniczne.

Domena

Wydawać by się mogło, że kupno domeny w 2023 jest proste, szybkie i przyjemne. Sprostuję, nie jest. A przynajmniej nie jest, jeśli korzysta się z TLD .es a kupuje w OVH. Rejestrator ma teraz dziwne wymagania, panel OVH ma dziwne pola i komunikaty. Ostatecznie udało się, po kontakcie z supportem OVH. Dwukrotnym.

Hosting

Jeśli chodzi o Ampere A1, to ostatecznie odpuściłem instalację Debiana, którego Oracle nie dostarcza i użyłem gotowca w postaci Ubuntu. Przynajmniej na podstawce AKA hypervisorze, bo sam blog stoi już w kontenerze LXC z Debianem. Za wiele się tam nie dzieje, ale – po krótkim obcowaniu – maszynka wygląda na wydajną i generalnie śmiga.

Cloudflare

Przepięcie domeny na Cloudflare – szybkie, łatwe i przyjemne. Podpowiadają co mają podpowiadać, autouzupełnianie działa. Panel przejrzysty, ustawienia domyślne sensowne. Opcji w wersji darmowej niewiele, ale wystarczają.

Oczywiście jest tricky part związana z certyfikatami SSL czy ustawieniami DNS, jeśli chce się mieć coś dostępne bezpośrednio, ale da się. No i wypada zablokować ruch HTTP(S) do serwera spoza Cloudflare. Jest wiele sposobów, wybrałem prawdopodobnie najprostszy i najgorszy, czyli iptables z wyjątkami na klasy adresowe Cloudflare na maszynie. Może kiedyś zmienię.

WordPress

Stawianie WordPressa także okazało się pewnym wyzwaniem. Może nie tyle samo postawienie, co doprowadzenie do działania. W każdym jakby ktoś wybrał wariant z ruchem nieszyfrowanym między blogiem a Cloudflare, czyli teoretycznie najprostszą opcję, to może się naciąć. W praktyce chyba prościej uruchomić to jako szyfrowane, z certyfikatem self signed. Nie obyło się bez grzebania w wp-config.php. Poza tym, raczej było prosto. Najwięcej czasu zeszło na wybór grafiki i ręczną instalację i konfigurację wszystkich wtyczek do WordPressa, których używam.

ChatGPT

No i na koniec część związana z AI. Jak łatwo można się domyślić, bawiłem się chatGPT przy porannej kawie i wtedy powstał pomysł na bloga generowanego przy pomocy AI. No właśnie nie przez AI, a przy pomocy. Co to znaczy? Ano to, że może się zdarzyć, że ingeruję w odpowiedzi zwrócone przez chatGPT. Łączę je, przycinam, albo dodaję coś od siebie. Ale nie jest to regułą i zwykle po prostu przeklejam wprost. Bez korekty, sprawdzania faktów itd. Błędy się zdarzają, o czym można przeczytać choćby w komentarzach do tego wpisu. Poza tym, nie podaję prompta i sam, ręcznie wybieram tytuł. Ot, powiedzmy taki asystent leniwego copywrightera w postaci AI. Co do zasady muszę zmieścić się z utworzeniem wpisu od początku do końca przy paru łykach porannej kawy.

Projekt nie jest skończony. Marzy mi się dorzucanie powiązanych obrazków do każdego wpisu. Najchętniej automatyczne. Brakuje detali typu favicona czy optymalizacja szybkości. Choć ten w zasadzie goły WordPress za Cloudflare działa wg GTmetrix podobnie szybko, co ten blog. Nad wyświetlaniem reklam nadal pracuję – chwilę to trwa już po stronie Google No i oczywiście wpisów na razie jest mało, a chciałbym dodawać około dwóch tygodniowo, przynajmniej przez najbliższych parę miesięcy.

DeepL

UPDATE: Do gromady dołączył jeszcze DeepL, a dokładnie Write. Coraz częściej zdarza mi się dodać coś od siebie, poza tym ChatGPT pisze dość sucho i encyklopedycznie. Nie używam domyślnie, raczej sporadycznie póki co. I uwzględniam tylko niektóre sugestie, ale warto wspomnieć i o tym narzędziu.

WordPress antyspam

Po raz kolejny musiałem zająć się problemem spamu w komentarzach na blogu. Przesiadka na hCaptcha pomogła na dłuższy czas, ale pod koniec lipca zabezpieczenie przestało działać[1]. Chwilę po tym, jak pojawiły się pierwsze komentarze, które przeszły hCaptcha, ruszyła lawina. Może raczej lawinka, bo 1-2 spamy dziennie to niewiele. Tak czy inaczej, wygląda, albo że spamerzy, że spamerzy szybko się uczą, albo mają bazę, który blog jaką ma captchę[2], albo hCaptcha istotnie się pogorszyła, albo ilość prób wzrosła na tyle, że coś się zaczęło przebijać[3]. A może wręcz znaleziono sposób na jej omijanie? Tematyka i języki różne, bez ładu i składu. Jedyne co pamiętam, to że zaczęło się od Azji, konkretnie pierwsze spamy wysłane w tej serii do mojego WordPressa były po… wietnamsku.

Garść statystyk

Zamieściłem statystyki poprzednio, więc zrobię to i teraz. Pomiędzy 20.06.2021 a 23.07.2022 zupełny brak spamu. W okresie od 23.07.2022 do 08.11.2022 73 sztuki. W 108 dni średnio 0,67 spamu na dobę. OK, to nie 1-2 dziennie, ale nadal sporo.

CAPTCHA

Moją pierwszą reakcją było zwiększenie trudności w panelu hCaptcha. Z najniższej na średnią. Niestety, nie zauważyłem spodziewanego efektu. Rozważam jeszcze powrót do reCAPTCHA. Jeśli spamerzy faktycznie mają bazę z typem zabezpieczeń na danym blogu, to taka zmiana może nieco popsuć szyki. Niemniej, skoro kiedyś nie dawała rady, to czemu teraz miałaby pomóc? Inna opcja to zwiększenie trudności do maksimum. Tylko to utrudni też życie zwykłym czytelnikom, a tego nie chcę.

Blokowanie IP

Zauważyłem, że IP z których zamieszczany jest spam w komentarzach, są raczej wątpliwej reputacji. Zatem kolejnym krokiem, połączonym z migracją hostingu, było zablokowanie na iptables z wykorzystaniem ipset tych IP, które są listowane w wybranych listach projektu firehol. Nieco pomogło na spam, zdecydowanie nie całkowicie. Ale i tak gorąco polecam to rozwiązanie, bo ilość ruchu z tych IP jest całkiem spora[4]. Niczego pozytywnego ze strony botnetów, open proxy itp. wynalazków się nie spodziewam, więc czemu nie zablokować?

Wtyczki

Skoro wycinanie IP nie pomogło, to pora sięgnąć po broń ostateczną. Tu jest WordPress, tu się instaluje wtyczki! Wtyczek obiecujących rozwiązanie spamu w komentarzach jest dla WordPressa sporo.

Akismet

Ponieważ kolejny raz polecono Akismet w komentarzach wpisu, więc zacząłem od niego. Pamiętam, że kiedyś już się przymierzałem do tego rozwiązania i odrzuciłem je. Po pierwsze, wymaga założenia osobnego konta. To mógł być wtedy wystarczający powód do odrzucenia. Po drugie, Akismet jest płatny. Tzn. teoretycznie jest pay what you want, ale nie da się zapłacić $0, jeśli ma się jakiekolwiek reklamy na blogu. Zaś what you want to minimum $1 miesięcznie. Tak się składa, że na niektórych stronach mam reklamy. Przynoszą grosze, ale są, a zakładanie konta, podawanie karty kredytowej to trochę za dużo, żeby przetestować rozwiązanie. Poza tym, skończyło by się tak, że wyświetlam reklamy, aby zapłacić za wtyczkę blokującą spam. Za którą muszę płacić, bo mam reklamy.

Antispam Bee

Kolejna popularna wtyczka antyspamowa dla WordPressa to Antispam Bee. Jest darmowa, wygląda sensownie, ma sporo więc dostała szansę. Trochę zdziwiło mnie działanie. Po włączeniu chciałem przetestować, wysłałem komentarz i… bez zmian, trafił od razu do moderacji, bez żadnych oznaczeń. Aż zwątpiłem, czy wtyczka działa przed moderacją, czy po. Jednak pierwszy spam pokazał, że wtyczka działa. Przed moderacją, a wykryty spam już nie niepokoi moderatora. Gdybym nie włączył powiadomień mailem, to bym nie zauważył. Znaczy pełen automat. Potrzeba trochę czasu, by ocenić skuteczność, ale wygląda obiecująco.

[1] Być może ma to jakiś związek ze zmianą hostingu, która koreluje czasowo. Tylko to mogłoby tłumaczyć jedynie znalezienie bloga, nie działanie zabezpieczeń.
[2] Tylko wtedy szkoda, że chyba nie ma w tej bazie pola „ręczna moderacja komentarzy, odpuść sobie”.
[3] Już po napisaniu tego wpisu zrobiłem szybką analizę i faktycznie, z ruchu wytypowanego jako boty zamieszczające spam, 95% dostaje HTTP status code 400. Pozostałe 5% dostaje 200.
[4] Aktualnie korzystam z dwóch list: stopforumspam oraz blocklist.net.ua. Kompromis między ilością IP (ok. 300 tys.), a efektem. Może się zmieniać, bo dodanie kolejnej listy jest trywialne.

Pomigracyjnie

W poprzednim wpisie pisałem o planowanej migracji na Oracle Cloud. Jak widać blog stoi już w nowej lokalizacji, więc operacja jest zakończona i mogę napisać kilka słów z perspektywy.

Migracja

Poszło niemal bezproblemowo. Backup w zasadzie zadziałał. Był problem z detalami typu lista zainstalowanych pakietów i crony. W sumie nieistotne i/lub poprawione. Xpil opisał swoją migrację VPSa i po tej lekturze miałem silne postanowienie zamknięcia wszystkiego w kontenerach LXC. To nieco wydłużyło proces migracji i dodało trochę zadań. Co prawda nadal nie jest to taka separacja jak w dockerach czyli per usługa, ale mariadb + nginx + całe WWW w osobnym VPSie też jest OK.

Konieczne było lekkie przemeblowanie. Musiałem rozdzielić skrypty cron do właściwych kontenerów. Okazało się też, że wynik działania jednego kontenera (Planeta Joggera) musi trafić nie do hypervisora, tylko do innego kontenera, a ten nie ma dostępu. Skrypt w cronie na hypervisorze załatwił sprawę.
Podobnie niezbyt elegancko rozwiązany jest backup bazy danych. Dump robię teraz w LXC, a następnie cały kontener jest backupowany. W ten sposób zawartość bazy jest zdublowana. Mam pomysł jak to rozwiązać, nie wiem, czy potrzebuję. Tyle o samej migracji, a efekty i hosting?

Efekty

Przede wszystkim jest szybciej, przynajmniej wg GTmetrix. Niestety nie zrobiłem testu tuż przed migracją i od razu po niej. Mam tylko ten link z twardymi danymi, ale w międzyczasie się poprawiło, więc polegam głównie na pamięci. Ale tak dobrze to nigdy nie było:

Blog GTmetrix w Oracle Cloud
GTmetrix w Oracle Cloud

Hosting

Pewnie w sporej części to kwestia przejścia z jednego VPSa na dwa, w dodatku z widocznymi dwoma rdzeniami w systemie. W Arubacloud było:

processor       : 0
vendor_id       : GenuineIntel
cpu family      : 6
model           : 79
model name      : Intel(R) Xeon(R) CPU E5-2650L v4 @ 1.70GHz
stepping        : 1
microcode       : 0xb000038
cpu MHz         : 1699.999
cache size      : 35840 KB
physical id     : 0
siblings        : 1
core id         : 0
cpu cores       : 1
apicid          : 0
initial apicid  : 0
fpu             : yes
fpu_exception   : yes
cpuid level     : 13
wp              : yes
flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts mmx fxsr sse sse2 ss syscall nx rdtscp lm constant_tsc arch_perfmon pebs bts nopl tsc_reliable nonstop_tsc cpuid pni pclmulqdq ssse3 fma cx16 sse4_1 sse4_2 movbe popcnt aes xsave avx hypervisor lahf_lm 3dnowprefetch pti arat
bugs            : cpu_meltdown spectre_v1 spectre_v2 spec_store_bypass l1tf mds swapgs itlb_multihit
bogomips        : 3399.99
clflush size    : 64
cache_alignment : 64
address sizes   : 40 bits physical, 48 bits virtual

Teraz jest (pojedynczy rdzeń):

processor       : 1
vendor_id       : AuthenticAMD
cpu family      : 23
model           : 1
model name      : AMD EPYC 7551 32-Core Processor
stepping        : 2
microcode       : 0x1000065
cpu MHz         : 1996.249
cache size      : 512 KB
physical id     : 0
siblings        : 2
core id         : 0
cpu cores       : 1
apicid          : 1
initial apicid  : 1
fpu             : yes
fpu_exception   : yes
cpuid level     : 13
wp              : yes
flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm rep_good nopl cpuid extd_apicid tsc_known_freq pni pclmulqdq ssse3 fma cx16 sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm cmp_legacy svm cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw topoext perfctr_core ssbd ibpb vmmcall fsgsbase tsc_adjust bmi1 avx2 smep bmi2 rdseed adx smap clflushopt sha_ni xsaveopt xsavec xgetbv1 xsaves clzero xsaveerptr virt_ssbd arat npt nrip_save arch_capabilities
bugs            : sysret_ss_attrs null_seg spectre_v1 spectre_v2 spec_store_bypass
bogomips        : 3992.49
TLB size        : 1024 4K pages
clflush size    : 64
cache_alignment : 64
address sizes   : 40 bits physical, 48 bits virtual

Blog zawsze dominował, jeśli chodzi o obciążenie, ale teraz ma całe zasoby dla siebie. Z drugiej strony bieżący VPS ma sporo wolniejszy dysk (3000 IOPS, 24 MB/s). Można tym jakoś sterować, ale zakładałem na domyślnych wartościach. No i nie widzę potrzeby zmiany.

Wady

Żeby nie było, że wszystko jest fajnie – port 25 TCP w Oracle Cloud jest zablokowany na twardo, w obie strony. Czyli ani maila nie przyjmę, ani nie wyślę. Znalazłem, że trzeba pisać do supportu o odblokowanie. Napisałem i zobaczymy. O ile do monitoringu poczta nie jest mi potrzebna, bo powiadomienia mogę wysyłać Telegramem, to przy blogu jest to jakby kluczowe. Potwierdzanie subskrybcji komentarzy itp. Z drugiej strony widzę, że nie było to jakoś mocno wykorzystywane… Zobaczę co odpowiedzą i wtedy pomyślę, co dalej.

Ogólnie sporo rzeczy w Oracle Cloud jest załatwianych przez support. Ustawienie PTR – support (działa!). Inny obraz dysku dla arm64 – support (tak powiedzieli na czacie, odpuściłem).

UPDATE: Port 25 nie został odblokowany, bo free tier. Nie jest to duży problem – wystarczy skonfigurować SMTP relay u któregoś z dostawców.