Buuck telepítése VPS-re
A Buuck a saját szervereden fut. Ez az oldal leírja, hogyan telepítsd a Buuckot egy VPS-re.
Kövesd a lépéseket a megadott sorrendben. A telepítés körülbelül 30 percet vesz igénybe.
Mit telepítesz
Szekció neve “Mit telepítesz”A Buuck három alkalmazásból és három kiegészítő szolgáltatásból áll. A Docker Compose ezeket együtt indítja el.
| Szolgáltatás | Funkció | Port |
|---|---|---|
booking |
A nyilvános oldal. Az ügyfeleid itt foglalnak. | 3002 |
dashboard |
A privát oldal. A munkatársaid itt kezelik a foglalásokat. | 3001 |
server |
Az API. A két alkalmazás innen kapja az adatokat. | 3000 |
postgres |
Az adatbázis. Az összes adatot az adatbázis tárolja. | 5432 |
cache |
A gyorsítótár. A gyorsítótár gyorsabbá teszi az API-t. | 6379 |
caddy |
A reverse proxy. Emellett a TLS-tanúsítványokat is beszerzi. | 80, 443 |
Csak a reverse proxy érhető el az internetről. A többi szolgáltatás privát Docker-hálózaton fut.
Mielőtt elkezded
Szekció neve “Mielőtt elkezded”Ezekre lesz szükséged:
- Egy VPS 2 CPU-maggal, 4 GB RAM-mal és 20 GB szabad lemezterülettel.
- 64 bites x86 processzor. A Buuck image-ek nem futnak ARM processzoron.
- Linux operációs rendszer. A Buuckot Ubuntu 24.04-en teszteljük.
- Root hozzáférés a VPS-hez, vagy
sudojogosultságú felhasználói fiók. - Egy domainnév. Tudnod kell DNS-rekordokat hozzáadni a zónájához.
- A registry felhasználóneved és a licenckulcsod. Ezeket e-mailben küldjük el.
- A Buuck kiadásod verziószáma. Ugyanaz az e-mail tartalmazza ezt a számot.
- Egy SMTP-fiók. A Buuck ezzel a fiókkal küldi a foglalási e-maileket.
Ez az oldal az example.com domainnevet használja. Cseréld le az example.com-ot a saját domainnevedre.
1. lépés: DNS-rekordok hozzáadása
Szekció neve “1. lépés: DNS-rekordok hozzáadása”A Buuck három aldomaint használ. Adj hozzá egy DNS A rekordot minden aldomainhez. Minden rekord a VPS-ed IP-címére mutasson.
| Rekord | Példa | Szolgáltatás |
|---|---|---|
api |
api.example.com |
az API |
admin |
admin.example.com |
a dashboard |
book |
book.example.com |
a foglalási oldal |
Ha a DNS-szolgáltatódnak van proxy funkciója, kapcsold ki a proxyt. A VPS-eden futó reverse proxynak közvetlenül kell megkapnia a kéréseket.
Ellenőrizz egy rekordot, mielőtt továbblépsz:
dig +short api.example.comA parancs a VPS-ed IP-címét mutatja. Ha a parancs nem ad vissza címet, várj 10 percet. Ezután ellenőrizd újra.
2. lépés: Docker telepítése
Szekció neve “2. lépés: Docker telepítése”Csatlakozz a VPS-edhez:
ssh root@YOUR-SERVER-IPTelepítsd a Docker Engine-t és a Docker Compose plugint:
curl -fsSL https://get.docker.com | shEllenőrizd a két verziót:
docker --versiondocker compose versionA Docker Compose verziója 2.20 vagy újabb legyen.
Nyisd meg a szükséges portokat a tűzfalon. Az Ubuntu az ufw-t használja:
ufw allow 22/tcpufw allow 80/tcpufw allow 443/tcpufw enable3. lépés: Bejelentkezés a Buuck registrybe
Szekció neve “3. lépés: Bejelentkezés a Buuck registrybe”A Buuck image-eid egy privát registryben vannak. Jelentkezz be az e-mailben kapott felhasználónévvel és licenckulccsal.
echo 'YOUR-LICENSE-KEY' | docker login registry.buuck.io -u 'robot$YOUR-LICENSE-ID' --password-stdinA Docker a Login Succeeded üzenetet mutatja. Ezután a Docker a VPS-en tárolja a licenckulcsot. Ezt a lépést csak egyszer kell megtenned.
4. lépés: Telepítési mappa létrehozása
Szekció neve “4. lépés: Telepítési mappa létrehozása”Hozz létre egy mappát a konfigurációs fájljaidnak:
mkdir -p /opt/buuckcd /opt/buuckA következő lépéseket mind ebben a mappában végezd.
5. lépés: Compose fájl létrehozása
Szekció neve “5. lépés: Compose fájl létrehozása”Hozz létre egy compose.yaml nevű fájlt. Írd bele ezt a szöveget:
name: buuck
services: postgres: image: postgres:16-alpine container_name: buuck-postgres environment: POSTGRES_DB: ${POSTGRES_DB} POSTGRES_USER: ${POSTGRES_USER} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} volumes: - postgres_data:/var/lib/postgresql/data healthcheck: test: ['CMD-SHELL', 'pg_isready -U ${POSTGRES_USER}'] interval: 10s timeout: 5s retries: 5 start_period: 10s restart: unless-stopped networks: - buuck
cache: image: valkey/valkey:9.0.0-alpine3.22 container_name: buuck-cache command: - valkey-server - --requirepass - ${CACHE_PASSWORD} - --dir - /data - --save - '900 1' - --maxmemory - 256mb - --maxmemory-policy - allkeys-lru environment: CACHE_PASSWORD: ${CACHE_PASSWORD} volumes: - cache_data:/data healthcheck: test: ['CMD-SHELL', 'valkey-cli --no-auth-warning -a "$$CACHE_PASSWORD" ping | grep -q PONG'] interval: 10s timeout: 5s retries: 5 start_period: 10s restart: unless-stopped networks: - buuck
db-migrate: image: ${BUUCK_REGISTRY:-registry.buuck.io}/buuck/db-migrate:${BUUCK_VERSION} container_name: buuck-db-migrate environment: DATABASE_URL: postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@postgres:5432/${POSTGRES_DB} POSTGRES_DB: ${POSTGRES_DB} POSTGRES_USER: ${POSTGRES_USER} APP_DB_USER: ${APP_DB_USER} APP_DB_PASSWORD: ${APP_DB_PASSWORD} NOTIFICATION_WORKER_USER: ${NOTIFICATION_WORKER_USER} NOTIFICATION_WORKER_PASSWORD: ${NOTIFICATION_WORKER_PASSWORD} depends_on: postgres: condition: service_healthy restart: 'no' networks: - buuck
server: image: ${BUUCK_REGISTRY:-registry.buuck.io}/buuck/server:${BUUCK_VERSION} container_name: buuck-server environment: NODE_ENV: production DATABASE_URL: postgresql://${APP_DB_USER}:${APP_DB_PASSWORD}@postgres:5432/${POSTGRES_DB} DATABASE_NOTIFICATION_WORKER_URL: postgresql://${NOTIFICATION_WORKER_USER}:${NOTIFICATION_WORKER_PASSWORD}@postgres:5432/${POSTGRES_DB} CACHE_URL: valkey://:${CACHE_PASSWORD}@cache:6379 BETTER_AUTH_SECRET: ${BETTER_AUTH_SECRET} BETTER_AUTH_URL: https://${API_DOMAIN} CORS_ORIGIN: https://${DASHBOARD_DOMAIN},https://${BOOKING_DOMAIN} EMAIL_PROVIDER: ${EMAIL_PROVIDER} EMAIL_FROM: ${EMAIL_FROM} SMTP_HOST: ${SMTP_HOST} SMTP_PORT: ${SMTP_PORT} SMTP_USER: ${SMTP_USER} SMTP_PASS: ${SMTP_PASS} SMTP_SECURE: ${SMTP_SECURE} NOTIFICATION_POLL_INTERVAL_MS: ${NOTIFICATION_POLL_INTERVAL_MS} depends_on: postgres: condition: service_healthy cache: condition: service_healthy db-migrate: condition: service_completed_successfully restart: unless-stopped networks: - buuck
dashboard: image: ${BUUCK_REGISTRY:-registry.buuck.io}/buuck/dashboard:${BUUCK_VERSION} container_name: buuck-dashboard environment: NODE_ENV: production ORIGIN: https://${DASHBOARD_DOMAIN} PUBLIC_SERVER_URL: https://${API_DOMAIN} depends_on: server: condition: service_healthy restart: unless-stopped networks: - buuck
booking: image: ${BUUCK_REGISTRY:-registry.buuck.io}/buuck/booking:${BUUCK_VERSION} container_name: buuck-booking environment: NODE_ENV: production ORIGIN: https://${BOOKING_DOMAIN} PUBLIC_SERVER_URL: https://${API_DOMAIN} depends_on: server: condition: service_healthy restart: unless-stopped networks: - buuck
caddy: image: caddy:2-alpine container_name: buuck-caddy environment: ACME_EMAIL: ${ACME_EMAIL} API_DOMAIN: ${API_DOMAIN} DASHBOARD_DOMAIN: ${DASHBOARD_DOMAIN} BOOKING_DOMAIN: ${BOOKING_DOMAIN} ports: - '80:80' - '443:443' volumes: - ./Caddyfile:/etc/caddy/Caddyfile:ro - caddy_data:/data - caddy_config:/config depends_on: - server - dashboard - booking restart: unless-stopped networks: - buuck
volumes: postgres_data: driver: local cache_data: driver: local caddy_data: driver: local caddy_config: driver: local
networks: buuck: driver: bridge6. lépés: Reverse proxy fájl létrehozása
Szekció neve “6. lépés: Reverse proxy fájl létrehozása”A reverse proxy minden kérést a megfelelő szolgáltatáshoz továbbít. Emellett TLS-tanúsítványt is beszerez minden aldomainhez.
Hozz létre egy Caddyfile nevű fájlt. Írd bele ezt a szöveget:
{ email {$ACME_EMAIL}}
{$API_DOMAIN} { reverse_proxy server:3000}
{$DASHBOARD_DOMAIN} { reverse_proxy dashboard:3001}
{$BOOKING_DOMAIN} { reverse_proxy booking:3002}7. lépés: Környezeti fájl létrehozása
Szekció neve “7. lépés: Környezeti fájl létrehozása”A környezeti fájl tartalmazza a domainneveidet, a jelszavaidat és a titkos kulcsodat.
Először készíts öt véletlenszerű értéket. Futtasd le ezt a parancsot ötször:
openssl rand -hex 24Őrizd meg az öt eredményt. Minden jelszóhoz és a titkos kulcshoz egyet használsz fel.
Hozz létre egy .env nevű fájlt. Írd bele ezt a szöveget. Ezután cseréld le minden példaértéket a saját értékedre:
# VersionBUUCK_VERSION=v0.0.1BUUCK_REGISTRY=registry.buuck.io
# Domain namesAPI_DOMAIN=api.example.comDASHBOARD_DOMAIN=admin.example.comBOOKING_DOMAIN=book.example.com
# DatabasePOSTGRES_DB=buuckPOSTGRES_USER=postgresPOSTGRES_PASSWORD=REPLACE-WITH-RANDOM-VALUE-1APP_DB_USER=app_userAPP_DB_PASSWORD=REPLACE-WITH-RANDOM-VALUE-2NOTIFICATION_WORKER_USER=notification_worker_userNOTIFICATION_WORKER_PASSWORD=REPLACE-WITH-RANDOM-VALUE-3
# CacheCACHE_PASSWORD=REPLACE-WITH-RANDOM-VALUE-4
# AuthenticationBETTER_AUTH_SECRET=REPLACE-WITH-RANDOM-VALUE-5
# EmailEMAIL_PROVIDER=smtpSMTP_HOST=smtp.example.comSMTP_PORT=587SMTP_USER=SMTP_PASS=SMTP_SECURE=false
# NotificationsNOTIFICATION_POLL_INTERVAL_MS=60000Ezek a legfontosabb változók:
| Változó | Funkció |
|---|---|
BUUCK_VERSION |
A Buuck verziója. Az e-mailed tartalmazza ezt az értéket. |
BUUCK_REGISTRY |
A Docker registry címe. Alapértelmezés: registry.buuck.io. |
API_DOMAIN |
Az API címe. |
DASHBOARD_DOMAIN |
A dashboard címe. |
BOOKING_DOMAIN |
A foglalási oldal címe. |
ACME_EMAIL |
Az e-mail címed. A tanúsítványkiadó ide küldi a figyelmeztetéseket. |
BETTER_AUTH_SECRET |
A felhasználói munkamenetek titkos kulcsa. Indítás után ne változtasd meg. |
EMAIL_PROVIDER |
Az e-mail fiók típusa. Használd az smtp, sendgrid, postmark vagy resend értéket. |
EMAIL_FROM |
A foglalási e-mailek feladó címe. |
Állítsd be a fájl megfelelő jogosultságait. Így csak a tulajdonos olvashatja a jelszavaidat:
chmod 600 .env8. lépés: Buuck indítása
Szekció neve “8. lépés: Buuck indítása”Töltsd le az image-eket a registryből:
docker compose pullIndítsd el az összes szolgáltatást:
docker compose up -dA Docker a helyes sorrendben indítja a szolgáltatásokat:
- Az adatbázis és a gyorsítótár elindul.
- A
db-migrateszolgáltatás létrehozza az adatbázis-felhasználókat és az adatbázis-táblákat. Ezután ez a szolgáltatás leáll. - Az API elindul.
- A dashboard, a foglalási oldal és a reverse proxy elindul.
Az első indítás körülbelül 2 percet vesz igénybe. A reverse proxy ebben az időben a TLS-tanúsítványokat is beszerzi.
Nézd meg a szolgáltatások állapotát:
docker compose psA db-migrate szolgáltatás az exited (0) állapotot mutatja. Ez az állapot helyes. A szolgáltatás csak egyszer fut le. Az összes többi szolgáltatás a running vagy healthy állapotot mutatja.
9. lépés: Telepítés ellenőrzése
Szekció neve “9. lépés: Telepítés ellenőrzése”Küldj egy kérést az API-nak:
curl -i https://api.example.comAz API 200 OK választ ad, és a szöveg OK.
Ezután nyisd meg ezt a két címet a böngészőben:
- A
https://admin.example.coma dashboard bejelentkezési oldalát mutatja. - A
https://book.example.coma foglalási oldalt mutatja.
A böngészőnek érvényes tanúsítványt kell mutatnia minden címhez. Ha egy oldal nem nyílik meg, olvasd el a Problémák szakaszt.
10. lépés: Első fiók létrehozása
Szekció neve “10. lépés: Első fiók létrehozása”- Nyisd meg a
https://admin.example.comcímet a böngészőben. - Válaszd a Sign up lehetőséget.
- Add meg a neved, az e-mail címed és egy jelszót.
- Válaszd a New organization lehetőséget.
- Add meg a vállalkozásod nevét és egy rövid nevet a címhez.
A dashboard megnyílik. Mostantól hozzáadhatod a helyszíneidet, az erőforrásaidat és a szolgáltatásaidat.
Az ügyfeleid a https://book.example.com/YOUR-SHORT-NAME címen foglalnak.
Mentés készítése
Szekció neve “Mentés készítése”A Buuck az összes adatodat az adatbázisban tárolja. Készíts naponta mentést az adatbázisról.
Írd a mentést egy fájlba:
cd /opt/buuckdocker compose exec -T postgres sh -c 'pg_dump -U "$POSTGRES_USER" "$POSTGRES_DB"' > buuck-$(date +%F).sqlKészíts másolatot a .env fájlról is. Tartsd mindkét fájlt egy másik gépen.
Ha vissza szeretnél tölteni egy mentést az adatbázisba, használd ezt a parancsot:
docker compose exec -T postgres sh -c 'psql -U "$POSTGRES_USER" -d "$POSTGRES_DB"' < buuck-2026-01-31.sqlFrissítés telepítése
Szekció neve “Frissítés telepítése”A licenced tartalmazza az összes későbbi verziót. Minden új verzióról e-mailt küldünk.
- Nyisd meg a
.envfájlt. - Állítsd a
BUUCK_VERSIONértékét az új verzióra. - Töltsd le az új image-eket:
docker compose pull- Indítsd el az új verziót:
docker compose up -dA Docker csak azokat a szolgáltatásokat cseréli le, amelyekhez új image tartozik. Az adatbázis megőrzi az adataidat.
Buuck leállítása és indítása
Szekció neve “Buuck leállítása és indítása”Állítsd le az összes szolgáltatást:
cd /opt/buuckdocker compose stopIndítsd el újra az összes szolgáltatást:
docker compose startBuuck eltávolítása
Szekció neve “Buuck eltávolítása”A konténerek eltávolításához használd ezt a parancsot:
cd /opt/buuckdocker compose downdocker compose down --volumesProblémák
Szekció neve “Problémák”Olvasd el egy szolgáltatás üzeneteit. Cseréld le a server nevet a szolgáltatás nevére:
cd /opt/buuckdocker compose logs -f server| Probléma | Ok és javítás |
|---|---|
A Docker unauthorized vagy denied üzenetet mutat pull közben. |
A bejelentkezés nem érvényes. Csináld meg újra a 3. lépést. |
A Docker manifest unknown üzenetet mutat pull közben. |
A BUUCK_VERSION értéke nem helyes. Hasonlítsd össze az értéket az e-maileddel. |
A Docker exec format error üzenetet mutat egy szolgáltatásnál. |
A VPS processzora nem 64 bites x86. Használj másik VPS-t. |
| A böngésző tanúsítványhibát mutat. | A DNS-rekordok nem helyesek, vagy aktív a proxy. Ellenőrizd azt is, hogy a 80-as port nyitva van-e. |
A db-migrate szolgáltatás exited (1) állapotot mutat. |
Olvasd el a szolgáltatás üzeneteit. Ezután indítsd újra a docker compose up -d db-migrate paranccsal. |
| A dashboard kapcsolódási hibát mutat. | Az API_DOMAIN vagy a DASHBOARD_DOMAIN értéke nem helyes. Javítsd az értéket. Ezután futtasd a docker compose up -d --force-recreate parancsot. |
| Az e-mailek nem érkeznek meg. | Az SMTP értékek nem helyesek. Olvasd el a server szolgáltatás üzeneteit. |
| Egy szolgáltatás újra és újra elindul. | A .env fájlban van üres érték. Hasonlítsd össze a fájlt a 7. lépés példájával. |
Ha a probléma továbbra is fennáll, válaszolj arra az e-mailre, amit a Buuck megvásárlása után küldtünk. Csatold a válaszodhoz a szolgáltatások üzeneteit.