Wiele serwisów chce w dzisiejszych czasach posiadać swoją listę mailingową. Problem zaczyna się właśnie w tym momencie, bo możemy chcieć stworzyć coś własnego, wymyślając koło na nowo, możemy zapłacić za dedykowane usługi (np: mailchimp czy convertkit), które oferuje nam kilka firm, a możemy spróbowac z rozwiązań pośrednich jakie prezentuję właśnie u mnie. W tym artykule przedstawię podejście które zastosowałem i udostępnie playbooki do ansible, które były tworzone na ostatnich transmisjach live na moim kanale.

To co mogę powiedzieć na samym początku jako właściciel serwera pocztowego od lat - utrzymywanie swojego serwera pocztowego, który jest zdolny dostarczać sporo e-maili, to generalnie ciężkie zajęcie, choć wydaje się na pierwszy rzut oka banalne. Niestety, kwestie dostarczalności, reputacji naszego adresu IP, wreszcie dopinania wszystkich tych spraw związanych z DNSami należą do zajmujących spraw i nigdy nie ma 100% pewności co do dostarczalności danego e-maila.

Rozwiązanie pośrednie to skorzystanie z dedykowanej usługi do wysyłki e-maili, np. Amazon SES, usługa korzysta z “reputacji” Amazona, stąd ma dobre “dotarcie” - czytaj: mniejsza szansa, że np. Gmail stwierdzi, że to jakiś serwer-krzak Janusza i odrzuci. I jest tanio - ponoć $1 przy 10 000 e-maili, nie licząc dodatkowych, ale jednorazowych 59$ na sendy. Oczywiście nikt nie każe Sendy kupować - jeśli chcesz, to masz dokumentację do API AWS dostępną, stwórz swój soft, który z tego skorzysta - to podejście jeszcze inne, ale znacznie bardziej czasochłonne.

\

Po co mi w ogóle lista mailingowa i dlaczego e-mail jest cenny?

Pierwsze pytanie, które się nasuwa, dla kogo jest lista mailingowa? Generalnie dla osób, które prowadzenie jakiegoś bloga/vloga traktują jako pewnego rodzaju inwestycję na przyszłość i chcą ze swoimi czytelnikami lub swoją widownią mieć dodatkowy kontakt. Warto nadmienić, że jeżeli jakaś osoba dopisuje się do Twojej listy mailingowej, to znak, że ta osoba jest zainteresowana Twoja twórczością. Powierza Ci najceniejszy zasób w internecie obok swojej prywatności - swój adres e-mail. Tak, dobrze napisano: najcenniejszy.

Adres e-mail jest tysiące razy cenniejszy niż konto na social mediach. Oczywiście nie mówię o jakichś wpaśnych kontach z milionami widzów, subów czy czego tam, ale per jednostkę jest znacznie cenniejszy. Po pierwsze dlatego, że bez adresu e-mail, to możesz co najwyżej założyć skarpetę na monitor, jak Ci się uda, a nie konto w innym serwisie.

Po drugie - biznesy “dzieją” się przez e-mail. Możesz mieć popularne konto na YT czy instagramie, ale umowę biznesową dzięki której zmonetyzujesz zasięgi, zawrzesz właśnie poprzez e-mail. E-mail jest prosty i uniwersalny, bo mając adres e-mail od usługodawcy A, skomunikujesz się z kimś, kto ma swój e-mail od usługodawcy B, lub usługodawcy C. Mało tego, każda z tych osób będzie mogła sobie używać innego oprogramowania do obsługi swojego e-maila, a i tak się z nią skomunikujesz. Magia, nie?

A teraz sobie wyobraź, czy to samo byłoby możliwe, gdyby chcieć napisać wiadomości z konta na Instagramie, do osoby na TikToku czy Snapchacie. To są zamknięte platformy własnościowe, e-mail, jako standard, taki nie jest. Dlatego jest tak istotny.

Co jeszcze warto dodać: osoby z Twojej listy mailingowej, niejako z automatu są Ci bardziej przychylne, co może przełożyć się kiedyś na kwestię biznesową. Ja np. subskrybuję różne techniczne listy mailingowe, np. Golang Weekly. Na takiej liście są inne osoby lub instytucje, które również są zainteresowane taką tematyką, czyli programowaniu w Go. I za każdym razem wiem, że co tydzień, na mój e-mail dostanę porcję ciekawych linków do stron i blogów w branży, w które chętnie kliknę i przeczytam, bo zwyczajnie mnie to interesuje. A sami autorzy listy, mają informacje, w co ich subskrybenci klikają i wiedzą jaka tematyka podoba się bardziej, a jaka mniej. Dzięki temu mogą poprawiać swoje usługi i zbierać bardziej “lubiane” linki.

I teraz jest firma, która chce reklamy swojej usługi, bo powiedzmy też ma swoje usługi związane z językiem Go. Szansa, że taka firma znajdzie klientów wśród subskrybentów takiej listy jest znacznie większa, niż np. nawet na tematycznych redditach i serwisach. A już napewno nieskończenie większa, niżby puściła reklamę TV w prime time, gdzie 99% widzów nie będzie wiedzieć co to jest Go (chyba, że jakiś klub gogo), podczas gdy śmiało można powiedzieć, że 100% subskrybentów Golang Weekly, doskonale wie co to jest Go.

Myślę, że dosyć dobrze przedstawiłem, dlaczego warto posiadać swoją listę mailingową w dobie dzisiejszych sosziali.

\

Potrzebne umiejętności

Bez wątpienia, jeśli chcesz bawić się w self-hosted listę mailingową, jak w tym przypadku, powinieneś/aś być w stanie ogarnąć instalację takiej listy na dedykowanym serwerze/vpc. Taka instalacja (sendy) wymaga serwera WWW, PHP i bazy danych MySQL/MariaDB. Ponadto, dobrze by było ogarniać swoją domenę, bo odpowiednie wpisy w niej będą potrzebne, aby dodać usługę do Amazon SES. Powiedziałbym, że to nie wszystko: znajomość jak działa usługa e-mail, jak weryfikować swoje kampanie pod względem tego, czy mają szanse one trafiać do spamu, zamiast do ludzi, to kolejna działka, która nieodkryta, może nam nieoczekiwanie sypać piaskiem po oczach.

Warto tu nadmienić, że jak ja to nazywam: uproszczony hosting “zwyczajny”, w którym najwyżej możemy wgrywać pliki przez FTP i dodawać bazy przez PHPMyAdmin może nie wystarczyć: lista mailingowa typu sendy wymaga kilku dodatkowych libów do PHP, nie w każdym hostingu będą one dostępne domyślnie, a już jak chcesz prosić o instalację adminów, to już w ogóle przemyśl, czy Twój hosting posiada tak miłych adminów lub devopsiarzy. Jeśli więc obawiasz się, że zabawa z terminalem nie jest dla Ciebie, to self-hosted lista również, powiedzmy to sobie szczerze i bez ogródek.

Z kolei inne listy self-hosted, takie jak listmonk, które nie korzystają (jeszcze) z takiej usługi jak Amazon SES, wymagają, by im dane serwera lub serwerów pocztowych wklepać ręcznie, w konfiguracji. Jak nigdy nie było dane Ci znać takie detale jak adres serwera smtp/imap, porty, rodzaj szyfrowania, to też natrafisz na problem. A jak nawet znasz takie dane, to też radośnie nie użyjesz swojego “normalnego” konta do wysyłki tysięcy maili w kilka godzin nawet, bo gmail to wykryje, zablokuje i będzie koniec tej zabawy.

Jak więc da się zauważyć, że nie jest to najprostsza kwestia do ogarnięcia. Jeśli jednak Twoja motywacja wciąż jest niewzruszona (ale przychylna), to śmiało przechodź do dalszej części tego artykułu.

\

Kiedy jakie rozwiązanie warto wybrać?

Wiele zależy od umiejętności o których wspomniałem wcześniej. Jeśli nie posiadasz tych umiejętności, to niestety (albo stety) musisz skorzystać z usług dedykowanych firm, typu convertkit czy mailchimp (tych firm jest oczywiście więcej). Niestety opcja ta będzie droższa niż lista self hosted, jaką tutaj opisuję.

Jeśli masz potrzebne umiejętności, ale nie masz czasu na zabawę w stawianie tego, wtedy też zalecam zakupić usługę u wyspecjalizowanych firm. A już zwłaszcza w sytuacji, jeśli pieniądze nie są problemem.

Self hosted lista jest głównie dla tych, którzy posiadaja odpowiednie umiejętności i mają czas, w sensie mogą się parę dni pobawić w dopieszczanie listy. W zamian za to, oszczędzą pieniądzę, tym więcej, im więcej będą mieć subskrybentów i kampanii mailingowych, bo to jest główna zaleta self-hosted listy mailingowej opartej o wykorzystanie usługi Amazon SES.

\

Ograniczenia sendy

Co warto tutaj nadmienić - np. sendy nie ma niektórych prostych opcji, jakie mają niektóre systemy komercyjne typu convertkit. Np. nie ma “wyślij maila do tych leniwców, którzy jeszcze mojego poprzedniego nie otwarli”. Sendy, przynajmniej w obecnej najnowszej wersji, nie udostępni Ci tak prostego rozwiązania. Ale jak Twoje alter ego to Janusz Mirek Druciasz, to możesz sobie wyeksportować listę do CSV i z powrotem zaimportować, do innego “koszyka” świadczeń i tam działać.

Albo inny przykład, podstawowy: chcesz zaplanować wysyłkę? Nie ma problemu - sendy zachęci Cię do… użycia crona w Twoim serwerze, nawet poda komendę, którą tam wpisać. Także, te i inne “atrakcje” Cie czekają, gdy w dobie jakiegoś kryzysu zrezygnujesz np. z convertkita, więc żeby nie było, że nie ostrzegałem. :)

\

Organizacja i playbooki ansible

Pliki do tego przykładu znajdziesz w moim repozytorium na GitHub

Zobaczmy najpierw jak wygląda organizacja katalogu mojego ansible z playbookami, który jest odpowiedzialny za deploy tego wszystkiego, uwzględniając, że łączy się do CentOS 8:

\

├── ansible.cfg
├── backup_database.yml
├── files
│   ├── caddy
│   ├── Caddyfile
│   ├── caddy.service
│   ├── newsletter.devopsiarz.pl.conf
│   ├── noip2
│   ├── no-ip2.conf
│   ├── noip2.service
│   └── sendy-4.0.6.zip
├── group_vars
├── host_vars
│   └── newsletter.devopsiarz.pl
│       └── passwords.yml
├── library
├── newsletter.devopsiarz.pl
├── newsletter.yml
├── servers
│   └── newsletter.devopsiarz.pl
└── templates

Na repozytorium wrzucam wszystkie pliki, poza:

  • noip2 - binarka - instrukcja skompilowania
  • no-ip2.conf, który zawiera dane mojego konta noip.com (zaszyfrowane, ale jednak)
  • caddy, to plik binarny, który możecie sobie skompilować lub sami ściągnąć
  • oczywiście plik sendy-4.0.6.zip, bo to kupione i nawet nie wolno mi tego rozpowszechniać, jeśli chcesz kupić wejdź na stronę autora projektu

\

Pamiętaj, że taki rasowy devopsiarz jak ja, nie może żyć bez codziennych problemów, bo by chyba umarł z nudów. A zatem - zamiast polecanego serwera WWW (apache), lub może mniej polecanego, ale przynajmniej przetestowanego z powodu popularności nginksa, ja oczywiście używam Caddy. Załączony plik konfiguracyjny do Caddy już zawiera odpowiednie wpisy, które trzeba było znaleźć. Jak nie masz zamiaru używać Caddy, tylko nginx, to bez problemu znajdziesz odpowiedni plik konfiguracyjny do niego.

Druga sprawa dotycząca mojego znacznego powinowactwa do potencjalnych problemów - oczywiście moje serwery mają włączonego SELinuksa, jeśli użyjesz jednak mojego playbooka na CentOS 8, to powinien on Cię bezboleśnie przeprowadzić przez krainę pułapek i mrocznych strażników bezpieczeństwa Twojego serwera. Nie rozmyślaj od razu jak to wyłączyć, z tym da się żyć.

Playbook newsletter.yml jest playbookiem, który właśnie stawia infrastrukture, ustawia odpowiednie usługi, instaluje sendy - słowem: robi wszystko. Ale tak jak wspominałem - to wszystko przy założeniu, że mamy od czynienia z sendy, noip, caddy, SELinux i paru innymi rzeczami. Jeśli u Ciebie użyte oprogramowanie jest inne, musisz zmodyfikować odpowiednie taski w playbooku.

Jeśli zależy Ci na backupie bazy danych, sprawdź backup_database.yml.

\

Bezpieczeństwo

Teraz parę słów bezpieczeństwa, wspomniałem o SELinux, ale osobna kwestia jest bezpiecznego użycia tych playbooków.

Ważne hasła przechowuję w pliku host_vars/newsletter.devopsiarz.pl/passwords.yml, to plik, który szyfruję za pomocą ansible-vault, dzięki temu w tej wersji mógłbym go np. puścić do prywatnego repozytorium. Pamiętaj, że jeżeli stosujesz takie sztuczki z trzymaniem sekretów, to ansible musisz potem odpalać z opcją --ask-vault-pass. Osobiście zalecam szczególną ostrożność z commitowaniem szyfrowanych ręcznie plików - powinien być za to odpowiedzialny jakiś automat i tylko on, bo nie jest trudno sobie wyobrazić, że ktoś w roztargnieniu zapomni zaszyfrować plik ponownie i w wersji jawnej udostępni go światu. Dlatego warto wyrobić sobie nawyk używania komendy ansible-vault edit, gdyż wtedy ansible zadba by automatycznie odszyfrować plik, otworzyć go nam w edytorze, a później ponownie zaszyfrować.

Odnośnie samych host_vars, to pamiętaj, że mogę je wrzucać do katalogu host_vars/newsletter.devopsiarz.pl/ ponieważ w moim katalogu servers/, gdzie według mojego ansible.cfg są moje pliki z statyczną listą serwerów, istnieje również plik servers/newsletter.devopsiarz.pl. Plik servers/newsletter.devopsiarz.pl może mieć dowolną nazwę, jednak ważna kwestia dotyczy jego zawartości - newsletter.devopsiarz.pl musi się zgadzać z katalogiem w host_vars/

Jeżeli nie skorzystasz z mojego ansible.cfg, ścieżkę do katalogu z z statyczną listą serwerów możesz podać zawsze używając opcji -i katalog podczas uruchamiania ansible-playbook

\

Nagranie I z live Lista mailingowa/newsletter na sendy/AWS SES - deploy i automatyzacja, część I

Na tym nagraniu zobaczysz moje tłumaczenie co to ta cała lista mailingowa, po co ona, no i pierwsze walki z ansible i instancją w hetznerze, trochę problemów z MySQL. Wszystko robione na żywo.

\

Nagranie II z live: Lista mailingowa/newsletter na sendy/AWS SES - dokończenie

Nagranie z dokończeniem - tutaj fixowanie ostatnich problemów z MySQL i PHP, oraz pokaz jak wygląda działająca aplikacja sendy i jak jest zintegrowana z tą stroną.

\

Nagranie III z live: Backup listy mailingowej za pomocą ansible oraz aktualizacja serwera packerem do CentOS 8

Tutaj z kolei nagranie ze streamu, w którym robiłem playbook ansible do backupu bazy danych tej bazy. Zobacz proces powstawania tego playbooka od prostego skryptu shellowego. Ponadto, jeszcze kwestia aktualizacji mojego serwera drugiego, devopsiarz.pl, który jak wiadomo działa w filozofii immutable infrastrukture.

\

Linki

Na koniec garść linków: