From 889c8a565ec4f5b37b7740d0c266fc3cdaa2b992 Mon Sep 17 00:00:00 2001 From: Anton Vakhrushev Date: Fri, 21 Aug 2026 22:06:06 +0300 Subject: [PATCH] =?UTF-8?q?=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=20goatcounter=20=D0=B4=D0=BB=D1=8F=20=D0=B2=D0=B5=D0=B1-?= =?UTF-8?q?=D0=B0=D0=BD=D0=B0=D0=BB=D0=B8=D1=82=D0=B8=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - один инстанс на два сайта, gc-main и gc-photo: нужный выбирается по Host - домены ведутся в goatcounter_sites (group_vars), оттуда же рендерятся имена в Caddyfile - сайты и первый пользователь заводятся идемпотентно, креды из vault --- AGENTS.md | 3 + files/caddyproxy/Caddyfile.template | 17 + files/dashboard/config/services.template.yaml | 5 + files/goatcounter/docker-compose.template.yml | 45 ++ group_vars/all/main.yml | 17 + group_vars/all/secrets.yml | 476 +++++++++--------- playbook-all-applications.yml | 3 + playbook-goatcounter.yml | 164 ++++++ 8 files changed, 499 insertions(+), 231 deletions(-) create mode 100644 files/goatcounter/docker-compose.template.yml create mode 100644 playbook-goatcounter.yml diff --git a/AGENTS.md b/AGENTS.md index 118cf8d..0666581 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -71,6 +71,7 @@ uv run ansible-galaxy install --role-file requirements.yml - `playbook-netdata.yml` — мониторинг. - `playbook-dozzle.yml` — просмотр Docker-логов. - `playbook-goaccess.yml` — аналитика веб-логов Caddy в реальном времени. +- `playbook-goatcounter.yml` — веб-аналитика посещений (GoatCounter, SQLite), собственный логин. Один инстанс на несколько сайтов, сайт выбирается по `Host`; список доменов — `goatcounter_sites` в `group_vars/all/main.yml`. - `playbook-gramps.yml` — генеалогия. - `playbook-calibre.yml` — управление электронными книгами. - `playbook-transcriber.yml` — транскрибация (образ собирается локально ролью `app_image`). @@ -99,6 +100,8 @@ uv run ansible-galaxy install --role-file requirements.yml - Суффиксы шаблонов: `.template.yml`, `.template.sh`, `.template.cfg`, `.template.conf`, `.template.toml`, `.template` (для файлов без естественного расширения) — рендерятся Ansible модулем `template`. Расширение оригинального формата сохраняется после `.template.` ради подсветки синтаксиса в редакторе. - Большинство приложений определяют переменные inline в плейбуке. Отдельные файлы переменных только у homepage и transcriber (`vars/homepage.yml`, `vars/transcriber.yml`). +- `vars_files` в precedence выше `group_vars`: одноимённая переменная в `vars/.yml` молча перебьёт значение из `group_vars`, в том числе из vault. +- Переменную, которую читает больше одного плейбука, кладём в `group_vars/all/main.yml`, а не в `vars/.yml` — так её видят все. Пример: `goatcounter_sites` (плейбук goatcounter заводит по нему сайты, caddyproxy рендерит из него имена в Caddyfile). - Общие переменные из `group_vars/all/` (`main.yml` + vault-файл `secrets.yml`): `application_dir`, `bin_prefix`, `primary_user` и др. Загружаются автоматически для группы `all`, поэтому плейбуки их не перечисляют. Хост-специфичные значения переопределяются в инвентаре — теперь они имеют приоритет над `group_vars`. - Каждое приложение: `app_name`, `app_user`, `app_owner_uid`, `app_owner_gid`, `base_dir`, `data_dir`. - UID/GID сервисов: новое соглашение — диапазон `11xx`, причём `app_owner_uid == app_owner_gid` (одно число на сервис). Новому приложению берём следующий свободный номер по возрастанию. Старые сервисы ещё сидят на легаси-нумерации `10xx` (часто с разными uid/gid) — их не трогаем, но новые заводим только в `11xx`. diff --git a/files/caddyproxy/Caddyfile.template b/files/caddyproxy/Caddyfile.template index 468327c..e3de83a 100644 --- a/files/caddyproxy/Caddyfile.template +++ b/files/caddyproxy/Caddyfile.template @@ -242,6 +242,23 @@ dozzle.vakhrushev.me { reverse_proxy dozzle_app:8080 } +# GoatCounter — веб-аналитика посещений. Один инстанс обслуживает несколько +# сайтов и выбирает нужный сам, по заголовку Host, поэтому здесь один блок на +# все имена, а не блок на сайт. Имена рендерятся из goatcounter_sites +# (group_vars/all/main.yml) — того же списка, по которому плейбук goatcounter +# заводит сами сайты, чтобы конфиг прокси и база не разъезжались. +# +# Без forward_auth: эндпоинты /count и /count.js обязаны быть публичными, их +# дёргает трекер с сайта. Дашборд закрыт собственным логином goatcounter. +{{ goatcounter_sites | join(', ') }} { + tls anwinged@ya.ru + import access_log + + reverse_proxy { + to goatcounter_app:8080 + } +} + goaccess.vakhrushev.me { tls anwinged@ya.ru import access_log diff --git a/files/dashboard/config/services.template.yaml b/files/dashboard/config/services.template.yaml index 47edb8c..f3e057c 100644 --- a/files/dashboard/config/services.template.yaml +++ b/files/dashboard/config/services.template.yaml @@ -85,6 +85,11 @@ description: Веб-аналитика логов Caddy icon: goaccess.png siteMonitor: http://goaccess_app:8080 + - GoatCounter: + href: https://gc-main.vakhrushev.me + description: Аналитика посещений сайтов + icon: mdi-chart-line + siteMonitor: http://goatcounter_app:8080 - Bifrost: href: https://bifrost.vakhrushev.me description: LLM-шлюз (DeepSeek) diff --git a/files/goatcounter/docker-compose.template.yml b/files/goatcounter/docker-compose.template.yml new file mode 100644 index 0000000..e290ffe --- /dev/null +++ b/files/goatcounter/docker-compose.template.yml @@ -0,0 +1,45 @@ +# GoatCounter — веб-аналитика (github.com/arp242/goatcounter). +# See versions: https://hub.docker.com/r/arp242/goatcounter/tags +# +# Образ ходит от собственного пользователя goatcounter (uid 1000 из alpine), +# поэтому подменяем его на системного владельца смонтированного каталога. +# Бинарник собран с osusergo/netgo и записи в /etc/passwd не требует. +# +# CMD образа — `serve -automigrate`, его не переопределяем: миграции должны +# накатываться сами при обновлении версии. Остальные флаги идут через +# GOATCOUNTER_ (дефис в имени флага -> подчёркивание). Неизвестная +# переменная с этим префиксом валит старт, так что новые добавлять только +# сверяясь с `goatcounter help serve`. +# +# Рабочая директория в образе — /home/goatcounter, БД по умолчанию лежит в +# ./goatcounter-data/db.sqlite3, то есть внутри смонтированного data. + +services: + + goatcounter_app: + image: arp242/goatcounter:2.7.0 + container_name: goatcounter_app + restart: unless-stopped + user: "{{ app_owner_uid }}:{{ app_owner_gid }}" + networks: + - "web_proxy_network" + volumes: + - "{{ data_dir }}:/home/goatcounter/goatcounter-data" + environment: + # TLS терминирует Caddy. `http` — не поднимать собственный TLS и не + # ходить за ACME-сертификатом; https goatcounter определяет по + # X-Forwarded-Proto, IP клиента — по X-Forwarded-For (их шлёт Caddy). + - GOATCOUNTER_TLS=http + - GOATCOUNTER_LISTEN=:8080 + + # Почта (Yandex Cloud Postbox, те же секреты, что у outline/wakapi): + # сброс пароля и еженедельные отчёты. STARTTLS — схема smtp://, а не + # smtps://. Экранированные логин/пароль приходят из плейбука. + - GOATCOUNTER_SMTP=smtp://{{ postbox_user_enc }}:{{ postbox_pass_enc }}@{{ postbox_host }}:{{ postbox_port }} + # Без явного -email-from goatcounter зовёт user.Current() и падает, + # потому что подменённого uid нет в /etc/passwd образа. + - GOATCOUNTER_EMAIL_FROM=goatcounter@vakhrushev.me + +networks: + web_proxy_network: + external: true diff --git a/group_vars/all/main.yml b/group_vars/all/main.yml index 004a23c..ff404f9 100644 --- a/group_vars/all/main.yml +++ b/group_vars/all/main.yml @@ -18,3 +18,20 @@ apprise_external_url: "http://127.0.0.1:{{ apprise_external_port }}" # tools (goaccess and so on). Lives under the system log path so it is # decoupled from any individual application's data directory. caddy_logs_dir: "/var/log/caddy" + +# Сайты (арендаторы) внутри одного инстанса goatcounter. Домен здесь — не +# отслеживаемый сайт, а ключ маршрутизации: goatcounter выбирает сайт по +# заголовку Host, другого способа у него нет. Список общий, потому что его +# читают два плейбука: goatcounter заводит по нему сайты, caddyproxy рендерит +# из него имена в Caddyfile. +# +# Первый в списке — родительский: ему принадлежит единственный пользователь, +# остальные заводятся с -link на него и делят с ним логин (goatcounter ищет +# пользователя по parent). Порядок менять нельзя: он определяет, кто родитель. +# +# Косметическое поле «Your site» (link_domain) — то, на какой домен ведут +# ссылки с путей в дашборде — CLI не умеет, оно ставится разово руками в +# настройках сайта. В комментариях ниже — чему оно должно соответствовать. +goatcounter_sites: + - "gc-main.vakhrushev.me" # vakhrushev.me + - "gc-photo.vakhrushev.me" # photo.vakhrushev.me diff --git a/group_vars/all/secrets.yml b/group_vars/all/secrets.yml index 78e720b..6e9c4bf 100644 --- a/group_vars/all/secrets.yml +++ b/group_vars/all/secrets.yml @@ -1,232 +1,246 @@ $ANSIBLE_VAULT;1.1;AES256 -34623131346139653664373036613532666565303039363565373735636363386366313233303238 -6630613730376536656663636234326332353236363439370a333166386530346666303531633666 -38323538623838623237636339613138383936383232346566333532383863623738333136663364 -3162386333383463330a643265386164613439643231313765623331376531306466313062363966 -65616337386232326433623763373464363135353761623430613036623761323965303333623139 -65633262623261656131393333646361393733323366343833386330663461663435373561626636 -31303437336431633630623835623633316538333339393866646661313762663134353364373234 -37326263396362343137626537333936366135663438373034326165376537663233356466356438 -35653637373864303864626433336634366132653262643731396636323963626363643666666635 -37393339353331666635626531343835346632363634366437663564376339386230386533323732 -63623232613137663266386161326333306530336634313666616437623931653232323431326562 -34323565653761636165303132313964373031626237626232623031656430356535613831373834 -65356263303364316465356138623737626339333530393661313638333931336331396336613437 -65323132666132363063333435383032663330653965373334643461303466353235313130363633 -31633134373732306535333433613839356362396261623364396339363630626636396632656233 -62333737633332383736626363366463663166306265646365373637333465393530386665363364 -37313064653434393761383066623638303162376263343130306439623166666366326639616336 -65386364633865626566373636393537653134333733666531616266636638653836383732383461 -65363132346563643439666431323934306330336233393363666164353839633534333132333130 -34303861653662636534373565306537366235663431333532653465643866363335383762333538 -62373332363265396639626137646334363933366633326462313336336265313739326131343165 -39336333376137393665316435363433613661393063306638306330313333633430333034373038 -62626265333433326665316634613562616631643161643930363632666262616431323536363066 -64353932623332626261326564396538663866623638326432303436356263643162336166636137 -39383432346365626663373932663134646566323061636235633336386236663639633663326265 -34353031343465313231336162396232303436366363646131613936303333376463363230636638 -30356137313035643330343536316138306633323635363066356333623365376430373231366439 -63633237633866656262313233633565666433626563393730376465623033353738383662323438 -39356265383161373933636133393534333934373664313962626637366466636132396563613435 -32653964663433646332616161616436363636363236353262613861643939376239636139626162 -31313638343765323736353961626238666536623330353537396464363935303439653139306265 -30323531626133393735633833326562333230323735623465326566393832303234646536626534 -30386263636537613366343431363262393433663064613631613665353139316639366334366133 -39353539306662636165346466303132633231666135313734653665303165356533653739396234 -35356338326631376631376136643930616164396466303733653266613766346334613338623133 -39326234363161363132643630323662313536386161633033623833613639643030366533353038 -31396430366236376232316462616138303832343862306361663061656263626466333036613366 -36386234666363396161333830636430383039356638313830666332663931383937623433613432 -35386136333830616239623161613538386238383130346435376230373838643339663066316130 -63663938626662396336396562373537303635343337346637626662353530623639306237313062 -34313664363838313133346533326137636239346564646661353566646163386663326232643766 -34613931613063646339313764383562363930386165636134653932393833303633643266666366 -61346238353636356564376165386339326662643634326431323766313831353039653565386437 -62343338656466343562643930656430666230303863323238373534633136386336356266666166 -36373536376263386434613533626130333261333633343439366266386336613665363530376432 -36383735313566666461323363383530636333616332643637653364373834643337346537626630 -61346331313237363832623535323936623163653233333562653035306336333831623338356231 -35313438626632666465353535383434343630306233306238366439623335343536346234616134 -39353938313536613531336134656262363830323561313730383331323165353930623066613064 -63646465626233646163303964376532383338633131383065313236616537313064303265383733 -66663132646130386638306335653531323531306437393364663135306466643365663235643461 -61633665623532386466623635376331336662666134373366346536363134313037393939346634 -64616332666630616235383136383536646233353663663634343762346236353533613832336436 -33643235663366626438373932633866626366323035363835633036393266613163383933343466 -36303630653731363637616337323030646164306264636237613032303738643938663032663365 -65333334303030313562636166653766306265636238653161356166616138376665613338396564 -36383732636331653934636666393861623965386666646630393261303365363839343838383266 -31616162643662616332363737373865353366343030623839663330343861313032363161306262 -34316161303432393365376431386165656464393632646534613930643966663330656532363162 -63366331323634356337366433643262343531376638666536383766343963663839656438353465 -33653132383336616166313330306233373630393530303161306634663830656433653739303466 -63373436613663643263343262643536366138333439313538656136633932383065643135303237 -34636637373863326539653836333430306537353436323832373131343435636233393762376430 -34633338396138376632653863633935643462346438653066623633323431336230616564613236 -39376639383837303430323939653435656437303635343335363965313734316134303166613238 -62616238306363613334313362666365633335336637393332633564653035303034333866623634 -30613432636539383031633266383166303639326133663065323236316561373461626637333138 -61376134366335646634623062333633306666663666303464386430626639373663633938396331 -35643138303561316531363165326230653461356133346531326466323966353330343438306630 -36613466336638623934373232316635633032343561323535346233633261376235613263316233 -34663635353732336234623935323631613831336639636338656332633832343238626361636364 -65636632633534343735343737666237616331353737636332333034393630303133376136663332 -31613532653566393164663738303138616233623031646665323266313863623761646465356135 -62303864336538306661383931346364303961366330396639336461306537313465663239623766 -36366262383662613432356333653765383432316333326535353062376539366434326638336361 -30653136633362323066643732383636626530363163376230306338353066373732376133313064 -63356532623331353538623561333364623037396262323864643061333131343061653330343632 -63386262626431376231326131396164613463383034346362396439393133373666316637346134 -64343538336332633131333530323462373864633665343439303162366335343234383362346434 -36356662656530353932616339326233336637396664636464396462376636646432313665323235 -66376635396436653137383039333932356665623932303433393264656632643632323165386430 -34613534336632613230343532346364663338613932626333663432396461353638646237613330 -63376265313536633838663031326133363563353266313464656666356538646333643361646239 -63346163646164636539333566393865303534646534396366363262353430613463326637336664 -35373433653336613934316333633565383863623562346663396433646633366130613339656466 -62346339396438656334333934383432326661643236646537643564346538626533613565303235 -64623038356162303338663037646137366136306232396535306565356132353830663566643465 -30373233323930333862633133303663646661323566336238363435376138383066383136393938 -37356361393334313735306238376134373930313834376566313236376665623339363039626463 -37306364623863356335373234366266383331326635653730633535363464326431323030303534 -39303231633664353834656162346531663933666133393462383135313764346564646162666563 -30633539643432383934363339656465646166326261623465336136333236343030346238653234 -32376363613864383162666138346565633239336361636435353362306163396133653432306262 -39663464623636663930643162353537393834653537646536313330376136363230613063383362 -38656632613834623362353366653766313735343665343661623836313339626433306338306366 -31376666303734666461663462316339663130623763373034316463643537653839363762373431 -64373064386564656438393030363135653030626665656337363366353130373237376331663231 -35663463383530653163323565623234316431336663363136356238383064653739343661653066 -32613535633631343563313262353063393733363230333236363665643238663338306639623932 -35376136616464366563386138636564636138623939663535393565653638303731343561313466 -64303838646538306233653437313663393730653139626166666433396434316239316662316537 -36333037613761313263396631386636313662653062326630383038656463366430653236333131 -33323330373833663763303930353339643363373266633734373732343632383138616235386166 -65343465666264366139376466386366393230376264313935623961373966333964376362356133 -65386564343332313037323336633465636439356363616261346435633536633331353935653364 -64616332326239653730343530656466353664373935363062633132326436333538393961346535 -37303533393036396662326263626432623135336530383939653833636634636135373431336638 -39353539333436356363623665633533393538393039653230633737653231616363343636353631 -39303361316565626564313237353738393533646666363362303866386462313633393531393034 -33633131376230616361323530313231636334653164383833326164393965333532363736373130 -35646162636538326461363163396362383366623635666162366136623363326266613632613966 -37663566313338633765366333663331336132636261636536353163306333346431373733396634 -61393536613634396530306239663365396563636563393038303831396135393831656430663363 -30346564663765636361613265393862636664646330393962643637353536363063363834663763 -62303836663963613438313161613963376262323337663166633530626264343034386563633266 -38633664636362333935663666383135393530643063666162313762316230303230336665383438 -30386664393239633931383230663464373235343964626534393663666236333933613965336632 -65633230356565623162396161313465636532333436326430623531646563323434363734623462 -31313638353237623230326361656533336661396533623566343062303164313566643538626536 -32366564353863343936376362666666303838663162383139663039353864383961396437306364 -65666666353335333733333538653336323763326437336338623466346435373239343533316365 -35393463656533373237363537663234303231396565663230383463336665656562633162366365 -33303337343464336262616332393465333963653164353063316630396432333264316136323465 -39376634616632373536623563626561303933346366636239613233303039643866643038343861 -63613230396632383031316336313862323166373939316362663236333564636437316338626661 -63656138666137366439343364346164343435326339366530313662626664383665643931303036 -38383761383964646231383431616265363932623630346162653738663531623236646138663165 -30323738386664633235353562323638636466353965366638626164656535366661333338393534 -31343039616562346232363831626136643131353834313161616531613633326637393864393831 -34383432363230313463623536663432356333386236326335373937613062646634346439613961 -33353364623363653136646262633963363265636263646466613833623330326434303634333161 -65636365663133306537626232333939316531353533316231373962313233636130336333323665 -35626363363432393032656434636635663263643664376134393239633538386438646232326234 -33623766643863643262636338656131363861396130373438656537653061343134393436653336 -36376163363133313165663436333563373335653761643236616664373231653632646539396132 -63336335363631613732373834313566316336373939313639306331383063366536306138646639 -31396337646465613237663733643762323339626262353862333030313661653231366461303338 -31313463353934356239323464343036316538643130316463646532633234336239663162636265 -66376137316235613130656266386661646336613037656563396338393134383835363232383130 -39373835313533373261613139326130626530383039383936633830373931306262623431396236 -64326337303236646136336466333764613032663537613935373538373939363965363734613339 -32316332396433333031356365366638313332313966616231353836316162356664353665386334 -35343032336664313366383435623632396538633264616637623363316461393561323966326133 -39306639363264656633613462336564653066633263333132623139643132386130623138333532 -63626433666566373037333035356231373238363039656562363131333634376138386662343230 -32613762306235313361396262633666376663323033613339353836363534326232353236613537 -38656139396265303030373539363766366439326332393130323631346233663436646362363237 -35303266383763663332656235383836633733333965303066643466376465356533383439643766 -65646663393632326136653332656164393834343766656333346364343332363032616636623637 -34313535356133653830343138653366653664353032663537383862316262303733613264343235 -34313939643639356261653334376533333330303632636266303031343031653432643763383462 -30646633346239663763646437623866346461386535643338323162363039383531343330383432 -62613564643966383463376133376538306539646463333338653136346665303836396538336237 -32373565653061376461303938383139336437666339333762396561613661356464326266303166 -65613532326438616434396461313130313761613063386633373462646462653065646162656264 -36313035623662383965643336643830643033323136373066343733363036666332366537336630 -31613532616135383365376635323037303361393561376166343638336663373532656165346333 -34383961346431363966356339323030373565313266346436326433633934363964313866323938 -32636538323838313064303330633436323062313637333764626437393737356337343661616336 -37323230353931323339366136633334316261646165343430343834326339303238613534363138 -65303932346435616563653961373561623761313534363732353633353330623030643033363730 -61383961326632393362633932353065613636313932633966616534383065613636363734306466 -66363933626561663038376334656534643566316134633338336161653532636239633536313933 -66616162386538346432323761636134376638336337623539646262393535613263366536366464 -66643566333162643261653136393331343431646233643130336562336366633664353734373636 -30633762333366613764346436333737623266343631363330356366663632366565396564613431 -31363439393463623334653666663636613366633437333237653363396561386233326334613831 -33643936366566373435653161346566636639633039363939376366366336373437346664656335 -65333633363336366263366433396661336262373931366639333362393939343031376166393362 -32633330303861666231393137356639363164303736306631656338373938666630316261393766 -64663935366265386463646163313336363066353164336631396365386465393933303566313333 -62336139666337353637646566623537613038636265636537313330666631623864333662663531 -64353563303165323066376133316266636433633863363039323535623862346663636464353031 -34333132383661303739333861326230346234626339633336383136333135336464656435633135 -32396139663737353062623533356638346563653032643465633333373761376362613434656432 -31623363376461326535386164616665363065623933306435643061666630363862393138663165 -63646263326665623066336361643836646437353432653963363165656364373531613362316632 -63633233333764626433353433303835663962393963656536323734643966333930633162636361 -62626437326437303766373331656232363763326565373535656266383365666336363466396438 -34356266336132343830336431326638383933393163373130653735306534303364373933646434 -37396235386162353232646639613531643332303038336330653234633437353464343131633961 -31666433303238633934646531333736383831376234326530613335346530363962643935656662 -35393066346136353534393934356466333036323666366263363561353861636538356363376362 -31376662376566626439386165383934623135613162613339356535643762626662363263653330 -33643166656634616534343133363030363930616231643535303163633436623463656364316631 -62333562636533306562376665326338383539313632666435636332353363613534316162373261 -31626535363334306630316463316264353633643738643939313932376461383833653232366438 -31323834613565633237353331386331323063653132343639366333613633623062643932346462 -64326533393438633530666266343435336165346131383330366264613138626630393939333131 -32343566613730313236626165623935343535656137306263306635653966613165356263653733 -62643036643430613231663332626431386432653632333538323465333562326339313538373332 -34663165653833356366353065393161313230666662666638666432663132303334363965346635 -32386236646366396530303635666539336538313530306462383335653738316364346637623361 -32646561613539303636613535643966356537353731373034343231373437383432373638333564 -65643932663566343761313064303265653963643264336230316163366638653537663464663937 -36303333393833306235636565643831376135373737373562333964306537383332343162656563 -31653462363734313531663738336430336630313537333039373366666539313362393134333465 -35636130383936613166316536663735616335373863333564383938323633386262363534306230 -35386530346539393434643362663961643430333532343032633832366137316362646234663437 -61363265396264636664663665633038623736646130303430353964653136633131323266396439 -63623931353330653662383261363431383866663764333037303463306637306262656630393261 -63393765633137323033316465376464623634363537396135623334633234356437653430643062 -36323766633162343862643538623364353839333861653862643864666234323965343336643762 -34666639303061326136613433623130333234303562396235623639353136613032363139636266 -66643732346339653764343965646263366639306263633837336232346465396535383530326337 -64396462633330336633633766323932316637376663656632633037356133633331303166663436 -38333434376534656562346638653130626462313564383366353537653531326335383138353330 -35656361343039343933316435646232396363326663643133373734616336313237386365346238 -31643732633630643066323935336432346363346636383239626365373232316230343239643365 -36383135643830386539336431643635323062346465383930623531663834663437636433376336 -32393035633534366639316339396632646538346661366564373366653766646263663137373561 -37306630336566326433643939376134333030653837343638646133346262323935653565363664 -30653036623638666535623964353738343461303834346535376235646566343761663438626135 -64643731383535363065333331346263333464623732306566326666643230623231336231643136 -66666664373334396139356332343564386332626632386332323434326533383063346532623035 -62303765306132616630323264363666343162313435343737303631346635393636363337316138 -30653966313563613533616362626263653261666464323664316132666462383334633937646330 -38646563646130393238663537343739643566346130616461366361643961643730353465366233 -63333163353532363564323032363162323235353262396338363533306131303934383562656561 -39366133376134353234653830623061363832643564353936343737303932386638396232303332 -64373736383538343662613033633564313532323663666333353632383431386239643631333739 -38303536343233393763386330323730653861333831393464306537316363623936663631616236 -62633932323831356361616130653266346439643837313339353338663330663136656133383332 -32646330626161313961633035323432313461643261626130636139646333623861663165626132 -30303330343632303239303938636662643037646431653662613839663865643638663966663064 -32616330643030656532626635346138386431383963376262663966313164643236616164356663 -37396432663463663039623334303235376462353930363939366430346664383431343062386561 -31336338356537636632663661356561343838373666383862333036386137333336376638613431 -32623234343065363762383035343462613766626134326165626636336335306239313363356362 -63663138613632396135323762633964653831663437613763623162336339396639656434323065 -346439636339643734636633613463343231 +33616165353931656432336130616463663066336561643964346139376535633630313039313831 +3163663434323730343337333137313366333832313330330a383833386138666139313536353763 +39666132343135613236326436633630663662373036623030623336366433356132376233623333 +6366333565326331320a353037383539653766653765343365633134643032323739363436633637 +65356435313961613266326664393165376335313534343832366436303339666233333132313865 +34323865633337386561643237383133613566613534383664333664383562366634396361646363 +64663530613337643461643133376637663462363261343464373238393730393939323762303263 +30313432613136366330343930383263313436663233346630366263643939343530353661633638 +30666266353161396163636236666665643035336237613037323361303361323934333933613464 +34373639323163363835666633656133363731326665383261346633633835663937346233326135 +61356134656165373136396634306164646361303536653633613732613635626234643961396437 +64313164306130666364653561306562633732663561346562626538353462386461623662626232 +35313634303163666435326230636464323038346137353164663837663734306536666233393736 +62356562396663356535613634313639653363623030373661666333663138366630386630343831 +30373231373466303866653933303739613835313734396564303339373439323436613235363934 +30326338346635663030393135363836663332333031633239346435623734303932366466346430 +66646432613165666665396535626634316161316334653830386365626631393466363439656135 +34323332643035313835616636623038613137336262366630663864663866393164373832613938 +65646133353131333430386631616464663162373533303838633335393737653465663762346639 +62303166323761373164383163616539313835356134343039326166636630653337316334623535 +31643431616337313266383736646162383765663630613332323733303233656432633666376331 +30303763636131636330626635323639316161343365333864396633356631653431396438613335 +61326365356130316263353034336131303835323535376466313534666230393766386333636265 +65336538346136303038393566373131313762343465313539373961333739623433393532626237 +62383564376232613138323262343064626338633934383536633537336462336664386463363564 +64333164613234373033333463323662376533333165363461393533666566376135356338356430 +61333732653863376266616436356537663761333531396237393637383062663532373633633531 +36613537633063636539363961666133316338353439613432386139376435396464386330306433 +33623037383761656231646331306561633763306135386638383366356232616230373465393733 +39656133313062356633663865353137336235663532363661336231343139343561643639623466 +66356535633031363231313966653566383137383436376166613863633235343061303037333032 +38353961386562353336343764383938633633363761396563373065353266666434306235313230 +62306337373430656531353430303131343239323739303434333632396365613236613861643136 +31356662653162323465316334623733666331323064353337376639343563663436346461323965 +31623731613334636361353961306163626666376162313165333665626439613339663138376338 +61333234663239353562336632613662323139306639363234623830643736653536613063393165 +30663836393039373665336461316632616431626165376631643566613932633036613537383663 +36633166386139636539303463623266633333326137666135643338303239353436323232386233 +37376630366635666533646538636539363633666634346462623635623539623361336362626563 +30393464666336393230393334613665643231373633653631333965633632303437353634376333 +37313836666630313963626536626537333434383663383538313538343134326664323032363666 +64653562313433386661396133373534636362656666646563376166313361643031333537393837 +62326231373431616633633862396334393133393832383231373433353230303638653139653065 +35643637623361346439613831636137663531613638396232623632363837616435323836383036 +38323161343066653563616638663631616636356339373932623237306639333065613430643864 +34613635633131663433363862333732353562353731333165666533356331363964343731636364 +35313537336366336435333831313834353565343635386434303362333238623930623461393037 +34653163626331326364343364393963373739326430336533653462313833626262323232383263 +61643636316630353530633234666462363032333135303431613361366530306538623133306336 +32323265623863613037653962323361393966666464346539636239336164366635396262383032 +61643231356235643532333666626366633430643262626263656135636436333030663739366638 +35303462633731373437306330363265663965663664633237646334386532653462373431306133 +63303434643630323461363135386233346662616236343736306339653662396330383664656334 +37616634366566613934656132316434643162353233396331323033313332653230316135336564 +66373735303535303130666639626139333664383232343938336133396164393362333237653966 +35363931326336336262313266653931366239363931373134346464353164313639353738396231 +66636533353536373532623032626333356266633439613961633137326439633964353634363362 +62353461366637366531316433616334343762376239376562356230346534353530356531313339 +32656131343430383035333264393331643262346632623166343433313262323234383064613636 +62336330636136346162393961353432353236633630666239646138316366363739616464353765 +35326661313864313235633462623231623634343662626131346530333762313535393937336437 +31376437313936383232633231386538396664346465666130353061656133306163653734313862 +64653736366232333561313435306335623730313635333938353965313762313334373932653030 +35366266626636356234386631373838653337646361343233336461633330653632333338356361 +64396331326638333264633837326364636137633861333338643733393361633637656162616262 +63366333376534663932626635363239396134303362323239646339363836306531666266363765 +37646362336465346666376135373738663363653334393334616166396537333535353436393134 +63373535666535373432396134316363646239383733653638343661306266633831313935633639 +30386139323464343234336230363037373336383566376431363031326534653235656465373061 +30616531323365326639366431656437643435343739623563346266333865363062376464346366 +30353437663063396532323134323436323966326662643632663936316564336464303364643235 +39306532393838336235303335653537386530376131666236366363393132663931323534306639 +34383134666664613066663965303363336138613033343863373661376132333633646435383038 +63373330363532303339373934653264613761353962633061303936383336653338323065646131 +36376566643032663863623835613263663163376462356135376664313239653532333363656633 +39303063623136363238393761376166303837356334663734623736633662626566353164313134 +33383532363462396363356230623136313436646536666234363562333534303665333335633332 +66353635323162373836393033653937633336386531623966646663643832356162373661383663 +33353262643163316232316261353939303939336231366331366432393738333137303963383034 +65376637356539643138343039373237376231386438616566666562333938636431373037643166 +34376361363930326465353563653236396230656333316338623165366330653034333234653632 +34363033613939316330386264373630376633646130636539633561333233343135623636393564 +66356664363562353564613137363239343830393639333130383435396630396439633834623734 +64323633666564363736623035646235393064313733386635353365366461383634643939393264 +35363631666630373138656233623966613437666432633666333436663537363932343463373734 +36313962363538326537343931353538333030643936633364316439343236306338333730373830 +63396337316130393036323266643063353665303539386265623134313164656534633131303565 +31646564323630343964306235386165663438336465343764633964623262626237636436343032 +66653962333838303432316435316663383964333036313339343437323238333466313237336166 +31336330353530373862656139626365303539343537393964326434653765646363373238383539 +65353861366239343034316365343262656136353931353834663639666132343531313433306431 +65306163393162653531343838633061336666363461336262636338653332396163353432383230 +35626231656431653064373630303936353432373332316130383831343463653339626639383834 +39343131393032613034623237383738666634393635343034333639363034373832646137383864 +35363438376131656262323364623836623137663662343036356561396262386336346261353133 +37633634626439663039396564646639663162646436646162393138333561653331363338313763 +37353138626232376236366432663262333566323533646665396234656366313939376132373562 +32653964333538666430313230666262666362306231303637623539623238643862353532306166 +35353831653063393664343061393166323962303564383166626539366464373935616164313066 +34666330656462326338313837653666653037363566333062313765383136636436363732346265 +39363161643738303433663838326163383534636463346264343232393564653230636566653563 +38363138383637653963376432633161616565663663333038363736653362383261646337356633 +61613235303765613830633866636461363861646439633566323938643738613932656431383330 +65373933323161303761366639633331366531383664376435646337353365653332643163336438 +61393533643962383863626530363534396134633030313865306263343139376165663239323761 +66363737366662373862323938373764333261386639313433346539656664383063353336363031 +37303962663834623062346166616461373737656435313365373863383761646466616535633163 +32353562636333636661623461653264666439396230326437613361336434363238666238613866 +39633365386639363263373439623431643964393934383831353733646264393838643430643134 +31616338366663653036353633656230646232636532353431336535353137663832376261333665 +31356565316636396137336536326631393439303330316635363464393434643333336334623261 +66643938313739623135636365346566636435663662343932346238633431313730623661396237 +63323833313732353762313237396633316137313335313536623530323465386231623265666463 +38636461643233333733323030346231663833646339653037353065316363343031353066373665 +37643764613933666630376563353662623461643866303335383237373532646331356361343036 +38353964623237393133383063376135353538373035653831633333333133626165333538326264 +64303464646261306536393264326636663035323638633034626139326331646161393334663365 +64386561663564613636613163353732646362383931646366616333316463633830626539346137 +32303831326435326235623836643031633863333562613438643465363339663561333239383835 +66366561653733323638623736363265366434393835326263623962343832623230303337663637 +31383361323434353232383363386339366232626264343137623432656234633532666436623837 +64353239373736366330306331316331393065323633613235343666663932386563623764353661 +32386361373537613838393536303031303630613637613961303863356231316364643230333139 +30343362636265373265363937363965313939663039356335396161376530626433363362393231 +39356139333633393433646166303762623330323763336464626537643837643134343639623331 +32386230653535636663366433333765613230373761363236663665303665393635623631613530 +30316561393063653732343137356638636263373530336266653239316431666464353861323633 +37656664393035366337343262616532626262356263653433373739373865356139383033376536 +36333564333039623663353162383531653066306332306436346366633030636632336637343566 +66393966613239633638313161636266313936346630623132633966383535336630316462306265 +64396537346538383364343336333734343863623663663238653134613737383966326436386438 +32646266373533376434613262383432363633613031613632633233633863343834313864316365 +33646661653534376437613061386532363035646561613533366134393739373565663334383134 +64303539393838383466343437386139616361393139363231663737303730353663663334653037 +61306165316135373633373630336466623036666134353436393834346638636165646165333065 +34636333646331346334303565363338396463373831353265636231623130313539323437343732 +37653030636464343962613764626264353166356161336239386631616339383063653138656530 +34343133366537666238616132376331303933366135666231643662633139383134646533656438 +66306232363562653231653865316561373264306333646663373062653535623136393038613231 +34623562313666346131316462346131613761383733643161336266343639626132636536396334 +37336263326532376336363030383864626534343937303134666564636230396462343862353431 +34306165616662663535346330656130636131656663353232656361643137306562623765373061 +38366266376530613636306664383865393631616462333830386535393734366239313834666338 +30613162343361646433666366346637333837346664323230653037383366613431313361343366 +66346535333436303335313337623362623231303363323566366166346636623263326465663536 +30396538353934323465323165626132396563326333303066313862316634336661303433333637 +32366562396666363333653461313866376332373065623063333335313538633861656639396638 +39323636656432656630666531336661366134346635623464313031323037633137356633613330 +36323065613562663865393033616661666136633063653163303665373535303135623565616539 +32343166366536333261653138333433656635646462623035646537353035663861306463363638 +61646664366465383134386365353537656266363065653937646530326639663739626539663837 +31353537393438386239376631366661386439343132616536333463366665396161633337653630 +33366133333363383034663832346561316136613438326130663733376664623831396135383336 +30343335356532363534373539616334383034356336663962373636303866653031623366626535 +32303762383738663764313434333864373739386436643333356264383333396636333831383833 +30313235363932616633383462633335613534343361313837393236336539303333336663656435 +34616437323931326436306430366436336338326339323037316230383262343032343765613461 +36396231656363333566643232306639376466613636336265363333333066626263636530623365 +39333935626161623263383739663461613262306437343366633862643935613633613236303334 +37393765326665303636303563393634373933313838353063386533396234623837343333663861 +63353536633061343066326437306233373736626539353637623266306434633932343138326562 +66663530323438313664383132613139643562643966386664613964613865306231663566303762 +35396137376435623636346531626434393737656437376533356564333130346464663232613333 +30363834643863353139313664383061623061656537386536633236663165666665643435363132 +30386666303461353534623963343732646564613939393365353763303563623265653631343539 +36653934653661303533346339633665346165333162643334396134366162616266656139353033 +36343864373264633735316236323733346131646330326564396132613661636165323462346639 +39636238383832316132376534373034363136646335303835336539633431666330316330363432 +36663835313166386235653639396333316236333162316266306566623765393135363033393434 +34353839623362626163346531643030613632303263663331386462613038303033363461346133 +65353966336635623234643136363439313461393831306334393036623733386232333766383033 +35343936663731633665303866333632663066346535383737356262383736643237343637353039 +32386166653565623638376531396639373432346163366130333765666534666637373639616534 +36386532386133333264376637333666323438336561643636353936636531353934316335323537 +33626239346261663833643037623232343839306231363365616634636262363238633034633331 +37363831666630336232623762643862323762303765373062363336303463666562643436663164 +66613466396235623732613337666430646461313136333437663635613661363937663234323936 +66336535646430333536626632643334336234616166636166393762643536333566633163323633 +63353366323339643563313939303734656561393137643434346339373439643363343239306235 +37316563643138356433333934363965646635353764366338393563656237666435646566343838 +36333831333837336532393934323264353661383530623932343132666461656639323764646134 +32656361663037396430666333336538336235623337373065393664633739353630633431333833 +34363461373234393534393431306565623862356634333161303964343761333735303162636364 +66653964383362323034643566343930623731613433333965623466613161356530306233646364 +32643039333233613964623463313462326331613936353162386435336337333462306331393836 +62373333616438373261383634383262393738613933323935343132323565613565653363356339 +30353062313538366161336366396264653437346138323830363637633837313864383539363862 +66343235306330323261633261623236663163316139323463363635616636363237343431363862 +61333662623166343263343737306539333734323137336238316131333938363233636136646635 +62636333306330366561646165346136343932316566363533343038656437303839333362646133 +63376431373930653437333731633634326636343238653133633261623663663166316530666434 +38653131393163323136643061373065626534653963343935323534623561373932643262376637 +32326230656632373334633563366161643033383638623537386562636537323832343330636230 +38333163663436373136323162646333616234336133383965323939306137386132356330356137 +66373864336433663239393563623061313137633963303438393665623132316232656336376234 +32396266343237366532353766663332666165393263346261646363373263623938616161336333 +61383563653239633433303835613835633464376434636434616365326234313638323430636535 +61613061343665343865643735623132303066323035383533373962376439336563633262633631 +38353466353265636233666632373464376165366364376231393438653364313737363765626566 +35663439643832353334613462636432343166313334396638326237616235303463373133646635 +38666166663630373962376539333237343164333632396165396462323534663234303639663839 +66656639356639393665653833613635393239323666376533663534353036623739303837366638 +39643332653337363039303366353231623263656230326466353236343136626661633539643964 +65383762326661353330616139386535356266336265306135373335353836366434346636313230 +36343336313463316661663834376361663935663633303236373734613864323563626436353262 +64616635653864366433663135323763393630386234343064656631653730316434333435653463 +66363566646461346363343363396266623764363934653561313962643662336662363439643736 +30323737653532653665326363306163666439396265656537653766393239336633363033623039 +63363164343334663066643863383731666233663164303661346362376231363233333564616162 +62343163393961626638303131346130646564373866633561363836316531333230313638616334 +62653939623663336665666163393166663434383234323531636563366636336631663065326163 +61343238386236643937336530626131616266333463383866626435663834376537313365346133 +66313364356634663831316332663634333632363263373332666232626461623933353534633764 +33643063313065313637653732313066343661383637353565646637306337303830356630343338 +66333836303331346233353434343964356162353432616333353930613431663365396166313563 +66343133333061363636303736336536336562333638386131366633303335646432353239333562 +34633235303934626661653839643664326564356565386436363863336331306530616261646132 +30326266316530346534393566316630616366336262383434383635636139316261383161323437 +61363231653037623836356438623039373331323930306465653739323061613334623763353334 +30356532636133626639653638326330616138366234623637396332633132613436633463303634 +38356166636231653938333832373838376262316337373130383936353335333034636236313434 +61613930383065623630643034643539623439626335633733613832623930386362646235633537 +35313036366465363461333461633965666664333262396163323537646634643066316532333935 +39306538393362386164626334363936313666353633343431343362623738376437353830373432 +61343866316338336538666635393631373665623834333231616266666133346531373138643866 +33393433333865323730363730386366623032383534396261656134323132663536363331306464 +63376232653762313539633137623039633862613236303465383838666133363931393034663834 +66646265623162646466636264646265396331346634613138663861363761363334613239323536 +63623138373766336664636266336239346331343063373564313265663166633430613366633630 +62363961653431366431316536633735646563333732613163386236636138616239636333316534 +62363465333865323564336366396463626339386135316130343131626261376631376433356465 +34616133653739646236636538383366333163383832656632366230316635313535326435393961 +35336330303066346165656561386663656333653234326162363262363163353131343764316562 +66363835336339376336323430313764653632646131633330323230376233353365333661386434 +39623235626666633862356438303734303965653837376266323932353861633362383630636438 +34643763306461353038376563666334386334383038376161636436343233633331313738333463 +31653031646266633462663136353039626432613462343763623733663135383366616565633037 +63303266356566636163303230613734656132643963613063366135313834313436343563643333 +65346663333238353466656336626535666534363733616330386538356436396237393937396166 +65376663363864393262353332343064626261363030323333323533376564313436376533666533 +65643062396461383635393865363032366234336339633464386166386331376630306632313434 +33343933363032633332646638393132613666633166356638313431323330313266306664316464 +37363632333737616630373961306237323332613733623864396665366537353533316665376531 +36363334613462306535653738663762333265616630626638396132386434313432353538396236 +6637 diff --git a/playbook-all-applications.yml b/playbook-all-applications.yml index f7caf48..0205680 100644 --- a/playbook-all-applications.yml +++ b/playbook-all-applications.yml @@ -70,3 +70,6 @@ - name: "Configure goaccess" ansible.builtin.import_playbook: playbook-goaccess.yml + +- name: "Configure goatcounter" + ansible.builtin.import_playbook: playbook-goatcounter.yml diff --git a/playbook-goatcounter.yml b/playbook-goatcounter.yml new file mode 100644 index 0000000..e6b57a1 --- /dev/null +++ b/playbook-goatcounter.yml @@ -0,0 +1,164 @@ +--- +- name: "Configure goatcounter application" + hosts: all + + # goatcounter_sites приходит из group_vars/all/main.yml (его же читает + # caddyproxy), goatcounter_admin_email/password — из vault-файла secrets.yml. + vars: + app_name: "goatcounter" + # Родительский сайт: владелец пользователя, к нему линкуются остальные. + goatcounter_parent_vhost: "{{ goatcounter_sites[0] }}" + app_user: "{{ app_name }}" + app_owner_uid: 1110 + app_owner_gid: 1110 + + base_dir: "{{ (application_dir, app_name) | path_join }}" + data_dir: "{{ (base_dir, 'data') | path_join }}" + + # Логин и пароль Postbox goatcounter принимает только внутри SMTP-URL, в + # userinfo, — значит их надо процентно экранировать. Фильтр urlencode + # оставляет `/` как есть (safe='/'), поэтому дожимаем его вручную. + postbox_user_enc: "{{ postbox_user | urlencode | replace('/', '%2F') }}" + postbox_pass_enc: "{{ postbox_pass | urlencode | replace('/', '%2F') }}" + + tasks: + - name: "Create user and environment" + ansible.builtin.import_role: + name: owner + vars: + owner_name: "{{ app_user }}" + owner_uid: "{{ app_owner_uid }}" + owner_gid: "{{ app_owner_gid }}" + owner_extra_groups: ["docker"] + + - name: "Create application internal directories" + ansible.builtin.file: + path: "{{ item }}" + state: "directory" + owner: "{{ app_user }}" + group: "{{ app_user }}" + mode: "0750" + loop: + - "{{ base_dir }}" + - "{{ data_dir }}" + + # В data лежит только SQLite-база; бэкапим её restic'ом напрямую, без + # промежуточного дампа — как у tududi. Записи редкие (пачка просмотров раз + # в 10 секунд), ночной прогон почти наверняка застаёт базу в покое, а + # retention страхует от редкого несогласованного снимка. + - name: "Create backup targets file" + ansible.builtin.copy: + dest: "{{ base_dir }}/backup-targets" + content: | + {{ data_dir }} + owner: "{{ app_user }}" + group: "{{ app_user }}" + mode: "0640" + + - name: "Copy docker compose file" + ansible.builtin.template: + src: "./files/{{ app_name }}/docker-compose.template.yml" + dest: "{{ base_dir }}/docker-compose.yml" + owner: "{{ app_user }}" + group: "{{ app_user }}" + mode: "0640" + # SMTP-пароль стоит прямым значением в environment: — без no_log его + # печатает --diff. Файловых секретов goatcounter не умеет. + no_log: true + + - name: "Run application with docker compose" + community.docker.docker_compose_v2: + project_src: "{{ base_dir }}" + state: "present" + remove_orphans: true + tags: + - run-app + + # Сайты заводятся по разу, в том же прогоне, что поднимает контейнер: пока + # сайта нет в базе, goatcounter отдаёт на его домене открытый мастер + # регистрации, и это окно надо закрыть сразу. + # + # `db show site` различает три состояния по rc и stderr: rc=0 — сайт есть; + # rc=1 + "nothing found" — база готова, сайта нет; rc=1 + "doesn't exist" — + # serve ещё не накатил миграции. Последнее и есть гонка со стартом + # контейнера, поэтому ждём в until, пока ответ не станет осмысленным. + - name: "Check which goatcounter sites exist" + community.docker.docker_container_exec: + container: "{{ app_name }}_app" + argv: + - "goatcounter" + - "db" + - "show" + - "site" + - "-find" + - "{{ item }}" + loop: "{{ goatcounter_sites }}" + register: "goatcounter_sites_state" + changed_when: false + failed_when: false + until: "goatcounter_sites_state.rc == 0 or 'nothing found' in goatcounter_sites_state.stderr" + retries: 10 + delay: 3 + tags: + - run-app + + # Пароль нужен только когда заводим родительский сайт: дочерние идут с + # -link и своих пользователей не получают. + - name: "Check credentials for the first goatcounter user are set" + ansible.builtin.assert: + that: + - "goatcounter_admin_email | default('') is match('[^@]+@[^@]+')" + - "goatcounter_admin_password | default('') | length >= 8" + fail_msg: >- + Сайт {{ goatcounter_parent_vhost }} ещё не заведён, а + goatcounter_admin_email / goatcounter_admin_password не заданы. + Пропишите их в group_vars/all/secrets.yml и повторите прогон. + when: "goatcounter_sites_state.results[0].rc != 0" + tags: + - run-app + + # Вход дальше — своей парой email/пароль на https://{{ goatcounter_parent_vhost }}; + # Authelia тут не участвует, эндпоинт /count обязан быть публичным. + - name: "Create the parent goatcounter site and its user" + community.docker.docker_container_exec: + container: "{{ app_name }}_app" + argv: + - "goatcounter" + - "db" + - "create" + - "site" + - "-vhost" + - "{{ goatcounter_parent_vhost }}" + - "-user.email" + - "{{ goatcounter_admin_email }}" + - "-password" + - "{{ goatcounter_admin_password }}" + when: "goatcounter_sites_state.results[0].rc != 0" + changed_when: true + # Пароль стоит прямым значением в argv — без no_log его печатает --diff. + no_log: true + tags: + - run-app + + # -link отдаёт дочернему сайту пользователей родителя и ставит его в + # переключалку сайтов в шапке. Данные при этом раздельные: всё, что видно + # в дашборде, скоупится по site_id. + - name: "Create linked goatcounter sites" + community.docker.docker_container_exec: + container: "{{ app_name }}_app" + argv: + - "goatcounter" + - "db" + - "create" + - "site" + - "-vhost" + - "{{ item.item }}" + - "-link" + - "{{ goatcounter_parent_vhost }}" + loop: "{{ goatcounter_sites_state.results[1:] }}" + loop_control: + label: "{{ item.item }}" + when: "item.rc != 0" + changed_when: true + tags: + - run-app