Блогқа оралу
Тамыз 19, 2026Нұсқаулықтар

VPS-те Docker Compose арқылы қосымшаларды қалай орналастыруға болады

Ubuntu-да Docker Compose v2 бойынша практикалық өндірістік нұсқаулық: қозғалтқышты орнатыңыз, желілер мен томдары бар Compose файлын жазыңыз, құпияларды өңдеңіз, алдына кері прокси қойыңыз, дүрбелеңсіз жаңартулар жасаңыз және атаулы томдарды сақтық көшірмелеңіз.

VPS-те Docker Compose арқылы қосымшаларды қалай орналастыруға болады

Docker Compose — бір VPS-те шағын стекті іске қосудың әдеттегі жолы: веб-қосымша, дерекқор, Redis кэші және кері прокси, бәрі бір YAML файлында. Бұл Kubernetes емес. Көп түйінді failover алмайсыз. Жаңа Hiddence VPS-те минуттарда қайта жасай алатын қайталанатын, шолуға болатын орнату аласыз — көптеген жанама жобалар мен шағын өнімдерге дәл осы керек.

Бұл мақала жұма кешіндегі docker run-нан өндіріске жақынырақ нәрсе қалайсыз деп есептейді. Docker Engine мен Compose плагинін орнатамыз, root емес deploy пайдаланушысын жасаймыз, денсаулық тексерулері мен қайта іске қосу саясаттары бар Compose файлын жазамыз, құпияларды Git-тен тыс ұстаймыз, интернетке тек кері прокси порттарын жариялаймыз және жаңарту мен сақтық көшірме тәртібін анықтаймыз. Мысал стек — типтік веб-қосымша плюс PostgreSQL плюс Caddy, бірақ сол үлгі Node, PHP, Python немесе бір топ worker үшін де жұмыс істейді.

Бір VPS-те Compose неге әлі де мағыналы

Адамдар сән болғандықтан Kubernetes-ке секіреді, содан кейін бір веб-сайт үшін демалыс күндерін YAML-мен өткізеді. Compose оқылатын болып қалады. Файлды нұсқалайсыз, орта айнымалыларын құжаттайсыз және қолданар алдында өзгерісті diff ете аласыз. Оқшаулау жеткілікті: желілер мен ең аз артықшылықты пайдаланушыларды қолдансаңыз, бұзылған қосымша контейнері дерекқор UNIX сокетін ұстамауы керек. Ресурс лимиттері бір жад ағынының бүкіл VPS-ті қатыруын тоқтатады.

  • Бір файл бүкіл стекті сипаттайды
  • Атаулы томдар контейнерді қайта жасаудан аман қалады
  • Ішкі Docker желілері Postgres-ті жалпыға ортақ интернеттен ұстайды
  • restart: unless-stopped көптеген қайта жүктеулерді қамтиды
  • Біріншісін өсіп шыққанда екінші VPS-ке көшіру оңай

Талаптар

Қосымша плюс Postgres үшін жеткілікті RAM бар VPS пайдаланыңыз. Қосымша + дерекқор + прокси үшін шынайы минимум — 2 ГБ жоспар. Ubuntu 24.04 есептеледі. cgroups-қа не істейтінін оқымай кездейсоқ Snap-тен Docker орнатпаңыз; төмендегі қадамдар Docker-дің ресми apt репозиторийін пайдаланады.

  • Ubuntu 22.04/24.04, root немесе sudo
  • 2 ГБ RAM ұсынылады (Postgres-сіз өте кішкентай стектер үшін тек 1 ГБ)
  • Автоматты HTTPS қаласаңыз VPS-ке қарайтын домен
  • Жобаны серверге көшірудің жолы: Git немесе басқа

1-қадам: Docker Engine және Compose v2 орнатыңыз

Compose v2 — ескі docker-compose Python бинары емес, docker compose (бос орынмен) деп шақырылатын плагин. Ағымдағы қауіпсіздік түзетулерін алу үшін екеуін де Docker репозиторийінен орнатыңыз.

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

2-қадам: Deploy пайдаланушысы және каталог орналасуы

Compose-ты root ретінде іске қосу жұмыс істейді, бірақ docker тобында мүшелігі бар бөлек пайдаланушы тазалау. Жобаны /root-та емес, /opt немесе /srv-ге қойыңыз — сақтық көшірмелер мен рұқсаттар анық болсын. .env бар каталогты ешқашан әлемге жазылатын етпеңіз.

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

3-қадам: Өндіріске бағытталған Compose файлын жазыңыз

Төмендегі файл — үлгі. Қосымша бейнесін өзіңіздікімен ауыстырыңыз. Postgres 0.0.0.0:5432-ге жарияланбайды — тек Caddy 80 және 443-те жарияланады. Денсаулық тексерулері кері проксидің дерекқорды әлі көшіріп жатқан қосымшаға трафик жіберуін тоқтатады. Бейне тегтерін бекітіңіз; latest — тосын сынулардың қалай болатыны.

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:

4-қадам: Құпиялар, .env және Caddyfile

Құпия сөздерді сервердегі .env-ке қойыңыз, chmod 600 жасаңыз және сол файлды ешқашан commit етпеңіз. Құпия сөздерді openssl rand -base64 32 арқылы генерациялаңыз. Caddyfile-ға тек Docker желісіндегі қосымша қызмет атауына кері прокси жасау керек.

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

5-қадам: Брандмауэр, журналдар және ресурс лимиттері

UFW тек 22, 80 және 443-ке рұқсат беруі керек. Docker кейде жарияланған порттар үшін UFW-ді айналып өтеді; қатаң хост брандмауэрі қажет болса, Ubuntu нұсқаңыз үшін ағымдағы Docker + UFW әрекеттесуін қараңыз немесе порттарды тек 127.0.0.1-де жариялап, алдына хост Caddy қойыңыз. Postgres VPS-ті жеп қоймауы үшін Compose-та жад лимиттерін қойыңыз.

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

6-қадам: Жаңартулар және кері қайтару

Жұмыс істейтін жалықтыратын жаңарту: жаңа бейнелерді тартыңыз, up -d, денсаулық тексерулерін бақылаңыз, кері бекіту үшін алдыңғы тегті git-те ұстаңыз. Трафикті тоқтатуды көздемесеңіз, өндірістік дерекқорда docker compose down жасамаңыз. down -v томдарды жояды — бұл қайта іске қосу емес, өшіру.

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

Атаулы томдарды сақтық көшірмелеңіз

VPS снапшоты жақсы. Басқа машинаға қалпына келтіру қажет болса, логикалық Postgres демпі жақсырақ. Мұны cron-мен жоспарлаңыз. Қалпына келтіруді бір рет сынаңыз, әйтпесе сақтық көшірмеңіз жоқ — сақтық көшірме деп үміттенетін файлдарыңыз бар.

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

Ақаулықтарды жою

docker compose ps және docker compose logs service оқыңыз. Бейне тарту қателері әдетте ghcr/docker hub жылдамдық шектеулері немесе кірусіз жеке бейне. Caddy-ден 502 қосымшаның сау еместігін немесе прокси хост атауының қате екенін білдіреді (Caddy контейнерінің ішінен localhost емес, Compose қызмет атауын пайдаланыңыз). Томдардағы рұқсат қателері көбіне бейненің uid 1000 ретінде жұмыс істеуі, хост каталогының root болуы.

  • compose: command not found — ескі бинар атауын орнаттыңыз; docker compose пайдаланыңыз
  • port is already allocated — 80/443-ті басқа біреу иеленеді (Apache, Nginx, басқа Caddy)
  • database connection refused — қосымша Postgres дайын болмай тұрып іске қосылды; healthcheck + depends_on шартын пайдаланыңыз
  • disk full — docker system df, содан кейін пайдаланылмаған бейнелерді абайлап кесіңіз
  • permission denied on docker.sock — пайдаланушы docker тобында емес немесе жаңа кіру сессиясы керек

Қауіпсіздік

Дерекқор порттарын жарияламаңыз. privileged: true іске қоспаңыз. Әдейі контейнер менеджерін жазбасаңыз, /var/run/docker.sock-ты қосымша контейнеріне тіркемеңіз. Қозғалтқышты жаңартып ұстаңыз. Өз бейнелеріңізді құрастырсаңыз, сканерлеңіз. Дискідегі .env әлі де құпия файл — жәшікке кім ssh жасай алатынын шектеңіз.

  • Жалпыға ортақ 5432 / 3306 / 6379 жоқ
  • Бейне дайджестерін немесе кемінде өзгермейтін тегтерді бекітіңіз
  • chmod 600 .env
  • Хост ОС үшін Unattended-upgrades әлі де маңызды
  • Қосымшаға бір Compose жобасы жарылыс радиусын кіші ұстайды

Кеңестер

  • compose.yaml-ді git-ке қойыңыз; нақты құпияларсыз .env.example ұстаңыз
  • Міндетті емес worker-лер үшін профильдерді пайдаланыңыз (docker compose --profile workers up -d)
  • VPS өлшемін таңдағанда docker stats қадағалаңыз
  • Бастапқы кодтың bind mount-ы өндірістік үлгі емес — бейне пісіріңіз
  • Стек бірнеше VPS-ке өссе, сонда оркестрацияға қараңыз — одан бұрын емес

Бір VPS-тегі өндіріске жақын Compose орнатуы: ресми Docker пакеттері, құлыпталған .env, дерекқорды жарияламайтын YAML файлы, денсаулық тексерулері, 80/443-те кері прокси, UFW, кері қайтара алатын бейне тегтері және бір рет шынымен қалпына келтірген Postgres демптері. Осы мақаладағы үлгіден бастаңыз, қосымша бейнесін ауыстырыңыз және docker compose down -v-ге rm -rf сияқты құрметпен қараңыз.