EQVPS

如何在 VPS 上部署 Docker Compose 技术栈

用 Docker Compose 在 VPS 上部署多容器技术栈:编写 docker-compose.yml、把机密放在 .env、以重启后自动拉起的方式启动,只发布你真正想发布的端口。含 Web 应用、数据库和反向代理的复制粘贴示例。

Docker Compose 用一个文件描述一个多容器技术栈,并用一条命令运行它。这是部署指南;如果还没装,先安装 Docker。关于面向 AI 代理的技术栈(代理 + 向量数据库 + Redis),请看 面向 AI 代理的 docker-compose

1. 一个技术栈:应用 + 数据库 + 反向代理

# /opt/stack/docker-compose.yml
services:
  app:
    image: your/app:latest
    restart: unless-stopped
    env_file: [.env]
    depends_on: [db]
    # no ports: — reached only through the proxy below

  db:
    image: postgres:16-alpine
    restart: unless-stopped
    environment:
      POSTGRES_PASSWORD: ${DB_PASSWORD}
    volumes: ["pg:/var/lib/postgresql/data"]   # internal only

  caddy:                                        # HTTPS automatically
    image: caddy:2
    restart: unless-stopped
    ports: ["80:80", "443:443"]                 # the only public entrypoint
    volumes:
      - ./Caddyfile:/etc/caddy/Caddyfile
      - caddy_data:/data

volumes: { pg: {}, caddy_data: {} }

机密放在 .env 里,绝不放进 compose 文件:

# /opt/stack/.env  (chmod 600, git-ignored)
DB_PASSWORD=a-long-random-string

一个最小的 Caddyfile 把你的域名代理到应用并自行获取 HTTPS:

app.yourdomain.com {
  reverse_proxy app:8080
}

2. 启动它

cd /opt/stack
docker compose up -d
docker compose ps
docker compose logs -f app

每个服务上的 restart: unless-stopped + Docker 开机自启 = 技术栈在重启后自行回来。

3. 日常命令

docker compose pull && docker compose up -d   # update images
docker compose down                            # stop the stack
docker compose restart app                     # restart one service

大家常搞错的部分:暴露的端口

Docker 通过 iptables 发布端口,所以带 ports: ["5432:5432"] 的容器即便在你以为已关闭的 UFW 防火墙之后,也能从互联网访问到。发布公开入口(80/443 上的代理);把数据库和缓存留在 compose 网络里或绑定到 127.0.0.1。任何对外提供 Web 流量的东西都需要 专用 IP 套餐;搭配 UFW 防火墙

关于一整个技术栈在一个 IP 之后,请看 自托管多个服务。大约一分钟拿到 root,NVMe,无 KYC,用加密货币付款。

常见问题

如何在 VPS 上部署 Docker Compose 技术栈?

安装带 Compose 插件的 Docker,编写描述每个服务的 docker-compose.yml,把机密放在被 git 忽略的 .env 里,然后 docker compose up -d。在每个服务上设置 restart: unless-stopped,并让 Docker 开机自启,使技术栈能挺过重启。下面的示例运行一个 Web 应用、Postgres 和一个 Caddy 反向代理。

机密放哪里——放在 compose 文件里吗?

不。把它们放进 .env 文件(chmod 600、被 git 忽略),在 compose 里用 ${VAR} 引用,或使用 Docker secrets。绝不要把密码或 API 密钥提交进 docker-compose.yml——一个带有有效凭据的泄露文件是经典错误。

技术栈在重启后会回来吗?

只有你让它这样做才会。在每个服务上设置 restart: unless-stopped(或 always),并让 Docker 开机自启(systemctl enable docker)。这样 docker compose up -d 就能挺过重启并重启崩溃的容器。

哪些端口会被暴露?

只有你用 ports: 发布的。把内部服务(数据库、缓存)绑定到 compose 网络或 127.0.0.1,只发布公开入口——通常是 80/443 上的反向代理。Docker 通过 iptables 发布,所以即便在你以为已关闭的 UFW 之后,一行意外的 ports: 也能从互联网访问到。

你们要身份证件或银行卡吗?

不要。注册用邮箱,用 USDC 或 USDT 付款——无文件、无卡。大约一分钟拿到 root。

评论

暂无评论。来做第一个吧。

发表评论

评论在显示前会经过审核。