VPS-те Docker Compose арқылы қосымшаларды қалай орналастыруға болады
Ubuntu-да Docker Compose v2 бойынша практикалық өндірістік нұсқаулық: қозғалтқышты орнатыңыз, желілер мен томдары бар 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 репозиторийінен орнатыңыз.
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 version2-қадам: Deploy пайдаланушысы және каталог орналасуы
Compose-ты root ретінде іске қосу жұмыс істейді, бірақ docker тобында мүшелігі бар бөлек пайдаланушы тазалау. Жобаны /root-та емес, /opt немесе /srv-ге қойыңыз — сақтық көшірмелер мен рұқсаттар анық болсын. .env бар каталогты ешқашан әлемге жазылатын етпеңіз.
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/app3-қадам: Өндіріске бағытталған Compose файлын жазыңыз
Төмендегі файл — үлгі. Қосымша бейнесін өзіңіздікімен ауыстырыңыз. Postgres 0.0.0.0:5432-ге жарияланбайды — тек Caddy 80 және 443-те жарияланады. Денсаулық тексерулері кері проксидің дерекқорды әлі көшіріп жатқан қосымшаға трафик жіберуін тоқтатады. Бейне тегтерін бекітіңіз; latest — тосын сынулардың қалай болатыны.
# /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 желісіндегі қосымша қызмет атауына кері прокси жасау керек.
# /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=1005-қадам: Брандмауэр, журналдар және ресурс лимиттері
UFW тек 22, 80 және 443-ке рұқсат беруі керек. Docker кейде жарияланған порттар үшін UFW-ді айналып өтеді; қатаң хост брандмауэрі қажет болса, Ubuntu нұсқаңыз үшін ағымдағы Docker + UFW әрекеттесуін қараңыз немесе порттарды тек 127.0.0.1-де жариялап, алдына хост Caddy қойыңыз. Postgres VPS-ті жеп қоймауы үшін Compose-та жад лимиттерін қойыңыз.
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 docker6-қадам: Жаңартулар және кері қайтару
Жұмыс істейтін жалықтыратын жаңарту: жаңа бейнелерді тартыңыз, up -d, денсаулық тексерулерін бақылаңыз, кері бекіту үшін алдыңғы тегті git-те ұстаңыз. Трафикті тоқтатуды көздемесеңіз, өндірістік дерекқорда docker compose down жасамаңыз. down -v томдарды жояды — бұл қайта іске қосу емес, өшіру.
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-мен жоспарлаңыз. Қалпына келтіруді бір рет сынаңыз, әйтпесе сақтық көшірмеңіз жоқ — сақтық көшірме деп үміттенетін файлдарыңыз бар.
# 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 сияқты құрметпен қараңыз.