Jang go Tsenya Di-application ka Docker Compose mo VPS
Kaelo ya production ya tiriso ya Docker Compose v2 mo Ubuntu: tsenya engine, kwala faele ya Compose e e nang le di-network le di-volume, laola diphiri, baya reverse proxy kwa pele, ntšhwafatsa ka diphetogo tse di se nang tshoganetso, mme o boloke di-volume tse di reilweng.

Docker Compose ke tsela e e tlwaelegileng ya go tsamaisa stack e nnye mo VPS e le nngwe: web app, database, Redis cache, le reverse proxy, tse di tlhalositsweng mo faeleng e le nngwe ya YAML. Ga se Kubernetes. Ga o kitla o nna le failover ya di-node tse dintsi. O tla nna le peakanyo e e ka dirwang gape, e e ka tlhatlhobiwang, e o ka e tlhamang gape mo VPS e ntšha ya Hiddence mo metsotsweng — se se tlhokwang ke diporojeke tse dintsi tsa thoko le ditlhagiso tse dinnye.
Athikele e e tsaya gore o batla se se gaufi le production go feta docker run mo Labotlhano bosigo. Re tla tsenya Docker Engine le plugin ya Compose, re tlhame modirisi wa go tsenya yo e seng root, re kwale faele ya Compose e e nang le di-healthcheck le melao ya go simolola gape, re nne le diphiri kwa ntle ga Git, re gatise fela di-port tsa reverse proxy mo internet, mme re tlhalose mokgwa wa ntšhwafatso le pabalelo. Stack ya sekao ke web app e e tlwaelegileng mmogo le PostgreSQL le Caddy, mme mokgwa o o tshwanang o bereka bakeng sa Node, PHP, Python, kgotsa badiri ba bantsi.
Ke ka ntlha yang Compose mo VPS e le nngwe e santse e na le bokao
Batho ba tlolela kwa Kubernetes ka gonne e a feshionwa, mme ba fetsa beke ka YAML ya website e le nngwe. Compose e nna e ka balwa. O naya faele version, o kwala di-variable tsa tikologo, mme o ka diff phetogo pele ga o e dirisa. Kgaoganyo e a lekana: container ya app e e amogetseng bosetlhogo ga e a tshwanela go tshwara UNIX socket ya database fa o dirisitse di-network le badirisi ba ba nang le ditshwanelo tse di kwa tlase. Meedi ya disebediswa e thibela memory leak e le nngwe go tshola VPS yotlhe.
- Faele e le nngwe e tlhalosa stack yotlhe
- Di-volume tse di reilweng di sala tse di teng fa container e tlhamiwa gape
- Di-network tsa mo teng tsa Docker di nna le Postgres kwa ntle ga internet e e bulegileng
- restart: unless-stopped e tshwarela bontsi jwa go tshuba gape
- Go motlhofo go e kopisetsa kwa VPS ya bobedi fa o feta ya ntlha
Ditlhokego
Dirisa VPS e e nang le RAM e e lekaneng bakeng sa app le Postgres. Leano la 2 GB ke minimum e e utlwalang ya app + database + proxy. Ubuntu 24.04 e a tsewa. O se ka wa tsenya Docker go tswa mo Snap e e sa solofelwang ntle le go bala se e se dirang mo di-cgroup; dikgato tse di fa tlase di dirisa repository ya semmuso ya apt ya Docker.
- Ubuntu 22.04/24.04, root kgotsa sudo
- 2 GB RAM e a kgothalediwa (1 GB fela ya di-stack tse dinnye thata ntle le Postgres)
- Domain e e bontshang VPS fa o batla HTTPS e e itiragalang
- Git kgotsa tsela e nngwe ya go kopisa porojeke mo server
Kgato 1: Tsenya Docker Engine le Compose v2
Compose v2 ke plugin e e bitswang jaaka docker compose (ka sekgala), e seng binary ya bogologolo ya Python ya docker-compose. Tsenya tse pedi go tswa mo repository ya Docker gore o nne le di-patch tsa tshireletso tsa jaanong.
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 versionKgato 2: Modirisi wa go tsenya le peakanyo ya directory
Go tsamaisa Compose jaaka root go a bereka, mme modirisi yo o kgethegileng yo o leng mo setlhopheng sa docker o phepa. Baya porojeke mo /opt kgotsa /srv, e seng mo /root, gore dipabalelo le ditumelo di nne di lebelega. O se ka wa dira gore directory e e nang le .env e nne e ka kwaliwa ke mongwe le mongwe.
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/appKgato 3: Kwala faele ya Compose e e ikaegileng ka production
Faele e e fa tlase ke template. Emisetsa image ya app ka ya gago. Postgres ga e gatisiwe kwa 0.0.0.0:5432 — ke Caddy fela e e gatisitsweng mo 80 le 443. Di-healthcheck di thibela reverse proxy go romela traffic kwa app e e santse e fudusa database. Tshwara di-tag tsa image; latest ke tsela e go tlang ka yone go senyega go sa solofelwa.
# /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:Kgato 4: Diphiri, .env le Caddyfile
Baya di-password mo .env mo server, chmod 600, mme o se ka wa commit faele eo. Dira di-password ka openssl rand -base64 32. Caddyfile e tlhoka fela go reverse-proxy kwa leineng la tirelo ya app mo network ya 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=100Kgato 5: Firewall, di-log le meedi ya disebediswa
UFW e tshwanetse go letlelela 22, 80 le 443 fela. Docker ka dinako tse dingwe e feta UFW bakeng sa di-port tse di gatisitsweng; fa o tlhoka firewall e e thata ya host, batla tirisanommogo ya jaanong ya Docker + UFW ya version ya gago ya Ubuntu kgotsa gatisa di-port fela mo 127.0.0.1 mme o baya Caddy ya host kwa pele. Baya meedi ya memory mo Compose gore Postgres e se ka ya ja VPS.
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 dockerKgato 6: Dintšhwafatso le go busetsa morago
Ntšhwafatso e e tena e e bereng: goga di-image tse ntšha, up -d, lebelela di-healthcheck, nna le tag e e fetileng mo git gore o kgone go e tshwara morago. O se ka wa dira docker compose down mo database ya production ntle le fa o ikaeletse go emisa go amogela traffic. down -v e phimola di-volume — seo ke go phimola, e seng go simolola gape.
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 volumesBoloka di-volume tse di reilweng
Snapshot ya VPS e siame. Dump e e utlwalang ya Postgres e botoka fa o tlhoka go busetsa mo motšhineng o mongwe. E rulaganye ka cron. Testa go busetsa gangwe, kgotsa ga o na dipabalelo — o na le difaele tse o solofetseng gore ke dipabalelo.
# 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 appGo rarabolola mathata
Bala docker compose ps le docker compose logs service. Go palelwa ga go goga image gantsi ke meedi ya lebelo ya ghcr/docker hub kgotsa image ya sephiri ntle le login. 502 go tswa mo Caddy e raya gore app ga e phele sentle kgotsa hostname ya proxy e fosagetse (dirisa leina la tirelo ya Compose, e seng localhost, go tswa mo teng ga container ya Caddy). Diphoso tsa tumello mo di-volume gantsi di raya gore image e tsamaya jaaka uid 1000 fa directory ya host e le root.
- compose: command not found — o tsentse leina la binary ya bogologolo; dirisa docker compose
- port e setse e neilwe — sengwe se sengwe se tshwere 80/443 (Apache, Nginx, Caddy e nngwe)
- kgolagano ya database e gannwe — app e simolotse pele ga Postgres e nna siapame; dirisa healthcheck + maemo a depends_on
- disk e tletse — docker system df, mme o prune di-image tse di sa dirisiweng ka kelotlhoko
- tumello e gannwe mo docker.sock — modirisi ga a mo setlhopheng sa docker, kgotsa o tlhoka session e ntšha ya go tsena
Tshireletso
O se ka wa gatisa di-port tsa database. O se ka wa tsamaisa privileged: true. O se ka wa mount /var/run/docker.sock mo container ya app ntle le fa o kwala motsamaisi wa container ka maikaelelo. Nna o ntšhwafaditse engine. Scan di-image tsa gago fa o di aga. .env mo disk e santse e le faele ya sephiri — kgaola yo o ka ssh-ang mo bokosong.
- Ga go na 5432 / 3306 / 6379 e e bulegileng
- Tshwara di-digest tsa image kgotsa bonyane di-tag tse di sa fetogeng
- chmod 600 .env
- Unattended-upgrades tsa OS ya host di santse di botlhokwa
- Porojeke e le nngwe ya Compose ka app e nna le radius ya senyo e nnye
Dikeletso
- Baya compose.yaml mo git; nna le .env.example ntle le diphiri tsa mmatota
- Dirisa di-profile tsa badiri ba ba sa tlhokegeng (docker compose --profile workers up -d)
- Leba docker stats fa o lekanya VPS
- Bakeng sa bind mounts tsa source code, ga se mokgwa wa production — apeha image
- Fa stack e gola go nna di-VPS tse dintsi, ke gone o lebang orchestration — e seng pele ga moo
Peakanyo ya Compose e e gaufi le production mo VPS e le nngwe ke: di-package tsa semmuso tsa Docker, .env e e tswaletsweng, faele ya YAML e e sa gatiseng database, di-healthcheck, reverse proxy mo 80/443, UFW, di-tag tsa image tse o ka di busetsang morago, le di-dump tsa Postgres tse o di busitseng gangwe tota. Simolola ka template e e mo athikeleng e, emisetsa image ya app, mme o tshware docker compose down -v jaaka taelo e e senyang ka tlotlo e e tshwanang le ya rm -rf.