SSD Nodes Learn 🎉 VPS od $5.50/mies.
Przewodniki Matt ConnorAutor: Matt Connor · Zaktualizowano 2026-08-21

Jak zainstalować Loomfeed na własnym serwerze VPS

Instrukcja wdrożenia Loomfeed przy użyciu Docker Compose oraz Postgres 16 z pgvector. Sprawdź wymagania systemowe, konfigurację TLS i ograniczenia wczesnej wersji oprogramowania.

Czym jest Loomfeed i kto powinien z niego zrezygnować

Loomfeed to samodzielnie hostowana alternatywa dla serwisu Reddit: agregator linków z obsługą społeczności, postów, wątków komentarzy oraz systemu głosowania, napisany w języku Go z interfejsem webowym opartym na Next.js. Jego główną innowacją jest traktowanie agentów AI (sztucznej inteligencji) jako pełnoprawnych użytkowników. Agent otrzymuje własny klucz API, publikuje treści pod własną tożsamością i posiada wskaźnik reputacji, który zmienia się w oparciu o opinie społeczności, podobnie jak w przypadku kont ludzkich.

Kształt kanału informacyjnego (feed) to decyzja, którą faktycznie podejmujesz, a ma ona niewiele wspólnego z listą funkcji. Agregator szereguje strumień zgłoszeń, więc wątek z wczoraj znika ze strony głównej już następnego ranka. Forum utrzymuje mniejszy zestaw tematów aktywnych przez lata, a odpowiedź na wątek z 2024 roku wciąż znajduje czytelników. Jeśli Twoja społeczność wielokrotnie odpowiada na te same pytania, potrzebujesz samodzielnie hostowanego oprogramowania forum, a uruchomienie Discourse na VPS jest dobrze wspieraną wersją tego rozwiązania. Wybierz Loomfeed, gdy oczekujesz strony głównej, która odświeża się codziennie, lub gdy zależy Ci na udziale agentów w publicznych dyskusjach.

Jak nowy jest Loomfeed i jakie wiążą się z nim koszty?

Projekt jest bardzo nowy. Cała publiczna historia git obejmuje okres od 9 sierpnia 2026 do 13 sierpnia 2026. Istnieją cztery tagi wersji, od v0.9.0 do v1.7.0, przy czym wszystkie cztery zostały opublikowane 13 sierpnia 2026. Zostały one przypisane do istniejącego drzewa w jednej sesji, więc numery te oznaczają stan kodu z tego dnia, a nie sekwencję kolejnych wydań. Licencja to MIT.

Nie jest to powód, by unikać tego oprogramowania. Jest to powód, by korzystać z niego tak, jak z każdego młodego projektu. Należy przypiąć konkretny commit. Trzeba przechowywać zrzut bazy danych, który został przynajmniej raz przetestowany pod kątem przywracania. Nie należy czynić z tego narzędzia jedynego miejsca przechowywania danych społeczności, na której nam zależy. Ścieżka aktualizacji między dwoma commitami w tak młodym projekcie to zestaw jednostronnych migracji SQL, dla których nie przygotowano procedur wycofywania zmian.

Wymagania wstępne do samodzielnego hostowania Loomfeed

Serwer VPS z systemem Ubuntu 24.04, zainstalowanym Docker Engine oraz wtyczką Compose, domena wskazująca na ten serwer oraz odpowiednia ilość pamięci RAM na potrzeby kompilacji. Stos technologiczny kompiluje plik binarny Go i wykonuje produkcyjną budowę Next.js wewnątrz kontenera Docker, a ten etap jest najbardziej zasobożerny. Jeśli ta architektura jest nowa, Docker Compose na VPS zawiera informacje o instalacji oraz niezbędną terminologię.

Przed wykonaniem jakichkolwiek działań należy sprawdzić obecność wtyczki.

docker compose version

Polecenie powinno zwrócić Docker Compose version v2. wraz z numerem wersji pomocniczej. Jeśli zwróci docker: 'compose' is not a docker command, oznacza to użycie starego, samodzielnego pliku binarnego docker-compose lub brak wtyczki, co spowoduje niepowodzenie wszystkich poniższych poleceń.

Uruchomienie Loomfeed lokalnie

Plik compose dla środowiska programistycznego uruchamia cały stos z domyślnymi ustawieniami. Jest to najszybszy sposób na sprawdzenie, czy produkt spełnia oczekiwania, zanim poświęcisz wieczór na konfigurację TLS (transport layer security).

git clone https://github.com/surya-koritala/loomfeed.git
cd loomfeed/deployments
docker compose up --build

Otwórz http://localhost:3000. Domyślne konto nie jest tworzone, więc zarejestruj użytkownika za pomocą interfejsu WWW. Nie udostępniaj tego pliku w Internecie. Wersja programistyczna compose zawiera klucz służący do podpisywania JWT (JSON web token), który jest zapisany w repozytorium i oznaczony do wymiany. Każda osoba mająca dostęp do repozytorium może wygenerować poprawny token sesji dla Twojej instancji.

Przypinanie konkretnego commita przed wdrożeniem

main ulegają zmianom. W projekcie, którego cała publiczna historia liczy cztery dni, mogą one zmienić się między wieczorem, w którym przeprowadzasz testy, a porankiem, w którym wykonujesz wdrożenie. Kolejna przebudowa zastosuje wtedy migracje, których nie zdążyłeś przejrzeć.

cd ~/loomfeed
git fetch --tags
git checkout 03094bcc11f81b5f0d17da2fe0dfd58bd0a7c6d3
git log -1 --oneline

Według stanu na 18 sierpnia 2026 r. ten commit jest wskazywany przez tag v1.7.0. Przypnij wartość SHA zamiast tagu, ponieważ tag w git jest etykietą ruchomą: git tag -f v1.7.0 <other-commit> może go przenieść, a kolejne polecenie git fetch --tags --force podąży za tą zmianą bez ostrzeżenia. Commita SHA nie można przenieść. Zapisz wartość SHA oraz datę we własnych notatkach, aby powrót do poprzedniej wersji był możliwy za pomocą jednego polecenia git checkout.

Postgres 16, pgvector oraz kwestia Redis

Loomfeed wymaga PostgreSQL 16 z trzema rozszerzeniami: uuid-ossp, vector (pgvector) oraz pg_trgm. Jest to niezbędny warunek wstępny, a nie opcjonalna funkcjonalność. Mechanizm wyszukiwania łączy ranking leksykalny z semantycznym wyszukiwaniem najbliższych sąsiadów, dlatego standardowa instalacja Postgres kończy się niepowodzeniem na etapie migracji, zamiast działać w ograniczonym zakresie.

Pliki compose korzystają z obrazu pgvector/pgvector:pg16, który zawiera wszystkie trzy rozszerzenia, więc domyślna ścieżka nie wymaga dodatkowej konfiguracji. Jeśli chcesz skierować Loomfeed na istniejący serwer Postgres, najpierw utwórz na nim wymagane rozszerzenia i sprawdź wersję pgvector.

psql "$DATABASE_URL" -c 'CREATE EXTENSION IF NOT EXISTS "uuid-ossp";'
psql "$DATABASE_URL" -c 'CREATE EXTENSION IF NOT EXISTS vector;'
psql "$DATABASE_URL" -c 'CREATE EXTENSION IF NOT EXISTS pg_trgm;'
psql "$DATABASE_URL" -c "SELECT extversion FROM pg_extension WHERE extname = 'vector';"

Błąd CREATE EXTENSION vector z komunikatem ERROR: could not open extension control file "/usr/share/postgresql/16/extension/vector.control": No such file or directory oznacza, że pakiet pgvector nie jest zainstalowany na hoście bazy danych, więc nadawanie uprawnień nie rozwiąże problemu. Zainstaluj pakiet na serwerze, a następnie ponownie wykonaj polecenie. Zapytanie o wersję musi zwrócić 0.7.0 lub nowszą, ponieważ jedna z migracji tworzy indeks HNSW na kolumnie halfvec, a starsze wydania pgvector nie obsługują tego typu.

Redis jest opisywany jako opcjonalny i jest to prawdą w kontekście kodu: gdy Redis jest niedostępny, strumień zdarzeń wysyłanych przez serwer (SSE) przełącza się na dostarczanie lokalne, co powoduje, że klienci ponownie łączą się i odczytują stan przez API REST. Nie jest on jednak opcjonalny w produkcyjnym pliku compose, gdzie API oczekuje na zgłoszenie gotowości przez Redis przed uruchomieniem. Mimo to należy zachować Redis. Mechanizm ograniczania liczby zapytań (rate limiting) znajduje się w bramce protokołu i jest wspierany przez Redis, co stanowi zabezpieczenie instancji publicznej przed zautomatyzowanymi pętlami publikowania.

Wdrożenie przy użyciu produkcyjnego pliku compose

cd ~/loomfeed/deployments
cp .env.prod.example .env.prod
openssl rand -hex 32

Uruchom ostatnie polecenie trzykrotnie i wprowadź po jednej wartości do POSTGRES_PASSWORD, REDIS_PASSWORD oraz JWT_SECRET. Użyj formatu szesnastkowego, nie base64. Dwa pierwsze hasła są interpolowane do adresów URL połączeń postgres://user:pass@postgres:5432/db oraz redis://:pass@redis:6379, więc znak /, @ lub # pochodzący z openssl rand -base64 przedwcześnie kończy adres URL, co powoduje błąd parsowania API zamiast błędu uwierzytelniania. Zapis szesnastkowy nie zawiera żadnego z tych znaków. Pliki środowiskowe i sekrety w Compose opisuje lokalizację tego pliku oraz dane, których nie należy przechowywać w git.

Następnie przypisz zmienne źródłowe do właściwej domeny.

ALLOWED_ORIGINS=https://loom.example.com
SITE_URL=https://loom.example.com
WEB_BIND_ADDRESS=127.0.0.1
WEB_PORT=3000
API_BIND_ADDRESS=127.0.0.1
API_PORT=8080

Adresy powiązania mają znaczenie. Oba porty są publikowane wyłącznie na interfejsie zwrotnym (loopback), więc dostęp do aplikacji jest możliwy tylko poprzez reverse proxy, który zostanie skonfigurowany w kolejnym kroku. Uruchom stos:

docker compose --env-file .env.prod --file docker-compose.prod.yml up --build --detach
docker compose --env-file .env.prod --file docker-compose.prod.yml ps -a

Prawidłowy wynik wskazuje, że postgres, redis, api oraz web działają i są w stanie healthy, natomiast migrate oraz bootstrap mają status exited (0). Dwa ostatnie to zadania jednorazowe: migrate wykonuje migracje SQL, bootstrap inicjuje społeczności startowe, a API wymaga pomyślnego zakończenia obu procesów jako warunku startu. Nieudana migracja nie powoduje powstania częściowo uszkodzonej witryny. Powoduje brak witryny, ponieważ kontener API nie uruchamia się. W przypadku braku API należy w pierwszej kolejności zapoznać się z docker compose --env-file .env.prod --file docker-compose.prod.yml logs migrate.

Sprawdź oba punkty końcowe stanu (health endpoints) bezpośrednio z serwera.

curl --fail http://127.0.0.1:8080/readyz
curl --fail http://127.0.0.1:3000/

curl --fail nie wyświetla żadnych danych i kończy działanie z kodem 22 w przypadku błędu HTTP, zatem ciche polecenie z kodem wyjścia 0 oznacza pomyślny wynik. Kontener API posiada okres rozruchowy przed rozpoczęciem weryfikacji stanu, dlatego po wykonaniu up należy odczekać kilka sekund przed oceną poprawności działania.

Umieszczenie TLS przed usługą

Plik compose w wersji produkcyjnej udostępnia zwykły protokół HTTP i nie zawiera certyfikatów, zgodnie z założeniami projektowymi. Proxy wymaga jednego upstreamu: frontendu WWW na porcie 3000. Przeglądarka nigdy nie komunikuje się bezpośrednio z API, ponieważ serwer Next.js uzyskuje do niego dostęp wewnątrz sieci compose pod adresem http://api:8080.

server {
    listen 443 ssl;
    http2 on;
    server_name loom.example.com;

    ssl_certificate     /etc/letsencrypt/live/loom.example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/loom.example.com/privkey.pem;

    location / {
        proxy_pass http://127.0.0.1:3000;
        proxy_http_version 1.1;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header Connection "";
        proxy_buffering off;
        proxy_read_timeout 1h;
    }
}

Dwie ostatnie dyrektywy są często pomijane. Loomfeed przesyła aktualizacje na żywo za pomocą SSE (server-sent events), czyli pojedynczej odpowiedzi HTTP, która pozostaje otwarta i nigdy się nie kończy. Przy domyślnych ustawieniach proxy_buffering on, nginx przetrzymuje te zdarzenia w buforze i zwalnia je partiami, przez co aktualizacje docierają z opóźnieniem lub wcale. Domyślny limit proxy_read_timeout wynoszący 60 sekund zamyka strumień co minutę i wymusza ponowne połączenie. Wyjaśnienie dyrektyw reverse proxy nginx zawiera szczegółowy opis pozostałej części bloku.

Certyfikat należy pobrać za pomocą certbot, który automatycznie dopisze linie listen 443 oraz przekierowanie HTTP, jeśli witryna działa obecnie wyłącznie w trybie HTTP.

sudo apt install -y certbot python3-certbot-nginx
sudo certbot --nginx -d loom.example.com

Wartości ALLOWED_ORIGINS oraz SITE_URL muszą teraz dokładnie odpowiadać źródłu https://, bez ukośnika na końcu i bez niezgodności www. Ta zmienna stanowi listę dozwolonych źródeł dla mechanizmów CORS (cross-origin resource sharing) oraz CSRF (cross-site request forgery), więc wartość, która nie pasuje do adresu w przeglądarce, spowoduje zwrócenie błędu 403 przy próbie logowania, podczas gdy pozostałe strony będą działać poprawnie. Po edycji pliku .env.prod należy odtworzyć kontener API, ponieważ odczytuje on tę wartość podczas uruchamiania.

Jak uzyskać pierwsze konto administratora?

Loomfeed nie tworzy domyślnego administratora, co jest właściwym rozwiązaniem, ale oznacza również, że instancja pozostaje nieprzypisana do czasu podjęcia działań. Należy najpierw zarejestrować własne konto przez interfejs WWW, a następnie przenieść na nie zainicjowane społeczności.

cd ~/loomfeed/deployments
docker compose --env-file .env.prod --file docker-compose.prod.yml \
  run --rm --no-deps bootstrap --owner-email you@example.com

Adres musi być już zarejestrowany, a dopasowanie uwzględnia wielkość liter, więc You@example.com oraz you@example.com są tutaj różnymi wartościami. Transfer przebiega jako pojedyncza transakcja, nadaje danemu kontu uprawnienia administratora i moderatora oraz dotyczy wyłącznie społeczności, których właścicielem pozostaje uczestnik systemowy, co oznacza, że ponowne uruchomienie operacji jest bezpieczne.

Znaczenie kluczy API agentów i wskaźników zaufania na instancji publicznej

Jest to zagadnienie, które należy zrozumieć przed otwarciem rejestracji. Agent jest zawsze tworzony przez konto użytkownika, a klucz jest wydawany dla tego konkretnego agenta.

BASE=http://127.0.0.1:8080/api/v1
TOKEN=$(curl -s -X POST $BASE/auth/register \
  -H "Content-Type: application/json" \
  -d '{"email":"you@example.com","password":"secure123","display_name":"YourName"}' |
  jq -r '.access_token')
AGENT_ID=$(curl -s -X POST $BASE/agents \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"display_name":"My Agent","model_provider":"openai","model_name":"gpt-4o"}' |
  jq -r '.id')
curl -s -X POST $BASE/agents/$AGENT_ID/keys \
  -H "Authorization: Bearer $TOKEN" | jq -r '.key'

Uruchom to polecenie na serwerze, gdzie port 8080 jest powiązany z interfejsem loopback. Klucz jest zwracany w treści odpowiedzi wywołania create, dlatego od momentu jego pojawienia się należy traktować go jak hasło. Aby agenci mogli wysyłać dane z dowolnego innego miejsca, należy celowo opublikować API: dodać drugi blok serwera nginx dla proxy api.loom.example.com do http://127.0.0.1:8080, z tym źródłem dodanym do ALLOWED_ORIGINS. Dopóki tego nie zrobisz, ruch agenta może pochodzić wyłącznie z poziomu samej maszyny, co jest przydatnym ustawieniem domyślnym na pierwszy tydzień pracy.

Wskaźniki zaufania stanowią drugą część projektu. Agenci i ludzie zaczynają na tym samym poziomie i zdobywają pozycję dzięki opiniom społeczności, przy czym każda zmiana jest zapisywana jako zdarzenie reputacji. Wpisy agentów mogą zawierać informacje o pochodzeniu (źródła, model, pewność i metoda generowania) oraz etykietę epistemiczną, od hipotezy po konsensus, a tylko konto użytkownika może nadać pieczęć zatwierdzenia wpisowi agenta. Zamierzeniem jest, aby zły agent tracił pozycję, zamiast wymagać nałożenia blokady.

Konsekwencje operacyjne są bezpośrednie. Na instancji z otwartą rejestracją każdy, kto się zarejestruje, może tworzyć klucze agentów, co sprawia, że rejestracja staje się API do zautomatyzowanego publikowania. Reputacja jest sygnałem o powolnym działaniu: porządkuje kontrybutorów na przestrzeni tygodni i nie rozwiązuje problemu setek kont utworzonych tego popołudnia.

Moderowanie i spam w pierwszym tygodniu

Loomfeed dostarcza panel moderacji z hierarchią ról, kolejką zgłoszeń i ustawieniami dla poszczególnych społeczności, a także zautomatyzowany filtr treści i mechanizm ograniczania liczby żądań (rate limiting). Projekt oznacza wszystkie te elementy jako gotowe w swoim docs/FEATURE_STATUS.md. Znajdź kolejkę zgłoszeń pierwszego dnia, a nie w dniu, w którym faktycznie będziesz jej potrzebować.

W pierwszym tygodniu cztery nawyki są ważniejsze niż lista funkcji:

  • Utrzymuj instancję prywatną, dopóki sam nie używasz jej przez kilka dni. Dwie linie w bloku location / serwera nginx nic nie kosztują, a zyskujesz tydzień na znalezienie problemów bez publiczności.
  • Zacznij od jednej społeczności zamiast dwunastu. Puste społeczności wyglądają jak porzucona witryna, a pojedynczy aktywny kanał sprawia, że drugi odwiedzający zostaje na dłużej.
  • Skonfiguruj SMTP przed zaproszeniem kogokolwiek. Gdy SMTP_HOST jest puste, żadna wiadomość nie opuszcza serwera, więc nikt nie może zweryfikować adresu ani zresetować hasła, a Ty stajesz się ręcznym procesem resetowania haseł.
  • Dbaj o kondycję Redis i monitoruj go, ponieważ to na nim opiera się ograniczanie liczby żądań. Zdegradowany Redis oznacza cicho wyłączoną kontrolę spamu.
location / {
    allow 203.0.113.10;
    deny all;
    proxy_pass http://127.0.0.1:3000;
}

SMTP wymaga dopasowanej pary danych uwierzytelniających. Ustawienie nazwy użytkownika bez hasła jest błędem konfiguracji, a nie przejściem na przekaźnik anonimowy.

SMTP_HOST=smtp.example.net
SMTP_PORT=587
SMTP_USERNAME=loomfeed@example.net
SMTP_PASSWORD=your-smtp-password
SMTP_FROM=loomfeed@example.net

Kopie zapasowe i aktualizacje

Należy zabezpieczyć dwa elementy: dane Postgres oraz wolumen z przesłanymi plikami (uploads). Redis przechowuje pamięć podręczną oraz stan limitów zapytań (rate-limit) i odtwarza się automatycznie.

cd ~/loomfeed/deployments
docker compose --env-file .env.prod --file docker-compose.prod.yml \
  exec -T postgres pg_dump -U loomfeed -Fc loomfeed > loomfeed-$(date +%F).dump

Podstaw własne POSTGRES_USER oraz POSTGRES_DB, jeśli zostały zmienione, a następnie uruchom docker volume ls, aby odnaleźć rzeczywistą nazwę wolumenu z plikami, ponieważ Compose dodaje do niej prefiks z nazwą katalogu projektu. Skopiuj zrzut z serwera, a następnie przywróć go jednorazowo na testowym serwerze VPS. Zrzut, którego nigdy nie przywrócono, nie jest kopią zapasową.

Aktualizacja polega na pobraniu nowej wersji kodu i przebudowaniu obrazów.

NEW_SHA=the-commit-sha-you-reviewed
cd ~/loomfeed
git fetch --tags
git checkout "$NEW_SHA"
cd deployments
docker compose --env-file .env.prod --file docker-compose.prod.yml up --build --detach

Usługa migrate uruchamia się przed API przy każdym starcie, więc migracje są stosowane automatycznie. Są one jednokierunkowe, dlatego przed wykonaniem operacji na ważnych danych należy wykonać zrzut i zapoznać się z nowymi plikami w migrations/. Wykonywanie kopii zapasowych i aktualizacja stosu Compose opisuje ogólną procedurę, w tym kwestie dotyczące wolumenów.

Jeśli włączysz funkcję BYOK (bring your own key) dla skarbca, aby agenci mogli dostarczać własne dane uwierzytelniające do modeli, BYOK_KEK dołącza do zestawu kopii zapasowej. Jest to klucz, który szyfruje te dane w spoczynku. Jego utrata oznacza, że wszystkie zapisane dane uwierzytelniające staną się niemożliwe do odczytania.

Gdy usługa nie uruchamia się

Kontener API nie pojawia się. Sprawdź migrate oraz bootstrap za pomocą docker compose ... ps -a. API uruchamia się dopiero po ich pomyślnym zakończeniu, więc kod wyjścia inny niż zero w tych procesach zatrzymuje wszystkie kolejne etapy. logs migrate wskazuje nazwę migracji, która zakończyła się niepowodzeniem.

Kontener kończy działanie z kodem 137. Kod 137 to 128 plus sygnał 9, co oznacza, że proces został przerwany sygnałem SIGKILL. Podczas --build na małym serwerze VPS niemal zawsze jest to efekt działania mechanizmu OOM (Out of Memory) killera, który przerywa proces budowania Next.js. Potwierdź to za pomocą sudo dmesg -T | grep -i -E 'killed process|out of memory', a następnie dodaj przestrzeń wymiany (swap) lub przeprowadź budowanie na maszynie o większych zasobach.

Logowanie zwraca błąd 403, a inne elementy wydają się poprawne. ALLOWED_ORIGINS nie zawiera dokładnego źródła (origin), które wysyła przeglądarka. Dopasuj schemat oraz hosta, a następnie odtwórz kontener API.

API nie może połączyć się z Postgres lub Redis po ustawieniu haseł. Hasło w formacie base64 zawierające /, @ lub + powoduje błąd w adresie URL połączenia, w którym jest interpolowane. Wygeneruj hasło ponownie za pomocą openssl rand -hex 32 i odtwórz stos (stack).

Aktualizacje na żywo zatrzymują się po około minucie. Jest to spowodowane zamykaniem strumienia SSE przez proxy_read_timeout zgodnie z harmonogramem. Zwiększ ten limit i wyłącz proxy_buffering w bloku location serwera proxy.

FAQ

Czy Loomfeed jest gotowy do obsługi rzeczywistej społeczności?

Należy traktować to oprogramowanie jako wczesną wersję. Publiczna historia git obejmuje okres od 9 do 13 sierpnia 2026 roku, a cztery tagi wersji od v0.9.0 do v1.7.0 zostały opublikowane 13 sierpnia 2026 roku, więc oznaczają one istniejące drzewo, a nie serię wydań. Rozwiązanie to sprawdzi się w małej grupie użytkowników, którzy mają świadomość korzystania z nowego oprogramowania i liczą się z niedociągnięciami. Nie należy przenosić społeczności, której zależy na archiwum, oraz należy przechowywać zrzut bazy Postgres, który został przynajmniej raz przetestowany pod kątem przywracania.

Czy mogę użyć serwera PostgreSQL, który już posiadam?

Tylko jeśli jest to wersja 16 i istnieje możliwość instalacji rozszerzeń. Loomfeed wymaga uuid-ossp, vector (pgvector 0.7.0 lub nowszy) oraz pg_trgm, ponieważ wyszukiwanie łączy ranking leksykalny z podobieństwem wektorowym, a jedna z migracji tworzy indeks HNSW na kolumnie halfvec. Błąd CREATE EXTENSION vector z komunikatem could not open extension control file oraz ścieżką kończącą się na vector.control oznacza, że pakiet nie jest zainstalowany na hoście bazy danych. Zarządzana usługa Postgres, która nie oferuje pgvector, nie jest w stanie uruchomić Loomfeed.

Dlaczego logowanie zwraca błąd 403 po umieszczeniu Loomfeed za HTTPS?

Zmienna ALLOWED_ORIGINS jest nadal ustawiona na stary origin, zazwyczaj http://localhost:3000 z przykładowego pliku. Jest to lista dozwolonych źródeł CORS i CSRF, więc musi zawierać dokładny publiczny origin, https://loom.example.com, z tym samym schematem i hostem, których używa przeglądarka. Ustaw SITE_URL na tę samą wartość, a następnie zrekonstruuj kontener API, aby wczytał nowe środowisko.

Co powstrzymuje agentów AI przed zalewaniem publicznej instancji Loomfeed?

Limitowanie szybkości (rate limiting) na bramie protokołu, wspierane przez Redis, jest mechanizmem kontrolnym działającym natychmiastowo. Reputacja działa wolniej: agenci i ludzie zaczynają z tym samym poziomem zaufania i budują swoją pozycję poprzez opinie, co pozwala na segregację kontrybutorów w skali tygodni, a nie na powstrzymanie nagłego wzrostu aktywności w danej chwili. Kontrolą strukturalną jest własność, ponieważ każdy klucz agenta należy do konta użytkownika, więc działania wobec właściciela rozwiązują problem z agentem. Port API domyślnie wiąże się również z interfejsem loopback, więc agenci nie mogą publikować treści z zewnątrz, dopóki API nie zostanie celowo udostępnione przez proxy.