VPS-də Docker Compose ilə yerləşdirmək üçün Docker Engine və Compose plaginini quraşdırın, layihə qovluğuna compose.yaml və .env faylı qoyun, docker compose up -d işlədin və HTTPS üçün qarşısına Caddy kimi reverse proxy qoyun. Bundan sonra yeniləmələr docker compose pull && docker compose up -d ilə edilir.
Bu bələdçi Ubuntu 24.04 və ya Debian 12 üzərində kiçik, lakin real stek qurur: veb tətbiq, Postgres verilənlər bazası və avtomatik HTTPS üçün Caddy.
1. Serveri hazırlayın
İlk addımları atılmış serverlə başlayın: yeniləmələr, sudo istifadəçisi, SSH açarları və firewall. Bu stek üçün 2 GB yaddaş məntiqli minimumdur.
HTTPS ilk cəhddə işləsin deyə başlamazdan əvvəl DNS qeydini serverə yönəldin:
app.example.com. A 203.0.113.10 ; example address
app.example.com. AAAA 2001:db8::10 ; example address
2. Docker Engine və Compose quraşdırın
Docker-in öz repozitoriyasından istifadə edin; distribusiya paketləri çox vaxt köhnə olur.
sudo apt update
sudo apt install -y ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
. /etc/os-release
sudo curl -fsSL "https://download.docker.com/linux/$ID/gpg" -o /etc/apt/keyrings/docker.asc
sudo 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/$ID $VERSION_CODENAME stable" | \
sudo tee /etc/apt/sources.list.d/docker.list >/dev/null
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
$ID dəyəri ubuntu və ya debian olur, ona görə də eyni sətirlər hər ikisində işləyir. Yoxlayın:
sudo docker run --rm hello-world
docker compose version
İstifadəçinizə Docker-i sudo olmadan işlətməyə icazə verin (sonra çıxıb yenidən daxil olun):
sudo usermod -aG docker $USER
docker qrupuna üzvlük faktiki olaraq root girişi deməkdir. Yalnız etibar etdiyiniz istifadəçiləri əlavə edin.
Qısa yol: Wolkra-dakı Docker bir kliklə tətbiqi Docker CE-ni Compose ilə birlikdə sizin üçün quraşdırır.
3. Layihənin strukturunu qurun
mkdir -p ~/apps/myapp && cd ~/apps/myapp
Aydın struktur serveri aylar sonra da asan başa düşməyə kömək edir:
~/apps/myapp/
├── compose.yaml
├── .env # secrets, not in git
└── Caddyfile
4. compose.yaml yazın
services:
app:
image: ghcr.io/example/myapp:1.4.2
restart: unless-stopped
env_file: .env
environment:
DATABASE_URL: postgres://myapp:${POSTGRES_PASSWORD}@db:5432/myapp
depends_on:
db:
condition: service_healthy
expose:
- "3000"
db:
image: postgres:16
restart: unless-stopped
environment:
POSTGRES_USER: myapp
POSTGRES_DB: myapp
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
volumes:
- db-data:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U myapp"]
interval: 10s
retries: 5
caddy:
image: caddy:2
restart: unless-stopped
ports:
- "80:80"
- "443:443"
- "443:443/udp"
volumes:
- ./Caddyfile:/etc/caddy/Caddyfile:ro
- caddy-data:/data
- caddy-config:/config
volumes:
db-data:
caddy-data:
caddy-config:
Diqqət yetirməli məqamlar:
- Image versiyalarını sabitləyin (
1.4.2,16) ki, yenidən başlatma heç vaxt gözlənilməz böyük versiya yeniləməsi çəkməsin. - Tətbiq və verilənlər bazası üçün
portsdeyil,expose. Onlara yalnız Compose şəbəkəsinin daxilindən çatmaq olur. Portları yalnız Caddy açır. - Adlı volume-lar konteynerlər yenidən yaradılanda məlumatları saxlayır.
- Health check ilə
depends_onPostgres bağlantı qəbul etməyə başlayana qədər gözləyir.
ghcr.io/example/myapp dəyərini öz image-iniz və portunuzla əvəz edin.
5. Sirləri .env faylında saxlayın
cat > .env <<EOF
POSTGRES_PASSWORD=$(openssl rand -hex 24)
APP_SECRET=$(openssl rand -hex 32)
EOF
chmod 600 .env
Compose ${...} əvəzləmələri üçün .env faylını layihə qovluğundan oxuyur, env_file isə onu tətbiqə ötürür. Qovluq git checkout-dursa, .env faylını .gitignore-a əlavə edin.
6. Caddy ilə HTTPS əlavə edin
Caddyfile yaradın:
app.example.com {
encode zstd gzip
reverse_proxy app:3000
}
DNS serverə yönələn və 80, 443 portları açılan kimi Caddy sertifikatı avtomatik alır və yeniləyir. Əlavə seçimlər üçün Caddy reverse proxy bələdçisinə baxın.
7. Steki işə salın
docker compose up -d
docker compose ps
docker compose logs -f caddy
Caddy logda certificate obtained successfully yazanda https://app.example.com ünvanını açın.
8. Firewall-a diqqət edin
Docker UFW-dən əvvəl işləyən iptables qaydaları əlavə edir. ports: ilə açılmış porta UFW bloklandığını desə belə internetdən çatmaq olur. Təhlükəsiz qalmağın üç yolu:
- Yalnız reverse proxy-ni açın (yuxarıdakı kimi).
- Qalan hər şeyi localhost-a bağlayın:
"127.0.0.1:5432:5432". - Serverin qarşısında Docker-in yan keçə bilmədiyi bulud firewall-u ilə süzün. 80 və 443-ə hər yerdən, 22-yə isə yalnız öz ünvanınızdan icazə verin.
9. Problemsiz yeniləyin
compose.yaml faylında image tag-ını dəyişin, sonra:
docker compose pull
docker compose up -d
docker image prune -f
Compose yalnız image-i və ya konfiqurasiyası dəyişmiş servisləri yenidən yaradır. Geri qaytarmaq üçün köhnə tag-ı yazın və up -d əmrini yenidən işlədin. Dump və bərpa tələb edən yeni Postgres böyük versiyası kimi ciddi yeniləmələrdən əvvəl snapshot çəkin.
10. Məlumatların ehtiyat nüsxəsini çıxarın
Volume-lar /var/lib/docker/volumes altında yerləşir. Verilənlər bazası üçün məntiqi dump faylları kopyalamaqdan daha təhlükəsizdir:
docker compose exec -T db pg_dump -U myapp myapp | gzip > ~/backups/myapp-$(date +%F).sql.gz
Bunu hər gecə cron ilə işlədin və faylları serverdən kənara köçürün. Server səviyyəsində ehtiyat nüsxələr də kömək edir: Wolkra-da gündəlik ehtiyat nüsxələr server qiymətinin 20%-i qədərdir və 7 bərpa nöqtəsi saxlayır. Ehtiyat nüsxə strategiyası bələdçisi hamısını bir yerə toplayır.
11. Loglar və limitlər
Standart Docker logları limitsiz böyüyür. Onları /etc/docker/daemon.json faylında qlobal olaraq məhdudlaşdırın:
{
"log-driver": "json-file",
"log-opts": { "max-size": "10m", "max-file": "3" }
}
Sonra sudo systemctl restart docker işlədin. Bir konteynerin digərlərini resurssuz qoymaması üçün hər servisin yaddaşını mem_limit: 512m ilə də məhdudlaşdıra bilərsiniz.
12. Açılışda avtomatik başlatma
restart: unless-stopped və aktiv Docker servisi stekin yenidən başlatmadan sonra geri qayıtmasını təmin edir. Bunu bir dəfə yoxlayın:
sudo reboot
# log in again
docker compose -f ~/apps/myapp/compose.yaml ps
13. CI-dan yerləşdirin
Stek işləməyə başladıqdan sonra yerləşdirmələr avtomatik ola bilər. CI tapşırığı yeni tag ilə image build edib push edir, sonra serverə SSH ilə qoşulub bunu işlədir:
cd ~/apps/myapp
sed -i 's|myapp:.*|myapp:1.4.3|' compose.yaml
docker compose pull app
docker compose up -d app
SSH açarları bələdçisində təsvir edildiyi kimi CI tapşırığına yalnız bu serverlə məhdudlaşan öz SSH açarını verin.
Bir serverdən nə vaxt kənara çıxmalı
Bir serverdə Compose ilə çox şey etmək olar. Daha çoxu lazım olduqda adi növbəti addımlar bunlardır:
- verilənlər bazasını şəxsi şəbəkədə ayrıca serverə köçürmək;
- yük balanslaşdırıcısının arxasında iki tətbiq serveri işlətmək;
- məlumatları serverlər arasında köçürə biləcəyiniz blok yaddaş volume-unda saxlamaq.
Çoxlu tətbiqi veb interfeys vasitəsilə idarə etmək üçün Coolify bir kliklə tətbiqi eyni Docker təməli üzərində qurulub. Daha çox ideya Docker hostinqi səhifəsindədir.
Tez-tez verilən suallar
Docker Compose production üçün kifayətdirmi?
Bir server üçün bəli. Bir çox kiçik və orta tətbiq illərlə Compose üzərində işləyir. Orkestratora yalnız bir neçə host, avtomatik failover və ya maşınlar arasında mərhələli yeniləmələr lazım olduqda keçin.
Docker Compose üçün nə qədər böyük VPS lazımdır?
Hər konteynerin istifadə etdiyini toplayın. Postgres və Redis ilə veb tətbiq 2-4 GB yaddaşla rahat işləyir; image-ləri serverdə build edirsinizsə, bunun üçün də yer saxlayın.
Niyə UFW konteyner portlarımı bloklamır?
Docker UFW-dən əvvəl işləyən öz iptables qaydalarını əlavə edir. Portları 127.0.0.1-də açın və qarşısına reverse proxy qoyun, yaxud bulud firewall-u ilə süzün.
Image-ləri serverdə build etməliyəmmi?
Kiçik layihələr üçün bu işləyir. Təkrarlana bilən yerləşdirmələr üçün CI-da build edin, reyestrə push edin və serverdə yalnız pull edin.
Docker-i özüm quraşdırmadan keçə bilərəmmi?
Bəli. Wolkra-da server yaradarkən Docker CE bir kliklə tətbiqini seçin; o, Docker və Compose plagini quraşdırılmış halda gəlir.