使用【docker】+【shell】脚本半自动化部署微服务项目

news2025/3/22 22:56:18

一.前言

以下是一个基于 ‌Docker + Shell脚本‌ 的半自动化部署方案,包含镜像构建、容器管理、网络配置和日志监控等核心功能,适用于大多数Web应用或微服务项目。

二‌.目录结构

在这里插入图片描述

三.脚本代码实现

1.‌Shell脚本实现 (deploy.sh)

#!/bin/bash

# 设置颜色代码
E="\033[0m"
R="\033[1;31m"
G="\033[1;32m"
Y="\033[1;33m"
C="\033[1;36m"

BASE_DIR=$(pwd)
BASE_NAME=$(basename "${BASE_DIR}")
DOCKER_COMPOSE_BIN=${DOCKER_COMPOSE_BIN:-docker-compose}

# 检查 docker-compose 是否已安装
if ! command -v $DOCKER_COMPOSE_BIN &> /dev/null; then
    echo "docker-compose could not be found, please install it first."
    exit 1
fi

# 显示帮助信息
show_help() {
    echo -e "${Y}---------------------------------------------------------------${E}"
    echo -e "${Y}|---------------------------  HELP ---------------------------|${E}"
    echo -e "${Y}---------------------------------------------------------------${G}"
    echo -e "${C}【启动服务】./deploy.sh start [all|服务名称]"
    echo -e "${G} 示例:./deploy.sh start lm-llmtest-dev\n"

    echo -e "${C}【停止服务】./deploy.sh stop [all|服务名称]"
    echo -e "${G} 示例:./deploy.sh stop lm-llmtest-dev\n"

    echo -e "${C}【重启服务】./deploy.sh restart [all|服务名称]"
    echo -e "${G} 示例:./deploy.sh restart lm-llmtest-dev\n"

    echo -e "${C}【显示所有服务容器名称】./deploy.sh services"
    echo -e "${G} 示例:./deploy.sh services\n"

    echo -e "${C}【加载当前服务群组的所有镜像】"
    echo -e "${G} 示例:./deploy.sh load \n"

    echo -e "######### 指定系统部署初始化【全新部署之前须先执行!!】##########"
    echo -e "${C}【初始化服务数据挂载目录】./deploy.sh init datadir [数据目录,/var/llmtest_dev]"
    echo -e "${G} 示例:./deploy.sh init datadir /var/llmtest_dev \n"

    echo -e "${C}【初始化数据库配置信息】./deploy.sh init database [数据目录] [数据库启动模式(host/docker)] [dockers模式时容器名称]"
    echo -e "${G} 示例:./deploy.sh init database /var/llmtest_dev host"
    echo -e "${G} 示例:./deploy.sh init database /var/llmtest_dev docker lm-mariadb-dev"
    echo -e "${Y}---------------------------------------------------------------${E}"
}

# 加载镜像
load_images() {
    echo -e "${G}Loading local images! Please wait...${E}"
    docker_images=('nginx-1.25.1.tar.gz' 'mariadb-10.6.tar.gz' 'nginx-1.26.tar.gz' 'python-3.11.13.tar.gz' 'redis-7.2.4.tar.gz' 'etcd-v3.5.15.tar.gz' 'elasticsearch-8.12.2.tar.gz' 'langchain-v4.tar.gz')

    for image in "${docker_images[@]}"; do
        image_path="${BASE_DIR}/../images/${image}"
        if [ ! -f "${image_path}" ]; then
            echo -e "${R}Error: File ${image} not found!${E}"
            continue
        fi
        if docker load < "${image_path}" &> /dev/null; then
            echo -e "${Y}Loading ${image}\t\t\t ${G}Success${E}"
        else
            echo -e "${Y}Loading ${image}\t\t\t ${R}Failure${E}"
        fi
    done
}

# 初始化函数
initialize() {
    if [ "$1" = "datadir" ]; then
        # 初始化服务数据挂载目录
        if mkdir -p "$2"/{llmtest,useradmin,redis,mariadb} && mkdir -p "$2/mariadb/datasource" && mkdir -p "$2/logs/"{useradmin,llmtest}; then
            echo -e "${G}Initialization Success.${E}"
            echo -e "${G}Created directories:${E}"

            # 打印创建的目录列表
            for dir in "$2"/llmtest "$2"/useradmin "$2"/redis "$2"/mariadb "$2"/mariadb/datasource "$2/logs/useradmin" "$2/logs/llmtest"; do
                if [ -d "$dir" ]; then
                    echo -e "${G}- $dir${E}"
                else
                    echo -e "${R}- Failed to create $dir${E}"
                fi
            done
        else
            echo -e "${R}Initialization Failed.${E}"
            exit 1
        fi
    elif [ "$1" = "database" ]; then
        # 初始化数据库
        mkdir -p "$2"/{logs,mariadb} && mkdir -p "$2/mariadb/datasource" && cp -a datasource/* "$2/mariadb/datasource" &&
        if [ "$3" = "docker" ]; then
            local container_name=$4
            container_id=$(docker ps -qf "name=$container_name")
            echo -e "container_name -> $container_name,container_id -> $container_id"
            if [ -z "$container_id" ]; then
                echo -e "${R}Docker container "name=$container_name" not found.${E}"
                exit 1
            fi
            docker exec $container_id bash "/var/llmtest_dev/mariadb/datasource/init_database.sh" "$2" "$3" && echo -e "${G}Database initialization completed.${E}"
        elif [ "$3" = "host" ]; then
            bash "$2/mariadb/datasource/init_database.sh" "$2" "$3" && echo -e "${G}Database initialization completed.${E}"
        else
            echo -e "${R}Unknown mode: $3${E}"
            exit 1
        fi || { echo -e "${R}Database initialization failed.${E}"; exit 1; }
    else
        echo -e "${R}Error: Missing required parameters or invalid initialization option.${E}"
        exit 1
    fi
}

# 开启服务
start_service() {
    if [ "$1" = "all" ]; then
        if ${DOCKER_COMPOSE_BIN} up -d --build && ${DOCKER_COMPOSE_BIN} ps -a; then
            echo -e "${G}All services started successfully.${E}"
            ${DOCKER_COMPOSE_BIN} logs -f
        else
            echo -e "${R}Failed to start all services.${E}"
            exit 1
        fi
    else
        if [ -z "$1" ]; then
            echo -e "${R}Error: Service name is required to start a service.${E}"
            exit 1
        fi
        if ${DOCKER_COMPOSE_BIN} up -d --build "$1" && ${DOCKER_COMPOSE_BIN} ps -a; then
            echo -e "${G}Service [$1] started successfully.${E}"
            ${DOCKER_COMPOSE_BIN} logs -f $1
        else
            echo -e "${R}Failed to start the service [$1].${E}"
            exit 1
        fi
    fi
}

# 停止并移除服务及其容器和相关镜像
stop_and_remove_service() {
    local service_name=$1

    if [ -z "$service_name" ]; then
        echo -e "${R}Error: Service name is required to stop and remove a service.${E}"
        exit 1
    fi

    # 使用 docker-compose down 来停止并移除服务及其容器
    if ! ${DOCKER_COMPOSE_BIN} down -v "$service_name"; then
        echo -e "${R}Failed to stop and remove the service [$service_name] and its containers.${E}"
    fi

    # 获取服务使用的镜像名称
    image_names=($(${DOCKER_COMPOSE_BIN} images | grep "$service_name" | awk '{print $2}' | sort -u))
    echo -e "image_names -> $image_names"
    if [ ${#image_names[@]} -eq 0 ]; then
        for image_name in "${image_names[@]}"; do
            if [ -n "$image_name" ]; then
                # 删除服务镜像
                if docker rmi "$image_name"; then
                    echo -e "${G}Successfully removed image [$image_name] associated with service [$service_name].${E}"
                else
                    echo -e "${R}Failed removed image [$image_name] associated with service [$service_name].${E}"
                fi
            fi
        done
    else
        # 停止并移除容器
        if docker stop "$service_name" && docker rm "$service_name"; then
            echo -e "${G}Successfully stopped and removed container [$service_name].${E}"
        else
            echo -e "${R}Failed to stop and remove container [$service_name].${E}"
        fi
    fi
}

# 定义不应被删除的基础镜像列表
declare -a base_images=("mariadb" "mysql" "redis" "nginx" "python") # 添加其他你不想删除的基础镜像

# 停止服务并删除容器和相关镜像
stop_service() {
    if [ "$1" = "all" ]; then
        echo -e "${Y}#警告!!删除项目[${BASE_NAME}]下的所有容器及镜像将不可恢复,不会删除外部挂载数据.${E}"

        # 获取与compose相关的所有镜像名称
        compose_images=($(${DOCKER_COMPOSE_BIN} images | awk 'NR>1{print $2}' | sort -u))

        # 过滤出不是基础镜像的镜像
        filtered_images=()
        for image_ in "${compose_images[@]}"; do
            skip_image=false
            for base_image in "${base_images[@]}"; do
                if [[ "$image_" == *"$base_image"* ]]; then
                    skip_image=true
                    break
                fi
            done
            if ! $skip_image; then
                filtered_images+=("$image_")
            fi
        done

        echo -e "The following images will be removed: ${filtered_images[@]}"

        # 使用 docker-compose down 来停止所有服务并移除它们的容器
        if ! ${DOCKER_COMPOSE_BIN} down -v; then
            echo -e "${R}Failed to stop all services and remove containers.${E}"
            exit 1
        else
            echo -e "${G}All services stopped and containers removed successfully.${E}"
        fi

        # 尝试删除每个找到的非基础镜像
        for image_ in "${filtered_images[@]}"; do
            if [ -n "$image_" ]; then  # 确保镜像名称非空
                if docker rmi "$image_" &> /dev/null; then
                    echo -e "${G}正在移除构建的服务镜像 ${image_} ...... \t\tsuccess${E}"
                else
                    # 如果常规删除失败,则尝试强制删除
                    if docker rmi -f "$image_" &> /dev/null; then
                        echo -e "${Y}正在强制移除构建的服务镜像 ${image_} ... \tsuccess (forced)${E}"
                    else
                        echo -e "${R}无法移除构建的服务镜像 ${image_}.${E}"
                    fi
                fi
            fi
        done

        # 最后打印剩余镜像列表以供确认
        docker images
    else
        stop_and_remove_service "$1"
    fi
}

# 重启服务
restart_service() {
    if [ "$1" = "all" ]; then
        # 调用 stop_service 函数来停止所有服务
        stop_service "all"

        # 启动所有服务
        if ${DOCKER_COMPOSE_BIN} up -d --build && ${DOCKER_COMPOSE_BIN} ps -a; then
            echo -e "${G}All services have been restarted successfully.${E}"
            ${DOCKER_COMPOSE_BIN} logs -f
        else
            echo -e "${R}Failed to restart all services.${E}"
            exit 1
        fi
    else
        if [ -z "$1" ]; then
            echo -e "${R}Error: Service name is required to restart a service.${E}"
            exit 1
        fi

        # 对于单个服务,调用 stop_service 来停止服务,并重新构建和启动服务
        local service_name="$1"
        stop_service "$service_name"
        # 重新构建并启动指定的服务
        start_service "$service_name"
    fi
}

deploy_service() {
    echo -e "${DOCKER_COMPOSE_BIN} config --services"
    services=$(${DOCKER_COMPOSE_BIN} config --services)

    # 遍历每个服务并查找其容器名称和ID
    echo -e "${G}>>>>>> 容器名称和ID <<<<<<\n----------------------${E}"
    for service in $services; do
        # 查找与服务名匹配的容器信息
        containers=$(docker ps --filter "name=$service" --format "{{.Names}}({{.ID}})")

        if [ -z "$containers" ]; then
            echo -e "${Y}Service: $service -> No containers found.${E}"
        else
            container_info=""
            # 拼接所有容器的名称和ID
            for container in $containers; do
                container_info="${container_info}${container}"
            done

            # 输出服务及其对应的容器信息
            echo -e "${G}Service: $service ${GREEN}-> Container:${container_info}${E}"
        fi
    done
    echo -e "----------------------${E}"
}

case "$1" in
    help)
        show_help
        ;;
    load)
        load_images
        ;;
    init)
        shift
        initialize "$@"
        ;;
    start)
        shift
        start_service "$@"
        ;;
    stop)
        shift
        stop_service "$@"
        ;;
    restart)
        shift
        restart_service "$@"
        ;;
    services)
        shift
        deploy_service "$@"
        ;;
    *)
        echo -e "${R}Usage: $0 {help|load|init|start|stop|restart|services} [args]${E}"
        exit 1
        ;;
esac

2.docker-compose.yml文件脚本实现

services:
  # 管理前端
  lm-backend-dev:
    container_name: lm-backend-dev
    image: lm-backend-dev
    build:
      context: ./
      dockerfile: dockerfiles/dockerfile-backendcli
    ports:
      - "8001:80"
    privileged: true
    volumes:
      - "/etc/localtime:/etc/localtime"
      - "/var/llmtest_dev/html:/usr/share/nginx/html"
      - "/var/llmtest_dev/logs/cli:/var/log/nginx"
#      - "/data/mulsen/llmtest_dev/cli/nginx/etc:/etc/nginx"

#  docker run --privileged -itd --name mariadb-10.11 -v /var/data/data:/home/data -v /var/data/etc:/opt/maria/etc mariadb:10.11  /sbin/init&&/bin/bash
  # 数据库服务配置
  lm-mariadb-dev:
    container_name: lm-mariadb-dev
    image: mariadb:latest
    ports:
      - "3318:3306"
    privileged: true
    environment:
      - TZ=Asia/Shanghai
      - MYSQL_ROOT_PASSWORD=nwbot#f76m+*
      - MYSQL_ROOT_HOST:'%'
#      - MYSQL_DATABASES:nwfaq
#      - MYSQL_USER:nwbot
#      - MYSQL_PASSWORD:nwbot#f76m+*
    volumes:
      - "/etc/localtime:/etc/localtime"
      - "/var/llmtest_dev/mariadb/data:/var/lib/mysql"
      - "/var/llmtest_dev/mariadb/etc:/etc/mysql/conf.d"
      - "/var/llmtest_dev/mariadb/datasource:/var/llmtest_dev/mariadb/datasource"
#      - "/var/llmtest_dev/mariadb/datasource:/docker-entrypoint-initdb.d"  # 挂载包含初始化脚本和SQL文件的目录

    # 配置文件目录
  # redis服务配置
  lm-redis-dev:
    image: redis:7
    container_name: lm-redis-dev
    ports:
      - "6889:6379"
    privileged: true
    environment:
      - REDIS_PASSWORD=fF76M+@963
    volumes:
      - "/etc/localtime:/etc/localtime"
      - "/var/llmtest_dev/redis/data:/data"

  # 用户管理服务
  lm-useradmin-dev:
    container_name: lm-useradmin-dev
    image: lm-useradmin-dev
    build:
      context: ./
      dockerfile: dockerfiles/dockerfile-useradmin
    ports:
      - "8002:5000"
    privileged: true
    environment:
      - SERVER_IP=127.0.0.1
      - SERVER_PORT=57680
    volumes:
      - "/etc/localtime:/etc/localtime"
      - "/var/llmtest_dev/logs/useradmin:/var/app/logs"
#    environment:
    depends_on:
      - lm-redis-dev
      - lm-mariadb-dev

  # 评测基础数据服务
  lm-test-dev:
    container_name: lm-test-dev
    image: lm-test-dev
    build:
      context: ./
      dockerfile: dockerfiles/dockerfile-test
    ports:
      - "8003:5000"
    privileged: true
    environment:
      - SERVER_IP=127.0.0.1
      - SERVER_PORT=8003
    volumes:
      - "/etc/localtime:/etc/localtime"
      - "/var/llmtest_dev/logs/test:/var/app/logs"
      - "/var/llmtest_dev/test/datasets:/var/app/datasets"
    depends_on:
      - lm-redis-dev
      - lm-mariadb-dev

  # 评测结果分析服务
  lm-evaluation-dev:
      container_name: lm-evaluation-dev
      image: lm-evaluation-dev
      build:
        context: ./
        dockerfile: dockerfiles/dockerfile-evaluation
      ports:
        - "8004:5000"
      privileged: true
      environment:
        - SERVER_IP=127.0.0.1
        - SERVER_PORT=8004
      volumes:
        - "/etc/localtime:/etc/localtime"
        - "/var/llmtest_dev/logs/evaluation:/var/app/logs"
        - "/var/llmtest_dev/test/datasets:/var/app/datasets"
      depends_on:
        - lm-redis-dev
        - lm-mariadb-dev
    ##############################################################################

3.数据库初始化脚本init_database.sh

#!/bin/bash
# 设置颜色代码
E="\033[0m"
R="\033[1;31m"
G="\033[1;32m"
Y="\033[1;33m"
C="\033[1;36m"
# 获取传入的路径参数和运行模式
BASE_DIR=$1
MODE=$2
echo -e "${Y}BASE_DIR -> $BASE_DIR \033[0m"
echo -e "${Y}MODE -> $MODE ${G}"

# 数据库连接信息
if [ "$MODE" = "docker" ]; then
  DB_HOST="localhost"  # 在容器内部使用localhost
  DB_PORT="3306"
  DB_PASSWORD="nwbot#f76m+*"
else
  DB_HOST="192.168.211.75"  # 根据实际情况设置主机IP
  DB_PORT="3306"
  DB_PASSWORD="maria"
fi

DB_USER="root"
DB_NAME="test"
SQL_FILE="${BASE_DIR}/mariadb/datasource/test.sql"  # 根据传入路径设置SQL文件路径
echo -e "${Y}SQL_FILE -> $SQL_FILE ${G}"

# 创建数据库
mysql --protocol=TCP  -h$DB_HOST -P$DB_PORT -u$DB_USER -p$DB_PASSWORD -e "CREATE DATABASE IF NOT EXISTS \`$DB_NAME\` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;"

# 检查创建数据库是否成功
if [ $? -ne 0 ]; then
  echo -e "\033[0;31m创建数据库失败\033[0m"
  exit 1
fi

# 导入数据
mysql --protocol=TCP -h$DB_HOST -P$DB_PORT -u$DB_USER -p$DB_PASSWORD $DB_NAME < $SQL_FILE

# 检查导入数据是否成功
if [ $? -eq 0 ]; then
  echo -e "${G}【数据库和数据导入】初始化完成\033[0m"
else
  echo -e "${G}【导入数据】失败\033[0m"
  exit 1
fi

三.总结

通过此方案,可实现从开发到生产的平滑迁移,显著提升部署效率和一致性。
希望对你有所帮助!

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

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

相关文章

使用 GitHub 可重用工作流和 GitHub Actions 简化 DevOps

在当今的 DevOps 环境中&#xff0c;自动化是开发团队能够更快地交付功能并维护高质量代码库的关键。这就是像 GitHub Actions 这样的工具变得不可或缺的地方&#xff0c;因为它能够直接在存储库中自动化、自定义和执行 GitHub 工作流程。 当然&#xff0c;随着项目的规模和存…

Sql Server 索引性能优化 分析以及分表

定位需优化语句 根据工具 skywking 或者开启慢查询日志 找到 慢sql 的语句根据 执行过程 来 判断 慢的原因 row filter 指标 看查了多少数据 比例多少 type 看下是单表 还是 join联表 比如 执行步骤多 没索引 优化方向 减少执行次数索引 没索引考虑加索引 加索引 尽量选择 i…

vue使用element-ui自定义样式思路分享【实操】

前言 在使用第三方组件时&#xff0c;有时候组件提供的默认样式不满足我们的实际需求&#xff0c;需要对默认样式进行调整&#xff0c;这就需要用到样式穿透。本篇文章以vue3使用element-ui的Tabs组件&#xff0c;对Tabs组件的添加按钮样式进行客制化为例。 确定需要修改的组…

PowerBI 条形图,解决数据标签在条形内部看不清的问题

比如下面的条形图&#xff1a; 最上面两行&#xff0c;数据标签显示在了条形内部&#xff0c;哪怕设置了值为黑色 字体也会自动切换为白色&#xff0c;如果设计要求条形的颜色是浅色&#xff0c;就会导致数据看不清晰。 解决方法一&#xff1a; 将数据标签位置设置为端外 效果…

下载与快速上手 NVM:Node.js 版本管理工具

一、准备工作&#xff1a;卸载旧版 Node.js 重要提示&#xff1a;在安装 NVM 前&#xff0c;请先彻底删除已安装的 Node.js&#xff0c;避免路径冲突&#xff1a; 检查安装路径 bash where node常见路径&#xff1a; C:\Program Files\nodejs\C:\Users\用户名\AppData\Local\n…

网络防火墙(Firewall)、Web防火墙(WAF)、入侵检测系统(IDS)、入侵防御系统(IPS)对比总结

目录 一、Firewall、WAF、IDS、IPS四种设备简介 二、Firewall、WAF、IDS、IPS四种设备的角色定位 三、防火墙&#xff08;Firewall&#xff09;与入侵检测系统&#xff08;IPS&#xff09;的区别 四、入侵检测系统&#xff08;IDS&#xff09;与入侵防御系统&#xff08;IP…

Unity | 游戏数据配置

目录 一、ScriptableObject 1.创建ScriptableObject 2.创建asset资源 3.asset资源的读取与保存 二、Excel转JSON 1.Excel格式 2.导表工具 (1)处理A格式Excel (2)处理B格式Excel 三、解析Json文件 1.读取test.json文件 四、相关插件 在游戏开发中,策划…

IT工具 | node.js 进程管理工具 PM2 大升级!支持 Bun.js

P(rocess)M(anager)2 是一个 node.js 下的进程管理器&#xff0c;内置负载均衡&#xff0c;支持应用自动重启&#xff0c;常用于生产环境运行 node.js 应用&#xff0c;非常好用&#x1f44d; &#x1f33c;概述 2025-03-15日&#xff0c;PM2发布最新版本v6.0.5&#xff0c;这…

VulnHub-Web-Machine-N7通关攻略

一、信息收集 第一步&#xff1a;确定靶机IP为192.168.0.107 第二步&#xff1a;扫描后台及开放端口 第三步&#xff1a;进行敏感目录及文件扫描 http://192.168.0.107/index.html (CODE:200|SIZE:1620) http://192.168.0.107/server-status (CODE:403|SIZ…

论华为 Pura X 折叠屏性能检测

在科技浪潮中&#xff0c;折叠屏手机以其创新形态掀起市场热潮。华为 Pura X 作为华为最新折叠手机&#xff0c;承载前沿科技与精湛工艺&#xff0c;成为行业焦点。它融合先进折叠屏技术与优质材质&#xff0c;致力于打破传统手机使用边界&#xff0c;为用户开启全新体验。但产…

生成PDF文件:从html2canvas和jsPdf渲染到Puppeteer矢量图

刚刚实现而已&#xff1a;第一次明白&#xff0c;双击或file:///打开html文件&#xff0c;居然和从localhost:3000打开同一个html文件有本质的区别。 字体居然还能以Base64代码嵌入到网页&#xff0c;只是太大太笨。 需要安装node.js&#xff0c;npm安装更多依赖&#xff1a;…

在 Elasticsearch 中探索基于 NVIDIA 的 GPU 加速向量搜索

作者&#xff1a;来自 Elastic Chris Hegarty 及 Hemant Malik 由 NVIDIA cuVS 提供支持&#xff0c;此次合作旨在为开发者在 Elasticsearch 中的向量搜索提供 GPU 加速。 在 Elastic Engineering 组织内&#xff0c;我们一直致力于优化向量数据库的性能。我们的使命是让 Lucen…

Junit在测试过程中的使用方式,具体使用在项目测试中的重点说明

JUnit 是一个广泛使用的 Java 单元测试框架,主要用于编写和运行可重复的测试。以下是 JUnit 在项目测试中的使用方式和重点说明: 1. 基本使用 场景:测试一个简单的 Java 类。 示例: import org.junit.Test; import static org.junit.Assert.*;public class CalculatorTe…

asp.net 4.5在医院自助系统中使用DeepSeek帮助医生分析患者报告

环境&#xff1a; asp.net 4.5Visual Studio 2015本地已经部署deepseek-r1:1.5b 涉及技术 ASP.NET MVC框架用于构建Web应用程序。使用HttpWebRequest和HttpWebResponse进行HTTP请求和响应处理。JSON序列化和反序列化用于构造和解析数据。SSE&#xff08;服务器发送事件&#xf…

HeyGem.ai 全离线数字人生成引擎加入 GitCode:开启本地化 AIGC 创作新时代

在人工智能技术飞速演进的时代&#xff0c;数据隐私与创作自由正成为全球开发者关注的焦点。硅基智能旗下开源项目 HeyGem.ai 近日正式加入 GitCode&#xff0c;以全球首个全离线数字人生成引擎的颠覆性技术&#xff0c;重新定义人工智能生成内容&#xff08;AIGC&#xff09;的…

密码协议与网络安全——引言

三个基本概念 计算机安全&#xff08;Computer Security&#xff09;&#xff1a;对于一个自动化的信息系统&#xff0c;采取保护措施确保信息系统资源&#xff08;包括硬件、软件、固件、信息、数据和通信&#xff09;的保密性、完整性和可用性。 网络安全&#xff08;Netwo…

springboot实现调用百度ocr实现身份识别+二要素校验

一、技术选型 OCR服务&#xff1a;推荐使用百度AI 二、实现 1.注册一个服务 百度智能云控制台https://console.bce.baidu.com/ai-engine/ocr/overview/index?_1742309417611 填写完之后可以获取到app-id、apiKey、SecretKey这三个后面文件配置会用到 2、导入依赖 <!-- …

MATLAB 控制系统设计与仿真 - 28

MATLAB状态空间控制系统分析 - 极点配置 就受控系统的控制律的设计而言,由状态反馈极点配置和输出反馈极点配置。 状态反馈极点配置问题就是:通过状态反馈矩阵K的选取,使闭环系统的极点,即(A-BK)的特征值恰好处于所希望的一组给定闭环极点的位置。 另外,线性定常系统可…

JetsonNano —— 4、Windows下对JetsonNano板卡烧录刷机Ubuntu20.04版本(官方教程)

介绍 NVIDIA Jetson Nano™ 开发者套件是一款面向创客、学习者和开发人员的小型 AI 计算机。按照这个简短的指南&#xff0c;你就可以开始构建实用的 AI 应用程序、酷炫的 AI 机器人等了。 烧录刷机 1、下载 Jetson Nano开发者套件SD卡映像 解压出.img文件并记下它在计算机上的…

【深度学习新浪潮】AI ISP技术与手机厂商演进历史

本文是关于AI ISP(人工智能图像信号处理器)的技术解析、与传统ISP(图像信号处理器)的区别、近三年研究进展,以及各大手机厂商在该领域演进历史的详细报告。本报告综合多个权威来源的信息,力求全面、深入地呈现相关技术发展脉络与行业动态。 第一部分:AI ISP的定义及与传…