确保配置好 .env.production 文件,然后安装 Docker。
配置示例如下,请首先将
xxxxxx部分替换为实际内容:DATABASE_URL="mongodb://root:password@mongo1:27017,mongo2:27017,mongo3:27017/chat_system?replicaSet=rs0&authSource=admin" NEXTAUTH_SECRET="xxxxxx" NEXTAUTH_URL="https://im.xxxxxx.com" OPENAI_API_KEY="sk-xxxxxx" OPENAI_BASE_URL="https://api.openai.com/v1" OSS_ACCESS_KEY_ID="xxxxxx" OSS_ACCESS_KEY_SECRET="xxxxxx" OSS_BUCKET="xxxxxx" OSS_REGION="oss-cn-shanghai-internal" RABBITMQ_URL="amqp://admin:password@rabbitmq:5672" NEXT_PUBLIC_SOCKETIO_SERVER_URL="https://im.xxxxxx.com" NEXT_PUBLIC_SOCKETIO_PATH="/socketio/" REDIS_URL="redis://redis:6379" # 以下为数据库和消息队列的默认密码,修改之后不要忘记上面的 URL 也需要修改 MONGO_ROOT_PASSWORD="password" RABBITMQ_DEFAULT_PASS="password"
拉取镜像:
docker pull node:22.2.0-bookworm
docker pull node:22.2.0-bookworm-slim
docker pull nginx:1.27.0-alpine3.19-slim
docker pull mongo:7.0.5
docker pull rabbitmq:3.13.0-management-alpine
docker pull redis:7.2.4-alpine3.19先构建 chat-websocket 项目,详情参见项目 README 文档。本项目将 Docker Compose 的构建和生产分开,为了方便调试并流程化部署。
Docker 构建:
docker build -t chat-system-web . -f docker/Dockerfile创建 MongoDB 副本集密钥:
mkdir secrets
openssl rand -base64 756 > secrets/rs0.key
chmod 400 secrets/rs0.key使用 Docker Compose 部署:
docker compose --env-file .env.production up -d需要手动初始化 MongoDB 副本集,进入任意容器(此操作需要等待 MongoDB 容器全部初始化完成):
docker exec -it chat-system-mongo1-1 mongosh初始化集群:
use admin
db.auth('root', 'password')
config = {
_id: "rs0",
members: [
{_id: 0, host: "mongo1:27017"},
{_id: 1, host: "mongo2:27017"},
{_id: 2, host: "mongo3:27017"},
]
}
rs.initiate(config)
exitWarning
MongoDB 副本集使用的地址解析为 Docker Compose 内部地址,如 mongo1、mongo2,此副本集地址不能被外部访问,即使端口被暴露。如果需要外部访问,请在 docker-compose.yml 文件中暴露 MongoDB 端口,然后将上述地址替换为外部访问地址,如 mongo.xxxxxx.com:27017。
🧨🧨🧨 停止并卸载全部服务:
docker compose downCertbot 是一个免费的开源工具,用于为 Nginx、Apache 和其他 Web 服务器自动设置 SSL 证书。如果没有 Certbot,可以先安装:
sudo apt install certbot python3-certbot-nginx先在域名注册商处进行域名解析,只有解析成功才能使用 Certbot,以 im.xxxxxx.com" 为例。
Nginx 服务器配置下列内容(可以在 /etc/nginx/sites-available/ 中新建文件,或编辑 /etc/nginx/nginx.conf):
server {
listen 80;
server_name im.xxxxxx.com;
client_max_body_size 128m;
location / {
proxy_pass http://127.0.0.1:5201/;
proxy_set_header Host $host;
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header REMOTE-HOST $remote_addr;
}
location ^~ /socketio/ {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
proxy_pass http://127.0.0.1:5202;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}使用 Certbot 申请证书:
sudo certbot --nginx申请成功后,Nginx 会自动配置 SSL 证书。