Przewodnik - 8 min

Uruchamianie obrazów Archestack

Archestack to dwa obrazy kontenerów i baza danych PostgreSQL. Każdy sposób jego uruchamiania, od laptopa po klaster Kubernetes, startuje te same dwa obrazy z innymi ustawieniami. Ta strona mówi, czym one są, co każda instalacja musi im zapewnić i który sposób uruchamiania pasuje do jakiego miejsca. Wszystkie ustawienia, które przyjmują obrazy, są na stronie Ustawienia obrazów.

Obrazy

ObrazCzym jestNasłuchuje na
nickpeelman/omnicore-apiAPI: każde żądanie, zadania w tle (harmonogramy, poczta, kopie zapasowe) i aktualizacje na żywo. /health mówi, kiedy jest gotowe.8080
nickpeelman/omnicore-webnginx z builderem i opublikowaną aplikacją.80
postgres:16Baza danych albo zamiast niej zarządzany PostgreSQL 16.5432
nickpeelman/omnicore-grafana, -prometheus, -tempo, -loki, -otel-collectorOpcjonalny monitoring: Grafana z dashboardami Archestack i to, co je zasila.

Każde wydanie ma tag ze swoją wersją, na przykład 1.0.42, a najnowsze ma też tag latest. Na produkcji uruchamiaj numer wersji, żeby wiedzieć, co działa, i móc przenieść tę samą wersję z testów na produkcję. API i obraz web z jednego wydania należą do siebie.

Co zapewnia im każda instalacja

  1. PostgreSQL 16 z użytkownikiem, który może tworzyć bazy danych. API tworzy własne bazy danych przy pierwszym starcie, a potem parę dla każdej przestrzeni roboczej, więc nie ma niczego do przygotowania. Daj PostgreSQL 1 GB pamięci współdzielonej (--shm-size 1g w Dockerze): jego statystyki rosną z każdą bazą danych, a wartość domyślna kończy się przy około tysiącu przestrzeni roboczych.
  2. Dwa foldery, które przetrwają restart: /files na przesłane pliki i /backups na kopie zapasowe. Bez nich przesłane pliki znikają przy następnej aktualizacji.
  3. Droga do każdego obrazu. Przeglądarka ładuje obraz web i wywołuje API pod /api, a aktualizacje na żywo idą przez WebSocket pod /hubs. Oba mogą dzielić jeden adres, jak w zestawach startowych, albo API dostaje własny adres:
    One address (the kits do this)          Two addresses
    
    https://apps.example.com                https://editor.example.com  ->  omnicore-web
      /api/...   ->  omnicore-api :8080     https://api.example.com     ->  omnicore-api
      /hubs/...  ->  omnicore-api :8080
      /...       ->  omnicore-web :80       VITE_API_URL=https://api.example.com
    
    VITE_API_URL empty
    Pod ścieżką nazwy hosta, na przykład https://apps.example.com/archestack/, oba obrazy dostają tę ścieżkę (BASE_PATH i Http__PathBase).
  4. Pierwszy administrator. Ustaw Identity__InitialAdminEmail i Identity__InitialAdminPassword albo otwórz builder zaraz po pierwszym starcie i utwórz tam administratora. Dopóki nikt tego nie zrobi, administratorem zostaje ten, kto pierwszy dotrze do buildera, więc nie zostawiaj świeżej instalacji otwartej w internecie.
  5. Czas na start. API odpowiada na /health wartością {"status":"ok"} dopiero wtedy, gdy każda baza danych jest zmigrowana. Pierwszy start trwa minutę lub dwie, a przy wielu przestrzeniach roboczych dłużej, więc sprawdzaj gotowość na /health i daj startowi wystarczająco dużo czasu.

Sposoby uruchamiania

SposóbDo czegoPrzewodnik
Projekt VS CodeBudowanie aplikacji na własnym komputerze. Rozszerzenie uruchamia Archestack za Ciebie, na Windowsie bez Dockera.Rozszerzenie VS Code
docker runWypróbowanie Archestack na laptopie w pięć minut.Poniżej
Docker ComposeJeden serwer, z automatycznymi certyfikatami albo za proxy, które już uruchamiasz, i z nocnymi aktualizacjami.Hosting z Dockerem
Manifesty KubernetesKlaster, który już masz, pod ścieżką nazwy hosta, którą już obsługuje.Hosting na Kubernetesie
Chart Helm na AKSWłasne nazwy hostów, zarządzana baza danych, kilka replik API, nocne aktualizacje.Hosting na AKS
Inne platformy konteneroweAzure Container Apps, Amazon ECS, Google Cloud Run i podobne.Poniżej

Niezależnie od wyboru Twoje aplikacje trafiają tam w ten sam sposób: z repozytorium, przez pipeline.

Wypróbowanie z docker run

Trzy kontenery w jednej sieci Dockera: PostgreSQL, API na porcie 8080 i builder na porcie 8081. Zamiast change-me wybierz własne hasło.

# Archestack on this machine with plain docker run: the builder on http://localhost:8081
docker network create archestack
docker volume create archestack-postgres

docker run -d --name archestack-postgres --network archestack --shm-size 1g \
  -e POSTGRES_USER=archestack -e POSTGRES_PASSWORD=change-me -e POSTGRES_DB=postgres \
  -v archestack-postgres:/var/lib/postgresql/data postgres:16

docker run -d --name archestack-api --network archestack -p 8080:8080 \
  -e ASPNETCORE_URLS=http://+:8080 \
  -e "ConnectionStrings__DefaultConnection=Host=archestack-postgres;Database=omnicore-db;Username=archestack;Password=change-me" \
  -e "ConnectionStrings__Core=Host=archestack-postgres;Database=omnicore-core;Username=archestack;Password=change-me" \
  -e "ConnectionStrings__Identity=Host=archestack-postgres;Database=omnicore-identity;Username=archestack;Password=change-me" \
  -e ConnectionStrings__Keycloak= \
  -e Database__CreateMissing=true \
  -e Identity__Provider=Builtin -e Identity__AppBaseUrl=http://localhost:8081 \
  -e Files__Directory=/files -e Backup__Directory=/backups \
  -v archestack-files:/files -v archestack-backups:/backups \
  nickpeelman/omnicore-api:latest

docker run -d --name archestack-web --network archestack -p 8081:80 \
  -e VITE_API_URL=http://localhost:8080 -e VITE_UI_MODE=dashboard \
  -e API_INTERNAL_URL=http://archestack-api:8080 \
  nickpeelman/omnicore-web:latest

Otwórz http://localhost:8081, gdy http://localhost:8080/health zacznie odpowiadać, i utwórz pierwszego administratora. Builder i opublikowana aplikacja (/app) są na tym samym porcie, a API na 8080 odpowiada przeglądarce bezpośrednio. Aby znowu wszystko usunąć:

docker rm -f archestack-web archestack-api archestack-postgres
docker network rm archestack
# Everything you made is in the volumes; this deletes it:
docker volume rm archestack-postgres archestack-files archestack-backups

To służy do wypróbowania. Serwer potrzebuje restartów, aktualizacji, certyfikatów i kopii zapasowych przenoszonych poza maszynę, a to konfiguruje Hosting z Dockerem.

Inne platformy kontenerowe

Azure Container Apps, Amazon ECS, Google Cloud Run i podobne platformy uruchamiają te same obrazy. Zanim którąś wybierzesz, sprawdź:

  • Bazę danych. Użyj zarządzanego PostgreSQL 16 danej platformy (Azure Database for PostgreSQL, Amazon RDS, Cloud SQL) z użytkownikiem, który może tworzyć bazy danych. Nie uruchamiaj samego PostgreSQL na sieciowym udziale plików.
  • Wolumin na /files i /backups, taki jak Azure Files, Amazon EFS czy Filestore. Przy więcej niż jednej instancji API każda instancja montuje ten sam.
  • Co najmniej jedną instancję API działającą zawsze. Zaplanowane zdarzenia, skrzynka nadawcza poczty i kopie zapasowe działają wewnątrz API, więc platforma skalująca do zera je zatrzymuje. Ustaw minimum na jedną instancję, a w Cloud Run pozostaw CPU przydzielony także poza żądaniami.
  • WebSockety do /hubs na potrzeby aktualizacji na żywo. Połączenie przerwane przez platformę jest otwierane ponownie, ale bardzo krótki limit bezczynności sprawia, że aktualizacje docierają z opóźnieniem.
  • Duże żądania. Importy pakietów i przesyłane pliki mogą być duże: dopuść body żądań o rozmiarze co najmniej 100 MB i żądania trwające kilka minut.
  • Więcej niż jedna instancja API działa bez sticky sessions: instancje dzielą stan przez PostgreSQL. Każda potrzebuje do tego bezpośredniego połączenia z nim, więc jeśli pomiędzy jest connection pooler, taki jak PgBouncer, ustaw ConnectionStrings__Cluster na sam PostgreSQL.

Co dalej

Ustawienia obrazów wymieniają wszystkie ustawienia obu obrazów. Wydajność i dobór serwerów mówi, ile obsłuży jedna instalacja, a Przestrzenie robocze i hosting jak przestrzenie robocze ją współdzielą.