第十四章 应用部署实践:docker、nginx、https

部署前准备:

  • 确保数据库使用指南中创建docker-compose.db.yml已经完成
  • 确保数据库使用指南中创建MakeFile完成
  • 生成数据库迁移
  • 代码部署到远程git仓库

一、连接配置

安装系统-Ubuntu,设置ubuntu默认账号的密码

提示:腾讯云会给ubuntu这样一个默认账号,root没有设置密码,且不允许登录,除非有特殊需要

Ubuntu 系统如何使用 root 用户登录实例

现在使用ssh连接服务器

perl 复制代码
ssh ubuntu@101.43.181.81
# 如果改变了端口就使用-p
ssh -p 1234 ubuntu@101.43.181.81

改变端口方法(修改完之后要在防火墙开放该端口,关闭22,否则会一直超时无法连接):

bash 复制代码
sudo vi /etc/ssh/sshd_config
# 按E(E)dit anyway,然后i编辑
# 修改Port端口
sudo service ssh restart

使用新端口重新登录之后主机名太长了,设置一下然后重新连接

arduino 复制代码
sudo hostnamectl set-hostname zjm-hello

接下来管理秘钥,使用秘钥登录:管理密钥,配置完后自动下载pem私钥文件,妥善保存,并且要求关机重启

使用密钥登录(同时将不能使用密码登录):

注意密钥文件的位置

css 复制代码
ssh -p 1234 -i /Users/dol/source/cloud_tencent/23112_ubuntu.pem ubuntu@101.43.181.81

每次使用这么长的命令很麻烦,你可以通过创建一个 SSH 配置文件来简化这个命令。SSH 配置文件可以让你为每个主机定义一组 SSH 选项,然后在连接到这个主机时自动使用这些选项。这样,你就可以通过一个简单的命令连接到服务器,而不需要每次都输入所有的选项。

bash 复制代码
# mac环境,编辑SSH 配置文件
vim ~/.ssh/config
# 增加以下配置
Host myserver
    HostName 101.43.181.81
    Port 1234
    User ubuntu
    IdentityFile /Users/dol/source/cloud_tencent/23112_ubuntu.pem
# 然后后续就可以在电脑的任意位置使用以下命令连接到服务器
ssh myserver

如果要退出服务器连接使用以下命令

bash 复制代码
exit

二、安装docker

安装docker:docs.docker.com/engine/inst...

安装docker-compose:参考

bash 复制代码
sudo apt update && sudo apt upgrade
# 安装compose
sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

# 将可执行权限应用于二进制文件:
sudo chmod +x /usr/local/bin/docker-compose
# 版本
sudo docker--compose --version
# 卸载
sudo rm /usr/local/bin/docker-compose
sudo apt remove docker-compose
sudo apt autoremove
bash 复制代码
#在 Linux 中,你可以通过将用户添加到 docker 组来允许他们在不使用 sudo 的情况下运行 docker 和 docker-compose 命令。以下是设置的步骤:首先,你需要创建 docker 组(如果它还不存在的话)。你可以使用以下命令来创建 docker 组:
sudo groupadd docker
#如果 docker 组已经存在,这个命令将不会有任何效果。然后,你需要将你的用户添加到 docker 组。这里的 $USER 变量代表了当前的用户名。这个命令会将当前用户添加到 docker 组。你可以使用以下命令来做到这一点:
sudo usermod -aG docker $USER

# 为了让这些改动生效需重启

三、安装Nginx

更新系统的软件包

sql 复制代码
sudo apt update && sudo apt upgrade

安装所需包:

sudo apt install nginx certbot python3-certbot-nginx
  1. nginx: 这是一个开源的、高性能的 HTTP 服务器和反向代理服务器。它也可以作为一个 IMAP/POP3/SMTP 代理服务器。nginx 在高并发连接时表现出色,并且配置灵活,因此在许多高流量的网站中被广泛使用。
  2. certbot: 这是 Let's Encrypt 的一个客户端,Let's Encrypt 是一个提供免费 SSL/TLS 证书的证书颁发机构。certbot 可以自动化获取和安装 SSL/TLS 证书的过程,使你的网站可以通过 HTTPS 提供服务。
  3. python3-certbot-nginx: 这是 certbot 的一个插件,它可以自动化配置 nginx 以使用从 Let's Encrypt 获取的 SSL/TLS 证书。这意味着你不需要手动编辑 nginx 的配置文件来启用 HTTPS。

总的来说,这个命令安装了你需要的所有软件,以便在 nginx 上运行一个通过 HTTPS 提供服务的网站,并且所有的证书管理都是自动化的。

删除默认配置文件

bash 复制代码
sudo rm /etc/nginx/sites-enabled/default
sudo rm /etc/nginx/sites-available/default
sudo rm -r /var/www/html

四、克隆远程代码

准备部署的Nextjs项目

docs.github.com/en/authenti...

GitHub 在 2021 年 8 月 13 日后已经不再支持使用密码进行身份验证。现在,GitHub 建议使用个人访问令牌 (PATs) 或 SSH 密钥进行身份验证。

如果你选择使用个人访问令牌,可以按照以下步骤操作:

  1. 登录你的 GitHub 账户,点击右上角的头像,然后选择 "Settings"。
  2. 在左侧菜单中选择 "Developer settings"。
  3. 在左侧菜单中选择 "Personal access tokens"。
  4. 点击 "Generate new token",在 "Note" 中输入一个描述,然后在 "Select scopes" 中选择你需要的权限。如:repo
  5. 点击 "Generate token",然后复制生成的令牌。

然后你可以在命令行中这样使用令牌:

bash 复制代码
sudo git clone https://<token>@github.com/lxs2048/treasure.git

<token> 替换为你生成的令牌。这样,你就可以使用令牌而不是密码进行身份验证了。

或者直接git clone克隆输入密码时使用token

克隆后将目录及其下所有的子目录和文件的所有者和所属组都改为 ubuntu,接下来使用ubuntu对该目录修改就不需要使用sudo

bash 复制代码
# 首先是改变treasure项目的所属
sudo chown -R ubuntu:ubuntu treasure/

使用ls -la或者ll查看

五、配置环境变量

按照代码中的.env.example分别配置.env.env.production

ini 复制代码
# .env
# Mysql:docker-compose.db.yml中的环境变量
MYSQL_ROOT_PASSWORD="123456"
MYSQL_USER="dbuser"
MYSQL_PASSWORD="dbpwd"
MYSQL_DATABASE="nextdb"
# Database
DATABASE_URL="mysql://dbuser:dbpwd@localhost:3306/nextdb"
# sms
ALIBABA_CLOUD_ACCESS_KEY_ID="LTA..."
ALIBABA_CLOUD_ACCESS_KEY_SECRET="O9Xd..."
ALIBABA_CLOUD_SMS_SIGN_NAME="itsh...s"
ALIBABA_CLOUD_SMS_TEMPLATE_CODE="SMS_46..."
#oss
AccessKeyId="LTA..."
AccessKeySecret="kreE..."
RoleArn="acs:ram::1...:role/..."
Bucket="..."
Region="..."
NEXT_PUBLIC_Bucket="..."
NEXT_PUBLIC_Region="..."
# .env.local/.env.production
# 生产环境必填
PRO_URL="http://abc.com"
# 端口
PORT="3000"

EMAIL_HOST="smtp.qq.com"
EMAIL_PORT="587"
EMAIL_USER="...@qq.com"
EMAIL_PASS="..."
DOMAIN="example.com"

# next-auth
NEXTAUTH_URL="http://localhost:3000"
NEXTAUTH_SECRET=".."

六、配置nginx

接下来初始化nginx配置文件

arduino 复制代码
sudo vim /etc/nginx/sites-available/treasure-website

部署nextjs为例配置如下:

ini 复制代码
server {
    listen 80;
    server_name treasure.guiyexing.site;
    
    gzip on;
    gzip_proxied any;
    gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;
    gzip_comp_level 6;
    gzip_buffers 16 8k;
    gzip_min_length 256;

    location /_next/static/ {
        alias /var/www/treasure/.next/static/;
        expires 365d;
        access_log off;
    }
    location / {
        proxy_pass http://127.0.0.1:3000;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;
    }
}

其他的项目还可以创建新的文件,也可以在当前文件内增加server{},端口还是80,server_name换成其他对应的域名。

在 Nginx 中,通常在 sites-available 目录下创建网站的配置文件,然后在 sites-enabled 目录下创建一个指向这个配置文件的符号链接,以启用这个网站。这样做的好处是,你可以通过简单地创建或删除符号链接来启用或禁用网站,而无需移动或复制配置文件。

所以,使用以下命令启用 treasure-website 这个网站。

bash 复制代码
sudo ln -s /etc/nginx/sites-available/treasure-website /etc/nginx/sites-enabled/treasure-website

重启nginx

sudo systemctl restart nginx

七、域名记录

然后去域名服务器添加记录,如添加一个二级域名:treasure.guiyexing.site,具体按照不同的域名厂商操作

八、部署数据库

项目docker-compose.db.yml在本地已经配置过了,配置如下

yaml 复制代码
version: '3'

services:
  db:
    image: mysql:8.0
    container_name: db-mysql
    restart: always
    volumes:
      - ./db-data:/var/lib/mysql
    command: --default-authentication-plugin=mysql_native_password
    ports:
      - '3306:3306'
    env_file: .env
    environment:
      TZ: Asia/Shanghai

使用Makefile来启动和暂停容器

makefile 复制代码
db-start:
    docker-compose -f docker-compose.db.yml --compatibility up -d
db-down:
    docker-compose -f docker-compose.db.yml down

确定环境变量文件内容后就可以直接make db-start启动容器服务了

和开发环境一样,连接都使用localhost:3306进行

容器启动以后,在项目中使用以下命令

npx prisma generate
npx prisma migrate deploy

npx prisma migrate deploy 命令会应用你的 Prisma 迁移到生产数据库,但不会自动生成 Prisma 客户端,所以需要先执行 npx prisma generate

九、打包项目

首先安装nvm

github.com/nvm-sh/nvm

csharp 复制代码
# 安装所需node版本
nvm install 20.9.0
# 设置默认
nvm alias default 20.9.0
# 全局安装pm2,如果使用yarn需要安装yarn
npm i -g yarn pm2

进入项目打包依赖

bash 复制代码
cd /var/www/treasure
npm i
npm run build

十、pm2管理项目

bash 复制代码
cd /var/www/treasure
# 启动pm2
pm2 start npm --name treasure-website -- start
# 如果使用的是yarn
pm2 start yarn --name treasure-website -- start
perl 复制代码
### 以下几个命名都可以替换使用id的方式
# 停止服务
pm2 stop treasure-website
# 重启
pm2 restart treasure-website
# 打包之后重启把原来的删除,重新使用完整命令
pm2 delete treasure-website
# 持续查看日志-线上排错
pm2 logs treasure-website

访问域名

Makefile增加配置

sql 复制代码
pm2-start:
    pm2 start npm --name treasure-website -- start
pm2-down:
    pm2 stop treasure-website && pm2 delete treasure-website
git-sync:
    git fetch origin && git reset --hard origin/main

十一、使用https

获取并安装一个 Let's Encrypt 提供的 SSL/TLS 证书。

css 复制代码
sudo certbot --nginx -d treasure.guiyexing.site

配置过程如下,使用命令后要求确定邮箱,接收协议,接收广告,重定向(当然要选2)

配置完成后查看/etc/nginx/sites-available/treasure-website可以看到被修改了,补充了一些配置

访问

十二、更新数据库

补充手动向数据库添加数据

ini 复制代码
# 进入db-mysql容器
docker exec -it db-mysql mysql -uroot -p
# 查看所有数据库
SHOW DATABASES;
# 假设你选择了数据库`mydatabase`
USE mydatabase;
# 查看数据库`mydatabase`中的所有表
SHOW TABLES;
# 假设你想查看表`OpenaiToken`的结构
DESCRIBE OpenaiToken;
# 查看`openaitoken`表中的所有数据
SELECT * FROM OpenaiToken;
# 插入数据
INSERT INTO OpenaiToken (id,account,session,organization) VALUES ('id...','account1', 'session1', 'organization1');
# 退出
exit;
# 更新数据
UPDATE OpenaiToken
SET session = 'new_session_value',
    organization = 'new_organization_value'
WHERE id = 'specific_id_value';

通用命令

sql 复制代码
cd /var/www/treasure/
# make pm2-down
pm2 stop treasure-website
pm2 delete treasure-website
git pull
npx prisma generate
npx prisma migrate deploy
npm run build
# make pm2-start
pm2 start npm --name treasure-website -- start
# 指定端口
PORT=4000 pm2 start npm --name treasure-website -- start
bash 复制代码
# 正常提交
git pull
# 同步到远程仓库的最新状态
# make git-sync
git fetch origin && git reset --hard origin/main
相关推荐
m0_7482412327 分钟前
ElasticPDF-新国产 PDF 编辑器开发框架(基于 pdf.js Web PDF批注开发,实现高亮多边形橡皮擦历史记录保存注释文字)
前端·pdf·编辑器
huapiaoy41 分钟前
JavaSE---String(含一些源码)
java·linux·前端
rkmhr_sef42 分钟前
frp内网穿透云服务器。云服务器映射多个家庭局域网内网端口。家庭Windows主机内网运行多个web程序
服务器·前端·windows
带多刺的玫瑰42 分钟前
Leecode刷题C语言之考场就座
c语言·前端·javascript
麦子爱种地44 分钟前
前端学习DAY26(华为平板页面)
服务器·前端·javascript
m0_748248021 小时前
HTML5前端实现毛玻璃效果的可拖拽登录框
前端·html·html5
Loong_DQX1 小时前
【前端js】 indexedDB Nosql的使用方法
前端·javascript·nosql·indexeddb
云上的阿七1 小时前
云计算中的容器技术(如Docker)是什么?
docker·容器·云计算
╰つ゛木槿1 小时前
Spring Boot与Django对比:哪个更适合做为Web服务器框架?
前端·spring boot·django
爱笑的眼睛111 小时前
浅谈 前端验证码那些事
前端·程序人生