Tagasi blogisse
August 19, 2026Juhendid

Kuidas juurutada rakendusi Docker Compose'iga VPS-il

Praktiline tootmisjuhend Docker Compose v2 kohta Ubuntuil: paigalda mootor, kirjuta Compose-fail võrkude ja köidetega, halda saladusi, pane ette pöördproksi, uuenda rahulike väljalasetega ja varunda nimega köited.

Kuidas juurutada rakendusi Docker Compose'iga VPS-il

Docker Compose on tavaline viis väikest virna ühel VPS-il käitada: veebirakendus, andmebaas, Redis vahemälu ja pöördproksi, kirjeldatud ühes YAML-failis. See ei ole Kubernetes. Sa ei saa mitme sõlme failoverit. Saad korduva, ülevaadatava seadistuse, mille saad uuel Hiddence VPS-il minutitega uuesti luua — täpselt see, mida enamik kõrvalprojekte ja väikesi tooteid vajavad.

See artikkel eeldab, et tahad midagi lähemal tootmisele kui docker run reedeõhtul. Paigaldame Docker Engine'i ja Compose pistikprogrammi, loome juurutuskasutaja ilma rootita, kirjutame Compose-faili healthcheckide ja taaskäivituspoliitikatega, hoiame saladused Gitist eemal, avaldame internetile ainult pöördproksi pordid ning määratleme uuendamise ja varundamise rutiini. Näidisvirn on tüüpiline veebirakendus pluss PostgreSQL pluss Caddy, kuid sama muster töötab Node'i, PHP, Pythoni või hunniku workerite jaoks.

Miks Compose ühel VPS-il endiselt mõtet omab

Inimesed hüppavad Kubernetese juurde, sest see on moes, ja veedavad siis nädalavahetuse YAML-iga ühe veebisaidi jaoks. Compose jääb loetavaks. Versioonid faili, dokumenteerid keskkonnamuutujad ja saad enne rakendamist muudatust diffida. Isolatsioon on piisav: kompromiteeritud rakenduse konteiner ei tohiks hoida andmebaasi UNIX-soklit, kui kasutasid võrke ja vähimate õigustega kasutajaid. Ressursipiirangud peatavad mälulekke kogu VPS-i külmutamast.

  • Üks fail kirjeldab kogu virna
  • Nimega köited jäävad konteinerite taasloomisel alles
  • Sisemised Dockeri võrgud hoiavad Postgresi avalikust internetist eemal
  • restart: unless-stopped katab enamiku taaskäivitusi
  • Lihtne kopeerida teisele VPS-ile, kui esimesest välja kasvad

Nõuded

Kasuta VPS-i, millel on piisavalt RAM-i rakendusele pluss Postgresile. 2 GB plaan on realistlik miinimum rakendusele + andmebaasile + proksile. Eeldatakse Ubuntu 24.04. Ära paigalda Dockerit juhuslikust Snapist ilma lugemata, mida see cgroupsidega teeb; alltoodud sammud kasutavad Dockeri ametlikku apt hoidlat.

  • Ubuntu 22.04/24.04, root või sudo
  • Soovitatav 2 GB RAM (1 GB ainult pisikestele virnadele ilma Postgresita)
  • Domeen, mis osutab VPS-ile, kui tahad automaatset HTTPS-i
  • Git või muu viis projekti serverisse kopeerida

Samm 1: Paigalda Docker Engine ja Compose v2

Compose v2 on pistikprogramm, mida kutsutakse kui docker compose (tühikuga), mitte vana docker-compose Pythoni binaar. Paigalda mõlemad Dockeri hoidlast, et saada praegused turvapaigad.

bash
ssh root@YOUR_VPS_IP
apt update && apt -y install ca-certificates curl gnupg
install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
chmod a+r /etc/apt/keyrings/docker.asc

echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null

apt update
apt -y install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

docker version
docker compose version

Samm 2: Juurutuskasutaja ja kataloogipaigutus

Compose'i käitamine rootina töötab, kuid pühendatud kasutaja docker grupi liikmelisusega on puhtam. Pane projekt /opt või /srv alla, mitte /root, et varukoopiad ja õigused oleksid ilmsed. Ära kunagi tee .env sisaldavat kataloogi kõigile kirjutatavaks.

bash
adduser --disabled-password --gecos '' deploy
usermod -aG docker deploy
mkdir -p /srv/app
chown deploy:deploy /srv/app
chmod 750 /srv/app

# Log in as deploy for the rest of the file editing:
# su - deploy
# cd /srv/app

Samm 3: Kirjuta tootmisele mõeldud Compose-fail

Alltoodud fail on mall. Asenda rakenduse image omaga. Postgresit ei avaldata 0.0.0.0:5432 peale — ainult Caddy avaldatakse 80 ja 443. Healthcheckid peatavad pöördproksil liikluse saatmise rakendusele, mis alles migreerib andmebaasi. Lukusta image sildid; latest on see, kuidas üllatusrikked sünnivad.

bash
# /srv/app/compose.yaml
services:
  caddy:
    image: caddy:2.8-alpine
    restart: unless-stopped
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./Caddyfile:/etc/caddy/Caddyfile:ro
      - caddy_data:/data
      - caddy_config:/config
    depends_on:
      app:
        condition: service_healthy

  app:
    image: ghcr.io/example/webapp:1.4.2
    restart: unless-stopped
    env_file: .env
    environment:
      DATABASE_URL: postgres://${POSTGRES_USER}:${POSTGRES_PASSWORD}@db:5432/${POSTGRES_DB}
    depends_on:
      db:
        condition: service_healthy
    healthcheck:
      test: ["CMD", "curl", "-fsS", "http://127.0.0.1:8000/health"]
      interval: 10s
      timeout: 3s
      retries: 10
    networks:
      - frontend
      - backend

  db:
    image: postgres:16-alpine
    restart: unless-stopped
    env_file: .env
    volumes:
      - pgdata:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U $${POSTGRES_USER} -d $${POSTGRES_DB}"]
      interval: 10s
      timeout: 5s
      retries: 10
    networks:
      - backend

networks:
  frontend: {}
  backend: {}

volumes:
  pgdata:
  caddy_data:
  caddy_config:

Samm 4: Saladused, .env ja Caddyfile

Pane paroolid serveris .env faili, chmod 600, ja ära kunagi seda faili commiti. Genereeri paroole käsuga openssl rand -base64 32. Caddyfile peab ainult pöördproksima rakenduse teenusenimele Dockeri võrgus.

bash
# /srv/app/.env (permissions 600)
POSTGRES_USER=app
POSTGRES_PASSWORD=change-me-long-random
POSTGRES_DB=app
# plus any APP_SECRET / NEXTAUTH_SECRET your image needs

# /srv/app/Caddyfile
app.example.com {
    encode gzip
    reverse_proxy app:8000
}

chmod 600 /srv/app/.env
cd /srv/app
docker compose up -d
docker compose ps
docker compose logs -f --tail=100

Samm 5: Tulemüür, logid ja ressursipiirangud

UFW peaks lubama ainult 22, 80 ja 443. Docker möödub mõnikord UFW-st avaldatud portide puhul; kui vajad ranget hosti tulemüüri, otsi oma Ubuntu versiooni praegune Docker + UFW vastastikmõju või avalda pordid ainult 127.0.0.1 peal ja pane ette hosti Caddy. Sea Compose'is mälupiirangud, et Postgres ei saaks VPS-i ära süüa.

bash
ufw allow OpenSSH
ufw allow 80/tcp
ufw allow 443/tcp
ufw enable

# Optional in compose.yaml under app or db:
#    deploy:
#      resources:
#        limits:
#          memory: 512M

# Logs (do not let json-file grow forever):
# { "log-driver": "json-file", "log-opts": { "max-size": "10m", "max-file": "3" } }
# in /etc/docker/daemon.json then: systemctl restart docker

Samm 6: Uuendused ja tagasivõtmised

Igav uuendus, mis töötab: tõmba uued imaged, up -d, jälgi healthchecke, hoia eelmine silt gitis, et saaksid tagasi lukustada. Ära käivita docker compose down tootmisandmebaasil, kui sa ei kavatse liiklust vastu võtta lõpetada. down -v kustutab köited — see on pühkimine, mitte taaskäivitus.

bash
cd /srv/app
git pull   # if the Compose file lives in git

# Change the image tag in compose.yaml, then:
docker compose pull
docker compose up -d
docker compose ps

# Rollback: set the old tag, pull, up -d again
# NEVER: docker compose down -v   # this deletes named volumes

Varunda nimega köited

VPS-i hetktõmmis on hea. Loogiline Postgresi dump on parem, kui pead taastama teisele masinale. Planeeri see croniga. Testi taastamist korra, muidu pole sul varukoopiaid — sul on failid, millest loodad, et need on varukoopiad.

bash
# Postgres dump while the db container is running:
docker compose exec -T db pg_dump -U app app | gzip > /var/backups/app-$(date +%F).sql.gz

# Copy off-box
# scp /var/backups/app-*.sql.gz backup-host:~

# Restore sketch (maintenance window):
# gunzip -c app-2026-08-19.sql.gz | docker compose exec -T db psql -U app app

Tõrkeotsing

Loe docker compose ps ja docker compose logs service. Image'i tõmbamise tõrked on tavaliselt ghcr/docker hubi kiirusepiirangud või privaatne image ilma sisselogimiseta. 502 Caddyst tähendab, et rakendus ei ole healthy või proksi hostinimi on vale (kasuta Compose teenusenime, mitte localhosti, Caddy konteinerist seest). Õiguste vead köidetel tähendavad sageli, et image jookseb uid 1000-na, samas kui hosti kataloog on root.

  • compose: command not found — paigaldasid vana binaarinime; kasuta docker compose
  • port is already allocated — keegi teine omab 80/443 (Apache, Nginx, teine Caddy)
  • database connection refused — rakendus startis enne Postgresi valmisolekut; kasuta healthcheck + depends_on condition
  • disk full — docker system df, seejärel prune kasutamata imaged ettevaatlikult
  • permission denied on docker.sock — kasutaja pole docker grupis või vajad uut sisselogimisseanssi

Turvalisus

Ära avalda andmebaasiporte. Ära käita privileged: true. Ära monteeri /var/run/docker.sock rakenduse konteinerisse, kui sa ei kirjuta teadlikult konteinerihaldurit. Hoia mootor uuendatud. Skanni oma imaged, kui neid ehitad. .env kettale on endiselt salajane fail — piira, kes saab kasti ssh-ida.

  • Pole avalikku 5432 / 3306 / 6379
  • Lukusta image digestid või vähemalt muutumatud sildid
  • chmod 600 .env
  • Unattended-upgrades hosti OS-ile loevad endiselt
  • Üks Compose projekt rakenduse kohta hoiab plahvatusraadiuse väiksemana

Näpunäited

  • Pane compose.yaml gitti; hoia .env.example ilma päris saladusteta
  • Kasuta profiile valikulistele workeritele (docker compose --profile workers up -d)
  • Jälgi docker stats, kui VPS-i mõõdad
  • Lähtekoodi bind mountide puhul pole see tootmismuster — küpseta image
  • Kui virn kasvab mitmele VPS-ile, vaata siis orkestreerimist — mitte enne

Tootmisele sarnane Compose seadistus ühel VPS-il on: ametlikud Dockeri paketid, lukustatud .env, YAML-fail, mis ei avalda andmebaasi, healthcheckid, pöördproksi 80/443, UFW, image sildid, mille saad tagasi võtta, ja Postgresi dumpid, mida oled tegelikult korra taastanud. Alusta selle artikli mallist, asenda rakenduse image ja kohtle docker compose down -v kui hävitavat käsku sama austusega kui rm -rf.