Барои ҷойгиркунӣ бо Docker Compose дар VPS, Docker Engine ва плагини Compose-ро насб кунед, файлҳои compose.yaml ва .env-ро дар директорияи лоиҳа гузоред, docker compose up -d-ро иҷро кунед ва барои HTTPS дар пеш reverse proxy, масалан Caddy, гузоред. Сипас навсозиҳо танҳо docker compose pull && docker compose up -d мебошанд.
Ин дастур стеки хурд, вале воқеӣ месозад: барномаи веб, пойгоҳи додаҳои Postgres ва Caddy барои HTTPS-и худкор, дар Ubuntu 24.04 ё Debian 12.
1. Серверро омода кунед
Аз сервере оғоз кунед, ки қадамҳои аввал дар он анҷом дода шудаанд: навсозиҳо, корбари sudo, калидҳои SSH ва firewall. Барои ин стек 2 GB хотира ҳадди ақали оқилона аст.
Пеш аз оғоз сабти DNS-ро ба сервер равона кунед, то HTTPS аз кӯшиши аввал кор кунад:
app.example.com. A 203.0.113.10 ; example address
app.example.com. AAAA 2001:db8::10 ; example address
2. Docker Engine ва Compose-ро насб кунед
Репозиторияи худи Docker-ро истифода баред; бастаҳои дистрибутив аксар вақт кӯҳнатаранд.
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 ubuntu ё debian аст, бинобар ин ҳамон сатрҳо дар ҳарду кор мекунанд. Санҷед:
sudo docker run --rm hello-world
docker compose version
Ба корбари худ иҷозат диҳед, ки Docker-ро бе sudo иҷро кунад (баъд аз ин аз система бароед ва дубора ворид шавед):
sudo usermod -aG docker $USER
Узвият дар гурӯҳи docker амалан дастрасии root аст. Танҳо корбарони боэътимодро илова кунед.
Роҳи кӯтоҳ: барномаи якклика Docker дар Wolkra Docker CE-ро бо Compose барои шумо насб мекунад.
3. Сохтори лоиҳаро созед
mkdir -p ~/apps/myapp && cd ~/apps/myapp
Сохтори равшан фаҳмидани серверро баъд аз чанд моҳ осон мекунад:
~/apps/myapp/
├── compose.yaml
├── .env # secrets, not in git
└── Caddyfile
4. compose.yaml нависед
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:
Нуктаҳои қобили таваҷҷуҳ:
- Версияҳои image-ро собит кунед (
1.4.2,16), то аз нав оғоз кардан ҳеҷ гоҳ навсозии асосии ногаҳонӣ наорад. expose, наports, барои барнома ва пойгоҳи додаҳо. Онҳо танҳо дар дохили шабакаи Compose дастрасанд. Танҳо Caddy портҳоро нашр мекунад.- Volume-ҳои номдор ҳангоми аз нав сохтани контейнерҳо додаҳоро нигоҳ медоранд.
depends_onбо санҷиши саломатӣ интизор мешавад, то Postgres пайвастҳоро қабул кунад.
ghcr.io/example/myapp-ро бо image ва порти худ иваз кунед.
5. Махфиятҳоро дар .env нигоҳ доред
cat > .env <<EOF
POSTGRES_PASSWORD=$(openssl rand -hex 24)
APP_SECRET=$(openssl rand -hex 32)
EOF
chmod 600 .env
Compose .env-ро аз директорияи лоиҳа барои ивазкунии ${...} мехонад ва env_file онро ба барнома мегузаронад. Агар директория нусхаи git бошад, .env-ро ба .gitignore илова кунед.
6. Бо Caddy HTTPS илова кунед
Caddyfile созед:
app.example.com {
encode zstd gzip
reverse_proxy app:3000
}
Caddy баробари он ки DNS ба сервер ишора кунад ва портҳои 80 ва 443 кушода бошанд, сертификатро худкор мегирад ва нав мекунад. Барои имконоти бештар ба дастури reverse proxy бо Caddy нигаред.
7. Стекро оғоз кунед
docker compose up -d
docker compose ps
docker compose logs -f caddy
Вақте Caddy дар лог certificate obtained successfully нависад, https://app.example.com-ро кушоед.
8. Firewall-ро дар хотир доред
Docker қоидаҳои iptables-ро илова мекунад, ки пеш аз UFW иҷро мешаванд. Порте, ки бо ports: нашр шудааст, аз интернет дастрас аст, ҳатто агар UFW гӯяд, ки он маҳкам аст. Се роҳи бехатар мондан:
- Танҳо reverse proxy-ро нашр кунед (мисли боло).
- Ҳар чизи дигарро ба localhost пайванд кунед:
"127.0.0.1:5432:5432". - Дар пеши сервер бо firewall-и абрӣ филтр кунед, ки Docker аз он гузашта наметавонад. 80 ва 443-ро аз ҳар ҷо ва 22-ро танҳо аз суроғаи худ иҷозат диҳед.
9. Бе мушкилот навсозӣ кунед
Тег (tag)-и image-ро дар compose.yaml иваз кунед, сипас:
docker compose pull
docker compose up -d
docker image prune -f
Compose танҳо хидматҳоеро аз нав месозад, ки image ё танзимоташон тағйир ёфтааст. Барои баргаштан тегҳои кӯҳнаро гузоред ва up -d-ро дубора иҷро кунед. Пеш аз навсозиҳои калон, масалан версияи нави асосии Postgres, ки dump ва барқарорсозиро талаб мекунад, snapshot гиред.
10. Аз додаҳо нусхаи эҳтиётӣ гиред
Volume-ҳо дар /var/lib/docker/volumes ҷойгиранд. Барои пойгоҳи додаҳо dump-и мантиқӣ аз нусха бардоштани файлҳо бехатартар аст:
docker compose exec -T db pg_dump -U myapp myapp | gzip > ~/backups/myapp-$(date +%F).sql.gz
Инро ҳар шаб аз cron иҷро кунед ва файлҳоро берун аз сервер нусха бардоред. Нусхаҳои эҳтиётӣ дар сатҳи сервер ҳам кӯмак мекунанд: дар Wolkra нусхаҳои эҳтиётии ҳаррӯза 20% нархи серверро ташкил медиҳанд ва 7 нуқтаи барқарорсозиро нигоҳ медоранд. Дастури стратегияи нусхабардории эҳтиётӣ ҳамаашро якҷоя мекунад.
11. Логҳо ва маҳдудиятҳо
Логҳои пешфарзи Docker бе маҳдудият калон мешаванд. Онҳоро дар /etc/docker/daemon.json ба таври умумӣ маҳдуд кунед:
{
"log-driver": "json-file",
"log-opts": { "max-size": "10m", "max-file": "3" }
}
Сипас sudo systemctl restart docker. Шумо инчунин метавонед хотираро барои ҳар хидмат бо mem_limit: 512m маҳдуд кунед, то як контейнер дигаронро бе захира нагузорад.
12. Оғоз ҳангоми боршавӣ
restart: unless-stopped дар якҷоягӣ бо хидмати фаъоли Docker маънои онро дорад, ки стек баъди аз нав боршавӣ бармегардад. Инро як бор санҷед:
sudo reboot
# log in again
docker compose -f ~/apps/myapp/compose.yaml ps
13. Ҷойгиркунӣ аз CI
Вақте стек кор мекунад, ҷойгиркуниҳо метавонанд худкор бошанд. Вазифаи CI image-ро бо тегҳои нав месозад ва push мекунад, сипас тавассути SSH ба сервер пайваст шуда, иҷро мекунад:
cd ~/apps/myapp
sed -i 's|myapp:.*|myapp:1.4.3|' compose.yaml
docker compose pull app
docker compose up -d app
Ба вазифаи CI калиди SSH-и алоҳида диҳед, ки танҳо ба ҳамин сервер маҳдуд аст, чунон ки дар дастури калидҳои SSH тавсиф шудааст.
Кай аз як сервер берун рафтан лозим аст
Compose дар як сервер имконоти зиёд дорад. Вақте бештар лозим шавад, қадамҳои маъмулии навбатӣ инҳоянд:
- пойгоҳи додаҳоро ба сервери алоҳида дар шабакаи хусусӣ интиқол диҳед;
- ду сервери барномаро дар паси мувозинаткунандаи сарборӣ иҷро кунед;
- додаҳоро дар ҳаҷми анбори блокӣ нигоҳ доред, ки онро байни серверҳо интиқол дода метавонед.
Барои идоракунии барномаҳои зиёд тавассути интерфейси веб барномаи якклика Coolify дар ҳамон асоси Docker сохта шудааст. Ғояҳои бештар дар хостинги Docker ҳастанд.
Саволҳои маъмул
Оё Docker Compose барои истеҳсолот кифоя аст?
Барои як сервер, бале. Бисёр барномаҳои хурду миёна солҳо дар Compose кор мекунанд. Танҳо вақте ба orchestrator гузаред, ки ба якчанд хост, гузариши худкор ҳангоми нокомӣ (failover) ё навсозиҳои пай дар пай дар якчанд мошин ниёз доред.
Барои Docker Compose чӣ қадар VPS-и калон лозим аст?
Он чиро, ки ҳар контейнер истифода мебарад, ҷамъ кунед. Барномаи веб бо Postgres ва Redis бо 2 то 4 GB хотира бароҳат кор мекунад; агар image-ҳоро дар сервер созед, барои сохтмон ҷой гузоред.
Чаро UFW портҳои контейнерҳои маро маҳкам намекунад?
Docker қоидаҳои iptables-и худро илова мекунад, ки пеш аз UFW иҷро мешаванд. Портҳоро дар 127.0.0.1 нашр кунед ва дар пеш reverse proxy гузоред ё бо firewall-и абрӣ филтр кунед.
Оё image-ҳоро дар сервер сохтан лозим аст?
Барои лоиҳаҳои хурд ин кор мекунад. Барои ҷойгиркуниҳои такроршаванда дар CI созед, ба реестр push кунед ва дар сервер танҳо pull кунед.
Оё метавонам Docker-ро худам насб накунам?
Бале. Дар Wolkra ҳангоми сохтани сервер барномаи якклика Docker CE-ро интихоб кунед; он бо Docker ва плагини Compose-и насбшуда меояд.