部署前准备:
- 确保数据库使用指南中创建
docker-compose.db.yml
已经完成 - 确保数据库使用指南中创建MakeFile完成
- 生成数据库迁移
- 代码部署到远程git仓库
一、连接配置
安装系统-Ubuntu,设置ubuntu默认账号的密码
提示:腾讯云会给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
nginx
: 这是一个开源的、高性能的 HTTP 服务器和反向代理服务器。它也可以作为一个 IMAP/POP3/SMTP 代理服务器。nginx
在高并发连接时表现出色,并且配置灵活,因此在许多高流量的网站中被广泛使用。certbot
: 这是 Let's Encrypt 的一个客户端,Let's Encrypt 是一个提供免费 SSL/TLS 证书的证书颁发机构。certbot
可以自动化获取和安装 SSL/TLS 证书的过程,使你的网站可以通过 HTTPS 提供服务。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 密钥进行身份验证。
如果你选择使用个人访问令牌,可以按照以下步骤操作:
- 登录你的 GitHub 账户,点击右上角的头像,然后选择 "Settings"。
- 在左侧菜单中选择 "Developer settings"。
- 在左侧菜单中选择 "Personal access tokens"。
- 点击 "Generate new token",在 "Note" 中输入一个描述,然后在 "Select scopes" 中选择你需要的权限。如:repo
- 点击 "Generate token",然后复制生成的令牌。
然后你可以在命令行中这样使用令牌:
bashsudo 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
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