Inwentarz Usług¶
Pełen spis usług działających na infrastrukturze AIO Factory. Każdy wiersz zawiera: rolę, port, ścieżkę sekretów, status backupów, procedurę restartu, pochodzenie (kto opłacił / kiedy powstała) oraz odpowiedzialność po przekazaniu projektu.
Stan zweryfikowany sondą hostów: 2026-05-02 (incus list + docker ps na host-dad i host-mom; lista poniżej odzwierciedla stan realnie działających kontenerów, nie tylko deklarowaną konfigurację).
Konwencja
- Pochodzenie: zlecenie = zrealizowane w ramach umowy z 13.01.2026; legacy = istniało wcześniej, tylko utrzymanie / migracja; opcjonalne = poza zakresem oferty, wdrożenie zależy od woli właściciela.
- Odpowiedzialność po przekazaniu: domyślnie właściciel; usługi gdzie wymagana jest specjalistyczna wiedza zewnętrzna (np. konfiguracja DKIM Mailcow) oznaczone jako właściciel + dostawca zewnętrzny.
- Restart: standardowo
incus exec <container> -- docker compose -f /root/dapps/<service>/compose.yaml restart(chyba że wskazano inaczej). - Sekrety: wszystkie klucze i hasła per-usługa są w SOPS (
secrets/secrets.sops.yamlw repo, kluczagew Bitwardenie / na stacji właściciela). Zmienne środowiskowe wstrzykiwane przez composeenv_file:.
Architektura wysokiego poziomu¶
| Host | Dostawca | Rola | Liczba kontenerów Incus | Liczba kontenerów Docker |
|---|---|---|---|---|
| host-mom | Hetzner (baremetal) | Jednostka centralna — poczta, narzędzia operacyjne, sklepy WordPress | 5 (dns, email, services, system-mom, web) |
~50 |
| host-dad | OVH (baremetal) | Panel produkcyjny + automatyzacje + failover sklepu | 3 (panel, system-dad, web) |
~20 |
| host-son | OVH (baremetal) | Trzecia linia obrony (standby) — patrz Serwery | bazowy NixOS | — |
Każdy incus to izolowany LXC; aplikacje uruchomione przez Docker Compose w środku. Reverse-proxy Caddy stoi w każdym kontenerze, który publikuje serwisy do internetu (dns, services, web na host-mom; panel, web na host-dad).
host-dad — Panel produkcyjny + automatyzacje¶
Kontener panel (51.75.40.111)¶
Ten kontener trzyma rdzeń systemu: panel operatora, backend, silnik automatyzacji.
| Usługa | Rola | URL operatora | Port (wewn.) | Sekrety | Backup | Pochodzenie | Odpowiedzialność |
|---|---|---|---|---|---|---|---|
| caddy | Reverse-proxy + auto-SSL (Let's Encrypt) | — | 80, 443 | — | konfig w git | zlecenie | właściciel |
| convex-backend | Baza Convex + runtime queries/mutations/actions | convex.aiofactory.pl |
3210, 3211 | convex.env (SOPS) |
snapshot 03:00 → B2 | zlecenie | właściciel |
| convex-dashboard | Web UI do administrowania Convexem | convex-dashboard.aiofactory.pl |
6791 | — | — | zlecenie | właściciel |
| panel | Dashboard SvelteKit (UI operatora) | panel.aiofactory.pl |
3000 | panel.env (SOPS) |
obraz w rejestrze | zlecenie | właściciel |
| windmill-server | API + UI silnika automatyzacji | windmill.aiofactory.pl |
8000 | windmill.env (SOPS) |
git + dziennie B2 | zlecenie | właściciel |
| windmill-worker ×8 | Workery Pythona/TS/Bun (job runners) | — | — | dziedziczy po server | — | zlecenie | właściciel |
| windmill-worker-native ×1 | Worker dla skryptów typu native (czysty TS bez Deno/Bun) | — | — | dziedziczy | — | zlecenie | właściciel |
| windmill-db | PostgreSQL 16 — kolejka jobów + metadane Windmilla | — | 5432 | windmill.env |
dziennie 04:00 → B2 | zlecenie | właściciel |
Restart wszystkiego: incus exec panel -- bash -c "cd /root/dapps && docker compose restart". Restart pojedynczej usługi: dopisać <service-name> po restart.
Wdrażanie kodu: panel (image build + push → restart) realizowany z dashboard/; convex przez npx convex deploy --prod; windmill przez wmill sync push z windmill/. Pełna procedura wdrożeniowa per warstwa jest dokumentowana w docs/DOMAINS.md w repo źródłowym.
Kontener web (51.75.40.111)¶
Drugi kontener publiczny — strona firmowa, dokumentacja, sklep buyspace.pl (failover).
| Usługa | Rola | URL operatora | Port (wewn.) | Sekrety | Backup | Pochodzenie | Odpowiedzialność |
|---|---|---|---|---|---|---|---|
| caddy | Reverse-proxy dla web | — | 80, 443 | — | konfig w git | zlecenie | właściciel |
| aioweb (static) | Strona firmowa Astro (aiofactory.pl) |
aiofactory.pl |
static | — | git | zlecenie | właściciel |
| aiodocs (static) | Ta dokumentacja (mkdocs-material) | docs.aiofactory.pl |
static | — | git | zlecenie | właściciel |
| buyspace-wp | WordPress + WooCommerce — produkcyjny sklep | buyspace.pl |
80 | wp-config.php |
dziennie 01:00 → B2 | legacy | właściciel + ext. dev |
| buyspace-db | MariaDB dla buyspace.pl | — | 3306 | wp-config.php |
dziennie 01:00 → B2 | legacy | właściciel |
Failover: buyspace.pl działa równocześnie na host-mom (web kontener, master) i host-dad (web kontener, replika). Replikacja DB master→slave; przy awarii host-mom IP failover OVH przepina ruch w sekundach.
Kontener system-dad¶
Bazowy NixOS, brak aplikacji użytkowych — odpowiada za hardware, sieć, bridge incusowy. Restart: ssh aio-dad -- sudo nixos-rebuild switch.
host-mom — Poczta + narzędzia operacyjne + sklepy¶
Kontener email (148.251.193.171)¶
Kompletny self-hosted serwer pocztowy.
| Usługa | Rola | URL operatora | Port | Sekrety | Backup | Pochodzenie | Odpowiedzialność |
|---|---|---|---|---|---|---|---|
| mailcow (stos: postfix, dovecot, rspamd, sogo, clamav, nginx, mysql, redis, …) | SMTP / IMAP / Webmail SOGo / DKIM / SPF / DMARC | mail.aiofactory.pl |
25, 465, 587, 143, 993 | mailcow.conf + mailcow.env |
codziennie 02:00 → B2 (skrzynki + konfig) | zlecenie (TASK-071) | właściciel |
Webmail SOGo: mail.aiofactory.pl/SOGo/. Admin Mailcow: mail.aiofactory.pl/admin (login: admin, hasło w Bitwardenie pod mailcow-admin).
Restart: incus exec email -- bash -c "cd /root/dapps/mailcow-dockerized && docker compose restart". Update Mailcow: update.sh w katalogu mailcow.
Co konkretnie obsługuje: zgłoszenie #15 "Serwer Email" — pełna konfiguracja DKIM/SPF/DMARC, integracja z modułem Obsługi Klienta przez IMAP fetch.
Kontener services (148.251.193.171)¶
Worek narzędzi operacyjnych (Forgejo, mailing, monitoring, social media, SMS, mesh VPN).
| Usługa | Rola | URL operatora | Port (wewn.) | Sekrety | Backup | Pochodzenie | Odpowiedzialność |
|---|---|---|---|---|---|---|---|
| caddy | Reverse-proxy services container | — | 80, 443 | — | konfig w git | zlecenie | właściciel |
| forgejo | Self-hosted git + issues (zastępuje GitHub dla repo aio/*) |
git.aiofactory.pl |
3000 (Caddy proxies) | forgejo.env |
dziennie 04:30 → B2 | zlecenie | właściciel |
| forgejo-db | MariaDB dla Forgejo | — | 3306 | dziedziczy | dziennie 04:30 → B2 | zlecenie | właściciel |
| beszel | Monitoring zdrowia hostów (CPU/RAM/dysk + status kontenerów) | beszel.aiofactory.pl |
8090 | konfig w wolumenie | dziennie 05:00 → B2 | zlecenie (TASK-103) | właściciel |
| listmonk | Mailing masowy (newslettery, kampanie) — relay przez Mailcow | listmonk.aiofactory.pl |
9000 | listmonk.env |
dziennie 04:30 → B2 | zlecenie (#21) | właściciel |
| listmonk-db | PostgreSQL dla Listmonka | — | 5432 | dziedziczy | dziennie 04:30 → B2 | zlecenie | właściciel |
| postiz | Planowanie i publikacja Social Media (FB / IG / LinkedIn / TikTok / X) | postiz.aiofactory.pl |
5000 | postiz.env (klucze OAuth platform) |
dziennie 04:00 → B2 | zlecenie (#18) | właściciel |
| postiz-db | PostgreSQL dla Postiza | — | 5432 | dziedziczy | dziennie 04:00 → B2 | zlecenie | właściciel |
| postiz-redis | Redis (kolejka publikacji) | — | 6379 | — | nie wymaga | zlecenie | właściciel |
| temporal + temporal-db + temporal-elasticsearch + temporal-ui + temporal-admin | Workflow engine (zaplecze Postiza) | temporal.aiofactory.pl |
7233, 8080 | dziedziczy | nie wymaga (stan w postiz-db) | zlecenie | właściciel |
| textbee-api + textbee-web + textbee-mongo-express + textbee-redis + textbee-db | Bramka SMS — API + UI + MongoDB | textbee.aiofactory.pl, sms.aiofactory.pl |
3000, 27017 | textbee.env |
dziennie 04:00 → B2 | zlecenie (#14) | właściciel + karta SIM Play (właściciel) |
| netbird-server + netbird-dashboard | Mesh VPN administracyjny (dostęp do panelu z poza biura) | netbird.aiofactory.pl |
3478/UDP | netbird.env |
konfig w wolumenie | zlecenie | właściciel |
| backrest | UI do restic — backup orchestrator |
backrest.aiofactory.pl |
9898 | restic-password (SOPS) |
sam jest backup-em (B2) | zlecenie (TASK-042) | właściciel |
Restart kontenera: incus exec services -- bash -c "cd /root/dapps/<service> && docker compose restart". Każdy katalog /root/dapps/<service>/ zawiera własny compose.yaml.
Bramka SMS — wymóg fizyczny
textbee jest gotowy programistycznie. Aby ruszył wysyłkę, właściciel musi: (1) włożyć kartę SIM Play z roamingiem SMS do modemu USB/IP podpiętego do host-dad, (2) dodać endpoint w panelu Konfiguracja → Bramka SMS. Patrz Poczta — bramka SMS.
Kontener dns (148.251.193.171)¶
Wewnętrzny DNS + Caddy dla niektórych subdomen.
| Usługa | Rola | URL operatora | Port | Sekrety | Backup | Pochodzenie | Odpowiedzialność |
|---|---|---|---|---|---|---|---|
| dns-server (PowerDNS) | Autorytatywny DNS dla subdomen wewn. | ns1.aiofactory.pl |
53/UDP, 53/TCP | pdns.conf |
konfig w git | zlecenie | właściciel |
| caddy | Reverse-proxy dla subdomen DNS-bound | — | 80, 443 | — | konfig w git | zlecenie | właściciel |
Kontener web (148.251.193.171)¶
Kontener WordPress — sklepy buyspace.pl (master, eu, de, test) i phpMyAdmin.
| Usługa | Rola | URL operatora | Port | Sekrety | Backup | Pochodzenie | Odpowiedzialność |
|---|---|---|---|---|---|---|---|
| caddy | Reverse-proxy dla buyspace.pl | — | 80, 443 | — | konfig w git | zlecenie | właściciel |
| buyspace-master-wp + buyspace-master-db | WordPress master (kanoniczny stan) | master.buyspace.pl |
80, 3306 | wp-config.php |
dziennie 01:00 → B2 | legacy | właściciel + ext. dev |
| buyspace-eu-wp + buyspace-eu-db | WordPress instancja EU | (wewn.) | 80, 3306 | wp-config.php |
dziennie 01:00 → B2 | legacy | właściciel + ext. dev |
| buyspace-de-wp + buyspace-de-db | WordPress instancja DE (planowana — patrz #26) | (wewn.) | 80, 3306 | wp-config.php |
dziennie 01:00 → B2 | legacy | właściciel + ext. dev |
| buyspace-test-wp + buyspace-test-db | Sandbox WP do testów | test.buyspace.pl |
80, 3306 | wp-config.php |
nie wymaga (sandbox) | legacy | właściciel + ext. dev |
| phpmyadmin | UI do zarządzania bazami WP | pma.buyspace.pl |
80 | dziedziczy z DB | — | legacy | właściciel |
Granica wsparcia: ze strony AIO Factory utrzymujemy infrastrukturę (kontenery, sieć, backupy, IP failover); samej treści WordPress (motywy, wtyczki, strona produktowa) nie supportujemy — to wprost wyłączone w ofercie (str. 4). Patrz Sklepy i FAQ #26.
Kontener system-mom¶
Bazowy NixOS host-mom; brak aplikacji użytkowych. Restart: ssh aio-mom -- sudo nixos-rebuild switch.
host-son — Trzecia linia obrony¶
W stanie standby. Sprzęt skonfigurowany, NixOS zainstalowany, podstawowa orkiestracja Incus/Docker — gotowy do przejęcia ruchu, ale rutynowo nie obsługuje produkcji. Pełna replikacja Convex + Mailcow konfigurowana w razie awarii host-mom + host-dad jednocześnie. Patrz Serwery — host-son.
Sieć VPS — sklepy lokalne¶
VPS-y w lokalizacjach docelowych klientów dla niskiego opóźnienia i lokalnych adresów IP. Mechanizm IP failover OVH przepina ruch na host-dad w razie awarii VPS-a. Koszt ~20 PLN/mc/VPS.
| Kraj | Status | Przeznaczenie |
|---|---|---|
| Polska | ✅ aktywny | buyspace.pl |
| Niemcy | 🟡 standby | przyszły rynek (#26) |
| Francja | 🟡 standby | przyszły rynek |
| Włochy / UK / Czechy / Hiszpania / Holandia / Belgia / Austria / Szwajcaria | ⚪ planowane | sukcesywnie wg potrzeby |
Procedura uruchomienia kolejnego VPS-a: zamówienie OVH → konfiguracja w infra/host-son/containers/ (NixOS template) → przepięcie IP failover.
Usługi opcjonalne (nie uruchomione na infra AIO)¶
W trakcie projektu rozważane były dwa dodatkowe narzędzia, które ostatecznie pozostają opcjonalne — nie uruchomione w infrastrukturze AIO, ale ich wdrożenie jest dokumentnie i organizacyjnie przygotowane:
- Vaultwarden / Bitwarden — magazyn haseł. Decyzja właściciela: korzystamy z Bitwarden cloud (poza naszą infrastrukturą). Klucz
agedo SOPS oraz hasła administracyjne wszystkich usług powyżej znajdują się w Bitwardenie (folderpanel-aio). Jeśli właściciel chce w przyszłości przenieść skarbiec na własną infrastrukturę, gotowa konfiguracja Vaultwarden do uruchomienia na host-mom. (Wcześniejsze wersje dokumentacji opisywały Vaultwarden jako uruchomiony — to było nieaktualne.) - Paperless-ngx — system zarządzania dokumentami z OCR, opcjonalny dodatek z oferty (str. 6: „zautomatyzujemy proste procesy, które teraz trzymacie w Excelach"). Nie został uruchomiony w pierwotnym wdrożeniu — przygotowany konfiguracyjnie, jeśli właściciel chce go aktywować w fazie utrzymania, jeden compose-file uruchamia całość na host-mom (
/root/dapps/paperless/).
Sekrety i klucze¶
Wszystkie sekrety w repo są SOPS-encrypted (Mozilla SOPS + age). Kluczowe ścieżki:
| Plik | Zawartość | Dostęp |
|---|---|---|
secrets/secrets.sops.yaml |
klucze API platform (Allegro/Amazon/eBay/…), tokeny, hasła DB | age w Bitwardenie |
dashboard/.env.sops.yaml |
sekrety dashboardu (Convex deploy key, etc.) | jw. |
convex/.env.dev.sops.yaml |
sekrety Convexa (per-środowisko) | jw. |
windmill/*.sops.yaml |
sekrety pipeline'ów Windmill (per-vendor refresh tokens) | jw. |
Reguły szyfrowania: .sops.yaml w katalogu głównym repo (path-regex per ścieżka).
Klucz prywatny age: w Bitwardenie pod panel-aio / sops-age-key. Bez tego klucza odzyskanie sekretów z repo jest niemożliwe — utrata = utrata dostępu do API platform i baz produkcyjnych.
Procedura odzyskania dostępu w razie utraty hasła głównego: opisana w Podsumowaniu Prac.
Backupy — ogólny stan¶
| Cel | Częstotliwość | Retencja | Źródło |
|---|---|---|---|
| Convex (snapshot) | codziennie 03:00 | 30 dni dziennych + 12 tygodniowych | host-dad / panel |
| Mailcow (skrzynki + konfig) | codziennie 02:00 | 14 dni | host-mom / email |
| Windmill (skrypty + flowy + db) | po każdym push (git) + dziennie 04:00 (db) | git: wieczne; B2: 14 dni | host-dad / panel |
| WordPress (db + uploads) ×4 | codziennie 01:00 | 30 dni dziennych | host-mom / web + host-dad / web |
| Postiz (db) | codziennie 04:00 | 14 dni | host-mom / services |
| Listmonk (db + listy) | codziennie 04:30 | 14 dni | host-mom / services |
| Forgejo (repo + db) | codziennie 04:30 | 30 dni | host-mom / services |
| Beszel (db metryk) | codziennie 05:00 | 7 dni | host-mom / services |
Cel backupów: Backblaze B2, bucket aiofactory, region eu-central-003. Klucz szyfrujący restic w secrets/secrets.sops.yaml (backrest_restic_password) — bez niego odzyskanie z B2 niemożliwe.
Monitoring backupów: Windmill cyklicznie sprawdza świeżość snapshotów (f/infra/backup__health__monitor.py, TASK-055.04) — alarm gdy snapshot starszy niż 25 h.
Restore: Backrest UI (backrest.aiofactory.pl) lub bezpośrednio przez SSH → host-mom → restic. Procedury per-usługa w windmill/docs/infra/restore-runbook.md.
Mapa pochodzenia (kto za co odpowiada)¶
| Pochodzenie | Co to znaczy | Przykłady |
|---|---|---|
| Zlecenie | Zrealizowane / wdrożone w ramach umowy z 13.01.2026 | Panel, Convex, Windmill, Mailcow, Listmonk, Postiz, Beszel, Forgejo, Backrest, Bramka SMS, infrastruktura NixOS, sieć VPS, IP failover |
| Legacy | Istniało przed umową, my tylko utrzymujemy / przenosimy | buyspace.pl WordPress (×5 instancji), domena buyspace.pl |
| Opcjonalne | Poza zakresem oferty, dostępne do uruchomienia w razie potrzeby | Vaultwarden, Paperless-ngx |
Zamknięcie zgłoszeń info¶
Ta strona zamyka 9 zgłoszeń typu „co to jest / czemu to działa" z Forgejo:
- #12 Host: son — patrz host-son wyżej.
- #13 Serwery VPS — patrz Sieć VPS wyżej.
- #14 Bramka SMS —
textbeew kontenerzeservicesna host-mom. Patrz tabela host-mom /services. - #15 Serwer Email —
mailcoww kontenerzeemailna host-mom. - #16 System monitoringu —
beszelw kontenerzeservicesna host-mom. - #17 Bazy danych pod strony — wszystkie WordPress-DB w kontenerach
web(host-mom + host-dad), backupowane codziennie do B2. - #18 Social Media —
postizw kontenerzeservicesna host-mom. - #21 Mailing —
listmonkw kontenerzeservicesna host-mom (relay przez Mailcow). - #25 Beszel — co to jest — patrz
beszelw tabeli host-mom /services.