项目实战——项目上线

news2025/1/20 19:55:38

ps : 项目要在云服务器上部署,博主自己是用的腾讯云,大家可以选择购买合适的服务器进行部署

目录

一、AC终端操

        1、ssh登录服务器

2、创建新用户

3、分配用户 sudo 权限

4、配置免密登录(SSH)

5、传递祖传文件给服务器

 6、安装软件(tmux,docker)

二、Git Bash 配置

1、ssh 免密登录

三、配置 Docker 环境

1、加载docker镜像

2、给容器创建用户

3、配置docker中的acs

4、Git Bash 配置免密登录 docker

5、祖传文件传到 docker 中

四、配置部署环境

1、安装 、配置 MySQL

2、安装jdk

五、上线后端

1、统一api格式

2、修改网关

3、 打包项目

六、配置nginx

1、配置文件

2、启动 / 加载 nginx

3、测试

七、上线前端


一、AC终端操

1、ssh登录服务器

ssh root@IP地址
输入密码:XXXX

如报错:则执行:   rm .ssh/known_hosts 删除原有的 ssh 信息

2、创建新用户

linux 命令列出用户:

cat /etc/passwd |cut -f 1 -d:

 

一般来说,最下面这几个就是你自己创建过的用户 

 下面给出几个常见命令:

  • 创建用户: adduser 用户
  • 设置用户密码: passwd 用户,然后输入密码即可
  • 验证、查看用户:cat /etc/passwd |cut -f 1 -d:

3、分配用户 sudo 权限

sudo给用户提供了一种机制,可以在不分享 root 用户密码情况下,为您信任的用户提供管理权限

  1. cd /etc/sudoers
  2. chmod u+w sudoers
  3. vim /etc/sudoers
  4. 找到 root ALL=(ALL) ALL
  5. username ALL=(ALL) ALL
  6. 配置免密使用 sudo 命令
# User privilege specification
root	ALL=(ALL:ALL) ALL
# Members of the admin group may gain root privileges
%admin ALL=(ALL) ALL
# Allow members of group sudo to execute any command
%sudo	ALL=(ALL:ALL) ALL
#下面的user是你的用户名 添加这一行就能免密sudo了
user ALL=(ALL:ALL) NOPASSWD: ALL

如何查看当前用户是否具有 sudo 权限?

sudo cat/etc/sudoers

4、配置免密登录(SSH)

  1. 生成密钥: ssh-copy-id myserver
  2. 回车输入密码,将 .ssh/id_rsa.pub 的内容传到服务器 ./ssh/authorizes_keys,如果没有则通过 ssh - kygen 生成
  3. 输入命令:ssh myserver1

5、传递祖传文件给服务器

scp .bashrc .vimrc .tmux.conf myserver1

 6、安装软件(tmux,docker)

更新软件列表:

sudo yum update

安装tmux:

sudo yum update
sudo yum install tmux

 测试 tmux 安装?

tmux

 安装docker:

  • 1.打开tmux。(养成好习惯,所有工作都在tmux里进行,防止意外关闭终端后,工作进度丢失)

  • 2.刷新软件源:sudo yum update

  • 2.在云服务器的acs用户下:然后在tmux中根据docker安装教程安装docker即可。
    tmux
    ctrl shift A +shift %分屏

  • 3.Centos安装Docker网址
    Centos的Docker安装

  • 4.步骤如下:在下面。

  • 5.测试:docker --version

  • 6.配置docker sudo权限,sudo usermod -aG docker $USER,要不然使用docker所有命令都要sudo

  • 7.ctrl + d返回acwing服务器,再次通过ssh命令进入自己服务器,此时docker可以正常使用了。执行完此操作后,需要退出服务器,再重新登录回来,才可以省去sudo权限。

二、Git Bash 配置

1、ssh 免密登录

  • 本地创建密钥,如果以前创建过密钥,跳过此步:ssh-keygen(本地执行过一次ssh-keygen)

  • 自动配置服务器密钥:ssh-copy-id myserver

  • 输入云服务上的密码即可。

  • 测试:登录云服务器:ssh myserver1

三、配置 Docker 环境

1、加载docker镜像

  • 返回acwing服务器,进入/var/lib/acwing/docker/images,通过命令:scp django_lesson_1_0.tar 别名:

  • 加载tar文件为docker镜像文件:docker load -i django_lesson_1_0.tar
    通过docker images查看docker镜像

  • 创建spring boot的docker:docker run -p 20000:22 -p 443:443 -p 80:80 -p 3000:3000 -p 3001:3001 -p 3002:3002 -itd --name kob_server django_lesson:1.0

  • 进入容器:docker attach kob_server

最终我们的程序是部署在容器中的,因为可以便于我们迁移,当我们要换服务器时,我们就把容器压缩包上传到新的docker即可

此时这个容器才是我们的开发环境,我们还需添加用户、给用户添加sudo权限。

2、给容器创建用户

  • 添加用户:adduser 用户名,输入两次密码,五次回车,输入Y
  • 添加sudo权限:usermod -aG sudo 用户名
  • 通过命令ctrl + p + ctrl + q挂载容器,注意不是ctrl d(关闭容器)
  • 去腾讯云,开放端口80,443,20000端口

3、配置docker中的acs

1、vim config:

Host 别名
HostName ip
User 用户名
Port 20000

2、免密登录 ssh-copy-id 别名

3、ssh 别名

4、Git Bash 配置免密登录 docker

1、vim config:

Host 别名
HostName ip
User 用户名
Port 20000

2、免密登录 ssh-copy-id 别名

3、ssh 别名

5、祖传文件传到 docker 中

scp .bashrc .vimrc .tmux.conf myserver1_docker1:

四、配置部署环境

进入 docker:

1、安装 、配置 MySQL

  • 更新软件源;sudo apt-get update
  • 安装:sudo apt-get install mysql-server
  • 启动:sudo service mysql start
  • 登录mysql:sudo mysql -u root
  • 设置root用户的密码:ALTER USER 'root'@'localhost' IDENTIFIED WITH caching_sha2_password BY 'yourpasswd';
  • 创建数据库:create database kob;
    • use kob;
    • show tables;
  • 创建表
    • 在idea中打开数据库,右键kob -> SQL脚本 -> 将DDL生成到剪贴板
    • 在docker容器中acs下创建create_table.sql:vim create_table.sql
    • 输入命令::set paste进入粘贴模式
    • 按i进入编辑模式,按下shift + insert粘贴内容,:wq保存并退出
      前提要先选择好数据库,use kob;
    • 在mysql命令行中输入命令:source /home/acs/create_table.sql
    • 创建成功

2、安装jdk

  • 命令:sudo apt-get install openjdk-8-jdk
  • 测试:java -version

五、上线后端

1、统一api格式

  • 将GetRanklistController、GetRecordListController、InfoController、GetListController的GetMapping中的地址前加上/api
  • 将LoginController、RegisterController、AddController、RemoveController、UpdateController的PostMapping中的地址前加上/api

2、修改网关

  • .antMatchers(“/api/user/account/token/”, “/api/user/account/register/”).permitAll()

3、 打包项目

以 backend 为例:在pom.xml 中加入:

backend/pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    ...

    <artifactId>backend</artifactId>
    <packaging>jar</packaging>

    ...

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <!--这里写上main方法所在类的路径-->
                <configuration>
                    <mainClass>com.kob.backend.BackendApplication</mainClass>
                </configuration>
                <executions>
                    <execution>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>

提示:打包前记得删除匹配玩家时输出的语句
打开右侧Maven,点开backendcloud -> 生命周期 -> 双击clean -> 双击package

用本地终端,传给docker下的acs:

scp backend-0.0.1-SNAPSHOT.jar myserver1_docker1:
scp botrunningsystem-0.0.1-SNAPSHOT.jar myserver1_docker1:
scp matchingsystem-0.0.1-SNAPSHOT.jar myserver1_docker1:

登录Docker下的acs:

cd ~
mkdir kob
cd kob
mkdir backendcloud
mkdir web
mkdir acapp
cd backendcloud
mv ~/*.jar .

 运行后端:

java -jar backend-0.0.1-SNAPSHOT.jar
java -jar matchingsystem-0.0.1-SNAPSHOT.jar
java -jar botrunningsystem-0.0.1-SNAPSHOT.jar

六、配置nginx

1、配置文件

  • cd /etc/nginx
  • sudo vim nginx.conf
  • 在命令行模式输入命令:ggdG
  • 复制y总讲义nginx配置文件内容(在下面)
  • 使用命令粘贴:
    • sudo scp .bashrc .vimrc .tmux.conf /root将文件传给root
    • 使用:set paste进入粘贴模式
    • 按i进入编辑模式
    • shift + insert粘贴
    • esc退出编辑模式
    • dd删除无关行内容
    • :wq保存内容
    • 将server_name的编号改成acwing创建应用界面的AppID,共有两处
      或者自己的域名

注意:若用户名不是acs,需要将nginx.conf配置文件中的acs全部改成你的用户名

user www-data;
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;

events {
    worker_connections 768;
    # multi_accept on;
}

http {

    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;
    keepalive_timeout 65;
    types_hash_max_size 2048;

    include /etc/nginx/mime.types;
    default_type application/octet-stream;

    ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; # Dropping SSLv3, ref: POODLE
    ssl_prefer_server_ciphers on;

    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log;

    gzip on;

    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*;

     server {
         listen 80;
         server_name XXXXXXXXXX替换app2703.acapp.acwing.com.cn;
         rewrite ^(.*)$ https://${server_name}$1 permanent;
     }

    server {
        listen 443 ssl;
        server_name XXXXXXXXXX替换app2703.acapp.acwing.com.cn;
        ssl_certificate   cert/acapp.pem;
        ssl_certificate_key  cert/acapp.key;
        ssl_session_timeout 5m;
        ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_prefer_server_ciphers on;
        charset utf-8;
        access_log /var/log/nginx/access.log;
        error_log /var/log/nginx/error.log;

        client_max_body_size 10M;

        location /api {
            proxy_pass http://127.0.0.1:3000;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header Host $http_host;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }

        location /websocket {
            proxy_pass http://127.0.0.1:3000;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header Host $http_host;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "upgrade";
            proxy_read_timeout  36000s;
        }

        location / {
            root /home/acs/kob/web;
            index index.html;
            try_files $uri $uri/ /index.html;
        }
    }
}

2、启动 / 加载 nginx

sudo /etc/init.d/nginx start

3、测试

在浏览器中输入域名测试,若提示403 forbidden则表示成功,并测试放行端口显示405
https://snake.mycomputer.top/api—>403
https://snake.mycomputer.top/api/user/account/register/—>405

七、上线前端

  • 在vscode中,ctrl + shift + f全文搜索127.0.0.1或localhost,将http://127.0.0.1:3000替换为https://appxxxx.acapp.acwing.com.cn/api
  • 将ws://127.0.0.1:3000替换为wss://appxxxx.acapp.acwing.com.cn
  • 打开vue脚手架,停止server,在任务界面选择build,运行
  • 通过scp命令将dist文件夹上传到服务器:scp -r dist/ springboot:kob/web/
  • 将dist内容移出到web下:mv dist/* .
  • 在web下刪除dist文件
  • 访问域名就可以访问前端网页了!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/40897.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JetpackCompose从入门到实战学习笔记2——Modifier的简单使用

JetpackCompose从入门到实战学习笔记2——Modifier的简单使用 1.Image的使用&#xff1a; Composable fun Image(modifier: Modifier) {Row {Image(painterResource(id R.mipmap.iv_pic),contentDescription stringResource(R.string.description),modifier modifier.size…

阿里P8熬了一个月肝出这份32W字Java面试手册,传到Git上目前star数达到了30K+

互联网行业竞争越来越严峻&#xff0c;面试也是越来越难&#xff0c;一直以来我都想整理一套完美的面试宝典&#xff0c;奈何难抽出时间&#xff0c;这套1000道的Java面试手册我整理了整整1个月&#xff0c;上传到Git上目前star数达到了30K这套互联网Java工程师面试题包括了&am…

【iOS】UITableView的动态Cell高度(Masonry)

动态cell高度评论长度不同引出的问题实现评论长度不同引出的问题 对于之前写的项目的评论部分&#xff0c;由于评论文字字数的不同会导致label高度不同&#xff0c;所以需要设定不同的cell高度来展示。 一开始使用了 CGSize labelSize [label.text boundingRectWithSize:CG…

数据结构与算法_AVL平衡二叉树_四种旋转,插入和删除

1 AVL平衡二叉树的概念 平衡二叉树在BST树基础上加了平衡操作。 BST树特点 &#xff1a;在BST树的基础上&#xff0c;引入了节点“平衡”的概念&#xff0c;任意一个节点的左右子树高度差不超过 1 &#xff0c;为了维持节点的平衡&#xff0c;引入了四种旋转操作&#xff0c;如…

MySQL的时区引起的前后端数据交互不畅的问题解决

MySQL的时区问题 一、问题起源 在使用swagger2进行代码测试时&#xff0c;执行完成后显示的时间与国内时间少了8个小时 强迫症的原因&#xff0c;就手贱了如下操作 ① 修改MySQL内的时间 set global time_zone 8:00; flush privileges;② show variables like “%time_zone%…

整数除法不用除号

给定两个整数 a 和 b &#xff0c;求它们的除法的商 a/b &#xff0c;要求不得使用乘号 *、除号 / 以及求余符号 % 。 注意&#xff1a; 整数除法的结果应当截去&#xff08;truncate&#xff09;其小数部分&#xff0c;例如&#xff1a;truncate(8.345) 8 以及 truncate(-2…

【路径规划】(2) A* 算法求解最短路,附python完整代码

大家好&#xff0c;今天和各位分享一下机器人路径规划中非常经典的 A* 算法&#xff0c;感兴趣的点个关注&#xff0c;文末有 python 代码&#xff0c;那我么开始吧。 1. 算法介绍 A* 算法是 1968 年 P.E.Hart[1]等人所提出的在全局地图环境中所有已知情形下求解最短路径问题的…

部分gcc预定义宏和函数栈帧的内存分布

本文简单基于树莓派8&#xff0c;linux4.4.50版本&#xff0c;32位arm cpu 尝试了解函数调用栈的内存分布的形态。使用gcc内置的宏 __builtin_frame_address 来打印栈帧内存上的信息&#xff0c;以及了解一下常用的gcc 内置的宏的输出。 针对 __builtin_frame_address 在gcc官网…

猴子也能学会的jQuery第十二期——jQuery遍历(上)

&#x1f4da;系列文章—目录&#x1f525; 猴子也能学会的jQuery第一期——什么是jQuery 猴子也能学会的jQuery第二期——引用jQuery 猴子也能学会的jQuery第三期——使用jQuery 猴子也能学会的jQuery第四期——jQuery选择器大全 猴子也能学会的jQuery第五期——jQuery样式操作…

PIC单片机3——外部中断

//RB2&#xff08;INT2&#xff09;作为外中断 #include <p18cxxx.h>/*18F系列单片机头文件*/ void PIC18F_High_isr(void);/*中断服务函数声明*/ void PIC18F_Low_isr(void); #pragma code high_vector_section0x8 /*高优先级中断响应时&#xff0c;会自动跳转到0x8处…

基于三相坐标系状态方程的感应电动机起动动态计算matlab程序

基于三相坐标系状态方程的感应电动机起动动态计算matlab程序 1 异步电动机动态数学模型的性质 电磁耦合是机电能量转换的必要条件&#xff0c;电流与磁通的乘积产生转矩&#xff0c;转速与磁通的乘积得到感应电动势。无论是直流电动机&#xff0c;还是交流电动机均如此。 交、直…

二十七、CANdelaStudio深入-编辑技巧(一致性检查)

本专栏将由浅入深的展开诊断实际开发与测试的数据库编辑,包含大量实际开发过程中的步骤、使用技巧与少量对Autosar标准的解读。希望能对大家有所帮助,与大家共同成长,早日成为一名车载诊断、通信全栈工程师。 本文介绍CANdelaStudio软件的一致性检查,欢迎各位朋友订阅、评论…

『LeetCode|每日一题』---->最小路径和

目录 1.每日一句 2.作者简介 『LeetCode|每日一题』最小路径和 1.每日一题 2.解题思路 2.1 思路分析 2.2 核心代码 2.3 完整代码 2.4 运行结果 1.每日一句 希望冬天的风能吹散一年里所有的遗憾 2.作者简介 &#x1f3e1;个人主页&#xff1a;XiaoXiaoChen-2716 &#x1f…

Vue3框架中CompositionAPI的基本使用(第十课)

1.Setup函数 理解&#xff1a;Vue3.0中一个新的配置项&#xff0c;值为一个函数。 setup是所有Composition API&#xff08;组合API&#xff09;“ 表演的舞台 ”。 组件中所用到的&#xff1a;数据、方法等等&#xff0c;均要配置在setup中。 setup函数的两种返回值&#x…

kubernetes工作负载之控制器

目录 ​一、概述 二、Deployment 控制器 2.1Deployment 部署应用 2.2Deployment滚动升级 2.2.1应用部署完成 2.2.2更新镜像三种方式 2.3 Deployment 发布失败回滚 2.4Deployment 水平扩容 三、DaemonSet控制器 四、Job控制器 4.1Job一次性执行 4.2定时任务&#xf…

查询:按A分组,满足B时对应的C

1.场景 这种问题我自己归纳为“找对应行”问题&#xff0c;例如有下面一场表&#xff08;学生做题&#xff0c;对每个知识点的得分情况&#xff09; 字段&#xff1a;主键id、user_id、score、is_study、knowledgeName、updateTime场景1&#xff1a;按用户分组&#xff0c;求…

Nginx (7):nginx高可用配置

所谓的高可用&#xff0c;就是虽然nginx可以反向代理&#xff0c;如果某个内部服务器down了&#xff0c;可以使用其他的内部服务器&#xff0c;然而万一nginx挂了呢&#xff1f;&#xff1f;&#xff1f;&#xff1f;布置多个nginx再反向代理nginx&#xff1f;&#xff1f;反向…

数据结构学习笔记(V):树与二叉树

目录 1 树 1.1 树的定义和基本术语 1.定义 2.基本术语 1.2 树的性质 2 二叉树 2.1 二叉树的定义和基本术语 1.定义 2.特殊二叉树 2.2 二叉树性质 2.3 二叉树存储结构 1.顺序存储 2.链式存储 3 二叉树进阶 3.1 二叉树顺序遍历 1.先序遍历 2.中序遍历 3.后序遍…

第十二周总结

这周我来总结一下数论分块和佩尔方程&#xff1a; 已知正整数n&#xff0c;求&#xff0c;对n/i下取整&#xff0c;相当于把一组数分块了&#xff0c;首先我们来找一下规律&#xff1a;n20时 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 …

现代密码学导论-20-流密码

目录 3.6 实际操作和加密方式 3.6.1 流密码 CONSTRUCTION 3.30 使用伪随机函数构造流密码 3.6.2 流密码的同步模式 CONSTRUCTION 3.31 流密码的异步模式 3.6 实际操作和加密方式 现代密码学导论-14-基于伪随机发生器的EAV安全_南鸢北折的博客-CSDN博客 CONSTRUCTION 3.17…