IP地址检测
视频播放器
输入关键词搜索
登录
在Docker容器中部署NextJS项目

在Docker容器中部署NextJS项目

2023-04-28
编程开发

Nginx配置

server {
    listen 0.0.0.0:80;
    listen 0.0.0.0:443 ssl http2;
    server_name www.wmwm.me;

    ssl_certificate /etc/nginx/ssl/fullchain.pem;
    ssl_certificate_key /etc/nginx/ssl/privatekey.pem;

    return 301 https://wmwm.me$request_uri;
}

server {
    listen 0.0.0.0:80;
    listen 0.0.0.0:443 ssl http2;
    server_name wmwm.me;

    ssl_certificate /etc/nginx/ssl/fullchain.pem;
    ssl_certificate_key /etc/nginx/ssl/privatekey.pem;

    location / {
        proxy_pass http://localhost:[主机映射端口];
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }

    location ~* ^/api/check/?$ {
        proxy_pass http://localhost:[主机映射端口];
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

        # 这个接口用来检测网站的运行状态,会频繁调用,就不记录日志了
        access_log off;
    }

    location ~* ^/api/user/info/avatar/?$ {
        proxy_pass http://localhost:[主机映射端口];
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

        # 用户头像👨,最大3M
        client_max_body_size 3m;
    }

    location ~* ^/api/user/article/attachment/?$ {
        proxy_pass http://localhost:[主机映射端口];
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

        # 文章附件接口,🚫不限制文件上传的大小
        client_max_body_size 0;
    }

    error_page 502 =200 /502.html;
    location = /502.html {
        root /;
        add_header Cache-Control "no-store, no-cache, must-revalidate, max-age=0";
    }
}

start.sh

#!/bin/bash

echo '删除容器'
docker rm -f wmwm.me

# 1.安装pnpm包管理器
# 2.用pnpm安装项目依赖
# 3.用pnpm运行prisma,生成client代码
#
# 要点:
#  (1)--rm参数,代表运行结束之后容器会被删除,目的是让下面的命令依旧可以用"wmwm.me"这个容器名来运行
#  (2)sh -c 可同时运行多条命令
docker run -it \
    --rm \
    -v $PWD/wmwm.me/:/wmwm.me/ \
    -w /wmwm.me/ \
    node:alpine sh -c "npm install pnpm -g && pnpm install && pnpm run generatePrismaClient"

# 运行容器
docker run -it -d \
    --name wmwm.me \
    --restart always \
    -e TZ=Asia/Shanghai \
    -e DATABASE_URL="mysql://root:数据库root密码@mariadb:端口号/BLOG?schema=public" \
    -e S3_ENDPOINT="minio" \
    -e S3_PORT=s3 api端口号 \
    -e S3_ACCESS_KEY=s3 access key \
    -e S3_SECRET_KEY=s3 secret key \
    -v $PWD/wmwm.me/:/wmwm.me/ \
    -w /wmwm.me/ \
    -p [主机映射端口不要用3000,改成其他的]:3000 \
    node:alpine sh -c "npm install pnpm -g && pnpm run start"

# 加入网络:数据库服务,图床服务
docker network connect mariadb_default wmwm.me
docker network connect minio_default wmwm.me

deploy.sh

#!/bin/bash

echo "【上传项目源代码到服务器:/home/docker/wmwm.me/wmwm.me/】"
rsync -avzh -e 'ssh -p [端口号默认22]' --progress --delete \
--exclude=".git/" \
--exclude=".idea/" \
--exclude=".vscode/" \
--exclude="node_modules/" \
--exclude="pnpm-lock.yaml" \
--exclude=".next/" \
--exclude="out/" \
--exclude="所有文章/" \
. root@[服务器地址]:/home/docker/wmwm.me/wmwm.me/

echo -e "\n\n【上传 start.sh 到服务器:/home/docker/wmwm.me】"
rsync -avzh -e 'ssh -p [端口号默认22]' --progress \
start.sh root@[服务器地址]:/home/docker/wmwm.me

echo -e "\n\n【远程执行 start.sh】"
ssh -t root@[服务器地址] -p [端口号默认22] "cd /home/docker/wmwm.me; bash start.sh"

package.json

"deploy": "bash deploy.sh"
THE END
0/500
暂无评论