diff --git "a/39 \345\221\250\350\211\263/note/20240702-Debian\345\256\211\350\243\205mysql.md" "b/39 \345\221\250\350\211\263/note/20240702-Debian\345\256\211\350\243\205mysql.md"
new file mode 100644
index 0000000000000000000000000000000000000000..0441c36dbc280fa8ba772538d14af531ce7221f2
--- /dev/null
+++ "b/39 \345\221\250\350\211\263/note/20240702-Debian\345\256\211\350\243\205mysql.md"
@@ -0,0 +1,115 @@
+## 💕Debian安装mysql💕
+
+### ✨安装✨
+
+1. 更新系统软件包并安装必要的依赖包
+
+ ```bash
+ apt updat
+ ```
+
+2. 下载 MySQL 的官方仓库配置文件
+
+ ```bash
+ wget https://repo.mysql.com/mysql-apt-config_0.8.30-1_all.deb
+ ```
+
+3. 安装 MySQL 的官方仓库配置文件
+
+ ```bash
+ dpkg -i /tmp/mysql-apt-config_0.8.30-1_all.deb
+ ```
+
+4. 
+
+ * 选第一个,进去前后选择长期支持版本
+ * 按照要求设置好密码
+
+5. 更新软件包,并安装MySQL
+
+ ```bash
+ sudo apt update
+ sudo apt install mysql-server
+ ```
+
+6. 登录mysql服务器
+
+ ```bash
+ mysql -u root -p
+ ```
+
+### ✨Debian MySQL创建新用户✨
+
+1. 登录到mysql服务器
+
+ ```bash
+ mysql -u root -p
+ ```
+
+2. 创建的新用户的用户名为"myuser",密码为"mypassword"
+
+ ```bash
+ CREATE USER 'myuser'@'localhost' IDENTIFIED BY 'mypassword';
+ ```
+
+3. 需要创建一个新的数据库,或者指定一个已经存在的数据库,可以给新用户分配权限
+
+ ```bash
+ CREATE DATABASE mydatabase;
+ ```
+
+4. 分配权限:给"myuser"用户在"mydatabase"数据库上的所有权限
+
+ ```bash
+ GRANT ALL PRIVILEGES ON mydatabase.* TO 'myuser'@'localhost';
+ ```
+
+5. 刷新权限
+
+ ```bash
+ FLUSH PRIVILEGES;
+ ```
+
+6. 登录新用户
+
+ ```bash
+ mysql -u myuser -p
+ ```
+
+7. 查看是否创建成功
+
+ ```bash
+ SELECT User, Host FROM mysql.user;
+ ```
+
+
+#### 🐱🐉给新用户修改用户名
+
+1. 修改
+
+ ```bash
+ update user set user =新用户名 where user ='旧用户名'
+ ```
+
+2. 验证是否修改成功
+
+ ```bash
+ select user from mysql.user;
+ ```
+
+3. 获取mysql的用户列表
+
+ ```mysql
+ select user,host from mysql.user
+ ```
+
+4. 查找授予特定mysql账户的权限
+
+ ```mysql
+ show grants for '用户名'@'登录方式(%或者localhost)'
+ ```
+
+
+
+
+
diff --git "a/39 \345\221\250\350\211\263/note/20240702-\345\256\211\350\243\205Debian.md" "b/39 \345\221\250\350\211\263/note/20240702-\345\256\211\350\243\205Debian.md"
new file mode 100644
index 0000000000000000000000000000000000000000..1c13f82fba68e81e894ac05b38b4006325407891
--- /dev/null
+++ "b/39 \345\221\250\350\211\263/note/20240702-\345\256\211\350\243\205Debian.md"
@@ -0,0 +1,773 @@
+## 刚安装完Deiban系统 7步走:
+
+1. 设置国内软件源镜像 /etc/apt/sources.list
+2. 更新软件包列表:apt update
+3. 更新系统:apt upgrade -y
+4. 安装vim:
+ 1. apt install vim -y
+ 2. locate 从数据库中找, find实时从系统中找
+
+5. 编辑网卡配置,设置静态IP:
+6. 只在虚拟机上操作,不要在云服务器操作
+
+```bash
+vim /etc/network/interfaces
+
+# 按如下设置
+# The primary network interface
+allow-hotplug ens192
+iface ens192 inet dhcp
+
+#重新启动网络服务
+sudo systemctl restart networking
+```
+
+5. 修改SSHD配置,允许root用户远程登录
+
+```bash
+vim /etc/ssh/sshd_config
+
+# 取消如下代码的注释,并且将其值设置为yes,以允许root用户的远程登录
+22
+PermitRootLogin yes
+
+
+```
+
+6. 配置环境变量,简单化ls的用法
+
+
+/etc/profile.d /etc/nginx/conf.d/
+
+```bash
+ export LS_OPTIONS='--color=auto'
+ alias ls='ls $LS_OPTIONS'
+ alias ll='ls $LS_OPTIONS -l'
+ alias l='ls $LS_OPTIONS -lA'
+
+```
+
+7. 配置环境变量,设置当前系统字符集,以接受中文
+
+/etc/profile.d/lang.sh
+
+```bash
+export LC_ALL=C.utf8
+```
+
+要确保设置生效,可以重新加载该文件并检查环境变量
+
+```sh
+source /etc/profile.d/lang.sh
+echo $LC_ALL
+```
+
+
+
+几个常用命令
+
+以下是一些常见的 Linux 命令,包括它们的使用场景、核心术语讲解以及示例:
+
+### 1. `time`
+
+**使用场景**:用于测量命令的执行时间。
+
+**核心术语**:
+
+- **real**:总的时间(墙上时钟时间)。
+- **user**:用户态 CPU 时间。
+- **sys**:内核态 CPU 时间。
+
+**示例**:
+
+```bash
+time ls
+```
+
+输出:
+
+```plaintext
+real 0m0.003s
+user 0m0.001s
+sys 0m0.002s
+```
+
+### 2. `date`
+
+**使用场景**:显示或设置系统日期和时间。
+
+**核心术语**:
+
+- **%Y**:四位数的年份。
+- **%m**:两位数的月份。
+- **%d**:两位数的日期。
+
+**示例**:
+
+```bash
+date "+%Y-%m-%d %H:%M:%S"
+```
+
+输出:
+
+```plaintext
+2024-06-10 15:30:00
+```
+
+### 3. `timedatectl`
+
+**使用场景**:查看和设置系统时间和日期,时区和 NTP(网络时间协议)设置。
+
+**核心术语**:
+
+- **NTP**:网络时间协议,用于同步时间。
+- **RTC**:实时时钟。
+
+**示例**:
+
+```bash
+timedatectl status
+```
+
+输出:
+
+```plaintext
+Local time: Mon 2024-06-10 15:30:00 UTC
+Universal time: Mon 2024-06-10 15:30:00 UTC
+RTC time: Mon 2024-06-10 15:30:00
+Time zone: Etc/UTC (UTC, +0000)
+System clock synchronized: yes
+NTP service: active
+```
+
+### 4. `reboot`
+
+**使用场景**:重新启动系统。
+
+**核心术语**:
+
+- **systemd**:系统和服务管理器。
+
+**示例**:
+
+```bash
+sudo reboot
+```
+
+### 5. `poweroff`
+
+**使用场景**:关闭系统电源。
+
+**核心术语**:
+
+- **halt**:停止系统所有的 CPU 功能。
+
+**示例**:
+
+```bash
+sudo poweroff
+```
+
+### 6. `wget`
+
+**使用场景**:从网络上下载文件。
+
+**核心术语**:
+
+- **URL**:统一资源定位符。
+- **HTTP/HTTPS**:超文本传输协议。
+
+**示例**:
+
+```bash
+wget https://example.com/file.txt
+```
+
+### 7. `curl`
+
+**使用场景**:从网络上获取或发送数据。
+
+**核心术语**:
+
+- **URL**:统一资源定位符。
+- **GET/POST**:HTTP 请求方法。
+
+**示例**:
+
+```bash
+curl -O https://example.com/file.txt
+```
+
+### 8. `ps`
+
+**使用场景**:查看当前运行的进程。
+
+**核心术语**:
+
+- **PID**:进程标识符。
+- **TTY**:终端类型。
+
+**示例**:
+
+```bash
+ps aux # 显示所有用户的所有进程 一般会结合。grep,awk等过滤数据
+```
+
+### 9. `kill`
+
+**使用场景**:向进程发送信号(通常用于终止进程)。
+
+**核心术语**:
+
+- **SIGTERM**:请求中止进程。
+- **SIGKILL**:强制终止进程。
+
+**示例**:
+
+```bash
+kill 1234 # kill 进程号,用pidof 进程名。来查看具体的进程的进程号
+```
+
+### 10. `killall`
+
+**使用场景**:向指定名称的所有进程发送信号。
+
+`先安装psmisc`
+
+1. 安装psmisc 后,就会有pstree和killall
+
+**核心术语**:
+
+- **signal**:信号,通知进程执行某种操作。
+
+**示例**:
+
+```bash
+killall firefox
+```
+
+### 11. `ip`
+
+**使用场景**:显示和操作网络接口和路由。
+
+**核心术语**:
+
+- **address**:IP 地址。
+- **route**:路由信息。
+
+**示例**:
+
+```bash
+ip addr show
+```
+
+### 12. `ss`
+
+**使用场景**:显示套接字统计信息。旧版是netstat
+
+**核心术语**:
+
+- **TCP**:传输控制协议。
+- **UDP**:用户数据报协议。
+
+**示例**:
+
+```bash
+ss -tuln # 可以查看哪些端口开放着
+```
+
+### 13. `uname`
+
+**使用场景**:显示系统信息。
+
+**核心术语**:
+
+- **kernel**:操作系统内核。
+- **OS**:操作系统。
+
+**示例**:
+
+```bash
+uname -a
+```
+
+### 14. `uptime`
+
+**使用场景**:显示系统运行时间和负载。
+
+**核心术语**:
+
+- **load average**:系统平均负载。
+
+**示例**:
+
+```bash
+uptime
+```
+
+### 15. `who`
+
+**使用场景**:显示当前登录用户信息。
+
+**核心术语**:
+
+- **login**:用户登录信息。
+- **TTY**:终端类型。
+
+**示例**:
+
+```bash
+who
+```
+
+### 16. `last`
+
+**使用场景**:显示系统上最近的登录信息。
+
+**核心术语**:
+
+- **wtmp**:记录登录和注销事件的文件。
+
+**示例**:
+
+```bash
+last
+```
+
+### 17. `ping`
+
+**使用场景**:测试网络连通性。
+
+- **ICMP**:互联网控制消息协议。
+- **echo request**:回显请求。
+
+**示例**:
+
+```bash
+ping example.com
+```
+
+### 18. `traceroute`
+
+**使用场景**:显示到达网络主机的路径。
+
+**核心术语**:
+
+- **hop**:从一个网络节点到另一个的跳转。
+- **TTL**:生存时间。
+
+**示例**:
+
+```bash
+traceroute example.com
+```
+
+### 19. `history`
+
+**使用场景**:显示命令历史记录。
+
+**核心术语**:
+
+- **bash history**:记录用户输入的命令历史。
+
+**示例**:
+
+```bash
+history
+```
+
+`top` 命令用于显示系统的运行进程信息,包括 CPU 占用情况、内存占用情况、进程列表等。通过 `top` 命令可以实时监控系统的运行状态,了解系统的负载情况。
+
+`pidof` 命令用于根据进程名查找对应的进程ID(PID)。例如,如果你知道某个进程的名字,但不知道它的PID,你可以使用 `pidof` 命令来查找。语法通常是 `pidof <进程名>`,比如 `pidof python` 会返回所有名为 `python` 的进程的PID。
+
+
+
+`free` 和 `df -h` 是两个用于查看系统资源利用情况的常用命令:
+
+1. **`free`**:该命令用于显示系统内存的使用情况,包括物理内存和交换空间(swap)。执行 `free` 命令时,会显示系统的内存信息,包括总内存、已使用内存、空闲内存以及缓冲区和缓存等情况。
+
+ 示例输出:
+
+ ```
+ total used free shared buff/cache available
+ Mem: 8081256 2133468 3458604 430300 2488184 5261632
+ Swap: 0 0 0
+ ```
+
+ 输出中的字段含义如下:
+
+ - `total`: 总内存量
+ - `used`: 已使用的内存量
+ - `free`: 空闲的内存量
+ - `shared`: 用于共享的内存量
+ - `buff/cache`: 用于缓存的内存量
+ - `available`: 可用的内存量
+
+2. **`df -h`**:该命令用于显示文件系统的磁盘空间利用情况。执行 `df -h` 命令时,会显示系统中每个挂载的文件系统的磁盘使用情况,包括总容量、已使用空间、剩余空间以及挂载点等信息。
+
+ 示例输出:
+
+ ```
+ Filesystem Size Used Avail Use% Mounted on
+ /dev/sda1 20G 15G 3.6G 81% /
+ /dev/sda2 30G 20G 8.8G 70% /home
+ ```
+
+ 输出中的字段含义如下:
+
+ - `Filesystem`: 文件系统设备
+ - `Size`: 文件系统总容量
+ - `Used`: 已使用的空间
+ - `Avail`: 可用空间
+ - `Use%`: 使用百分比
+ - `Mounted on`: 挂载点
+
+通过这两个命令,你可以快速了解系统的内存和磁盘空间使用情况,以便进行系统资源管理和监控。
+
+
+
+`du` 命令用于估算文件或目录的磁盘使用情况。它可以显示指定文件或目录的磁盘使用量,以及每个子目录的磁盘使用量,帮助用户了解文件系统上的空间分布情况。以下是 `du` 命令的一些常见使用场景:
+
+1. **查看当前目录的磁盘使用情况**:
+
+ ```
+ 复制代码
+ du -h
+ ```
+
+ 这将以人类可读的格式显示当前目录及其所有子目录的磁盘使用情况。
+
+2. **查看特定目录的磁盘使用情况**:
+
+ ```
+ du -h /目录名
+ ```
+
+ 这将显示指定目录及其所有子目录的磁盘使用情况。
+
+3. **显示文件或目录的总磁盘使用量**:
+
+ ```
+ du -sh /path/to/file_or_directory
+ ```
+
+ 这将显示指定文件或目录的总磁盘使用量, `-s` 参数表示仅显示总和, `-h` 表示以人类可读的格式显示。
+
+4. **显示目录中每个文件的磁盘使用量**:
+
+ ```
+ 复制代码
+ du -ah /path/to/directory
+ ```
+
+ 这将显示指定目录中每个文件的磁盘使用量, `-a` 参数表示包括所有文件。
+
+5. **按照磁盘使用量排序显示目录**:
+
+ ```
+ du -h | sort -h
+ ```
+
+ 这将按照磁盘使用量从小到大排序显示当前目录及其所有子目录的磁盘使用情况。
+
+6. **限制显示的深度**:
+
+ ```
+ du -h --max-depth=1 /path/to/directory
+ ```
+
+ 这将仅显示指定目录的直接子目录的磁盘使用情况, `--max-depth` 参数用于指定显示的深度。
+
+
+
+
+
+
+
+
+
+## 重定向和管道
+
+在 Unix 和 Linux 系统中,文件描述符用于表示打开的文件或者输入/输出流。常用的文件描述符包括:
+
+- `0`:标准输入(stdin): 键盘输入
+- `1`:标准输出(stdout): 直接显示在屏幕,不包含错误信息
+- `2`:标准错误(stderr): 只包含错误信息
+
+使用形式:
+
+- 定向符前直接用数字,如 1> 1.txt 、 2> 2.txt
+- 定向符后紧跟定向符并加&号如 >&1
+
+### 重定向
+
+重定向允许将命令的输入或输出重定向到文件或其他命令。常用的重定向符号包括 `>`、`>>`、`<`、`2>` &>等。
+
+#### 输出重定向
+
+1. **覆盖输出重定向 `>`**
+
+ 将命令的标准输出重定向到一个文件,如果文件已经存在,则覆盖它。
+
+ ```bash
+ ls > filelist.txt
+ ```
+
+ 这个命令将 `ls` 命令的输出保存到 `filelist.txt` 文件中,如果文件已存在,则会被覆盖。
+
+
+
+2. **追加输出重定向 `>>`**
+
+ 将命令的标准输出追加到一个文件的末尾,如果文件不存在,则创建它。
+
+ ```bash
+ echo "Hello, World!" >> greetings.txt
+ ```
+
+ 这个命令会将 "Hello, World!" 追加到 `greetings.txt` 文件中。
+
+3. 注意:
+
+ 1. **标准输出不含错误信息**
+
+
+#### 输入重定向
+
+1. **输入重定向 `<`**
+
+ 将文件的内容作为命令的输入。
+
+ ```bash
+ sort < unsorted_list.txt
+
+ # 原文件
+ apple
+ orange
+ banana
+
+ # 这个命令将 `unsorted_list.txt` 文件的内容作为 `sort` 命令的输入进行排序。
+ ```
+
+
+
+
+
+ 场景:你需要从一个SQL脚本文件中读取命令并在数据库中执行。
+
+ ```bash
+ # 示例:
+ mysql -u root -p mydatabase < script.sql
+ #该命令将 script.sql 文件中的SQL命令导入到 mydatabase 数据库中。
+ # 还原数据库常用的命令
+ ```
+
+
+
+#### 错误重定向
+
+```
+ 参考:find / -name '*.conf'
+```
+
+
+
+1. **错误输出重定向 `2>`**
+
+ 将命令的错误输出重定向到一个文件。
+
+ ```bash
+ reboot 2> error_log.txt
+ ```
+
+ 这个命令会将 `ls` 命令的错误信息保存到 `error_log.txt` 文件中。
+
+2. **错误输出追加重定向 `2>>`**
+
+ 将命令的错误输出追加到一个文件。
+
+ ```bash
+ ls non_existent_file 2>> error_log.txt
+ ```
+
+ 这个命令会将 `ls` 命令的错误信息追加到 `error_log.txt` 文件中。
+
+3. **同时重定向标准输出和标准错误输出**
+
+ 使用 `&>` 符号将标准输出和错误输出同时重定向到同一个文件。
+
+ ```bash
+ command &> output_and_error_log.txt # 正确和错误原版混搭,原封不动
+ command > 1.txt 2>&1 # 正确和错误原版混搭,原封不动
+ command > 1.txt 2>> 1.txt # 先正确后错误
+ command 2> 1.txt >> 1.txt # 先错误后正确
+
+ ```
+
+ 这个命令会将 `command` 的标准输出和错误输出都保存到 `output_and_error_log.txt` 文件中。
+
+### 管道 `|`
+
+管道符号 `|` 将一个命令的输出作为另一个命令的输入。管道是进行命令链式操作的重要工具。
+
+#### 使用场景
+
+1. **将命令的输出传递给另一个命令**
+
+ ```bash
+ ls -l | grep "txt"
+ ```
+
+ 这个命令会将 `ls -l` 的输出传递给 `grep "txt"`,只显示包含 "txt" 的行。
+
+2. **多命令链式操作**
+
+ ```bash
+ ps aux | grep "sshd" | awk '{print $2}'
+ ```
+
+ 这个命令链会列出所有进程 (`ps aux`),然后过滤包含 "sshd" 的行 (`grep "sshd"`),最后提取进程 ID (`awk '{print $2}'`)。
+
+### 示例解析
+
+#### 使用管道和重定向的综合示例
+
+1. **查找特定文件并将结果保存到文件**
+
+ ```bash
+ find / -name "*.conf" 2> errors.txt | sort > sorted_log_files.txt
+
+
+ ```
+
+ 这个命令会在根目录下查找所有以 `.log` 结尾的文件,将错误信息重定向到 `errors.txt`,并将结果进行排序后保存到 `sorted_log_files.txt`。
+
+### 总结
+
+- **重定向**:
+ - `>`:将输出重定向到文件(覆盖)。
+ - `>`:将输出追加到文件。
+ - `<`:将文件内容作为输入。
+ - `2>`:将错误输出重定向到文件。
+ - `2>>`:将错误输出追加到文件。
+ - `&>`:将标准输出和错误输出同时重定向到文件。
+ - `&>>`:将标准输出和错误输出同时追加重定向到文件。
+
+- **管道 `|`**:
+ - 将一个命令的输出作为另一个命令的输入,用于链式操作。
+
+
+
+**扩展:**
+
+- 输入输出一起使用的情况
+
+ ```basn
+ sort < unsorted_list.txt > sorted_list.txt
+ ```
+
+-
+
+- **重定向标准输出和错误输出到不同文件:**
+
+ - 若要将标准输出重定向到一个文件,将错误输出重定向到另一个文件,可以使用以下命令:
+
+ ```sh
+ command > output.txt 2> error.txt
+ ```
+
+ 这样,标准输出会被写入 `output.txt`文件,而错误输出则会被写入`error.txt`
+
+ 文件。
+
+- **将错误输出追加到标准输出文件中:**
+
+ - 若要将错误输出追加到标准输出文件中,可以使用以下命令:
+
+ ```bash
+ command > output.txt 2>&1
+ # 等效谁?
+ ```
+
+ 这会将标准输出写入`output.txt`文件,同时将错误输出追加到标准输出文件中。
+
+- **将错误输出丢弃:**
+
+ - 若要忽略错误输出,可以将错误输出重定向到特殊设备 `/dev/null
+ `
+
+ ,例如:
+
+ ```bash
+ command 2> /dev/null
+ ```
+
+ 这会将错误输出发送到 `/dev/null
+ `,从而丢弃错误输出而只保留标准输出
+
+
+
+## 思考:
+
+```
+<< 是什么功能?here document
+()把命令包括起来,是干什么功能?
+```
+
+
+
+补充一个实用命令:
+
+`tee` 是一个在Unix和类Unix操作系统上非常有用的命令行实用程序。它的作用是从标准输入中读取数据,并同时将数据输出到标准输出和一个或多个文件中。
+
+下面是 `tee` 命令的基本语法:
+
+```bash
+tee [OPTION]... [FILE]...
+```
+
+- `[OPTION]`: 一些选项,可以控制 `tee` 命令的行为。
+- `[FILE]`: 一个或多个文件名,表示要将数据写入的目标文件。
+
+### 示例 1:简单的使用方式
+
+```bash
+echo "Hello, world" | tee output.txt
+```
+
+在这个示例中,`echo "Hello, world"` 命令的输出被送到 `tee` 命令,然后 `tee` 将这个输出写入到 `output.txt` 文件,并同时将其输出到标准输出。
+
+### 示例 2:同时写入多个文件
+
+```bash
+echo "Hello, world" | tee file1.txt file2.txt
+```
+
+在这个示例中,`tee` 命令将 `Hello, world` 写入到 `file1.txt` 和 `file2.txt` 文件中,并同时将其输出到标准输出。
+
+### 示例 3:追加写入文件
+
+```bash
+echo "New data" | tee -a file1.txt
+```
+
+通过 `-a` 选项,`tee` 命令将数据追加写入到 `file1.txt` 文件中,而不是覆盖原有内容。
+
+### 示例 4:结合重定向和管道
+
+```bash
+command1 | tee >(command2) | command3
+```
+
+在这个示例中,`command1` 的输出被送到 `tee` 命令,然后 `tee` 将输出传递给 `command2`,并且同时将输出发送到 `command3`。这种结构可以用于复杂的管道命令中。
+
+### 选项
+
+- `-a`:追加写入文件而不是覆盖。
+- `-i`:忽略中断信号。
+- `--help`:显示帮助信息和选项列表。
+- `--version`:显示版本信息。
+
+### 总
+
+`tee` 命令是一个灵活而强大的工具,可以用于在命令行中处理数据流,同时向多个文件写入数据。
\ No newline at end of file
diff --git "a/39 \345\221\250\350\211\263/note/20240703-mysql\350\277\234\347\250\213\347\231\273\345\275\225&\344\277\256\346\224\271\347\253\257\345\217\243\345\217\267.md" "b/39 \345\221\250\350\211\263/note/20240703-mysql\350\277\234\347\250\213\347\231\273\345\275\225&\344\277\256\346\224\271\347\253\257\345\217\243\345\217\267.md"
new file mode 100644
index 0000000000000000000000000000000000000000..696b488675197f1c33137fbfea1c4288cbe0e678
--- /dev/null
+++ "b/39 \345\221\250\350\211\263/note/20240703-mysql\350\277\234\347\250\213\347\231\273\345\275\225&\344\277\256\346\224\271\347\253\257\345\217\243\345\217\267.md"
@@ -0,0 +1,40 @@
+## ✨数据库的远程登录配置✨
+
+1. 登录MySQL
+
+ ```bash
+ mysql -u 用户名 -p
+ ```
+
+2. 对数据库进行操作必须要先使用数据库
+
+ ```bash
+ use mysql;
+ ```
+
+3. ```bash
+ update user set host='%' where user ='root';
+ ```
+
+4. ```bash
+ FLUSH PRIVILEGES; #刷新权限
+ ```
+
+5. ```bash
+ GRANT ALL PRIVILEGES ON *.* TO 'root'@'%'WITH GRANT OPTION; #进行授权
+ ```
+
+6. ```bash
+ mysql -u 用户名 -p -h 主机ip #测试链接
+ ```
+
+## ✨修改端口号✨
+
+1. ```bash
+ vim /etc/mysql/mysql.conf.d/mysqld.cnf #进行配置文件的修改
+ # 在文本末尾添加一行
+ port = 端口号
+ ```
+
+
+
diff --git "a/39 \345\221\250\350\211\263/note/20240703-\345\256\211\350\243\205Apache\345\222\214ssl\350\257\201\344\271\246\347\232\204\351\203\250\347\275\262.md" "b/39 \345\221\250\350\211\263/note/20240703-\345\256\211\350\243\205Apache\345\222\214ssl\350\257\201\344\271\246\347\232\204\351\203\250\347\275\262.md"
new file mode 100644
index 0000000000000000000000000000000000000000..23eeeff69af4d10c04c29495ba4ded3fe9f7e4a3
--- /dev/null
+++ "b/39 \345\221\250\350\211\263/note/20240703-\345\256\211\350\243\205Apache\345\222\214ssl\350\257\201\344\271\246\347\232\204\351\203\250\347\275\262.md"
@@ -0,0 +1,111 @@
+#### 💕安装Apache💕
+
+1. ```bash
+ apt update #更新源
+ ```
+
+2. ```bash
+ apt install apache2 #下载Apache
+ ```
+
+3. ```bash
+ systemctl restart apache2 #重启apache
+ ```
+
+4. ```bash
+ systemctl status apache2 #查看apache的状态
+ ```
+
+5. 将apache的监听窗口修改,让其与nginx共存
+
+ ```bash
+ cd /etc/apache2 #切换到这个目录
+ vim ports.conf #修改这个文件
+ # If you just change the port or add more ports here, you will likely also
+ # have to change the VirtualHost statement in
+ # /etc/apache2/sites-enabled/000-default.conf
+
+ Listen 8080 #将端口修改为8080
+
+
+ Listen 444
+
+
+
+ Listen 444
+
+ ```
+
+6. 将阿里云服务器的安全组添加一个8080的端口
+
+7. 如果开启了防火墙,要允许8080端口的访问
+
+ ```bash
+ ufw allow 8080/tcp #允许8080端口访问
+ ufw allow 443/tcp
+ ufw reload #重启防火墙
+ ufw status #查看防火墙状态
+ ```
+
+#### 💕ssl证书的部署💕
+
+1. ssl证书的下载:https://yundunnext.console.aliyun.com/?spm=a2c4g.11186623.0.0.c09a335909bpha&p=cas#/certExtend/free/cn-hangzhou
+
+2. ssl部署的教程:https://help.aliyun.com/zh/ssl-certificate/user-guide/install-ssl-certificates-on-apache-2-servers-that-run-ubuntu?spm=a2c4g.11186623.0.i1#concept-cfn-yf2-kgb
+
+3. 步骤
+
+ 1. 执行以下命令,在Apache2的安装目录下创建一个用于存放证书的ssl目录。
+
+ ```bash
+ mkdir /etc/apache2/ssl #创建一个新的目录,用来存放ssl证书所需要的文件
+ #将证书文件和私钥文件上传到Apache2证书目录(/etc/apache2/ssl)
+ ```
+
+ 2. 执行以下命令,启用SSL模块。
+
+ ```bash
+ a2enmod ssl
+ ```
+
+ 
+
+ 3. SSL模块启用后,会在`/etc/apache2/sites-available`目录生成SSL证书配置文件default-ssl.conf。
+
+ * default-ssl.conf文件可能存放在`/etc/apache2/sites-available`或`/etc/apache2/sites-enabled`目录中。
+
+ - `sites-available`目录存放的是可用的虚拟主机。
+ - `sites-enabled`目录存放的是已经启用的虚拟主机。
+
+ 4. SSL模块启用后,会自动放行用于HTTPS服务的443端口。若443端口未自动放行,可在`/etc/apache2/ports.conf`配置文件中添加Listen 443,手动放行443端口。
+
+ 5. 编辑default-ssl.conf文件,修改与证书相关的配置。
+
+ * 执行以下命令,打开default-ssl.conf文件。
+
+ ```bash
+ cd /etc/apache2/sites-available #切换到该目录
+ vim default-ssl.conf #编辑该文件
+ ```
+
+ * 在default-ssl.conf配置文件中,定位到以下参数,按照中文注释修改。
+
+ ```bash
+ SSLCertificateFile /etc/apache2/ssl/domain_name_public.crt #证书文件路径。请替换为实际证书文件路径。
+ SSLCertificateKeyFile /etc/apache2/ssl/domain_name.key #证书私钥文件路径。请替换为实际证书私钥文件路径。
+ SSLCertificateChainFile /etc/apache2/ssl/domain_name_chain.crt #证书链文件路径。请替换为实际证书链文件路径。
+ ```
+
+ 6. 执行以下命令,将default-ssl.conf映射至`/etc/apache2/sites-enabled`目录,实现两者之间的自动关联。
+
+ ```bash
+ sudo ln -s /etc/apache2/sites-available/default-ssl.conf /etc/apache2/sites-enabled/001-ssl.conf #软连接方法一
+ ln -s ../sites-available/default-ssl.conf ../sites-enabled/default-ssl.conf #方法2
+ ```
+
+ 7. 执行以下命令,重新加载Apache2配置文件。
+
+ ```bash
+ systemctl restart apachce2 # 重启服务
+ ```
+
diff --git "a/39 \345\221\250\350\211\263/note/20240703-\345\256\211\350\243\205postgresql15\347\211\210\346\234\254.md" "b/39 \345\221\250\350\211\263/note/20240703-\345\256\211\350\243\205postgresql15\347\211\210\346\234\254.md"
new file mode 100644
index 0000000000000000000000000000000000000000..139d79eb3483c3468d9825f966fea8be287eca2e
--- /dev/null
+++ "b/39 \345\221\250\350\211\263/note/20240703-\345\256\211\350\243\205postgresql15\347\211\210\346\234\254.md"
@@ -0,0 +1,60 @@
+#### 💕安装postgresql💕
+
+##### 卸载安装包
+
+```mysql
+apt --purge remove postgresql
+apt autoremove postgresql*
+find / -name postgresql* -exec rm -rf {} \;
+```
+
+##### 安装
+
+1. ```bash
+ apt update #更新资源
+ ```
+
+2. ```bash
+ apt install postgresql #安装postgresql
+ ```
+
+3. ```bash
+ sudo -u postgres psql -c "SELECT version();" #验证postgresql的版本
+ # PostgreSQL 15.7 (Debian 15.7-0+deb12u1) on x86_64-pc-linux-gnu, compiled by gcc (Debian 12.2.0-14) 12.2.0, 64-bit:表示成功了
+ ```
+
+#### 配置
+
+1. ```bash
+ sudo -i -u postgres #切换到postgres用户
+ ```
+
+2. ```bash
+ psql #进入postgresql
+ ```
+
+3. ```bash
+ \q #退出postgresql
+ ```
+
+4. ```bash
+ psql -U postgres -W #测试登录
+ ```
+
+##### 远程登录配置
+
+1. ```bash
+ vim /etc/postgresql/15/main/postgresql.conf #对该文件进行配置
+ # listen_addresses = 'localhost'
+ # 改为
+ listen_addresses = '*'
+ ```
+
+2. ```bash
+ vim /etc/postgresql/15/main/pg_hba.conf
+ # 在文本的末尾添加一行
+ host all all 0.0.0.0/0 md5
+ ```
+
+
+
diff --git "a/39 \345\221\250\350\211\263/note/20240703-\346\216\222\345\272\217\345\222\214\345\216\273\351\207\215.md" "b/39 \345\221\250\350\211\263/note/20240703-\346\216\222\345\272\217\345\222\214\345\216\273\351\207\215.md"
new file mode 100644
index 0000000000000000000000000000000000000000..bb78849d2bb4597687bb23b36d7b3a436a7cd228
--- /dev/null
+++ "b/39 \345\221\250\350\211\263/note/20240703-\346\216\222\345\272\217\345\222\214\345\216\273\351\207\215.md"
@@ -0,0 +1,61 @@
+#### 💕排序sort💕
+
+1. 默认是以每一行第一个字符的ASCII码,按升序排序
+
+ ```bash
+ sort 文件名
+ ```
+
+2. 数字>字母
+
+3. ```bash
+ sort -r 文件名 #倒序
+ ```
+
+4. ```bash
+ sort -t '分隔符' -nk 数字 文件名
+ # -t:指定分隔符
+ # -k 数字:以某列排序
+ sort -k 1.2 文件名 # 以第一列的第二个字符排序
+ # -n:比较数字大小
+ ```
+
+5. ```bash
+ -o 文件名 #保存
+ ```
+
+6. ```bash
+ #唯一/去重
+ -u
+ ```
+
+#### 💕去重uniq💕
+
+1. 先排序再去重
+
+ ```bash
+ sort 文件名 | uniq
+ ```
+
+2. ```bash
+ -c :显示重复次数
+ ```
+
+#### 💕统计💕
+
+```bash
+1. wc -l 文件名 #统计文件数/文件行数
+2. nl
+3. cat -n
+```
+
+#### 💕切割:cut💕
+
+```
+cut -d '分隔符' -f 列数1,列数2... 文件名
+# -d : 指定分隔符
+# -f :显示第几列
+# -f M-N:显示第M列到第N列
+# -f M,N:显示第M列和第N列
+```
+
diff --git "a/39 \345\221\250\350\211\263/note/20240703-\347\250\213\345\272\217\347\232\204\345\256\211\350\243\205\346\226\271\345\274\217.md" "b/39 \345\221\250\350\211\263/note/20240703-\347\250\213\345\272\217\347\232\204\345\256\211\350\243\205\346\226\271\345\274\217.md"
new file mode 100644
index 0000000000000000000000000000000000000000..8d214d88381ec32be8d937da7dbcd91cce91edfc
--- /dev/null
+++ "b/39 \345\221\250\350\211\263/note/20240703-\347\250\213\345\272\217\347\232\204\345\256\211\350\243\205\346\226\271\345\274\217.md"
@@ -0,0 +1,11 @@
+#### 💕程序安装的方式💕
+
+1. apt管理工具,自由在线安装,自由安装需要的一些依赖包
+2. 手动下载的安装包,压缩包等,要自己安装依赖包
+ * wget 网址:直接下载到服务器
+ * 先下载到个人电脑,用scp上传到服务器上
+ * scp 本地电脑的文件的路径 用户名@主机IP:/要上传到的文件目录(目的地址)
+ * sftp 用户名@主机IP
+ * put 要上传的文件
+ * .deb二进制的安装包
+ * 下载源码,再进行编译
\ No newline at end of file
diff --git "a/39 \345\221\250\350\211\263/note/20240704-mysql\347\232\204\345\270\270\347\224\250\345\221\275\344\273\244.md" "b/39 \345\221\250\350\211\263/note/20240704-mysql\347\232\204\345\270\270\347\224\250\345\221\275\344\273\244.md"
new file mode 100644
index 0000000000000000000000000000000000000000..c3c6a33a4d9a29828882a0269f3452636e2d4e9e
--- /dev/null
+++ "b/39 \345\221\250\350\211\263/note/20240704-mysql\347\232\204\345\270\270\347\224\250\345\221\275\344\273\244.md"
@@ -0,0 +1,489 @@
+### 💕MySQL的常用命令💕
+
+[MySQL 创建数据表 | 菜鸟教程 (runoob.com)](https://www.runoob.com/mysql/mysql-create-tables.html)
+
+#### ✨MySQL查询命令
+
+1. ```bash
+ show database #列出所有可用的数据库
+ ```
+
+2. ```bash
+ use 数据库名 #选择要用的数据库
+ show tables # 查看所选数据库中所有的表
+ ```
+
+#### ✨使用 PHP 脚本连接 MySQL
+
+1. 链接语法:mysqli_connect()
+
+ ```bash
+ mysqli_connect(host, username, password, dbname,port, socket);
+ ```
+
+2. 成功链接到 MySQL 后返回连接标识,失败返回 FALSE
+
+3. 断开链接语法:mysqli_close()
+
+ * 关闭指定的连接标识所关联的到 MySQL 服务器的非持久连接
+
+ ```bash
+ bool mysqli_close ( mysqli $link )
+ ```
+
+4. | 参数 | 描述 |
+ | :--------- | :------------------------------------------ |
+ | *host* | 可选。规定主机名或 IP 地址。 |
+ | *username* | 可选。规定 MySQL 用户名。 |
+ | *password* | 可选。规定 MySQL 密码。 |
+ | *dbname* | 可选。规定默认使用的数据库。 |
+ | *port* | 可选。规定尝试连接到 MySQL 服务器的端口号。 |
+ | *socket* | 可选。规定 socket 或要使用的已命名 pipe。 |
+
+#### ✨MySQL创建数据库
+
+1. ```bash
+ create database 数据库名; #创建数据库
+ create database if not exists 数据库名; #如果数据库名不存在才创建
+ ```
+
+2. ```bash
+ #使用 mysqladmin 创建数据库的基本语法
+ mysqladmin -u 用户名 -p create 数据库名;
+ ```
+
+#### ✨MySQL删除数据库
+
+1. ```bash
+ drop database 数据库名; #删除数据库
+ drop database if exists 数据库名; #检查是否存在,存在才会删除
+ ```
+
+2. ```bash
+ #使用 mysqladmin 删除数据库的基本语法
+ mysqladmin -u 用户名 -p drop 数据库名;
+ ```
+
+#### ✨MySQL选择数据库
+
+1. ```bash
+ use 数据库名; #选择数据库
+ mysql -u 用户名 -p -D 数据库名;
+ #-D 参数用于指定要选择的数据库
+ ```
+
+#### ✨MySQL数据类型
+
+###### 💕数值类型
+
+| 类型 | 大小 | 范围(有符号) | 范围(无符号) | 用途 |
+| :----------- | :--------------------------------------- | :----------------------------------------------------------- | :----------------------------------------------------------- | :-------------- |
+| tinyint | 1 Bytes | (-128,127) | (0,255) | 小整数值 |
+| smallint | 2 Bytes | (-32 768,32 767) | (0,65 535) | 大整数值 |
+| mediumint | 3 Bytes | (-8 388 608,8 388 607) | (0,16 777 215) | 大整数值 |
+| int或integer | 4 Bytes | (-2 147 483 648,2 147 483 647) | (0,4 294 967 295) | 大整数值 |
+| bigint | 8 Bytes | (-9,223,372,036,854,775,808,9 223 372 036 854 775 807) | (0,18 446 744 073 709 551 615) | 极大整数值 |
+| float | 4 Bytes | (-3.402 823 466 E+38,-1.175 494 351 E-38),0,(1.175 494 351 E-38,3.402 823 466 351 E+38) | 0,(1.175 494 351 E-38,3.402 823 466 E+38) | 单精度 浮点数值 |
+| double | 8 Bytes | (-1.797 693 134 862 315 7 E+308,-2.225 073 858 507 201 4 E-308),0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) | 0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) | 双精度 浮点数值 |
+| decimal | 对decimal(M,D) ,如果M>D,为M+2否则为D+2 | 依赖于M和D的值 | 依赖于M和D的值 | 小数值 |
+
+###### 💕日期和时间类型
+
+| 类型 | 大小 ( bytes) | 范围 | 格式 | 用途 |
+| :-------- | :------------ | :----------------------------------------------------------- | :------------------ | :----------------------- |
+| date | 3 | 1000-01-01/9999-12-31 | YYYY-MM-DD | 日期值 |
+| time | 3 | '-838:59:59'/'838:59:59' | HH:MM:SS | 时间值或持续时间 |
+| year | 1 | 1901/2155 | YYYY | 年份值 |
+| datetime | 8 | '1000-01-01 00:00:00' 到 '9999-12-31 23:59:59' | YYYY-MM-DD hh:mm:ss | 混合日期和时间值 |
+| timestamp | 4 | '1970-01-01 00:00:01' UTC 到 '2038-01-19 03:14:07' UTC结束时间是第 **2147483647** 秒,北京时间 **2038-1-19 11:14:07**,格林尼治时间 2038年1月19日 凌晨 03:14:07 | YYYY-MM-DD hh:mm:ss | 混合日期和时间值,时间戳 |
+
+💕字符串类型
+
+| 类型 | 大小 | 用途 |
+| :--------- | :-------------------- | :------------------------------ |
+| char | 0-255 bytes | 定长字符串 |
+| varchar | 0-65535 bytes | 变长字符串 |
+| tinyblob | 0-255 bytes | 不超过 255 个字符的二进制字符串 |
+| tinttext | 0-255 bytes | 短文本字符串 |
+| blob | 0-65 535 bytes | 二进制形式的长文本数据 |
+| text | 0-65 535 bytes | 长文本数据 |
+| mediublob | 0-16 777 215 bytes | 二进制形式的中等长度文本数据 |
+| mediumtext | 0-16 777 215 bytes | 中等长度文本数据 |
+| Blongblob | 0-4 294 967 295 bytes | 二进制形式的极大文本数据 |
+| longtext | 0-4 294 967 295 bytes | 极大文本数据 |
+
+###### 💕枚举和集合类型
+
+1. ENUM: 枚举类型,用于存储单一值,可以选择一个预定义的集合。
+2. SET: 集合类型,用于存储多个值,可以选择多个预定义的集合。
+
+#### ✨MySQL 创建数据表
+
+##### 💕语法
+
+```mysql
+-- table_name:表名
+-- column:表示列名(字段名)
+-- datatype:数据类型
+create table table_name(
+ column1 datatype,
+ column2 datatype,
+ ······
+);
+-- primary key:主键
+-- not null:不为空
+```
+
+#### ✨MySQL 删除数据表
+
+##### 💕语法
+
+1. drop:删除
+
+ ```mysql
+ drop table table_name;
+ -- 会先判断数据表存不存在
+ drop table if exists table_name;
+ ```
+
+2. mysqladmin:删除
+
+ ```mysql
+ -- your_username:mysql的用户名
+ -- your_table:要删除表的名称
+ mysqladmin -u your_username -p drop your_table
+ ```
+
+#### ✨MySQL 插入数据
+
+##### 💕语法1
+
+```mysql
+insert into table_name (column1, column2, column3, ...)
+values(value1, value2, value3, ...);
+```
+
+##### 💕语法2:插入所有列的数据
+
+```mysql
+insert into table_name
+values (value1, value2, value3, ...);
+-- 必须与所有列匹配,如果不需要数据就写null
+insert into table_name
+values (null, value2, value3, ...);
+```
+
+#### ✨MySQL 查询数据
+
+##### 💕语法
+
+```mysql
+select column1, column2, ...
+from able_name
+[where 要过滤的内容]
+[order by 排序]
+```
+
+#### ✨MySQL where子句
+
+##### 💕语法
+
+```mysql
+select column1, column2, ...
+from able_name
+where 要过滤的内容
+```
+
+##### 💕操作符
+
+| 操作符 | 描述 | 实例 |
+| :----- | :----------------------------------------------------------- | :------------------- |
+| = | 等号,检测两个值是否相等,如果相等返回true | (A = B) 返回false。 |
+| <>, != | 不等于,检测两个值是否相等,如果不相等返回true | (A != B) 返回 true。 |
+| > | 大于号,检测左边的值是否大于右边的值, 如果左边的值大于右边的值返回true | (A > B) 返回false。 |
+| < | 小于号,检测左边的值是否小于右边的值, 如果左边的值小于右边的值返回true | (A < B) 返回 true。 |
+| >= | 大于等于号,检测左边的值是否大于或等于右边的值, 如果左边的值大于或等于右边的值返回true | (A >= B) 返回false。 |
+| <= | 小于等于号,检测左边的值是否小于或等于右边的值, 如果左边的值小于或等于右边的值返回true | (A <= B) 返回 true。 |
+
+##### 💕常用命令
+
+1. 组合条件(and,or)
+
+ ```mysql
+ -- 两个条件同时满足
+ select * from table_name
+ where column1 操作符 '条件1' and column2 操作符 '条件2';
+ -- 满足其中一个条件
+ select * from table_name
+ where column1 操作符 '条件1' or column2 操作符 '条件2';
+ ```
+
+2. 模糊匹配条件
+
+ ```mysql
+ select * from table_name
+ where column like 'J%';
+ ```
+
+3. in条件:在什么条件里面
+
+ ```mysql
+ select * from table_name where column in ('', '', '');
+ ```
+
+4. not条件:不在什么条件里
+
+ ```mysql
+ select * from table_name where in column ('', '', '');
+ ```
+
+5. between条件 :在什么和什么之间
+
+ ```mysql
+ select * from table_name where column between '' and '';
+ ```
+
+6. is null条件
+
+ ```mysql
+ select * from table_name where column is null;
+ ```
+
+7. is not null条件
+
+ ```mysql
+ select * from table_name where column is not null;
+ ```
+
+#### ✨MySQL update更新语句
+
+##### 💕语法
+
+```mysql
+-- value1, value2, ... 是新的值,用于替换旧的值
+update table_name
+set column1 = value1, column2 = value2, ...
+where 需要过滤的内容
+```
+
+#### ✨MySQL delete删除语句
+
+##### 💕语法
+
+```mysql
+delete from table_name
+where 要过滤的内容
+```
+
+#### ✨MySQL like子句
+
+##### 💕语法
+
+```mysql
+-- column1, column2, ... 是你要选择的列的名称,如果使用 * 表示选择所有列。
+-- table_name 是你要从中查询数据的表的名称。
+-- column_name 是你要应用 like 子句的列的名称。
+-- pattern 是用于匹配的模式,可以包含通配符。
+select column1, column2, ...
+from table_name
+where column_name like pattern;
+```
+
+##### 💕使用案例
+
+1. 百分号通配符%:表示零个或者多个字符
+
+ ```mysql
+ -- 匹配以字母'S'开头的任何字符串
+ select * from table_name wjere column like 'S%';
+ ```
+
+2. 下划线通配符_:表示一个字符
+
+ ```mysql
+ -- 第二个字母为'a'的任何字符串
+ select * from table_name where column like '_a%';
+ ```
+
+3. 组合使用%和_
+
+ ```mysql
+ select * from table_name where column like 'a%o_';
+ ```
+
+4. 不区分大小写的匹配
+
+ ```mysql
+ select * from table_name where column like 'smi%' collate utf8mb4_general_ci;
+ ```
+
+#### ✨MySQL union操作符
+
+##### 💕作用
+
+1. 用于连接两个以上的select语句的结果组合到一个结果集合,并去除重复的行。
+2. 必须由两个或多个select语句组成,每个select语句的列数和对应位置的数据类型必须相同。
+
+##### 💕语法
+
+```mysql
+-- condition1, condition2, ... 是每个 SELECT 语句的过滤条件,是可选的
+-- order by 子句是一个可选的子句,用于指定合并后的结果集的排序顺序
+select column1, column2, ...
+from table1
+where condition1
+union
+select column1, column2, ...
+from table2
+where condition2
+[order by column1, column2, ...];
+```
+
+1. 基本操作
+
+ ```mysql
+ -- 选取两个表中的唯一值(字段名和数据类型必须一致),并按唯一值升序排序
+ select column from table_name1
+ union
+ select column from table_name2
+ order by column;
+ ```
+
+2. 过滤
+
+ ```mysql
+ -- 在同一个表中过滤出符合column2条件的内容,并通过column1排序
+ select column1 from table_name where column2 操作符 'value1'
+ union
+ select column1 from table_name where column2 操作符 'value2'
+ order by column1;
+ ```
+
+3. union操作中的列数和数据类型必须相同
+
+ ```mysql
+ -- departments 表中的 department_name 列被映射到了 employees 表中的 last_name 列,但是列数和数据类型必须相同
+ select first_name, last_name from employees
+ union
+ select department_name, null from departments
+ order by first_name;
+ ```
+
+4. 使用 union all不去除重复行
+
+ ```mysql
+ -- union 操作符在合并结果集时会去除重复行,而 union all 不会去除重复行,因此 union all 的性能可能更好,但如果你确实希望去除重复行,可以使用 union。
+ select column from table_name1
+ union all
+ select column from table_name2
+ order by column;
+ ```
+
+#### ✨MySQL order by排序语句
+
+##### 💕语法
+
+```mysql
+-- asc:升序排序
+-- desc:降序排序
+select column1, column2, ...
+from table_name
+order by column1 [asc | desc], column2 [asc | desc], ...;
+```
+
+1. 单列排序
+
+ ```mysql
+ select * from table_name
+ order by column asc;
+ ```
+
+2. 多列排序
+
+ ```mysql
+ select * from table_name
+ order by column1 asc, column2 desc;
+ ```
+
+
+
+#### ✨MySQL 连表
+
+##### 💕inner join(内连接,或等值连接)
+
+1. 作用:获取两个表中字段匹配关系的记录
+
+2. 基本语法
+
+ ```mysql
+ -- column_name:表示列名
+ -- table:表示表名
+ select column1,column2 ·····(或者*:表示所有列)
+ from table1
+ inner join table2 on
+ table1.column_name =table2.column_name
+ ```
+
+3. 普通用法
+
+ ```mysql
+ select 表名1.字段名,表名2.字段名 from 表名1
+ inner join 表名2 on
+ 表名1.id字段 = 表名2.id字段;
+ ```
+
+4. 使用表的别名
+
+ ```mysql
+ select 表别名1.字段名,表别名2.字段名
+ from 表名1 as 别名1
+ inner join 表名2 as 别名2 on
+ 别名1.id字段 = 别名2.id字段;
+ ```
+
+5. 多表链接
+
+ ```mysql
+ select 表名1.字段,表名2.字段,表名3.字段
+ from 表名1
+ inner join 表名2 on 表名1.id字段 = 表名2.id 字段
+ inner join 表名4 on 表名1.id字段 =表名4.id字段
+ inner join 表名3 on 表名4.id字段 = 表名3.id字段 ;
+ ```
+
+6. 使用where子句进行过滤
+
+ ```mysql
+ select 表名1.字段名,表名2.字段名
+ from 表名1
+ inner join 表名2 on
+ 表名1.id字段 =表名2.id字段
+ where 需要过滤的内容;
+ ```
+
+
+##### 💕left join(左连接)
+
+1. 作用:获取左表所有记录,即使右表没有对应的匹配记录
+
+2. 基础语法
+
+ ```mysql
+ select column1, column2, ...
+ from table1 left join table2 on
+ table1.字段 = table2.字段;
+ ```
+
+##### 💕right join(右连接)
+
+1. 作用:获取右表所有记录,即使左表没有对应的匹配记录
+
+2. 基础语法
+
+ ```mysql
+ select column1, column2, ...
+ from table1 right join table2 on
+ table1.字段 = table2.字段;
+ ```
+
+
\ No newline at end of file
diff --git "a/39 \345\221\250\350\211\263/note/20240704-\346\225\260\346\215\256\345\272\223\347\232\204\350\277\230\345\216\237\344\270\216\345\244\207\344\273\275.md" "b/39 \345\221\250\350\211\263/note/20240704-\346\225\260\346\215\256\345\272\223\347\232\204\350\277\230\345\216\237\344\270\216\345\244\207\344\273\275.md"
new file mode 100644
index 0000000000000000000000000000000000000000..1771bb471a244d4ce602f8e73d1e7ffe868924ec
--- /dev/null
+++ "b/39 \345\221\250\350\211\263/note/20240704-\346\225\260\346\215\256\345\272\223\347\232\204\350\277\230\345\216\237\344\270\216\345\244\207\344\273\275.md"
@@ -0,0 +1,84 @@
+### 💕数据库的还原与备份💕
+
+#### 🐱🐉备份
+
+1. 在默认情况下,即备份数据有备份结构
+
+2. 执行命令在Linux中执行,不在mysql中执行,mysql与Linux是同一级的
+
+3. mysqldump:单库备份,不包含建库语句,所以恢复时要指定数据库
+
+ * 在恢复时先指定好数据库(这个数据库可以任意)
+ * 添加建库语句
+
+ ```bash
+ mysqldump -u 用户名 -p 数据库名 > 备份文件目录 #(文件名是以.sql结尾的)
+ ```
+
+4. 多个库的备份,已经包含建库语句了,不用在添加建库语句
+
+ ```bash
+ # --databases 库1 库2 ·······
+ mysqldump -u 用户名 -p --databases 库1 库2 > 备份文件目录
+ ```
+
+5. 全部库的备份
+
+ ```bash
+ #--all-databases
+ mysqldump -u 用户名 -p --all-databases > 备份文件目录
+ ```
+
+6. 单个表的备份
+
+ ```bash
+ mysqldump -u 用户名 -p 数据库名 表名 > 备份文件目录
+ ```
+
+7. 多个表的备份
+
+ ```bash
+ mysqldump -u 用户名 -p 数据库名 表名1 表名2 > 备份文件目录
+ ```
+
+8. 只备份数据
+
+ ```bash
+ mysqldump -u 用户名 -p --no-date 数据库名 > 备份文件目录
+ ```
+
+9. 只备份结构
+
+ ```bash
+ mysqldump -u 用户名 -p --no-create-info 表名 > 备份文件目录
+ ```
+
+10. 备份数据库,压缩输出
+
+ ```bash
+ mysqldump -u 用户名 -p 数据库名 | gzip > 备份文件目录
+ ```
+
+11. 解压
+
+ ``` bash
+ gungzip < 备份文件.gz | mysql -u 用户名 -p
+ gzip -d < 备份文件.gz | mysql -u root -p # gzip -d = gunzip
+ ```
+
+#### 🐱👓还原
+
+1. 还原(导入)
+
+ ```bash
+ mysql -u root -p 数据库名 < 要恢复的文件(备份文件目录)
+ # 前提是这个数据库名要真实存在
+ ```
+
+
+2. 登录mysql后,先选择要恢复的数据库,再用source 要恢复的文件来恢复
+
+ ```bash
+ use 数据库名;
+ source 要恢复的文件的目录 #(文件名是以.sql结尾的)
+ ```
\ No newline at end of file
diff --git "a/39 \345\221\250\350\211\263/note/20240706-\345\256\211\350\243\205postgresql16\347\211\210\346\234\254.md" "b/39 \345\221\250\350\211\263/note/20240706-\345\256\211\350\243\205postgresql16\347\211\210\346\234\254.md"
new file mode 100644
index 0000000000000000000000000000000000000000..70a8a15b1c38bfb9607da2099401337b154566ae
--- /dev/null
+++ "b/39 \345\221\250\350\211\263/note/20240706-\345\256\211\350\243\205postgresql16\347\211\210\346\234\254.md"
@@ -0,0 +1,73 @@
+#### 💕安装postgresql 16版本💕
+
+##### 卸载安装包
+
+```mysql
+apt --purge remove postgresql
+apt autoremove postgresql*
+find / -name postgresql* -exec rm -rf {} \;
+```
+
+##### 安装
+
+```bash
+#下载依赖包
+sudo apt install -y postgresql-common
+sudo /usr/share/postgresql-common/pgdg/apt.postgresql.org.sh
+#按回车继续
+apt update #更新资源
+apt install postgresql #安装postgresql
+```
+
+#### 配置
+
+1. ```bash
+ su postgres #切换到postgres用户
+ ```
+
+2. ```bash
+ psql #进入postgresql
+ \password
+ ```
+
+3. ```bash
+ \q #退出postgresql
+ ```
+
+4. ```bash
+ 本地登录不需要密码
+ ```
+
+##### 远程登录配置
+
+1. ```bash
+ vim /etc/postgresql/16/main/postgresql.conf #对该文件进行配置
+ # listen_addresses = 'localhost'
+ # 改为
+ listen_addresses = '*'
+ ```
+
+2. ```bash
+ vim /etc/postgresql/16/main/pg_hba.conf
+ # 在文本的末尾添加一行
+ host all all 0.0.0.0/0 md5
+ ```
+
+3. ```bash
+ psql -h localhost -U postgre #测试远程登录
+ ```
+
+##### postgresql的语法
+
+```mysql
+-- 查看数据库
+\l
+-- 切换导数据库
+\c
+-- 列出表
+\dt
+-- 查看表结构
+\d
+-- 其他语言和mysql类似
+```
+
diff --git "a/39 \345\221\250\350\211\263/note/20240709-postgresql\347\232\204\345\244\207\344\273\275\344\270\216\350\277\230\345\216\237.md" "b/39 \345\221\250\350\211\263/note/20240709-postgresql\347\232\204\345\244\207\344\273\275\344\270\216\350\277\230\345\216\237.md"
new file mode 100644
index 0000000000000000000000000000000000000000..acc613d7852da854e98f5d86f16a3df7cfd999c9
--- /dev/null
+++ "b/39 \345\221\250\350\211\263/note/20240709-postgresql\347\232\204\345\244\207\344\273\275\344\270\216\350\277\230\345\216\237.md"
@@ -0,0 +1,70 @@
+### 💕postgresql的备份与还原💕
+
+1. 将本地文件上传到服务器上 scp
+
+ * ```mysql
+ psql -h 主机IP -U postgres -f 文件目录 #将文件导入到postgres
+ #权限不够,将文件移动到另一个位置(/tmp)
+ ls -ld #查看目录本身
+ ```
+
+2. 先创建好库,再将文件导入postgres
+
+ ```mysql
+ psql -h 主机IP -U postgres -d 数据库名 -f 文件名目录
+ # 在postgresql中不能用 use 数据库名,int 后不能设置宽度,例如:id int(3)
+ ```
+
+##### 备份
+
+```mysql
+pg-dump -U postgres -d 数据库名 -f 文件名目录(备份文件目录)
+pg-dump -U postgres -d 数据库名 > 文件名目录(备份文件目录)
+```
+
+##### 还原
+
+```mysql
+#-h 主机IP:如果上是本地主机号,就不用写
+psql -h 主机IP -U postgres -d 数据库名 -f 文件名目录(备份文件目录)
+psql -h 主机IP -U postgres -d 要恢复的数据库名 < 文件名目录(备份文件目录)
+```
+
+##### 以.dump结尾的文件的备份和还原
+
+```mysql
+#备份
+pg-dump -U postgres -FC 库名 > 文件名目录(备份文件目录)
+#还原
+pg-restore
+```
+
+##### 备份还原表
+
+```mysql
+#备份
+pg-dunmp -U postgres -d 库名 -t 表名 > 备份文件目录
+#多个表 :-t 表名 -t 表名·······
+#还原
+psql -U postgres -d 库名 < 备份文件目录
+```
+
+##### 备份所有数据库
+
+```mysql
+#备份
+pg-dumpall > 备份文件目录
+#还原
+psql < 备份文件目录
+ #如果用了 -h 主机IP ,就要用密码, -U 用户名:制定用户
+```
+
+##### 压缩备份
+
+```mysql
+gunzip < 备份文件目录 | psql
+pg-dumpall
+
+```
+
+#### postgresql 中的字段不能有` `
\ No newline at end of file
diff --git "a/39 \345\221\250\350\211\263/note/20240709-\345\256\211\350\243\2058\344\270\252\350\231\232\346\213\237\346\234\272.md" "b/39 \345\221\250\350\211\263/note/20240709-\345\256\211\350\243\2058\344\270\252\350\231\232\346\213\237\346\234\272.md"
new file mode 100644
index 0000000000000000000000000000000000000000..6b3e31e2f3faa602a920d5af7a4af75eb32d9319
--- /dev/null
+++ "b/39 \345\221\250\350\211\263/note/20240709-\345\256\211\350\243\2058\344\270\252\350\231\232\346\213\237\346\234\272.md"
@@ -0,0 +1,70 @@
+### 💕安装8个虚拟机💕
+
+#### 💕安装虚拟机和Debian💕
+
+1. Linux是操作系统的内核,以其为基础会有很多发行的版本,RedHat,Centos,Ubantu,Debian
+
+ * RedHat:收费商业版本
+ * Centos:是RedHat的社区版本
+ * Ubantu:是以Debian+桌面皮肤的版本
+ * Debian:以命令行为主
+
+2. 学习Debian的两种方式
+
+ * 安装虚拟机
+ * 利用阿里云,华为云,腾讯云,也可以利用快照功能,对服务器进行存档
+
+3. 虚拟机
+
+ * 虚拟机VM 17版本+Debian 12.5 64位的ISO文件
+
+ * 先安装VM,再创建一个虚拟机
+
+ * 下载镜像文件:(https://www.debian.org/)
+
+ * 直接再虚拟机操作Debian 很麻烦,要用ssh远程登录
+
+ * ```js
+ ip adde show //查IP
+ ssh -l 用户名 用户IP//ssh远程登录(管理员cmd)
+ ```
+
+ * 默认Debian 没有俺煮给你吃ssh服务端
+
+ * ```js
+ apt-get install ssh -y//在超级用户下写root(普通用户可以登录)
+ ```
+
+ * 远程登录root需要对ssh进行配置
+
+ * ```js
+ apt-get install vim -y
+ wherein ssh //查看配置文件
+ ```
+
+ * 修改ssh的服务端配置文件/etc/ssh/sshd_config文件
+
+ * ```js
+ vim /etc/ssh/sshd_config
+ port 22 //开启端口22
+ PermiRootLogin yes//允许root登录
+ PasswordAutentication yes //采用密码验证模式
+ PermitEmptyPasswords no//禁用空密码
+ systemctl restart ssh//重启ssh,让遂改后的配置生效
+ letc/init.d/ssh restart
+ ```
+
+ * 如何借用root权限
+
+ * ```js
+ 1. 安装sudo
+ apt-get install sudo -y
+ 2. 将普通用户名加入
+ vim /etc/sudoers
+ ##
+ ## Allow root to run any commands anywhere
+ root ALL=(ALL) ALL
+ 用户名 ALL=(ALL) ALL
+ ```
+
+
diff --git "a/39 \345\221\250\350\211\263/note/20240709-\350\231\232\346\213\237\346\234\272\345\256\211\350\243\205mysql.md" "b/39 \345\221\250\350\211\263/note/20240709-\350\231\232\346\213\237\346\234\272\345\256\211\350\243\205mysql.md"
new file mode 100644
index 0000000000000000000000000000000000000000..3433bdc4a0ce50f574b88df94e91b1e8731068ef
--- /dev/null
+++ "b/39 \345\221\250\350\211\263/note/20240709-\350\231\232\346\213\237\346\234\272\345\256\211\350\243\205mysql.md"
@@ -0,0 +1,121 @@
+## 💕Debian安装mysql💕
+
+### ✨安装✨
+
+1. 更新系统软件包并安装必要的依赖包
+
+ ```bash
+ apt update
+ ```
+
+2. 下载 MySQL 的官方仓库配置文件
+
+ ```bash
+ wget https://repo.mysql.com/mysql-apt-config_0.8.30-1_all.deb
+ ```
+
+3. ```bash
+ apt install gnupg
+ ```
+
+
+
+4. 安装 MySQL 的官方仓库配置文件
+
+ ```bash
+ dpkg -i /tmp/mysql-apt-config_0.8.30-1_all.deb
+ ```
+
+5. 
+
+ * 选第一个,进去前后选择长期支持版本
+ * 按照要求设置好密码
+
+6. 更新软件包,并安装MySQL
+
+ ```bash
+ sudo apt update
+ sudo apt install mysql-server
+ ```
+
+7. 登录mysql服务器
+
+ ```bash
+ mysql -u root -p
+ ```
+
+### ✨Debian MySQL创建新用户✨
+
+1. 登录到mysql服务器
+
+ ```bash
+ mysql -u root -p
+ ```
+
+2. 创建的新用户的用户名为"myuser",密码为"mypassword"
+
+ ```bash
+ CREATE USER 'myuser'@'localhost' IDENTIFIED BY 'mypassword';
+ ```
+
+3. 需要创建一个新的数据库,或者指定一个已经存在的数据库,可以给新用户分配权限
+
+ ```bash
+ CREATE DATABASE mydatabase;
+ ```
+
+4. 分配权限:给"myuser"用户在"mydatabase"数据库上的所有权限
+
+ ```bash
+ GRANT ALL PRIVILEGES ON mydatabase.* TO 'myuser'@'localhost';
+ ```
+
+5. 刷新权限
+
+ ```bash
+ FLUSH PRIVILEGES;
+ ```
+
+6. 登录新用户
+
+ ```bash
+ mysql -u myuser -p
+ ```
+
+7. 查看是否创建成功
+
+ ```bash
+ SELECT User, Host FROM mysql.user;
+ ```
+
+
+#### 🐱🐉给新用户修改用户名
+
+1. 修改
+
+ ```bash
+ update user set user =新用户名 where user ='旧用户名'
+ ```
+
+2. 验证是否修改成功
+
+ ```bash
+ select user from mysql.user;
+ ```
+
+3. 获取mysql的用户列表
+
+ ```mysql
+ select user,host from mysql.user
+ ```
+
+4. 查找授予特定mysql账户的权限
+
+ ```mysql
+ show grants for '用户名'@'登录方式(%或者localhost)'
+ ```
+
+
+
+
+
diff --git "a/39 \345\221\250\350\211\263/note/20240710-shell\350\204\232\346\234\254.md" "b/39 \345\221\250\350\211\263/note/20240710-shell\350\204\232\346\234\254.md"
new file mode 100644
index 0000000000000000000000000000000000000000..3f5c86cd44bd73b56580cae93eabd1941e7540a2
--- /dev/null
+++ "b/39 \345\221\250\350\211\263/note/20240710-shell\350\204\232\346\234\254.md"
@@ -0,0 +1,109 @@
+### shell脚本
+
+1. 对话方式
+
+ * 交互式:用户输入一条命令,shell解释并执行一条
+ * 非交互式(批量处理)
+
+2. 脚本的基本格式
+
+ ```bash
+ #声明以下代码是通过/bin/bash程序来执行的,shell脚本一般是一.sh结尾的
+ #!/bin/bash
+ ```
+
+3. 执行shell脚本的三种方式
+
+ * 路径:
+
+ * 会报一个权限不够的错误
+
+ ```bash
+ #解决方案
+ chmod +x 文件名
+ ```
+
+ * 文件的绝对路径
+ * 文件的相对路径
+
+ * shell解释器执行:指定使用bash执行,不需要权限
+
+ ```bash
+ sh 文件名
+ dash 文件名
+ rbash 文件名
+ ```
+
+ * sourece或 **.** :也可以直接执行,不需要权限,但是当前环境会被影响
+
+ ``` bash
+ source 文件名
+ . 文件名
+ ```
+
+4. 错误
+
+ * 命令错误
+
+ * 会继续向下执行,但是错误的一行会报错
+
+ * ```bash
+ # 检测脚本语言是否 有错误
+ bash -x 文件名
+ ```
+
+ * 语法错误
+
+ * 后续的命令不会在执行
+
+ * ```bash
+ # 检查错误
+ bash -n
+ ```
+
+5. 自定义变量
+
+ * 交互式
+
+ * 不能以数字开头
+ * 两边不能有空格
+ * 字符串要加" "
+ * 变量前加$,表示使用改变量
+
+ * 非交互式
+
+ * ```bash
+ read -p "提示语" 变量名
+ ```
+
+ * ```bash
+ # 只读变量,不能进行其他操作
+ readonly -p "提示语" 变量名
+ ```
+
+6. 预定义变量:在shell启动时就已经存在的变量
+
+7. 位置变量
+
+ * $0:会打印出脚本文件的文件名(当前)
+ * $1:脚本后面第一个参数
+ * $2:脚本后面第二个参数
+ * $#:查看一共有几个参数
+
+8. 两数相加
+
+ ```bash
+ # 要用空格隔开
+ echo $(erpr 1 + 1 )
+ #加强版
+ echo $(( sum=1+1 ))
+ #定义变量
+ let a=1+1 ==> echo $a
+
+ echo $[1+1]
+ ```
+
+
+
+
+
diff --git "a/39 \345\221\250\350\211\263/note/20240710-\346\217\222\345\205\245100\344\270\207\346\235\241\346\225\260\346\215\256.md" "b/39 \345\221\250\350\211\263/note/20240710-\346\217\222\345\205\245100\344\270\207\346\235\241\346\225\260\346\215\256.md"
new file mode 100644
index 0000000000000000000000000000000000000000..fa40847fe43d657c0bc0a93bc12a54b7c25d0ec3
--- /dev/null
+++ "b/39 \345\221\250\350\211\263/note/20240710-\346\217\222\345\205\245100\344\270\207\346\235\241\346\225\260\346\215\256.md"
@@ -0,0 +1,47 @@
+```mysql
+#!/bin/bash
+
+# MySQL连接配置
+DB_USER="root"
+DB_PASS="密码"
+DB_HOST="主机ip"
+DB_NAME="数据库名称"
+
+# 数据量控制变量
+NUM_ROWS=100 # 要插入的数据条数
+
+# 连接MySQL并创建表格
+mysql -u$DB_USER -p$DB_PASS -h$DB_HOST $DB_NAME << EOF
+CREATE TABLE IF NOT EXISTS stu (
+ id INT AUTO_INCREMENT PRIMARY KEY,
+ name VARCHAR(50),
+ phone VARCHAR(11),
+ hobby VARCHAR(50),
+ created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
+);
+EOF
+
+# 准备生成随机数据并插入数据库
+hobbies=("Reading" "Sports" "Music" "Gaming")
+
+# 开始测量时间
+echo "开始插入数据..."
+time (
+ # 插入指定数量的随机数据
+ for ((i=1; i<=$NUM_ROWS; i++)); do
+ name=$(cat /dev/urandom | tr -dc 'a-zA-Z' | fold -w 4 | head -n 1) # 生成随机姓名,4个字符长
+ phone="1$(( RANDOM % 9000000000 + 1000000000 ))" # 生成11位以1开头的随机手机号
+ hobby=${hobbies[$RANDOM % ${#hobbies[@]} ]}
+
+ # 插入数据到MySQL
+ mysql -u$DB_USER -p$DB_PASS -h$DB_HOST $DB_NAME << EOF
+INSERT INTO stu (name, phone, hobby) VALUES ('$name', '$phone', '$hobby');
+EOF
+ done
+)
+
+echo "插入完成!"
+```
+
+1. 脚本文件(要以.sh结尾)
+2. 使用脚本:输入脚本文件的绝对路径
\ No newline at end of file
diff --git "a/39 \345\221\250\350\211\263/note/20240712-shell\350\204\232\346\234\254\344\270\255\347\232\204\346\265\213\350\257\225\346\226\271\346\263\225.md" "b/39 \345\221\250\350\211\263/note/20240712-shell\350\204\232\346\234\254\344\270\255\347\232\204\346\265\213\350\257\225\346\226\271\346\263\225.md"
new file mode 100644
index 0000000000000000000000000000000000000000..343dda15feead10ca1780ab8f24afc6dc418d30b
--- /dev/null
+++ "b/39 \345\221\250\350\211\263/note/20240712-shell\350\204\232\346\234\254\344\270\255\347\232\204\346\265\213\350\257\225\346\226\271\346\263\225.md"
@@ -0,0 +1,238 @@
+### shell中的测试与语句
+
+##### 简单条件测试
+
+1. 格式
+
+ ```bash
+ # 需要用空格隔开
+ [ 操作符 目录/文件 ]
+ ```
+
+2. 常见的操作符
+
+ ```bash
+ -d #测试是否为目录
+ -e #测试目录或文件是否存在
+ -f #测试是否为文件
+ -r #测试当前用户是否有权限读取
+ -w #测试当前用户是否有写入权限
+ -x #测试当前用户是否有权限执行
+ -L #测试是否为软连接文件
+ ```
+
+##### 逻辑测试
+
+1. 格式
+
+ ```bash
+ #格式1
+ [表达式1] 操作符 [表达式2]
+ #格式2
+ 命令1 操作符 命令2
+ ```
+
+2. 操作符
+
+ * &&:逻辑的与,“而且”的意思
+ * 有一个条件不符合,就不会执行
+ * || :逻辑的或,“或者”的意思
+ * 满足其中一个条件就可以
+ * !:逻辑的否
+
+##### 整数比较
+
+1. 语法
+
+ ```mysql
+ [ 整数 操作符 整数 ]
+ ```
+
+2. | 操作符 | 作用 |
+ | ------ | ------------------ |
+ | -eq | 判断是否等于 |
+ | -ne | 判断是否不等于 |
+ | -gt | 判断是否大于 |
+ | -lt | 判断是否小于 |
+ | -le | 判断是否等于或小于 |
+ | -ge | 判断是否大于或等于 |
+
+##### 字符串比较
+
+1. 语法
+
+ ```mysql
+ [字符串1 操作符 字符串2]
+ ```
+
+2. | 操作符 | 作用 |
+ | ------ | ------------------------ |
+ | = | 比较字符串内容是否相同。 |
+ | != | 比较字符串内容是否不同。 |
+ | z | 判断字符串内容是否为空。 |
+
+##### 双中括号 [[ ]]
+
+1. 双中括号是中括号的升级版,它支持通配符和正则表达式,提供了更丰富的功能和更好的错误处理机制
+
+##### () {}
+
+1. ()与{}都可以将多个命令组合在一起,批量执行。但是执行的方式却不相同
+2. ():批量执行命令时,会开启一个子bash环境去执行,执行完毕后自动退出
+3. {}:批量执行命令时,会在当前环境执行,可能会影响当前bash环境的操作
+
+#### 条件测试语句
+
+##### if条件语句
+
+1. 单分支结构
+
+ * 语法
+
+ ```mysql
+ if [判断条件];then
+ 需要执行的命令
+ fi
+ ```
+
+2. 双分支结构
+
+ * 语法
+
+ ```mysql
+ if [判断条件];then
+ 需要执行的命令
+ else
+ 条件不成立时需要执行的命令
+ fi
+ ```
+
+3. 多分支结构
+
+ * 语法
+
+ ```mysql
+ if [判断条件1];then
+ 命令序列1
+ elif [判断条件2];then
+ 命令序列2
+ elif 判断条件3;then
+ 命令序列3
+ else
+ 以上条件都不符合才要执行的命令 #托底命令
+ fi
+ ```
+
+### case
+
+1. 语法
+
+ ```mysql
+ case $变量名 in
+ 模式1) # 判断条件
+ 命令1... # 判断为该模式后需要执行的命令
+ ;;
+ 模式2)
+ 命令2...
+ ;;
+ 模式3|模式4) # 可以用'|'分隔多个模式进行联合匹配
+ 命令3...
+ ;;
+ *)
+ default_commands... # 匹配所有未明确列出的其他情况(可选)
+ ;;
+ esac # 内容的结尾格式,与if语句中的fi类似
+ ```
+
+### 循环语句
+
+##### for语句
+
+1. 语法
+
+ ```mysql
+ #分号就代表回车
+ for 变量名 in 取值列表 ;do
+ 命令序列
+ done
+
+ ————————————————————————————————————————————
+
+ for 变量名 in 取值列表
+ do
+ 命令序列
+ done
+
+ ————————————————————————————————————————————
+
+ #表达式1:定义变量并赋初值
+ #表达式2:决定是否循环,正确则循环,不正确直接退出
+ #表达式3:决定循环变量如何改变,决定循环什么时候退出
+ for ((表达式1;表达式2;表达式3))
+ do
+ 命令序列
+ done
+ ```
+
+2. | ++ | 自身变量+1 |
+ | ---- | ---------- |
+ | -- | 自身变量-1 |
+ | +=5 | 自身变量+5 |
+ | -=5 | 自身变量-5 |
+ | *=5 | 自身变量*5 |
+ | /=5 | 自身变量/5 |
+ | %=5 | 自身变量%5 |
+
+##### while语句
+
+1. 语法
+
+ ```mysql
+ while 判断条件
+ do
+ 命令1
+ done
+ #语法与if相似
+ ```
+
+2. 死循环
+
+ ```mysql
+ while 条件始终为真
+ while :
+ while true
+ ```
+
+##### until语句
+
+1. 列
+
+ ```mysql
+ 1 a=0
+ 2 sum=0
+
+ 3 until [ $a -gt 100] #判断条件。$a大于100则条件为真,会退出循环,若小于100,会陷入循环
+ 4 do
+ 5 sum=$[sum+a] #将当前的a的值累加到sum上
+ 6 let a++ #每循环一次,变量值本身+1
+ 7 done
+ 8 echo $sum
+ ```
+
+2. until 循环与 while 循环类似,while 循环能实现的脚本 until 同样也可以实现,但区别是while 循环在条件为真是继续执行循环,而 until 则是在条件为假时执行循环
+
+#### echo用法
+
+| 选项 | 作用 |
+| :--- | :------------------------ |
+| \r | 光标移至行首,并且不换行 |
+| \s | 当前shell的名称,如bash |
+| \t | 插入Tab键,制表符 |
+| \n | 输出换行 |
+| \f | 换行,但光标仍停留在原处 |
+| \ | 表示插入"\"本身转义 |
+| \b | 表示退格 不显示前一个字符 |
+| \c | 抑制更多的输出或不换行 |
+
+
+
diff --git "a/39 \345\221\250\350\211\263/note/20240712-\346\225\260\346\215\256\345\272\223\347\232\204\350\260\203\344\274\230.md" "b/39 \345\221\250\350\211\263/note/20240712-\346\225\260\346\215\256\345\272\223\347\232\204\350\260\203\344\274\230.md"
new file mode 100644
index 0000000000000000000000000000000000000000..da2b87fb6854bdfa2a6827f002a8c394a5acf877
--- /dev/null
+++ "b/39 \345\221\250\350\211\263/note/20240712-\346\225\260\346\215\256\345\272\223\347\232\204\350\260\203\344\274\230.md"
@@ -0,0 +1,86 @@
+### 数据库的调优
+
+#### 排查慢SQL
+
+##### 开启慢查询日志
+
+1. 查看慢查询次数:
+
+```mysql
+show status like 'slow_queries';
+```
+
+2. 开启慢查询日志,修改慢查询阈值:
+
+```mysql
+set slow_query_log='ON'; #开启慢查询日志
+set long_query_time = 1; #设置慢查询阈值
+```
+
+3. 找出最慢的几条SQL
+ * 慢查询日志分析工具mysqldumpslow找到最慢的几条语句:
+ * mysqldumpslow 命令的具体参数如下:
+ * -a: 不将数字抽象成N,字符串抽象成S
+ -s: 是表示按照何种方式排序:
+ c: 访问次数
+ l: 锁定时间
+ r: 返回记录
+ t: 查询时间
+ al:平均锁定时间
+ ar:平均返回记录数
+ at:平均查询时间 (默认方式)
+ ac:平均查询次数
+ -t: 即为返回前面多少条的数据;
+ -g: 后边搭配一个正则匹配模式,大小写不敏感的;
+
+
+示例: 按照查询时间排序,查看前五条 慢查询SQL 语句
+
+```mysql
+#命令行,按照查询时间排序,查看前五条 慢查询SQL 语句
+mysqldumpslow -s t -t 5 /var/lib/mysql/xxx-slow.log
+```
+
+
+
+4. 分析查询计划
+ * explan分析sql执行计划(访问类型、记录条数、索引长度等);主要关注字段:
+ * possible_keys:查询可能用到的索引
+ key:实际使用的索引
+ key_len:实际使用的索引的字节数长度。
+ type:访问类型,看有没有走索引。all(全表扫描),ref(命中非唯一索引),const(命中主键/唯一索引)、range(范围索引查询)、index_merge(使用多个索引)、 system(一行记录时,快速查询)。
+ Extra:额外信息。看有没有走索引。
+ using index:覆盖索引,不回表。
+ using filesort:需要额外的排序。排序分为索引排序和filesort排序,索引排序一般更快,深分页等查询数据量大时filesort更快。
+ using index condition:索引下推。MySQL5.6开始支持。联合索引某字段是模糊查询(非左模糊)时,该字段进行条件判断后,后面几个字段可以直接条件判断,判断过滤后再回表对不包含在联合索引内的字段条件进行判断。
+ using where:不走索引,全表扫描。
+
+#### MySQL调优
+
+##### 基础优化
+
+1. 缓存优化
+ * mysql调整缓冲池大小等参数;引入redis。tip:InnoDB使用缓冲池缓存记录和索引
+2. 硬件优化
+ * 服务器加内存条、升级SSD固态硬盘、把磁盘I/O分散在多个设备、配置多处理器。
+3. 参数优化
+ * 关闭不必要的服务和日志:调优结束关闭慢查询日志;
+
+4. 调整最大连接数:max_connections ;
+
+5. 线程池缓存线程数:thread_cache_size,缓存空闲线程,有连接时直接分配该线程处理连接;
+
+6. 缓冲池大小:innodb_buffer_pool_size 。
+
+7. 定期清理垃圾
+ 对于不再使用的表、数据、日志、缓存等,应该及时清理,避免占用过多的MySQL资源,从而提高MySQL的性能。
+
+8. 使用合适的存储引擎
+
+ * MyISAM:适合读取频繁,写入较少的场景(因为表级锁、B+树叶存地址)
+
+ * InnoDB:适合并发写入的场景(因为行级锁、B+树叶存记录)。
+
+ * InnoDB:支持外键和事务,行锁适合高并发,缓存索引和数据,内存要求高(因为要缓存索引和记录),适合存大数据量,增删改性能更优(行级锁高并发),耗费磁盘(因为有多个非聚簇索引,索引可能比记录空间还大)。
+
+ * MyISAM:不支持外键和事务,表锁不适合高并发,缓存索引和数据地址,内存要求低(因为不用缓存记录),查询性能更优(因为查询时InnoDB要维护MVCC一致,而且多缓存了记录),节省磁盘(因为磁盘不存完整记录)。
\ No newline at end of file
diff --git "a/39 \345\221\250\350\211\263/note/20240713-ansible\350\207\252\345\212\250\345\214\226\350\277\220\347\273\264.md" "b/39 \345\221\250\350\211\263/note/20240713-ansible\350\207\252\345\212\250\345\214\226\350\277\220\347\273\264.md"
new file mode 100644
index 0000000000000000000000000000000000000000..8bbeaad7f8864194604c439cd4af8b1dd90bb393
--- /dev/null
+++ "b/39 \345\221\250\350\211\263/note/20240713-ansible\350\207\252\345\212\250\345\214\226\350\277\220\347\273\264.md"
@@ -0,0 +1,69 @@
+### ansible自动化运维
+
+1. absibel:自动化运维工具,批量系统配置,批量程序部署,批量运行命令行,模块化工作
+2. ansible --version:查看版本号
+3. 需要ssh,系统,IP ,一台控制机,多台被控机,root密码
+
+#### ssh免秘钥登录配置
+
+1. 管理机生成密钥对,将公钥复制安装到被控机
+
+ ```mysql
+ ssh-keygen #生成秘钥对
+ Your identification has been saved in /root/.ssh/id_rsa
+ Your public key has been saved in /root/.ssh/id_rsa.pub
+ ssh-copy-id -i /root/.ssh/id_rsa.pub root@被控机IP
+
+ /usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
+ /usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
+ /usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to
+ install the new keys
+ root@172.16.90.72's password: # 这里要输入被控机 172.16.90.72的root密码
+
+ ```
+
+2. 管理机安装ansible
+
+ ```mysql
+ apt install -y ansible
+ ansible --version # 查看版本信息
+ ```
+
+3. 生成配置文件
+
+ ```mysql
+ mkdir -p /etc/ansible # 创建目录
+ cd /etc/ansible
+ ansible-config init --disabled > ansible.cfg
+ ```
+
+ * 编辑hosts文件,指定要被管理的主机的ip,可以分组
+
+ ```mysql
+ vim /etc/ansible/hosts
+ [组名]
+ 被控主机IP
+ [组名]
+ 被控主机IP
+ ·······
+ ```
+
+ * 测试
+
+ ```mysql
+ # ansible 组名 -m 模块名 -a 参数
+ ansible mdd -m command -a 'free'
+ ansible mdd -m shell -a 'shell脚本语句'
+ ansible mdd -m ping # ping模块
+ ```
+
+ * 语法
+
+ ```mysql
+ ansible 要控制组名 -m 模块名 -a 参数
+ ```
+
+#### ansible的模块
+
+##### command 模块:命令
+
diff --git "a/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/Nginx\345\217\215\345\220\221\344\273\243\347\220\206/Nginx\345\217\215\345\220\221\344\273\243\347\220\206.md" "b/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/Nginx\345\217\215\345\220\221\344\273\243\347\220\206/Nginx\345\217\215\345\220\221\344\273\243\347\220\206.md"
new file mode 100644
index 0000000000000000000000000000000000000000..359ae8eb0bb451b4348ef06fb1de3212016a1925
--- /dev/null
+++ "b/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/Nginx\345\217\215\345\220\221\344\273\243\347\220\206/Nginx\345\217\215\345\220\221\344\273\243\347\220\206.md"
@@ -0,0 +1,86 @@
+## 反向代理
+
+- 备份nginx配置文件
+
+```sh
+mv /etc/nginx/nginx.conf /etc/nginx/nginx.conf.bak
+mv /etc/nginx/sites-available/default /etc/nginx/sites-available/default.bak
+```
+
+- 重写配置文件
+
+```sh
+vim /etc/nginx/nginx.conf
+
+events {}
+http {
+ include /etc/nginx/mime.types;
+ include /etc/nginx/sites-available/*.conf;
+}
+
+重新加载
+systemctl restart nginx
+
+vim /etc/nginx/sites-available/default.conf
+server {
+ listen 80;
+ server_name sx1.com,www.sx1.com; #自己的域名
+
+ root /var/www/html;
+ index index.html;
+
+ location / {
+ proxy_pass http://192.168.1.129:80; #后端服务器地址与端口
+ proxy_set_header Host $host; #保留原始Host头
+ proxy_set_header X-Real-IP $remote_addr; #传递真实客户端IP
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+ proxy_set_header X-Forwarded-Proto $scheme; #传递请求协议(http/https)
+ }
+}
+
+重新加载
+systemctl restart nginx
+```
+
+
+
+
+
+## 负载均衡
+
+- 修改配置文件
+
+```sh
+vim /etc/nginx/sites-available/default.conf
+
+upstream backend-servers { #指定上游服务器,backend-servers 这个名称是可以自己定义的
+ server 192.168.1.129:80 weight=50; #代理服务器IP和端口,weight是设置权重
+ server 192.168.1.131:80 weight=50; #代理服务器IP和端口,weight是设置权重
+}
+server {
+ listen 80;
+ server_name sx1.com,www.sx1.com;
+
+ root /var/www/html;
+ index index.html;
+
+ location / {
+ proxy_pass http://backend-servers; #此处的backend-servers对应了开头的upstream的backend-servers
+ proxy_set_header Host $host; #保留原始Host头
+ proxy_set_header X-Real-IP $remote_addr; #传递真实客户端IP
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+ proxy_set_header X-Forwarded-Proto $scheme; #传递请求协议(http/https)
+ }
+}
+
+重新加载
+systemctl restart nginx
+```
+
+
+
+## 测试结果
+
+
+
+
diff --git "a/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\270\200/DNS\346\234\215\345\212\241\345\231\250.md" "b/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\270\200/DNS\346\234\215\345\212\241\345\231\250.md"
new file mode 100644
index 0000000000000000000000000000000000000000..373c45dab699efc4e92a9c579b1b148bdb445f11
--- /dev/null
+++ "b/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\270\200/DNS\346\234\215\345\212\241\345\231\250.md"
@@ -0,0 +1,125 @@
+### DNS服务器
+
+```sh
+搭建dns服务器
+bind 是一款开源的DNS服务器软件,由Internet Systems Consortium(ISC)开发和维护,目前最广泛使用的DNS服务器之一
+
+安装bind
+apt update
+apt install bind9
+
+检查以确保所有软件包均已成功安装
+named -v
+
+查看状态
+systemctl status bind9
+
+包含指向上游 DNS 服务器的转发器,添加以下内容
+vim /etc/bind/named.conf.options
+forwarders {
+ 223.5.5.5;
+};
+allow-query { any; };
+
+检查配置是否有误
+named-checkconf
+```
+
+
+
+- 正向解析
+ - 域名找ip
+
+```sh
+## 正向
+配置一个基本的DNS区域 配置域名解析
+vim /etc/bind/named.conf.local
+#sx1.com是自己想要设置的域名
+zone "sx1.com" {
+ type master;
+ file "/etc/bind/db.sx1.com";
+};
+```
+
+
+
+```sh
+创建相应的区域文件/etc/bind/db.sx1.com,定义DNS记录
+cp db.local db.sx1.com
+vim /etc/bind/db.sx1.com
+$TTL 604800
+@ IN SOA sx1.com. root.sx1.com. (
+ 2 ; Serial
+ 604800 ; Refresh
+ 86400 ; Retry
+ 2419200 ; Expire
+ 604800 ) ; Negative Cache TTL
+;
+@ IN NS ns.sx1.com.
+@ IN A 192.168.1.128
+ns IN A 192.168.1.128
+www IN A 192.168.1.128
+mail IN A 192.168.1.128
+mail IN MX 10 mail.sx1.com.
+```
+
+
+
+```
+重启服务,成功不会报错
+systemctl restart bind9
+
+测试
+nslookup www.sx1.com
+
+Server: 192.168.1.2
+Address: 192.168.1.2#53
+
+Non-authoritative answer:
+Name: www.sx1.com
+Address: 192.168.1.128
+
+域名可以成功访问到网站,需要把本地电脑的DNS设置成虚拟机(服务器)的ip地址,我的是192.168.1.128
+```
+
+
+
+
+
+- 反向解析
+ - ip找域名
+
+```sh
+## 反向解析
+192.168.1.0/24网段
+vim /etc/bind/named.conf.local
+zone "1.168.192.in-addr.arpa" {
+ type master;
+ file "/etc/bind/db.192.168.1";
+};
+
+cp /etc/bind/db.127 db.192.168.1
+vim /etc/bind/db.192.168.1
+$TTL 604800
+@ IN SOA sx1.com. root.sx1.com. (
+ 2 ; Serial
+ 604800 ; Refresh
+ 86400 ; Retry
+ 2419200 ; Expire
+ 604800 ) ; Negative Cache TTL
+;
+@ IN NS ns.sx1.com.
+128 IN PTR sx1.com.
+128 IN PTR ns.sx1.com.
+128 IN PTR www.sx1.com.
+128 IN PTR mail.sx1.com.
+
+运行以下命令来检查配置文件是否有语法错误
+named-checkconf
+named-checkzone sx1.com /etc/bind/db.sx1.com
+named-checkzone 1.168.192.in-addr.arpa /etc/bind/db.192.168.1
+
+重启服务,成功不会报错
+systemctl restart bind9
+```
+
diff --git "a/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\270\200/Debian\346\220\255\345\273\272DHCP\346\234\215\345\212\241.md" "b/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\270\200/Debian\346\220\255\345\273\272DHCP\346\234\215\345\212\241.md"
new file mode 100644
index 0000000000000000000000000000000000000000..01ae80cea1ec94dc3a061ec4797824b22ceb857a
--- /dev/null
+++ "b/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\270\200/Debian\346\220\255\345\273\272DHCP\346\234\215\345\212\241.md"
@@ -0,0 +1,79 @@
+## Debian搭建DHCP服务
+
+1. 第一步:安装DHCP软件包
+
+ ```bash
+ root@class:~#apt install -y isc-dhcp-server
+ ```
+
+2. 第二步:更改DHCP主配置文件
+
+ ```bash
+ root@class:~#vim /etc/dhcp/dhcpd.conf
+
+ ##找到以下内容并修改:
+ 1.
+ #option definitions common to all supported networks...
+ option domain-name "ht.com";##域名
+ option domain-name-servers 192.168.1.1;##当前服务器的IP
+
+ default-lease-time 600;
+ max-lease-time 7200;
+
+ 2.
+ #A slightly different configuration for an internal subnet.
+ subnet 192.168.1.0 netmask 255.255.255.0 {
+ range 192.168.1.100 192.168.1.200;(为客户端分配IP地址范围)
+ option domain-name-servers 192.168.1.1;
+ option domain-name "ht.com";##域名
+ option routers 192.168.1.1;
+ #option broadcast-address 192.168.1.255;
+ default-lease-time 600;
+ max-lease-time 7200;
+ }
+ ```
+
+3. 第三步:添加为客户端分配地址的网卡名称
+
+ ```bash
+ vim /etc/default/isc-dhcp-server
+
+ INTERFACESv4="ens33" (ifconfig可查看网卡名称)
+ INTERFACESv6=""
+ ```
+
+4. 第四步:重启服务
+
+ ```bash
+ systemctl restart isc-dhcp-server.service
+ ```
+
+5. 第五步:配置客户端网卡配置
+
+ ```bash
+ vim /etc/network/interfaces
+
+ ##修改
+ # The primary network interface
+ allow-hotplug ens33
+ iface ens33 inet static
+ address 192.168.1.90
+ netmask 255.255.255.0
+ gateway 192.168.1.2
+
+ ```
+
+6. 第六步:重启网卡
+
+ ```bash
+ systemctl restart networking.service
+ ```
+
+7. 第七步:查看配置情况
+
+ ```
+ dhclient -v
+ ```
+
+
+
diff --git "a/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\270\200/EMALL.md" "b/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\270\200/EMALL.md"
new file mode 100644
index 0000000000000000000000000000000000000000..ee0d2dc60bf4e623fc13b6da28593d0286fa3799
--- /dev/null
+++ "b/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\270\200/EMALL.md"
@@ -0,0 +1,160 @@
+### EMAIL服务器
+
+```sh
+dns服务
+vim /etc/bind/db.sx1.com #这个文件是安装完DNS之后的 配置的自己的域名
+
+加入下面这些内容
+mail IN A 192.168.1.128 #自己的ip
+mail IN MX 10 mail.sx1.com. #自己的域名
+```
+
+
+
+- 设置主机名
+
+```sh
+vim /etc/hostname
+加入主机名
+mail
+
+vim /etc/hosts
+加入下面这些内容
+#自己电脑的ip地址 #自己的邮件域名 #主机名
+192.168.1.128 mail.cc.com mail
+```
+
+
+
+
+
+- 安装postfix
+
+```sh
+apt update
+
+apt install postfix
+选择 "Internet Site"
+
+#选择界面输入
+sx1.com # 这是自己的完全限定域名
+```
+
+- 配置文件
+
+```sh
+vim /etc/postfix/main.cf
+
+myhostname = mail.cc.com #自己的邮件服务器的主机名
+mydomain = cc.com #自己的邮件服务器负责的域
+myorigin = $mydomain
+mynetworks = 0.0.0.0/0 #0.0.0.0/0表示允许来自任何 IP 地址的连接,通常建议限制 mynetworks 到实际的内部网络地址,比如 192.168.1.0/24
+home_mailbox = Maildir/ #用户的邮箱存储方式
+```
+
+- 重启服务
+
+```sh
+#需要重启服务
+systemctl restart postfix
+```
+
+- 安装dovecot
+
+```sh
+apt install dovecot-core dovecot-pop3d dovecot-imapd
+```
+
+- 配置文件
+
+```sh
+vim /etc/dovecot/dovecot.conf
+listen = *
+login_trusted_networks = 0.0.0.0/0
+
+vim /etc/dovecot/conf.d/10-mail.conf
+#mail_location = mbox:~/mail:INBOX=/var/mail/%u
+mail_location = maildir:~/Maildir
+
+vim /etc/dovecot/conf.d/10-auth.conf
+disable_plaintext_auth = no
+auth_mechanisms = plain login
+
+vim /etc/dovecot/conf.d/10-ssl.conf
+ssl = no
+
+vim /etc/dovecot/conf.d/10-master.conf
+unix_listener /var/spool/postfix/private/auth {
+ mode = 0666
+ user = postfix
+ group = postfix
+}
+```
+
+- 重启服务
+
+```sh
+#需要重启服务
+systemctl restart dovecot
+```
+
+- 发送测试
+
+```sh
+创建测试用户
+adduser user1
+adduser user2
+
+user2用户给user1用户发送邮件
+
+使用mailx命令
+安装
+sudo apt install mailutils
+
+测试
+su - user2
+
+user2@mail:~$ echo "这是给user1的邮件内容。" | mailx -s "邮件主题" user1@sx1.com
+# user1@sx1.com 用户名@自己的电子邮件域名
+
+查看
+su - user1
+cd /Maildir/new
+cat 1721176361.V801Ibf431M729532.mail #根据邮件发送时间来查看
+```
+
+
+
+- 接收测试
+
+```sh
+切换到测试用户账户
+user1用户给user2用户发送邮件
+
+测试
+su - user1
+
+user2@mail:~$ echo "这是给user2的邮件内容。" | mailx -s "邮件主题" user2@sx1.com
+# user2@sx1.com 用户名@自己的电子邮件域名
+
+查看
+su - user2
+cd /Maildir/new
+cat 1721176361.V801Ibf431M729532.mail #根据邮件发送时间来查看
+```
+
+
+
+- 客户端测试
+
+```sh
+安装foxmail
+选择其他邮箱
+添加账号
+```
+
+
+
+
+
+
\ No newline at end of file
diff --git "a/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\270\200/FTP.md" "b/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\270\200/FTP.md"
new file mode 100644
index 0000000000000000000000000000000000000000..67cbdf76145c7e2a2f8cf4caa26ff5ddddac58e5
--- /dev/null
+++ "b/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\270\200/FTP.md"
@@ -0,0 +1,84 @@
+## Debian简单配置FTP服务器
+
+### 1、安装ftp
+
+```mysql
+apt install ftp vsftpd
+```
+
+### 2、创建ftp共享路径
+
+```mysql
+mkdir /ftp #创建路径
+chmod 777 /ftp #给予权限
+```
+
+### 3、修改配置文件
+
+**vi /etc/vsftpd.conf:**
+
+```mysql
+listen=YES #监听ipv4端口
+listen_ipv6=NO #关闭监听ipv6
+anonymous_enable=NO #禁止匿名登录
+write_enable=YES #允许上传写入
+local_umask=022 #上传写入权限(反掩)
+local_root=/ftp #登录根路径,这个要自己添加
+```
+
+### 4、创建ftp测试用户
+
+```mysql
+adduser 用户名
+#这几个都不用填,直接回车就可以了
+Full Name []:
+ Room Number []:
+ Work Phone []:
+ Home Phone []:
+ Other []:
+```
+
+1. 为了让用户能够访问FTP服务器,你需要将其添加到FTP用户组中
+
+ ```mysql
+ usermod -a -G ftp 用户名
+ ```
+
+2. 现在用户已经可以访问FTP服务器并上传/下载文件
+
+### 5、启动ftp服务
+
+```mysql
+systemctl restart vsftpd.service
+systemctl restart vsftpd
+```
+
+1. 使用以下命令检查服务的状态
+
+ ```mysql
+ systemctl status vsftpd
+ ```
+
+### 6、测试FTP服务器
+
+1. 打开此电脑,输入以下命令,输入用户名和密码就可以了
+
+```mysql
+ftp localhost(主机ip)#我的是192.168.1.90
+```
+
+2. 方法二:win+R :cmd
+
+ ```mysql
+ ftp localhost(主机ip)#我的是192.168.1.90
+ #输入用户名和密码就可以了
+ ```
+
+
+### 如果开启了防火墙,需要将端口打开
+
+```mysql
+ss -tunl#查看端口号
+ufw allow 21/tcp#打开端口
+```
+
diff --git "a/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\270\200/Img/VM8\351\200\211\346\213\251.jpg" "b/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\270\200/Img/VM8\351\200\211\346\213\251.jpg"
new file mode 100644
index 0000000000000000000000000000000000000000..9fc6475eab853e89fc3e3ae43fb04d66935a91c6
Binary files /dev/null and "b/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\270\200/Img/VM8\351\200\211\346\213\251.jpg" differ
diff --git "a/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\270\200/Img/\346\265\213\350\257\225ftp\346\234\215\345\212\241.jpg" "b/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\270\200/Img/\346\265\213\350\257\225ftp\346\234\215\345\212\241.jpg"
new file mode 100644
index 0000000000000000000000000000000000000000..ec894aac28805d3f4a6309149e3179817e81ddc1
Binary files /dev/null and "b/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\270\200/Img/\346\265\213\350\257\225ftp\346\234\215\345\212\241.jpg" differ
diff --git "a/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\270\200/Img/\347\274\226\350\276\221.jpg" "b/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\270\200/Img/\347\274\226\350\276\221.jpg"
new file mode 100644
index 0000000000000000000000000000000000000000..044a310f8a2ebbdc1c7ec6d4b36c32f186db60cb
Binary files /dev/null and "b/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\270\200/Img/\347\274\226\350\276\221.jpg" differ
diff --git "a/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\270\200/Img/\347\274\226\350\276\221\345\255\220\347\275\221ip.jpg" "b/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\270\200/Img/\347\274\226\350\276\221\345\255\220\347\275\221ip.jpg"
new file mode 100644
index 0000000000000000000000000000000000000000..7172062a7f58cee80f75002f1c8f9838632865a3
Binary files /dev/null and "b/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\270\200/Img/\347\274\226\350\276\221\345\255\220\347\275\221ip.jpg" differ
diff --git "a/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\270\200/samba\346\234\215\345\212\241\345\231\250.md" "b/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\270\200/samba\346\234\215\345\212\241\345\231\250.md"
new file mode 100644
index 0000000000000000000000000000000000000000..e56f65626ea421f6ed00010f86ee1fddcbb617b6
--- /dev/null
+++ "b/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\270\200/samba\346\234\215\345\212\241\345\231\250.md"
@@ -0,0 +1,90 @@
+### SAMBA服务器
+
+- 安装
+
+```sh
+apt install samba
+```
+
+- 创建samba共享目录
+
+```sh
+mkdir /shared
+```
+
+- 添加目录权限
+
+```sh
+添加权限
+chmod 777 /shared/
+```
+
+- 创建用户
+
+```sh
+adduser samba #创建用户,可以改成任何名字
+smbpasswd -a samba #设置登录密码
+```
+
+- 编辑配置文件
+
+```sh
+vim /etc/samba/smb.conf
+
+最后一行添加配置,shift+G
+[share] #共享目录的名称,用户在网络上访问共享时会看到这个名称
+ comment = Shared folder #描述注释
+ path = /shared #服务器上的文件夹
+ readonly = no #共享目录不是只读的,用户可以对该目录进行写操作
+ browseable =yes #共享目录在网络浏览时是可见的
+ writable = yes #共享目录是可写的,用户可以对该目录进行写操作
+ directory mask = 0777 #设置新创建的目录的权限
+ create mask = 0777 #设置新创建的文件的权限
+ valid users = samba #只有用户名为samba的用户可以访问
+ write list = samba #只有用户名为samba的用户可以对共享目录进行写操作
+```
+
+
+
+- 重启服务
+
+```sh
+systemctl restart smbd
+systemctl restart nmbd
+```
+
+- 测试
+
+```sh
+win+r 窗口输入 \\192.168.1.128\share #自己的ip地址和共享文件夹
+正常情况下,就可以成功进去
+```
+
+
+
+- 测试出错,如果你出现了以下问题
+
+
+
+```sh
+win + r 输入cmd
+
+执行以下命令
+net use X: \\192.168.1.128\share /user:samba *
+#把ip地址换成你的虚拟机IP地址
+#share这个换成你的共享目录名字
+#user:samba后面的samba换成你的smb用户名
+
+#使用此命令后,windows默认会使用这个用户名和密码登录文件夹
+#net use: 这是一个 Windows 命令,用于连接到或断开网络共享资源
+#X:: 这是将要映射的本地驱动器号码,即将要分配给远程共享文件夹的本地驱动器
+#\\192.168.1.128\share: 这是要连接的远程共享资源的路径。在这里,192.168.1.128 是共享资源所在的主机的IP地址或主机名,share 是共享文件夹的名称。
+#/user:samba: 这个选项指定要使用的用户名 samba 来连接共享资源。
+#*: 当系统提示时,此选项将强制要求您输入用户的密码,以便验证您的身份并连接到共享资源。
+
+win+r cmd窗口重新输入 \\192.168.1.128\share
+```
+
+
+
+
\ No newline at end of file
diff --git "a/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\270\200/\344\277\256\346\224\271\347\275\221\347\273\234\351\205\215\347\275\256.md" "b/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\270\200/\344\277\256\346\224\271\347\275\221\347\273\234\351\205\215\347\275\256.md"
new file mode 100644
index 0000000000000000000000000000000000000000..b61c8883841522a70b4440ee050320baa9bd5aba
--- /dev/null
+++ "b/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\270\200/\344\277\256\346\224\271\347\275\221\347\273\234\351\205\215\347\275\256.md"
@@ -0,0 +1,35 @@
+### 修改网络配置
+
+1. 打开虚拟机,点击编辑,选择虚拟机网络编辑,选择VMnet8,点击更改设置,选择VMnet8,将子网ip更改为192.168.1.0,点击确定。
+
+2. ```mysql
+ #查看网关
+ ip route
+
+ default via 192.168.1.2 dev ens33 onlink
+ 192.168.1.0/24 dev ens33 proto kernel scope link src 192.168.1.90
+ ```
+
+
+
+3. ```mysql
+ #进行网络配置
+ vim /etc/network/interfaces
+ iface ens33 inet static
+ address 192.168.1.90 #IP地址
+ netmask 255.255.255.0 #子网掩码
+ gateway 192.168.1.2 #网关
+
+ ```
+
+4. ```mysql
+ #重启服务
+ systemctl restart networking
+ ```
+
+5. ```mysql
+ #测试是否修改成功,没有报错就成功了
+ apt update
+ ```
+
+
\ No newline at end of file
diff --git "a/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\270\200/\345\256\236\350\256\255\351\241\271\347\233\2561\346\210\220\346\236\234.md" "b/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\270\200/\345\256\236\350\256\255\351\241\271\347\233\2561\346\210\220\346\236\234.md"
new file mode 100644
index 0000000000000000000000000000000000000000..0ce9d1647ab50f51f6f4a08275cfd6573e46c9ac
--- /dev/null
+++ "b/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\270\200/\345\256\236\350\256\255\351\241\271\347\233\2561\346\210\220\346\236\234.md"
@@ -0,0 +1,512 @@
+### DHCP服务器
+
+- 安装isc-dhcp-server
+
+```sh
+apt update
+apt install isc-dhcp-server
+```
+
+- 设置网卡监听
+
+```sh
+查看网卡信息
+ip address
+ens33
+
+配置监听的网卡
+vim /etc/default/isc-dhcp-server
+INTERFACESv4="ens33"
+```
+
+
+
+
+
+- 配置文件
+
+```sh
+vim /etc/dhcp/dhcpd.conf
+subnet 192.168.1.0 netmask 255.255.255.0 { #定义了网络子网的网段
+ range 192.168.1.10 192.168.1.50; #指定了可供分配的IP地址范围
+ option routers 192.168.1.2; #默认网关
+ option domain-name-servers 8.8.8.8; #设置DNS地址
+ option subnet-mask 255.255.255.0; #设置子网掩码
+ option broadcast-address 192.168.1.255; #广播地址
+ default-lease-time 600; #租约的默认时间长度600秒
+ max-lease-time 7200; #DHCP 租约的最大时间长度7200秒
+}
+
+重启服务,成功不会报错
+systemctl restart isc-dhcp-server
+```
+
+
+
+- 测试
+
+```sh
+如果是使用vm虚拟机,需要关闭
+编辑-->虚拟网络编辑-->VMnet8-->更改设置-->VMnet8-->取消勾选 使用本地DHCP服务将IP地址分配给虚拟机-->应用
+
+设置有dhcp服务器的主机不能关闭,可以拿其他虚拟机来测试
+vim /etc/network/interfaces
+iface ens33 inet dhcp
+
+重启网卡服务
+systemctl restart networking
+
+查看是否成功
+ip address 或者 ip route
+```
+
+
+
+
+
+### DNS服务器
+
+```sh
+搭建dns服务器
+bind 是一款开源的DNS服务器软件,由Internet Systems Consortium(ISC)开发和维护,目前最广泛使用的DNS服务器之一
+
+安装bind
+apt update
+apt install bind9
+
+检查以确保所有软件包均已成功安装
+named -v
+
+查看状态
+systemctl status bind9
+
+包含指向上游 DNS 服务器的转发器,添加以下内容
+vim /etc/bind/named.conf.options
+forwarders {
+ 223.5.5.5;
+};
+allow-query { any; };
+
+检查配置是否有误
+named-checkconf
+```
+
+
+
+- 正向解析
+ - 域名找ip
+
+```sh
+## 正向
+配置一个基本的DNS区域 配置域名解析
+vim /etc/bind/named.conf.local
+#sx1.com是自己想要设置的域名
+zone "sx1.com" {
+ type master;
+ file "/etc/bind/db.sx1.com";
+};
+```
+
+
+
+```sh
+创建相应的区域文件/etc/bind/db.sx1.com,定义DNS记录
+cp db.local db.sx1.com
+vim /etc/bind/db.sx1.com
+$TTL 604800
+@ IN SOA sx1.com. root.sx1.com. (
+ 2 ; Serial
+ 604800 ; Refresh
+ 86400 ; Retry
+ 2419200 ; Expire
+ 604800 ) ; Negative Cache TTL
+;
+@ IN NS ns.sx1.com.
+@ IN A 192.168.1.128
+ns IN A 192.168.1.128
+www IN A 192.168.1.128
+mail IN A 192.168.1.128
+mail IN MX 10 mail.sx1.com.
+```
+
+
+
+```
+重启服务,成功不会报错
+systemctl restart bind9
+
+测试
+nslookup www.sx1.com
+
+Server: 192.168.1.2
+Address: 192.168.1.2#53
+
+Non-authoritative answer:
+Name: www.sx1.com
+Address: 192.168.1.128
+
+域名可以成功访问到网站,需要把本地电脑的DNS设置成虚拟机(服务器)的ip地址,我的是192.168.1.128
+```
+
+
+
+
+
+- 反向解析
+ - ip找域名
+
+```sh
+## 反向解析
+192.168.1.0/24网段
+vim /etc/bind/named.conf.local
+zone "1.168.192.in-addr.arpa" {
+ type master;
+ file "/etc/bind/db.192.168.1";
+};
+
+cp /etc/bind/db.127 db.192.168.1
+vim /etc/bind/db.192.168.1
+$TTL 604800
+@ IN SOA sx1.com. root.sx1.com. (
+ 2 ; Serial
+ 604800 ; Refresh
+ 86400 ; Retry
+ 2419200 ; Expire
+ 604800 ) ; Negative Cache TTL
+;
+@ IN NS ns.sx1.com.
+128 IN PTR sx1.com.
+128 IN PTR ns.sx1.com.
+128 IN PTR www.sx1.com.
+128 IN PTR mail.sx1.com.
+
+运行以下命令来检查配置文件是否有语法错误
+named-checkconf
+named-checkzone sx1.com /etc/bind/db.sx1.com
+named-checkzone 1.168.192.in-addr.arpa /etc/bind/db.192.168.1
+
+重启服务,成功不会报错
+systemctl restart bind9
+```
+
+
+
+### FTP服务器
+
+- 安装vsftpd
+
+```sh
+apt install ftp vsftpd
+```
+
+- 创建目录
+
+```sh
+mkdir /ftp
+```
+
+- 设置权限
+
+```sh
+chmod 777 /ftp
+```
+
+- 修改配置文件
+
+```sh
+vim /etc/vsftpd.conf
+
+#找到并修改以下信息
+listen=YES #监听ipv4端口
+listen_ipv6=NO #关闭监听ipv6
+anonymous_enable=NO #禁止匿名登录
+write_enable=YES #允许上传写入
+local_umask=022 #上传写入权限(反掩)
+local_root=/ftp #登录根路径
+
+重启服务,成功不会报错
+systemctl restart vsftpd
+```
+
+- 创建测试用户
+
+```sh
+adduser ftpuser
+usermod -aG ftp ftpuser #将ftpuser加入ftp组
+```
+
+- cmd测试
+
+```sh
+上传文件
+#上传文件的路径一定是从盘符精确到上传的文件名
+put E:\index\你好.txt
+
+下载文件
+#下载前要保证FTP上有这个文件
+get 你好.txt
+```
+
+- 客户端测试
+
+```sh
+安装FileZilla
+主机:192.168.1.128 #自己的ip地址
+用户名:user1 #自己创建的用户
+密码:123456 #自己用户的密码
+端口:默认即可
+```
+
+
+
+### SAMBA服务器
+
+- 安装
+
+```sh
+apt install samba
+```
+
+- 创建samba共享目录
+
+```sh
+mkdir /shared
+```
+
+- 添加目录权限
+
+```sh
+添加权限
+chmod 777 /shared/
+```
+
+- 创建用户
+
+```sh
+adduser samba #创建用户,可以改成任何名字
+smbpasswd -a samba #设置登录密码
+```
+
+- 编辑配置文件
+
+```sh
+vim /etc/samba/smb.conf
+
+最后一行添加配置,shift+G
+[share] #共享目录的名称,用户在网络上访问共享时会看到这个名称
+ comment = Shared folder #描述注释
+ path = /shared #服务器上的文件夹
+ readonly = no #共享目录不是只读的,用户可以对该目录进行写操作
+ browseable =yes #共享目录在网络浏览时是可见的
+ writable = yes #共享目录是可写的,用户可以对该目录进行写操作
+ directory mask = 0777 #设置新创建的目录的权限
+ create mask = 0777 #设置新创建的文件的权限
+ valid users = samba #只有用户名为samba的用户可以访问
+ write list = samba #只有用户名为samba的用户可以对共享目录进行写操作
+```
+
+
+
+- 重启服务
+
+```sh
+systemctl restart smbd
+systemctl restart nmbd
+```
+
+- 测试
+
+```sh
+win+r 窗口输入 \\192.168.1.128\share #自己的ip地址和共享文件夹
+正常情况下,就可以成功进去
+```
+
+
+
+- 测试出错,如果你出现了以下问题
+
+
+
+```sh
+win + r 输入cmd
+
+执行以下命令
+net use X: \\192.168.1.128\share /user:samba *
+#把ip地址换成你的虚拟机IP地址
+#share这个换成你的共享目录名字
+#user:samba后面的samba换成你的smb用户名
+
+#使用此命令后,windows默认会使用这个用户名和密码登录文件夹
+#net use: 这是一个 Windows 命令,用于连接到或断开网络共享资源
+#X:: 这是将要映射的本地驱动器号码,即将要分配给远程共享文件夹的本地驱动器
+#\\192.168.1.128\share: 这是要连接的远程共享资源的路径。在这里,192.168.1.128 是共享资源所在的主机的IP地址或主机名,share 是共享文件夹的名称。
+#/user:samba: 这个选项指定要使用的用户名 samba 来连接共享资源。
+#*: 当系统提示时,此选项将强制要求您输入用户的密码,以便验证您的身份并连接到共享资源。
+
+win+r cmd窗口重新输入 \\192.168.1.128\share
+```
+
+
+
+
+
+### EMAIL服务器
+
+```sh
+dns服务
+vim /etc/bind/db.sx1.com #这个文件是安装完DNS之后的 配置的自己的域名
+
+加入下面这些内容
+mail IN A 192.168.1.128 #自己的ip
+mail IN MX 10 mail.sx1.com. #自己的域名
+```
+
+
+
+- 设置主机名
+
+```sh
+vim /etc/hostname
+加入主机名
+mail
+
+vim /etc/hosts
+加入下面这些内容
+#自己电脑的ip地址 #自己的邮件域名 #主机名
+192.168.1.128 mail.cc.com mail
+```
+
+
+
+
+
+- 安装postfix
+
+```sh
+apt update
+
+apt install postfix
+选择 "Internet Site"
+
+#选择界面输入
+sx1.com # 这是自己的完全限定域名
+```
+
+- 配置文件
+
+```sh
+vim /etc/postfix/main.cf
+
+myhostname = mail.cc.com #自己的邮件服务器的主机名
+mydomain = cc.com #自己的邮件服务器负责的域
+myorigin = $mydomain
+mynetworks = 0.0.0.0/0 #0.0.0.0/0表示允许来自任何 IP 地址的连接,通常建议限制 mynetworks 到实际的内部网络地址,比如 192.168.1.0/24
+home_mailbox = Maildir/ #用户的邮箱存储方式
+```
+
+- 重启服务
+
+```sh
+#需要重启服务
+systemctl restart postfix
+```
+
+- 安装dovecot
+
+```sh
+apt install dovecot-core dovecot-pop3d dovecot-imapd
+```
+
+- 配置文件
+
+```sh
+vim /etc/dovecot/dovecot.conf
+listen = *
+login_trusted_networks = 0.0.0.0/0
+
+vim /etc/dovecot/conf.d/10-mail.conf
+#mail_location = mbox:~/mail:INBOX=/var/mail/%u
+mail_location = maildir:~/Maildir
+
+vim /etc/dovecot/conf.d/10-auth.conf
+disable_plaintext_auth = no
+auth_mechanisms = plain login
+
+vim /etc/dovecot/conf.d/10-ssl.conf
+ssl = no
+
+vim /etc/dovecot/conf.d/10-master.conf
+unix_listener /var/spool/postfix/private/auth {
+ mode = 0666
+ user = postfix
+ group = postfix
+}
+```
+
+- 重启服务
+
+```sh
+#需要重启服务
+systemctl restart dovecot
+```
+
+- 发送测试
+
+```sh
+创建测试用户
+adduser user1
+adduser user2
+
+user2用户给user1用户发送邮件
+
+使用mailx命令
+安装
+sudo apt install mailutils
+
+测试
+su - user2
+
+user2@mail:~$ echo "这是给user1的邮件内容。" | mailx -s "邮件主题" user1@sx1.com
+# user1@sx1.com 用户名@自己的电子邮件域名
+
+查看
+su - user1
+cd /Maildir/new
+cat 1721176361.V801Ibf431M729532.mail #根据邮件发送时间来查看
+```
+
+
+
+- 接收测试
+
+```sh
+切换到测试用户账户
+user1用户给user2用户发送邮件
+
+测试
+su - user1
+
+user2@mail:~$ echo "这是给user2的邮件内容。" | mailx -s "邮件主题" user2@sx1.com
+# user2@sx1.com 用户名@自己的电子邮件域名
+
+查看
+su - user2
+cd /Maildir/new
+cat 1721176361.V801Ibf431M729532.mail #根据邮件发送时间来查看
+```
+
+
+
+- 客户端测试
+
+```sh
+安装foxmail
+选择其他邮箱
+添加账号
+```
+
+
+
+
+
+
diff --git "a/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\270\200/\346\220\255\345\273\272Apache2 Web\346\234\215\345\212\241\345\231\250.md" "b/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\270\200/\346\220\255\345\273\272Apache2 Web\346\234\215\345\212\241\345\231\250.md"
new file mode 100644
index 0000000000000000000000000000000000000000..07bb0daf734ac9934d5df52ad1ecd7c78592f6ea
--- /dev/null
+++ "b/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\270\200/\346\220\255\345\273\272Apache2 Web\346\234\215\345\212\241\345\231\250.md"
@@ -0,0 +1,86 @@
+## 搭建Apache2 Web服务器
+
+ 1.更改虚拟机网段 192.168.1.0/24
+
+ 虚拟机Ip地址192.178.1.128
+
+
+
+**下载apache2**
+
+ apt-get install apache2
+
+**配置web服务器**
+
+ 编辑 /etc/apache2/sites-available/000-default.conf
+
+
+ ServerName example.com
+ DocumentRoot /var/www/html
+
+ Options Indexes FollowSymLinks
+ AllowOverride All
+ Require all granted
+
+
+
+
+**下载防火墙ufw**
+
+ ufw app list-------列出ufw应用程序配置文件
+
+ systemctl status apache2------查看apache2活动状态
+
+ hostname -I --------显示一些IP地址
+
+
+
+**apt install curl -------安装curl**
+
+ curl -4 icanhazip.com
+
+ http://192.168.1.128---------使用 `curl` 使用 IPv4 检索 `icanhazip.com`
+
+
+
+**设置虚拟主机**
+
+* mkdir -p /var/www/192.168.1.128 -------为 192.168.1.128创建目录
+
+* chown -R $USER:$USER /var/www/192.168.1.128 --------将目录的所有权分配给您当前使用 $USER 环境变量登录的用户
+
+* chmod -R 755 /var/www/192.168.1.128 -------确保权限正确并允许所有者读取、写入和执行文件,同时授予组和其他人仅读取和执行权限
+
+
+
+* vim /var/www/192.168.1.128/index.html -------创建 index.html 页面
+
+
+
+ Welcome to your_domain!
+
+
+ Success! The your_domain virtual host is working!
+
+
+
+
+* vim /etc/apache2/sites-available/192.168.1.128.conf ————不要直接修改位于 `/etc/apache2/sites-available/000-default.conf` 的默认配置文件,而是在 `/etc/apache2/sites-available/< 创建一个新配置文件mark>your_domain.conf`
+
+
+ ServerAdmin webmaster@localhost
+ ServerName 192.168.1.128
+ ServerAlias www.192.168.1.128
+ DocumentRoot /var/www/192.168.1.128
+ ErrorLog ${APACHE_LOG_DIR}/error.log
+ CustomLog ${APACHE_LOG_DIR}/access.log combined
+
+* a2ensite 192.168.1.128.conf ————使用 a2ensite 工具启用该文件
+
+* a2dissite 000-default.conf ————禁用 000-default.conf 中定义的默认站点
+
+* apache2ctl configtest ————测试配置错误
+
+ 如果正确 会得到OutputAH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 127.0.1.1. Set the 'ServerName' directive globally to suppress this message Syntax OK
+
+* systemctl restart apache2 ——-重新启动 Apache2
\ No newline at end of file
diff --git "a/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\344\270\200/C#Web.md" "b/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\344\270\200/C#Web.md"
new file mode 100644
index 0000000000000000000000000000000000000000..66611b657ee9b5a4a9ef3d4b1ab0f518f591a426
--- /dev/null
+++ "b/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\344\270\200/C#Web.md"
@@ -0,0 +1,343 @@
+## C#
+
+### 下载SDK
+
+```sh
+wget https://packages.microsoft.com/config/debian/12/packages-microsoft-prod.deb -O packages-microsoft-prod.deb
+```
+
+```sh
+dpkg -i packages-microsoft-prod.deb
+```
+
+```sh
+rm packages-microsoft-prod.deb
+```
+
+### 安装SDK
+
+```sh
+apt update
+```
+
+```sh
+apt install dotnet-sdk-8.0 -y
+
+dotnet --list-sdks #检查SDK版本
+```
+
+### 安装nodejs(本项目需要nodejs)
+
+```sh
+curl -fsSL https://deb.nodesource.com/setup_22.x -o nodesource_setup.sh
+bash nodesource_setup.sh
+
+apt update
+
+apt install nodejs
+
+node -v #查看版本
+```
+
+### 获取项目
+
+```sh
+Windows上操作 使用git
+git clone https://gitee.com/zuohuaijun/Admin.NET.git
+```
+
+### 后端(vscode中)
+
+```sh
+Windows中操作
+打开vscode 下载扩展插件C# Dev Kit 在官网下载.net 网站:https://dotnet.microsoft.com/zh-cn/download
+获取这个项目之后 进入文件夹 Admin.NET\Admin.NET\Admin.NET.Web.Entry 右键 在集中终端中打开 输入下面的命令
+dotnet watch --framework net8.0
+```
+
+
+
+### 前端(vscode中)
+
+```sh
+Windows中操作
+打开vscode
+获取这个项目之后 进入文件夹 Admin.NET\Web 右键 在集中终端中打开 输入下面的命令
+
+# 安装依赖
+npm install
+
+# 打包
+npm run build
+
+# 更新依赖
+npm update
+
+# 运行
+npm run dev
+
+如果本地运行成功就可以部署到linux
+```
+
+
+
+
+
+
+
+
+
+### 部署到linux
+
+```sh
+#进入 /opt目录
+cd /opt
+
+#将打包完成的项目上传到这个文件夹
+上传Admin.NET 这个文件夹到虚拟机/opt目录下面
+打包完会在 Admin.NET\Web 文件夹里得到一个dist文件夹,将dist上传到虚拟机的/opt目录下面
+```
+
+
+
+
+
+```sh
+#修改nginx配置文件
+vim /etc/nginx/sites-available/default
+
+server {
+ listen 8888; #监听8888端口
+
+ location / {
+ root /opt/dist; #项目网页所在的目录
+ index index.html index.htm;
+ }
+
+ location /api/ {
+ proxy_pass http://192.168.1.129:5005; #自己虚拟机的ip加上5005端口
+ proxy_http_version 1.1;
+ }
+
+ location /hubs/ {
+ proxy_pass http://192.168.1.129:5005; #自己虚拟机的ip加上5005端口
+ proxy_http_version 1.1;
+ }
+
+ location /upload/ {
+ alias /opt/adminnet/wwwroot/Upload/;
+ }
+ }
+#检查配置文件
+nginx -t
+#重启nginx
+systemctl restart nginx
+```
+
+
+
+
+
+### 测试
+
+```sh
+#后端需要拉取依赖和启动服务,进入/opt/Admin.NET/Admin.NET.Web.Entry 目录
+cd /opt/Admin.NET/Admin.NET.Web.Entry
+#输入下面这个命令
+dotnet watch --framework net8.0
+```
+
+
+
+
+
+```sh
+#前端
+网页输入自己虚拟机的ip加上5005端口,出现下面的效果并成功登录进去就证明已经成功实现
+```
+
+
+
+
+
+### 将应用程序变成服务
+
+#### 项目打包
+
+```sh
+进入/opt/Admin.NET
+cd /opt/Admin.NET
+使用 dotnet publish -c Release -o output --framework net8.0 进行项目打包,打包后会在当前文件下生成名为 output 的文件夹
+```
+
+
+
+
+
+#### 创建服务文件
+
+```sh
+创建服务文件:
+在 /etc/systemd/system/ 目录下创建一个 .service 文件,例如 admin.service
+
+cd /etc/systemd/system/
+
+vim admin.service
+[Unit]
+Description=MyApp Service
+After=network.target
+
+[Service]
+Type=simple
+ExecStart=/usr/bin/dotnet /opt/Admin.NET/output/Admin.NET.Web.Entry.dll
+WorkingDirectory=/opt/Admin.NET/output/
+Restart=always
+
+[Install]
+WantedBy=multi-user.target
+```
+
+
+
+#### 加载和启动服务
+
+```sh
+systemctl daemon-reload
+systemctl start admin.service
+```
+
+#### 设置开机自启
+
+```sh
+systemctl enable admin.service
+```
+
+#### 检查服务状态
+
+```sh
+#检查服务是否正在运行
+systemctl status admin.service
+```
+
+
+
+#### 测试
+
+
+
+
+
+
+
+# C# Web 应用
+
+### C# Web 应用部署
+
+1. 前置任务:
+
+ - 安装 .NET 运行环境:
+
+ ```shell
+ wget https://packages.microsoft.com/config/debian/12/packages-microsoft-prod.deb -O packages-microsoft-prod.deb
+ dpkg -i packages-microsoft-prod.deb
+ rm packages-microsoft-prod.deb
+ apt update && apt install dotnet-sdk-8.0 -y
+ ```
+
+ 使用 `dotnet --list-sdks` 查看是否安装完成。
+
+ - 安装 Node.js 环境:
+
+ ```shell
+ curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash
+ # 此处注意将输出的 export 复制再粘贴运行
+ nvm install 20
+ ```
+
+ 使用 `node -v` 和 `npm -v` 查看是否安装完成。
+
+2. 下载项目:
+
+ 使用 `git clone` 命令拉取仓库:
+
+ ```shell
+ mkdir dotnet && cd dotnet
+ git clone https://gitee.com/zuohuaijun/Admin.NET && cd Admin.NET && ls -l
+ ```
+
+ 输出如下:
+
+ 
+
+ 由结构可知,此为前后端分离项目,前端文件在 `Web` 文件夹下,后端文件在 `Admin.NET` 文件夹下。
+
+3. 部署前端:(vscode里部署)
+
+ ```shell
+ cd Web/
+ npm install -g pnpm
+ # 若下载速度慢,可使用以下指令换源后再次下载
+ # npm config set registry https://registry.npmmirror.com
+ pnpm install
+ pnpm run dev
+ ```
+
+ 
+
+ 浏览器输入 查看前端页面:
+
+ 
+
+ 确定前端页面没问题后,使用 `pnpm run build` 打包前端:
+
+ > 打包过程所耗内存较大,虚拟机可能会内存溢出报错。故此步建议在物理机上进行,打包完成后使用 scp 命令传回服务器或虚拟机。
+ >
+ > 参考命令:`scp -r "F:\Admin.NET\Web\dist" root@192.168.110.110:/opt/dist`(路径要完整)
+
+ 打包完成后端文件在当前文件夹 `dist` 文件夹下,将此文件夹及其内容移动到服务器 `/opt/` 下,并对 `/etc/nginx/site-enable/default` 文件中 server 块做以下配置:
+
+ ```conf
+ server {
+ # 监听 8888 端口
+ listen 8888;
+ location / {
+ root /opt/dist;
+ index index.html index.htm;
+ }
+ location /api/ {
+ proxy_pass http://localhost:5005;
+ proxy_http_version 1.1;
+ }
+ location /hubs/ {
+ proxy_pass http://localhost:5005;
+ proxy_http_version 1.1;
+ }
+ location /upload/ {
+ alias /opt/adminnet/wwwroot/Upload/;
+ }
+ }
+ ```
+
+ 使用 `nginx -t` 检查配置文件,使用 `systemctl restart nginx` 重启 Web 服务器。使用 访问前端页面。
+
+4. 测试后端:
+
+ 进入 `/Admin.NET/Admin.NET/Admin.NET.Web.Entry` 文件夹下,使用 `dotnet watch --framework net8.0` 拉取依赖和启动服务。
+
+ 后端服务启动完成后,显示如图所示:
+
+ 
+
+ 返回前端页面,如图所示:
+
+ 
+
+ 登陆后页面:
+
+ 
+
+5. 打包后端:
+
+ 使用 `dotnet publish -c Release -o output --framework net8.0` 进行项目打包,打包后会在当前文件下生成名为 output 的文件夹,进入后使用 `dotnet Admin.NET.Web.Entry.dll` 运行后端服务。
+
+ 若需要使其保持运行,可将其设置为服务或使用 pm2 挂载等。此处介绍简单保留在后台运行方法,使用 `nohup dotnet Admin.NET.Web.Entry.dll > nohup.out 2>&1 &` 即可保留在后台运行,命令中额外提供了保留日志功能。
\ No newline at end of file
diff --git "a/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\344\270\200/GO.md" "b/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\344\270\200/GO.md"
new file mode 100644
index 0000000000000000000000000000000000000000..8433a0ca2db4eaffeed6602a525f184073544134
--- /dev/null
+++ "b/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\344\270\200/GO.md"
@@ -0,0 +1,173 @@
+GoWeb应用部署
+
+```bash
+apt update
+apt install git
+apt install gnupg
+apt install npm
+apt install redis
+apt install nginx
+
+访问 https://golang.google.cn/dl/
+下载:go1.22.5.linux-amd64.tar.gz
+```
+
+```bash
+下载完成后 传输到虚拟机,传输到root路径下
+# 在虚拟机中创建文件夹
+mkdir /go-two
+# 通过 scp 协议把主机文件上传至虚拟机对应文件夹中
+scp -r go1.22.5.linux-amd64.tar.gz root@主机ip:/go-two
+# 打开对应文件夹,解压文件到所在目录下
+cd /go-two
+tar -xzvf go1.22.5.linux-amd64.tar.gz
+# 添加 go 的 PATH 环境变量
+vim ~/.bashrc
+export PATH=$PATH:/go-two/go/bin
+# 添加完成后 重新加载配置文件
+source ~/.bashrc
+# 验证安装 出现版号字样即为安装成功
+go version
+```
+
+```bash
+# 新建文件夹用于存储项目 并切换目录
+mkdir /go && cd /go
+# 后端
+git clone -b os-v3.2 https://gitee.com/tiger1103/gfast.git
+# 前端
+git clone -b os-v3.2 https://gitee.com/tiger1103/gfast-ui.git
+```
+
+```bash
+## 后端
+# 进入后端文件根目录下
+cd /go/gfast
+# 安装依赖前先更改 go 国内镜像源,否则无法获取
+go env -w GO111MODULE=on
+go env -w GOPROXY=https://goproxy.cn
+# 安装依赖
+go mod tidy
+```
+
+```bash
+## 前端
+# 进入前端文件根目录下
+cd /go/gfast-ui
+# 安装前端依赖
+npm install --registry=https://registry.npmmirror.com
+```
+
+```bash
+# 安装 mysql 并设置密码 此项目中账号密码皆为 `root`
+apt update
+apt search mysql-server
+apt install mysql-server
+# 安装完成后连接mysql
+mysql -p
+# 创建数据库 并 进入数据库
+CREATE DATABASE gfast;
+USE gfast;
+# 导入 sql 文件
+source /go/gfast/resource/data/gfast-v32.sql
+# 或者在root模式下运行
+mysql -u root -p gfast < /go/gfast/resource/data/gfast-v32.sql
+# 给予 root 用户最高权限
+use mysql;
+update user set host='%' where user='root';
+grant all privileges on *.* to 'root'@'%';
+flush privileges;
+GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION ;
+
+登录mysql 我的密码是111 测试成功即可
+```
+
+```bash
+# 复制项目文件到同意路径下 更改后缀为 yaml
+cp /go/gfast/manifest/config/config.yaml.bak /go/gfast/manifest/config/config.yaml
+# 修改配置文件
+vim /go/gfast/manifest/config/config.yaml #如下图所示 改四处
+( mysql 用户名,此项目中为 root
+ 密码,此项目中为 111
+ 虚拟机 192.168.1.153 IP
+ 所创建数据库名称,此项目中为 gfast)
+
+
+
+#修改配置文件
+cd /go
+vim gfast-ui/.env.development
+#将localhost修改为自己的ip
+VITE_API_URL = 'http://192.168.1.153:8808/'
+
+```
+
+```bash
+# 安装
+apt install redis
+# 配置
+vim /etc/redis/redis.conf
+(修改 bind 为虚拟机 ip)
+(取消 requirepass 注释 并在后面更改为自己的 redis 密码
+本项目密码为 root)
+```
+
+```bash
+# 打开项目配置文件
+vim /go/gfast/manifest/config/config.yaml
+(虚拟机本机 ip
+添加刚才设置的 redis 密码选项,本项目中为 root)
+
+重启 redis 执行命令systemctl restart redis
+```
+
+```bash
+# 切换到前端根目录
+cd /go/gfast-ui
+# 打开要修改的隐藏文件
+vim .env.production
+
+VITE_PUBLIC_PATH = ' '
+( 修改 VITE_PUBLIC_PATH 为空
+ 修改完成后打包前端文件 npm run build 打包完成后会在前端根目录生成 dist 文件夹,复制粘贴到下文配置 nginx 文件的 对应注释处。)
+```
+
+
+
+```bash
+# 安装
+apt update
+apt install nginx -y
+# 打开 并 更改配置为
+vim /etc/nginx/sites-enabled/default
+server {
+ # 监听 8889 端口
+ listen 8889;
+ location / {
+ root /go/gfast-ui/dist; # 前端打包 dist 文件夹路径
+ index index.html index.htm;
+ }
+ location /api/v1 {
+ proxy_pass http://192.168.1.153:8808; # 虚拟机ip 192.168.100.100:后端端口8808
+ proxy_http_version 1.1;
+ }
+}
+
+# 开启
+systemctl start nginx
+# 重启
+systemctl restart nginx
+
+
+在浏览器打开192.168.1.153:8889进入前端页面
+```
+
+```bash
+# 进入后端根目录
+cd /go/gfast
+# 创建可执行文件
+go build -o gfast-app ./main.go # gfast-app 为执行文件的文件名 名称不唯一
+# 执行文件
+./gfast-app
+
+```
\ No newline at end of file
diff --git "a/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\344\270\200/Nodejs.md" "b/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\344\270\200/Nodejs.md"
new file mode 100644
index 0000000000000000000000000000000000000000..dacd59efb4d03453d3dc19ecc64c97dd40baefb9
--- /dev/null
+++ "b/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\344\270\200/Nodejs.md"
@@ -0,0 +1,83 @@
+## Nodejs
+
+- 环境部署
+
+```sh
+apt update
+apt install curl
+apt install nginx
+apt install sqlite3
+```
+
+```sh
+#下载安装脚本
+curl -fsSL https://deb.nodesource.com/setup_20.x -o nodesource_setup.sh
+
+#运行安装脚本
+bash nodesource_setup.sh
+
+#安装Node.js
+apt update
+apt install nodejs
+
+node -v #查看版本
+```
+
+- 使用npx安装依赖
+
+```sh
+#需要换源,不然下载很慢
+npm config set registry https://registry.npmmirror.com
+
+#安装依赖
+npx create-strapi-app@latest my-project #my-project 这个名字可以自己定义,如果出错,可能是网络问题,删掉项目,重新下载
+
+
+#出现如下情况
+Need to install the following packages:
+create-strapi-app@4.25.5
+Ok to proceed? (y) #输入y
+
+? Choose your installation type (Use arrow keys)
+❯ Quickstart (recommended) #选择这个,回车键确认,键盘上下键可以进行选择,默认使用sqlite3数据库,前面已经安装过
+ Custom (manual settings)
+
+? Please log in or sign up.
+ Login/Sign up
+❯ Skip #选择这个,回车键确认,键盘上下键可以进行选择
+
+#完成依赖安装之后,会出现如下情况
+ Project information
+
+┌────────────────────┬──────────────────────────────────────────────────┐
+│ Time │ Sat Jul 27 2024 18:40:30 GMT+0800 (China Standa… │
+│ Launched in │ 1204 ms │
+│ Environment │ development │
+│ Process PID │ 9240 │
+│ Version │ 4.25.5 (node v20.16.0) │
+│ Edition │ Community │
+│ Database │ sqlite │
+└────────────────────┴──────────────────────────────────────────────────┘
+
+ Actions available
+
+One more thing...
+Create your first administrator 💻 by going to the administration panel at:
+
+┌─────────────────────────────┐
+│ http://localhost:1337/admin │ #使用这个地址去浏览器访问 http://192.168.1.156:1337/admin localhost换成自己虚拟机的ip
+└─────────────────────────────┘
+
+#如果关掉之后,想要再次进入
+#安装完成之后会有个my-project目录
+cd my-project
+
+#启动运行
+npm run develop
+
+使用这个地址去浏览器访问 http://192.168.1.156:1337/admin localhost换成自己虚拟机的ip
+```
+
+
+
+
\ No newline at end of file
diff --git "a/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\344\270\200/Python.md" "b/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\344\270\200/Python.md"
new file mode 100644
index 0000000000000000000000000000000000000000..9ccb221059bf52d1e8b10a1f77fcab46350b745d
--- /dev/null
+++ "b/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\344\270\200/Python.md"
@@ -0,0 +1,139 @@
+1. 克隆项目
+
+ ```bash
+ git clone https://gitee.com/insistence2022/dash-fastapi-admin.git
+ #在桌面克隆后压缩成zip的,然后上传到服务器
+ apt install unzip
+ unzip 文件名 #解压文件
+ ```
+
+2. 下载Python3
+
+ ```bash
+ apt install -y python3 python3-pip
+ ```
+
+3. 下载Mysql
+
+ ```bash
+ # 步骤参考自己写的笔记
+ # 新建数据库
+ create database dash;
+ # 使用命令运行sql文件夹下的dash-fastapi.sql
+ source 文件的路径
+ # 修改root的登录由localhost变成%
+ use mysql;
+ select user,host from user;
+ update user set host ='%' where user='root';
+ ```
+
+ 
+
+4. 下载redis
+
+ ```bash
+ apt update
+ apt install redis-server
+ # 设置密码
+ vim /etc/redis/redis.conf
+ # 找到 #requirepass foobared,修改foobared,或者复制一行,将foobared修改为自己想要的密码
+ requirepass 111
+ # 保存重启
+ systemctl restart redis-server
+ # 验证是否成功
+ ## 1.进入客户端:
+ /bin/redis-cli
+ ## 2.输入config get requirepass验证
+ ## 出现“(error) NOAUTH Authentication required.证明设置密码成功!
+ ## 3.输入密码:出现ok则是成功
+ auth 111
+ ## 再次输入config get requirepass验证,即可看到自己设置的密码,123456就是密码
+ 1) "requirepass"
+ 2) "111"
+ ```
+
+ 
+
+5. 创建Python的虚拟环境
+
+ - 关于Python的命令都要在虚拟环境中执行
+ - 虚拟环境中也可以执行Linux的基本命令(cd,ls,vim...)
+ - 后面前后端的命令都要在虚拟环境中进行(前后端分别开两个终端)
+
+ ```bash
+ # 安装python3-venv包
+ apt install python3-venv
+ # 创建一个新的虚拟环境
+ python3 -m venv myenv
+ # 激活虚拟环境
+ source myenv/bin/activate
+ # 然后就可以在虚拟环境中执行命令
+ ...
+ # 退出虚拟环境
+ deactivate
+ ```
+
+6. 在虚拟环境中安装 numpy 和 pandas
+
+ ```bash
+ pip install --upgrade numpy pandas
+ ```
+
+7. 进入项目根目录
+
+ ```
+ cd dash-fastapi-admin
+ ```
+
+8. 在该目录安装项目的依赖环境
+
+ ```bash
+ pip3 install -r requirements.txt
+ ```
+
+9. 前端
+
+ ```bash
+ # 进入前端目录
+ cd dash-fastapi-frontend
+
+ # 配置信息(将IP设置成自己的)
+ vim .env.dev
+
+ # 运行前端(切换到另一个终端执行后端的步骤)
+ python3 app.py --env=dev
+ ```
+
+ 
+
+10. 后端
+
+ ```bash
+ # 进入后端目录
+ cd dash-fastapi-backend
+
+ # 配置信息
+ # 数据库和redis的IP不变,将应用主机IP修改成自己的
+ # 数据库的库名密码等需要修改填写
+ # redis的密码需要填写
+ vim .env.dev
+
+ # 运行后端
+ python3 app.py --env=dev
+ ```
+
+ 
+
+ 
+
+11. 完成后,到浏览器中验证是否成功
+
+ ```bash
+ # 浏览器访问
+ http://自己的IP:8088
+ # 默认账号密码
+ 账号:admin
+ 密码:admin123
+ ```
+
+
\ No newline at end of file
diff --git "a/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\344\270\200/php.md" "b/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\344\270\200/php.md"
new file mode 100644
index 0000000000000000000000000000000000000000..58a255052a4819837be8796ef8449b41d24ff367
--- /dev/null
+++ "b/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\344\270\200/php.md"
@@ -0,0 +1,23 @@
+# 前置条件:
+
+MySQL5.7以上
+
+PHP8.2
+
+PHP的扩展:php-redis imagemagick exif
+
+```bash
+apt install php-redis imagemagick exif#更新到8.3
+apt-get install php php-fpm php-curl php-cli php-zip php-mysql php-xml php-redis -y #安装PHP
+php -v #此时可以查看安装的PHP版本,看得到就是安装成功
+apt install redis#下载redis
+#进入随便一个文件夹
+git clone https://gitee.com/meystack/swiftadmin.git #下载文件下来(没有命令就是没下载git下载下就好了)
+cd /swiftadmin
+systemctl restart php8.2-fpm #重启服务(要在克隆下来的目录运行)
+php start.php start #启动开发服务
+php start.php start -d # 启动守护进程
+#一直弹信息可能是redis这个扩展服务没有安装好 具体可以自行翻译一下看看是哪个扩展服务没有安装好
+#打开浏览器http://localhost:8787/index访问项目执行安装(localhost改为自己的IP)
+```
+
diff --git "a/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\344\270\211/11-Kubernetes \351\233\206\347\276\244\351\203\250\347\275\262(3).md" "b/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\344\270\211/11-Kubernetes \351\233\206\347\276\244\351\203\250\347\275\262(3).md"
new file mode 100644
index 0000000000000000000000000000000000000000..44c0b04d6213a586131846abc221abecad370a10
--- /dev/null
+++ "b/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\344\270\211/11-Kubernetes \351\233\206\347\276\244\351\203\250\347\275\262(3).md"
@@ -0,0 +1,558 @@
+# Kubernetes 搭配 containerd 进行集群部署
+
+Kubernetes(K8s) 是一个开源的平台,用于自动化容器化应用程序的部署、扩展和管理。可以通过 K8s 部署容器化集群,对集群内的容器进行批量化的管理、控制。
+
+containerd 是容器运行时,类似 Docker,主要用于管理容器的生命周期。
+
+> 关于 K8s 与 containerd 详细内容请自行了解。
+
+## 通过 K8s 集群部署 Nginx 应用
+
+> 本节主要目标为在多台 Linux 主机上通过 K8s 集群进行 Nginx 应用的安装。
+
+### 前置:准备工作
+
+> 部署要点:
+>
+> 1. **集群中各个主机要保证 UUID、hostname、IP 地址唯一。**
+>
+> 2. **每台主机 hosts 都要修改。**
+
+1. 分配 master 节点与 node 节点:
+
+ > master 节点:控制节点,负责管理集群的整体状态和控制功能。
+ >
+ > node 节点:工作节点,实际运行应用程序的容器。
+
+ IP 分配方法自行查找,本文不在此赘述。
+
+ > **此处 IP 分配看实际情况。**
+
+ | IP | 节点类型 | 主机名 |
+ | ------------- | -------- | ------ |
+ | 192.168.18.10 | master | master |
+ | 192.168.18.20 | node | node1 |
+ | 192.168.18.21 | node | node2 |
+
+2. cri-containerd 下载:
+
+ 下载链接:
+
+ 本节以最新版本为例,建议先行下载,后用 scp 传输到虚拟机上。
+
+### 部署集群
+
+#### 所有节点配置
+
+> **本小节内容工作在所有节点上,即所有主机都要进行以下配置**
+
+> **强调:修改 UUID、hostname、IP!主机之间不可有相同!**
+>
+> **每台主机上的 `/etc/hosts` 都要进行修改!**
+
+- 修改主机名:
+
+ > 集群中主机名不可重复,此处以设置 master 主机名为例。
+
+ ```shell
+ hostnamectl hostname master && reboot
+ ```
+
+- 配置本机 hosts:
+
+ 编辑 `/etc/hosts` 文件,写入以下内容,注意修改 127.0.1.1 解析为当前主机名:
+
+ ```shell
+ 127.0.0.1 localhost
+ 127.0.1.1 master
+ 192.168.1.180 master
+ 192.168.1.183 node1
+ 192.168.1.184 node2
+ ```
+
+- 设置 DNS 服务器:
+
+ ```shell
+ echo "nameserver 114.114.114.114" | tee /etc/resolv.conf
+ ```
+
+- 配置软件源:
+
+ 编辑 `/etc/apt/sources.list` 文件:
+
+ ```shell
+ deb https://mirrors.aliyun.com/debian/ bookworm main non-free non-free-firmware contrib
+ deb-src https://mirrors.aliyun.com/debian/ bookworm main non-free non-free-firmware contrib
+ deb https://mirrors.aliyun.com/debian-security/ bookworm-security main
+ deb-src https://mirrors.aliyun.com/debian-security/ bookworm-security main
+ deb https://mirrors.aliyun.com/debian/ bookworm-updates main non-free non-free-firmware contrib
+ deb-src https://mirrors.aliyun.com/debian/ bookworm-updates main non-free non-free-firmware contrib
+ deb https://mirrors.aliyun.com/debian/ bookworm-backports main non-free non-free-firmware contrib
+ deb-src https://mirrors.aliyun.com/debian/ bookworm-backports main non-free non-free-firmware contrib
+ ```
+
+ 使用 `apt update && apt full-upgrade -y` 刷新软件包缓存并更新系统。
+
+- 设置系统时区:
+
+ ```shell
+ timedatectl set-timezone Asia/Shanghai
+ ```
+
+- 时钟同步:
+
+ 配置时钟源为阿里云 NTP 服务器并强制进行时间同步。
+
+ ```shell
+ apt install chrony -y
+ sed -i '/pool 2.debian.pool.ntp.org iburst/ s/^/#/' /etc/chrony/chrony.conf && sed -i '/pool 2.debian.pool.ntp.org iburst/ a\server ntp.aliyun.com iburst' /etc/chrony/chrony.conf
+ systemctl enable chrony && systemctl restart chrony
+
+ # 强制进行同步
+ chronyc -a makestep
+ chronyc sources -v
+ chronyc tracking
+ ```
+
+ 同步后:
+
+ 
+
+- 改写系统配置:
+
+ 创建并编辑 `/etc/sysctl.d/k8s.conf` 文件,写入以下内容:
+
+ ```shell
+ net.ipv4.ip_forward = 1
+ net.ipv4.conf.all.send_redirects = 0
+ net.ipv4.conf.default.send_redirects = 0
+ net.netfilter.nf_conntrack_max = 1000000
+ net.netfilter.nf_conntrack_tcp_timeout_established = 86400
+ net.core.somaxconn = 1024
+ net.ipv4.tcp_syncookies = 1
+ net.ipv4.tcp_max_syn_backlog = 2048
+ net.ipv4.tcp_synack_retries = 2
+ fs.file-max = 65536
+ vm.swappiness = 0
+ ```
+
+ 保存后:
+
+ ```shell
+ # 加载内核网络模块,启用网络过滤
+ modprobe br_netfilter
+
+ # 应用修改的配置
+ sysctl -p /etc/sysctl.d/k8s.conf
+ ```
+
+- 配置流量处理:
+
+ - 安装 ipset 与 ipvsadm:
+
+ ```shell
+ apt install ipset ipvsadm -y
+ ```
+
+ - 创建并编辑 `/etc/modules-load.d/k8s.conf` 文件:
+
+ ```shell
+ ip_vs
+ ip_vs_rr
+ ip_vs_wrr
+ ip_vs_sh
+ ip_tables
+ nf_conntrack_ipv4
+ br_netfilter
+ ```
+
+ 添加权限:
+
+ ```shell
+ chmod a+x /etc/modules-load.d/k8s.conf
+ ```
+
+- 关闭交换分区:
+
+ 编辑 `/etc/fstab` 文件,将 swap 行下内容注释:
+
+ 
+
+ 重启后,使用 `free` 查看内存:
+
+ 
+
+ 若 Swap 一行为 0,即代表禁用成功。
+
+ 或使用以下方法:
+
+ ```shell
+ swapoff -a
+ sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
+ reboot
+ ```
+
+- 停止并禁用安全策略:
+
+ > AppArmor 是一种 Linux 内核安全模块,用于限制程序的能力,以提高系统的安全性。此处关闭是为了防止安全模块杀 K8s 进程。
+
+ ```shell
+ systemctl stop apparmor.service
+ systemctl disable apparmor.service
+ ```
+
+#### master 节点配置
+
+> **本小节内容工作在 master 节点上。**
+
+1. 找到准备工作中的 cri-containerd 包,并将其解压到 `/` 下:
+
+ ```shell
+ tar -xf cri-containerd-1.7.20-linux-amd64.tar.gz -C /
+ ```
+
+2. 修改 cri-containerd 配置:
+
+ ```shell
+ mkdir /etc/containerd
+ # 导出默认配置文件
+ containerd config default > /etc/containerd/config.toml
+
+ # 修改配置文件中使用的沙箱镜像版本
+ vim /etc/containerd/config.toml #在67行左右,改成以下
+ sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.9"
+
+ # 设置 containerd 在创建容器时使用 systemd
+ sed -i '/SystemdCgroup/s/false/true/' /etc/containerd/config.toml
+ ```
+
+ 修改完成后,重启服务并查看状态:
+
+ ```shell
+ systemctl enable containerd.service
+ systemctl restart containerd.service
+ systemctl status containerd.service
+ ```
+
+ 验证组件:
+
+ ```shell
+ containerd --version && crictl --version && runc --version
+ ```
+
+ 输出如图所示:
+
+ 
+
+3. 安装 K8s 组件:
+
+ - 安装插件以提供 https 连接:
+
+ ```shell
+ apt update && apt install apt-transport-https gnupg gnupg2 curl software-properties-common -y
+ ```
+
+ - 下载密钥:
+
+ ```shell
+ curl -fsSL https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.30/deb/Release.key | gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
+ ```
+
+ - 写入软件源:
+
+ ```shell
+ echo "deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.30/deb/ /" | tee /etc/apt/sources.list.d/kubernetes.list
+ ```
+
+ - 刷新软件源缓存并安装组件:
+
+ ```shell
+ apt update && apt install kubeadm kubelet kubectl -y
+ ```
+
+ - 安装完成后查看版本信息:
+
+ ```shell
+ dpkg -l kubeadm kubelet kubectl
+ ```
+
+ 如图所示:
+
+ 
+
+4. 配置 kubelet:
+
+ ```shell
+ cat > /etc/default/kubelet << EOF
+ KUBELET_EXTRA_ARGS="--cgroup-driver=systemd"
+ EOF
+ systemctl enable kubelet && systemctl restart kubelet
+ ```
+
+ 配置到此处后,使用 `reboot` 重启主机。
+
+5. 初始化集群:
+
+ > 关于镜像拉取与初始化:
+ >
+ > 在国内网络下拉取镜像和初始化很容易失败,可在拉取和初始化命令后加上 `--image-repository registry.aliyuncs.com/google_containers` 指定镜像源为阿里云镜像源。
+ >
+ > 但即使指定镜像源,仍然有较大概率拉取或初始化失败,故推荐有条件的使用一些代理软件,以达到访问原镜像源的效果。
+ >
+ > 参考代理软件设置:
+ >
+ > 
+
+ > 关于代理:
+ >
+ > 不使用流量代理很难将镜像拉取下来并初始化(目前未成功过),建议使用代理后拉取,会更加方便。
+
+ 拉取镜像:
+
+ ```shell
+ kubeadm config images pull
+ #以上和以下的命令选一个执行就可以了,过程有点久
+ kubeadm config images pull --image-repository registry.aliyuncs.com/google_containers
+ ```
+
+ 
+
+
+
+ 初始化集群:
+
+ ```shell
+ sudo kubeadm init \
+ --kubernetes-version v1.30.0 \
+ --image-repository registry.aliyuncs.com/google_containers \
+ --apiserver-advertise-address 192.168.1.180 \
+ --service-cidr 10.245.0.0/12 \
+ --pod-network-cidr 10.244.0.0/16
+ #master 改成虚拟机的主机名称
+ #192.168.111.30 改成本机虚拟机ip地址
+ ```
+
+ 初始化完成后信息:
+
+ 
+
+ > 以下两条命令源于上一条命令输出,若找不到了可以使用 `kubeadm token create --print-join-command` 重新获取。
+
+ 其中,在工作节点上使用此命令加入此集群:
+
+ ```shell
+ kubeadm join 192.168.1.182:6443 --token 1iwf92.1j3ty01buc0slc4e \
+ --discovery-token-ca-cert-hash sha256:06ecd763f3812c84dca1a86bddb18bd01085f555f4a51d28f75421d8e975a80f
+ ```
+
+ 报错
+
+ 
+
+ 解决方案
+
+ ```bash
+ #检查并停止服务: 确保没有正在运行的 kubelet 服务:
+ sudo systemctl stop kubelet
+ #删除旧配置: 清理旧的配置文件,以便重新初始化:
+ rm -f /etc/kubernetes/kubelet.conf
+ rm -f /etc/kubernetes/pki/ca.crt
+ #重新执行加入命令
+ kubeadm join 192.168.1.182:6443 --token 1iwf92.1j3ty01buc0slc4e \
+ --discovery-token-ca-cert-hash sha256:06ecd763f3812c84dca1a86bddb18bd01085f555f4a51d28f75421d8e975a80f
+ ```
+
+
+
+
+
+ 依据提示,进行配置:
+
+ ```shell
+ mkdir -p $HOME/.kube
+ sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
+ sudo chown $(id -u):$(id -g) $HOME/.kube/config
+ export KUBECONFIG=/etc/kubernetes/admin.conf
+ ```
+
+ 查看集群和节点状态列表:
+
+ ```shell
+ kubectl cluster-info && kubectl get nodes
+ ```
+
+ 
+
+ 由上图可见,此时状态为 NotReady,需要安装网络插件以达到联系主机的目的:
+
+ ```shell
+ curl https://raw.githubusercontent.com/projectcalico/calico/v3.28.1/manifests/calico.yaml -O
+ kubectl apply -f calico.yaml
+ ```
+
+ 使用 `kubectl get pods -n kube-system` 查看状态:
+
+ > 此处 node pod 未 Ready 为正常现象,建议进行到此处后先配置 node 节点,配置 node 节点完成后重启网络插件,查看 pod 状态。
+
+ 
+
+ 再次使用 `kubectl get nodes` 查看节点状态:
+
+ > 此处 node1 为新加入的工作节点,加入方式见 node 节点配置。
+
+ 
+
+ Ready 代表节点已就绪。
+
+#### node 节点配置
+
+1. 前期准备工作与 master 节点配置第 1-4 点相同,参考上述。
+
+2. 加入集群:
+
+ 根据 master 节点配置第 5 点输出的 token,在工作节点上加入集群:
+
+ ```shell
+ kubeadm join master1:6443 --token 9vf65d.3c0q5at7btbh9ac9 --discovery-token-ca-cert-hash sha256:c2a629ff9939d539af6600465d88b75f8adac20f807cd901d816268601222363
+ ```
+
+ 
+
+ 在 master 节点上通过`kubectl get nodes`查看节点:
+
+ 
+
+ 存在新加入的节点并且状态为 Ready 即为成功。
+
+#### 新 master 节点加入集群
+
+1. 前期准备工作与 master 节点配置第 1-4 点相同,参考上述。
+
+2. 在集群内已存在的控制节点上生成密钥和 token:
+
+ ```shell
+ kubeadm init phase upload-certs --upload-certs
+ ```
+
+ 如图所示:
+
+ 
+
+3. 保存上一步的密钥和 token,在新加入的主机上:
+
+ > 确保新机上的 hosts 文件和 containerd、kubectl、kubeadm、kubelet 配置完成,且未进行初始化。
+
+ ```shell
+ kubeadm join master1:6443 --token --discovery-token-ca-cert-hash sha256: --control-plane --certificate-key
+ ```
+
+ 对应图(注意复制完全):
+
+ 
+
+ 运行命令后会经历拉取镜像、初始化等过程,最后输出为:
+
+ 
+
+ 执行以下命令:
+
+ ```shell
+ mkdir -p $HOME/.kube
+ sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
+ sudo chown $(id -u):$(id -g) $HOME/.kube/config
+ ```
+
+ 使用 `kubectl get nodes` 查看节点:
+
+ 
+
+ 发现状态为 NotReady,重复上一小节安装网络插件即可。
+
+ 若仍然为 NotReady 状态,则需要重新启动 calico 插件和集群服务:
+
+ ```shell
+ kubectl rollout restart daemonset calico-node -n kube-system
+ systemctl restart kubelet
+ systemctl restart containerd
+ ```
+
+ 查看 Pod 状态:
+
+ 
+
+ 等待一会后,使用 `kubectl get nodes` 重新查看节点状态:
+
+ 
+
+ 节点都为 Ready 即为配置成功。
+
+### 在工作节点上部署 Nginx 应用并启动
+
+1. 在 master 节点上(控制平面):
+
+ - 创建并编辑 `nginx-install.yml` 文件,写入以下内容:
+
+ ```yml
+ apiVersion: apps/v1
+ kind: Deployment
+ metadata:
+ name: nginx-deployment
+ labels:
+ app: nginx
+ spec:
+ replicas: 2
+ selector:
+ matchLabels:
+ app: nginx
+ template:
+ metadata:
+ labels:
+ app: nginx
+ spec:
+ containers:
+ - name: nginx
+ image: nginx:latest
+ ports:
+ - containerPort: 80
+ ```
+
+ - 创建 Pod:
+
+ ```shell
+ kubectl apply -f nginx-install.yml
+ ```
+
+ 使用 `kubectl get deployments` 查看部署状态:
+
+ 
+
+ 使用 `kubectl get pods` 查看 Pod 状态:
+
+ 
+
+ 发现 Pod 都成功运行。现在将容器内的服务暴露在外部:
+
+ 创建 `nginx-server.yml` 文件并写入:
+
+ ```yml
+ apiVersion: v1
+ kind: Service
+ metadata:
+ name: nginx-service
+ spec:
+ selector:
+ app: nginx
+ ports:
+ - protocol: TCP
+ port: 80
+ targetPort: 80
+ type: NodePort
+ ```
+
+ 使用 `kubectl apply -f nginx-server.yml` 创建暴露服务,并使用 `kubectl get svc nginx-service` 查看端口:
+
+ 
+
+ 可知,端口暴漏在 31363 上,通过工作节点的 31363 端口即可访问对应的 Nginx 应用服务:
+
+ 
diff --git "a/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\344\270\211/img/image-20240810085212797.png" "b/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\344\270\211/img/image-20240810085212797.png"
new file mode 100644
index 0000000000000000000000000000000000000000..075e6025fd829647ab81606e505eef368b4b6f2e
Binary files /dev/null and "b/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\344\270\211/img/image-20240810085212797.png" differ
diff --git "a/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\344\270\211/img/image-20240810090044372.png" "b/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\344\270\211/img/image-20240810090044372.png"
new file mode 100644
index 0000000000000000000000000000000000000000..37f47cdb34e4eb580e1abf51885bdcd829e0767d
Binary files /dev/null and "b/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\344\270\211/img/image-20240810090044372.png" differ
diff --git "a/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\344\270\211/img/image-20240810091132475.png" "b/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\344\270\211/img/image-20240810091132475.png"
new file mode 100644
index 0000000000000000000000000000000000000000..d6a1004ed48b83d3193b41b0cfa29ee8cb81a907
Binary files /dev/null and "b/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\344\270\211/img/image-20240810091132475.png" differ
diff --git "a/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\344\270\211/img/image-20240810145242615.png" "b/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\344\270\211/img/image-20240810145242615.png"
new file mode 100644
index 0000000000000000000000000000000000000000..b764e963400acff523a3fe7d53fb1133570a8aa0
Binary files /dev/null and "b/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\344\270\211/img/image-20240810145242615.png" differ
diff --git "a/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\344\270\211/img/image-20240810192350357.png" "b/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\344\270\211/img/image-20240810192350357.png"
new file mode 100644
index 0000000000000000000000000000000000000000..deb4e4424ab7e533f472d80952069f2b02de4050
Binary files /dev/null and "b/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\344\270\211/img/image-20240810192350357.png" differ
diff --git "a/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\344\270\211/img/\346\237\245\347\234\213\345\256\236\351\231\205\346\216\245\345\217\243\345\220\215\347\247\260.png" "b/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\344\270\211/img/\346\237\245\347\234\213\345\256\236\351\231\205\346\216\245\345\217\243\345\220\215\347\247\260.png"
new file mode 100644
index 0000000000000000000000000000000000000000..abe3e1f583f1222b16715f0900920934968a34ed
Binary files /dev/null and "b/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\344\270\211/img/\346\237\245\347\234\213\345\256\236\351\231\205\346\216\245\345\217\243\345\220\215\347\247\260.png" differ
diff --git "a/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\344\270\211/k8s\351\233\206\347\276\244.md" "b/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\344\270\211/k8s\351\233\206\347\276\244.md"
new file mode 100644
index 0000000000000000000000000000000000000000..7795399191e5a9628c193150b329449323875b96
--- /dev/null
+++ "b/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\344\270\211/k8s\351\233\206\347\276\244.md"
@@ -0,0 +1,41 @@
+## k8s集群
+
+1. [入门 | Kubernetes](https://kubernetes.io/zh-cn/docs/setup/)
+
+Kubernetes(简称K8s)是一个开源的容器编排平台,用于自动化部署、扩展和管理容器化应用程序。K8s集群是由一组运行在物理机或虚拟机上的节点(nodes)组成的,这些节点协同工作以运行应用程序的容器化实例。
+
+### K8s集群的组成:
+
+1. Master 节点(控制平面)
+
+ :
+
+ - **API Server**:Kubernetes API,集群的统一入口,各组件协调者,以RESTful API提供接口服务,是所有资源信息的唯一入口和访问枢纽。
+ - **Etcd**:所有集群数据的存储位置,包括集群状态、节点信息、配置和资源定义等。
+ - **Scheduler**:负责根据调度策略将Pod调度到相应的Node上。
+ - **Controller Manager**:运行控制器进程的集合,通过API Server监控集群的状态,确保集群处于预期的工作状态。
+
+2. Worker 节点(工作节点)
+
+ :
+
+ - **Kubelet**:负责维护容器的生命周期,根据PodSpec工作。它会监听API Server上Pod和节点的变化信息,确保容器运行在Pod中。
+ - **Kube-proxy**:实现Kubernetes服务(Service)的通信与负载均衡机制。
+ - **Container Runtime**:负责容器的运行和管理,常用的有Docker、CRI-O等。
+
+### K8s集群的工作原理:
+
+- 用户通过kubectl命令行工具或Kubernetes API与集群交互,发送部署和管理应用程序的请求。
+- 请求首先到达API Server,API Server处理请求后,将需要的数据更新到Etcd中。
+- Scheduler监控新创建的Pod,根据调度策略选择一个合适的Node来运行Pod。
+- Kubelet在Node上接收Pod的调度信息,并使用容器运行时(如Docker)来创建和运行Pod中的容器。
+- Kube-proxy负责实现服务发现和负载均衡,确保集群内的服务可以正常通信。
+- Controller Manager中的多个控制器会不断检查集群的状态,确保集群的状态与用户的预期一致,例如确保Pod的副本数量与期望一致。
+
+### K8s集群的优势:
+
+- **高可用性**:通过自动部署、扩展和容错能力,提高应用程序的可用性。
+- **可扩展性**:可以轻松地增加或减少集群中的节点,以适应应用程序的负载变化。
+- **自动化**:自动化部署、扩展、更新和维护,减少人为错误。
+- **自我修复**:通过控制器和调度器,集群能够自动修复问题,保持健康状态。
+- **丰富的生态系统**:拥有庞大的社区和丰富的插件、工具和服务,支持多种应用场景。
\ No newline at end of file
diff --git "a/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\344\272\214/8.DevOps\346\214\201\347\273\255\350\277\220\347\273\264\345\271\263\345\217\260.md" "b/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\344\272\214/8.DevOps\346\214\201\347\273\255\350\277\220\347\273\264\345\271\263\345\217\260.md"
new file mode 100644
index 0000000000000000000000000000000000000000..bdec05bea513c35941b0708fd53ee2006016e8a1
--- /dev/null
+++ "b/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\344\272\214/8.DevOps\346\214\201\347\273\255\350\277\220\347\273\264\345\271\263\345\217\260.md"
@@ -0,0 +1,35 @@
+## 阶段一,部署以下不同的语言开发的各种系统,以安装相应的语言运行环境(如C#的SDK或运行时,Java的JDK或运行时)、相应数据等mysql、Postgresql等,来支撑以下应用,不得使用集成环境或工具(如宝塔等,docker容器等)
+
+
+1. C#Web应用:
+
+
+地址:https://gitee.com/zuohuaijun/Admin.NET
+
+
+2. Java Web应用
+
+地址:https://gitee.com/wuxw7/MicroCommunity
+
+
+3. Python Web应用
+
+地址:https://gitee.com/insistence2022/dash-fastapi-admin
+
+
+4. PHP Web应用
+
+地址:https://gitee.com/meystack/swiftadmin
+
+5. Go Web应用
+
+地址:https://gitee.com/tiger1103/gfast
+
+6. NodeJs Web应用
+
+地址:https://strapi.io/
+
+
+## 阶段二,将以上第1、第4、第6个项目,使用容器技术的方式部署到Debian服务器,要求前端正常nginx部署,后端使用Docker,而且必须是自己手写配置文件的形式部署
+
+> 建议,先了解清楚Docker的相关概念和理论,再实践动手,效率更高噢^_^
\ No newline at end of file
diff --git "a/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\344\272\214/C#\357\274\210docker\357\274\211.md" "b/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\344\272\214/C#\357\274\210docker\357\274\211.md"
new file mode 100644
index 0000000000000000000000000000000000000000..c9d102a4143892e58c329e1deb781b607fae382d
--- /dev/null
+++ "b/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\344\272\214/C#\357\274\210docker\357\274\211.md"
@@ -0,0 +1,366 @@
+## 部署C#
+
+```mysql
+#下载SDK
+wget https://packages.microsoft.com/config/debian/12/packages-microsoft-prod.deb -O packages-microsoft-prod.deb
+
+dpkg -i packages-microsoft-prod.deb
+
+rm packages-microsoft-prod.deb
+
+#安装SDK
+apt update
+
+apt install dotnet-sdk-8.0 -y
+
+dotnet --list-sdks #检查SDK版本
+
+#安装nodejs
+curl -fsSL https://deb.nodesource.com/setup_22.x -o nodesource_setup.sh
+bash nodesource_setup.sh
+
+apt update
+
+apt install nodejs
+
+node -v #查看版本
+
+
+```
+
+#### 获取项目
+
+```mysql
+#获取项目(在Windows上操作,在C盘和D盘都可以),用git拉取项目
+git clone https://gitee.com/zuohuaijun/Admin.NET.git
+
+#后端(在vscode中操作)
+#拉取的项目通过vscode打开(需要下载插件C# Dev Kit)
+#在官网下载.net(下载完成后需要重新启动vscode)
+https://dotnet.microsoft.com/zh-cn/download
+#进入文件夹 Admin.NET\Admin.NET\Admin.NET.Web.Entry 右键 在集中终端中打开 输入下面的命令
+dotnet watch --framework net8.0
+```
+
+
+
+
+
+```mysql
+#前端(同样是在vscode中进行)
+#进入文件夹 Admin.NET\Web 右键 在集中终端中打开 输入下面的命令
+
+# 安装依赖
+npm install
+
+# 打包
+npm run build
+
+# 更新依赖
+npm update
+
+# 运行
+npm run dev
+
+如果本地运行成功就可以部署到linux
+```
+
+
+
+```mysql
+# 安装依赖
+npm install
+#如果这一步出错了,使用以下命令
+npm install -g pnpm
+#如果还报错就执行下面的操作
+#之后再次执行前端的操作,将npm改为pnpm执行
+```
+
+
+
+
+
+
+
+#### 部署到Linux
+
+```mysql
+#进入 /opt目录
+cd /opt
+
+#将打包完成的项目上传到这个文件夹
+#上传Admin.NET 这个文件夹到虚拟机/opt目录下面
+#打包完会在 Admin.NET\Web 文件夹里得到一个dist文件夹,将dist上传到虚拟机的/opt目录下面
+```
+
+
+
+```mysql
+#需要下载nginx
+apt install nginx
+
+#修改nginx配置文件
+vim /etc/nginx/sites-available/default
+
+server {
+ listen 8888; #监听8888端口
+
+ location / {
+ root /opt/dist; #项目网页所在的目录
+ index index.html index.htm;
+ }
+
+ location /api/ {
+ proxy_pass http://192.168.1.170:5005; #自己虚拟机的ip加上5005端口
+ proxy_http_version 1.1;
+ }
+
+ location /hubs/ {
+ proxy_pass http://192.168.1.170:5005; #自己虚拟机的ip加上5005端口
+ proxy_http_version 1.1;
+ }
+
+ location /upload/ {
+ alias /opt/adminnet/wwwroot/Upload/;
+ }
+ }
+#检查配置文件
+nginx -t
+#重启nginx
+systemctl restart nginx
+```
+
+#### 测试
+
+```mysql
+#后端需要拉取依赖和启动服务,进入/opt/Admin.NET/Admin.NET.Web.Entry 目录
+cd /opt/Admin.NET/Admin.NET.Web.Entry
+#输入下面这个命令
+dotnet watch --framework net8.0
+```
+
+
+
+```mysql
+#前端
+网页输入自己虚拟机的ip加上8888端口,出现下面的效果并成功登录进去就证明已经成功实现
+```
+
+
+
+#### 将应用程序变成服务
+
+##### 项目打包
+
+```mysql
+#进入/opt/Admin.NET
+cd /opt/Admin.NET
+使用 dotnet publish -c Release -o output --framework net8.0 进行项目打包,打包后会在当前文件下生成名为 output 的文件夹
+```
+
+##### 创建服务文件
+
+```mysql
+创建服务文件:
+在 /etc/systemd/system/ 目录下创建一个 .service 文件,例如 admin.service
+
+cd /etc/systemd/system/
+
+vim admin.service
+[Unit]
+Description=MyApp Service
+After=network.target
+
+[Service]
+Type=simple
+ExecStart=/usr/bin/dotnet /opt/Admin.NET/output/Admin.NET.Web.Entry.dll
+WorkingDirectory=/opt/Admin.NET/output/
+Restart=always
+
+[Install]
+WantedBy=multi-user.target
+```
+
+##### 加载和启动服务
+
+```mysql
+systemctl daemon-reload
+systemctl start admin.service
+```
+
+##### 设置开机自启
+
+```mysql
+systemctl enable admin.service
+```
+
+##### 检查服务状态
+
+```mysql
+#检查服务是否正在运行
+systemctl status admin.service
+```
+
+##### 测试
+
+
+
+## 安装docker
+
+```mysql
+apt update #更新
+apt install ca-certificates curl #下载curl
+install -m 0755 -d /etc/apt/keyrings
+
+#下载curl
+apt install curl
+
+#使用阿里源
+curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/debian/gpg | gpg --dearmor -o /etc/apt/keyrings/docker-archive-keyring.gpg
+
+#向 sources.list 中添加 Docker 软件源
+echo \
+ "deb [arch=amd64 signed-by=/etc/apt/keyrings/docker-archive-keyring.gpg] https://mirrors.aliyun.com/docker-ce/linux/debian \
+ $(lsb_release -cs) stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null
+
+
+ #安装docker
+ apt update
+ apt install docker-ce docker-ce-cli containerd.io docker-compose-plugin
+
+ #启动docker
+ systemctl enable docker
+ systemctl start docker
+
+#建立 docker 组
+ groupadd docker
+#将当前用户加入 docker 组
+ usermod -aG docker $USER
+
+
+ #配置镜像加速器
+cd /etc/docker
+vim daemon.json #如果没有这个文件就新建一个
+{
+ "registry-mirrors": ["https://jqyv7suv.mirror.aliyuncs.com"] #https://jqyv7suv.mirror.aliyuncs.com是我阿里云的镜像加速地址
+}
+#镜像加速地址请登录阿里云获取 阿里云 -> 容器镜像服务 -> 镜像工具 -> 镜像加速器
+
+#设置完成之后重启服务
+systemctl daemon-reload
+systemctl restart docker
+```
+
+```mysql
+#测试docker是否安装成功
+docker version #查看版本
+
+docker run --rm hello-world
+
+#若能正常输出以下信息,则说明安装成功(如图)
+```
+
+
+
+```mysql
+#进入 /opt/Admin.NET/Admin.NET目录
+cd /opt/Admin.NET/Admin.NET
+
+# 创建Dockerfile文件
+cat << EOF > Dockerfile
+# 使用官方的 .NET SDK 镜像作为基础镜像
+FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build
+WORKDIR /app
+
+# 将项目文件复制到镜像中
+COPY . ./
+
+# 运行发布命令
+RUN dotnet publish -c Release -o output --framework net8.0 #进行项目打包
+
+# 使用官方的 .NET 运行时镜像作为基础镜像
+FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS runtime
+WORKDIR /app
+COPY --from=build /app/output ./
+
+# 指定应用程序入口点
+CMD ["dotnet","Admin.NET.Web.Entry.dll"]
+EOF
+
+# 创建docker-compose.yml文件(这个文件不可以有格式错误)
+cat << EOF > docker-compose.yml
+services:
+ admin-net:
+ build:
+ context: .
+ dockerfile: Dockerfile
+ ports:
+ - "5005:5005"
+EOF
+```
+
+```mysql
+#先查看容器ip 我的是 172.17.0.1
+ip route
+```
+
+
+
+```mysql
+#修改配置文件
+vim /etc/nginx/sites-available/default
+```
+
+
+
+```mysql
+#重启nginx
+systemctl restart nginx
+```
+
+```mysql
+#下载docker-compose
+apt install docker-compose
+#运行docker容器 效果如图
+
+#进入/opt/Admin.NET/Admin.NET目录,执行以下命令
+cd /opt/Admin.NET/Admin.NET
+docker-compose up --build
+
+docker-compose up -d
+```
+
+
+
+## 修改 Docker 配置
+
+1. 限制日志文件大小,防止 Docker 日志塞满硬盘
+2. 添加docker构建镜像的国内源,加速使用,不然docker build 会泪奔
+
+```mysql
+cat > /etc/docker/daemon.json << EOF
+{
+ "registry-mirrors": [
+ "https://do.nark.eu.org",
+ "https://dc.j8.work",
+ "https://docker.m.daocloud.io",
+ "https://dockerproxy.com",
+ "https://docker.mirrors.ustc.edu.cn",
+ "https://docker.nju.edu.cn"
+ ],
+ "log-driver": "json-file",
+ "log-opts": {
+ "max-size": "20m",
+ "max-file": "3"
+ }
+}
+EOF
+```
+
+以上配置会增加一段自定义内网 IPv6 地址,开启容器的 IPv6 功能,以及限制日志文件大小
+
+## 重载Docker服务配置并重启Docker服务
+
+```mysql
+ systemctl daemon-reload && systemctl restart docker
+```
\ No newline at end of file
diff --git "a/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\344\272\214/PHP\357\274\210docker\357\274\211.md" "b/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\344\272\214/PHP\357\274\210docker\357\274\211.md"
new file mode 100644
index 0000000000000000000000000000000000000000..393b59e61b5f277b08b1e6189921622b790b03e2
--- /dev/null
+++ "b/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\344\272\214/PHP\357\274\210docker\357\274\211.md"
@@ -0,0 +1,192 @@
+# Debian12部署Docker运行环境
+
+以下操作需要在 root 用户下完成,请切换到 root 用户进行操作。 首先,安装一些必要的软件包:
+
+```mysql
+apt update
+apt upgrade -y
+apt install curl vim wget gnupg dpkg apt-transport-https lsb-release ca-certificates
+
+```
+
+### 然后加入 Docker 的 GPG 公钥和 apt 源:
+
+```mysql
+# 通过阿里云得Docker 的 GPG 公钥 保存到/usr/share/keyrings/docker-ce.gpg
+curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/debian/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-ce.gpg
+# 配置公钥和apt 源
+echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-ce.gpg] https://mirrors.aliyun.com/docker-ce/linux/debian $(lsb_release -sc) stable" > /etc/apt/sources.list.d/docker.list
+# 以上操作会生成一个/etc/apt/sources.list.d/docker.list
+```
+
+### 然后更新系统后即可用apt 安装 Docker CE 和 Docker Compose 插件:
+
+```mysql
+apt update
+apt install docker-ce docker-ce-cli containerd.io docker-compose-plugin
+
+```
+
+此时可以使用 `docker version` 命令检查是否安装成功:
+
+```mysql
+# docker version
+Client: Docker Engine - Community
+ Version: 27.1.1
+ API version: 1.46
+ Go version: go1.21.12
+ Git commit: 6312585
+ Built: Tue Jul 23 19:57:19 2024
+ OS/Arch: linux/amd64
+ Context: default
+
+Server: Docker Engine - Community
+ Engine:
+ Version: 27.1.1
+ API version: 1.46 (minimum version 1.24)
+ Go version: go1.21.12
+ Git commit: cc13f95
+ Built: Tue Jul 23 19:57:19 2024
+ OS/Arch: linux/amd64
+ Experimental: false
+ containerd:
+ Version: 1.7.19
+ GitCommit: 2bf793ef6dc9a18e00cb12efb64355c2c9d5eb41
+ runc:
+ Version: 1.7.19
+ GitCommit: v1.1.13-0-g58aa920
+ docker-init:
+ Version: 0.19.0
+ GitCommit: de40ad0
+
+```
+
+因为我们已经安装了 `docker-compose-plugin`,所以 Docker 目前已经自带 `docker compose` 命令
+
+```mysql
+root@debian ~ # docker compose version
+Docker Compose version v2.29.1
+```
+
+### 如果某些镜像或命令不兼容,则我们还可以单独安装 Docker Compose:
+
+```mysql
+# 下载二进制文件,另存为 /usr/local/bin/docker-compose
+wget -L https://github.com/docker/compose/releases/latest/download/docker-compose-Linux-x86_64 > /usr/local/bin/docker-compose
+# 添加 执行 权限
+
+chmod +x /usr/local/bin/docker-compose
+
+```
+
+注意以上 github.com 网址访问 会时好时不好,多试几次,或想办法用国内镜像下载
+
+此时可以使用 `docker-compose version` 命令检查是否安装成功:
+
+```mysql
+root@debian ~ # docker-compose version
+Docker Compose version v2.29.1
+```
+
+## 修改 Docker 配置
+
+我们要
+
+1. 限制日志文件大小,防止 Docker 日志塞满硬盘 (泪的教训)
+2. 添加docker构建镜像的国内源,加速使用,不然docker build 会泪奔
+
+```mysql
+cat > /etc/docker/daemon.json << EOF
+{
+ "registry-mirrors": [
+ "https://do.nark.eu.org",
+ "https://dc.j8.work",
+ "https://docker.m.daocloud.io",
+ "https://dockerproxy.com",
+ "https://docker.mirrors.ustc.edu.cn",
+ "https://docker.nju.edu.cn"
+ ],
+ "log-driver": "json-file",
+ "log-opts": {
+ "max-size": "20m",
+ "max-file": "3"
+ }
+}
+EOF
+
+```
+
+## 重载Docker服务配置并重启Docker服务
+
+```mysql
+ systemctl daemon-reload && systemctl restart docker
+```
+
+## PHP
+
+- 编辑配置文件
+
+```mysql
+git clone https://gitee.com/meystack/swiftadmin.git #下载项目
+
+cd swiftadmin #进入项目根目录
+
+创建和编辑Dockerfile文件
+vim Dockerfile
+
+FROM php:8.1-cli
+RUN echo "deb http://mirrors.ustc.edu.cn/debian/ buster main" > /etc/apt/sources.list
+RUN sed -i 's/deb.debian.org/mirrors.ustc.edu.cn/g' /etc/apt/sources.list
+RUN apt-get update -y
+RUN apt-get install -y \
+ redis-server \
+ libpng-dev \
+ libzip-dev \
+ libcurl4-openssl-dev
+RUN docker-php-ext-install \
+ zip \
+ pcntl \
+ gd \
+ bcmath \
+ pdo_mysql \
+ mysqli \
+ opcache \
+ exif \
+ curl
+RUN pecl install redis && docker-php-ext-enable redis
+COPY . /app
+WORKDIR /app
+RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
+RUN composer install --no-autoloader --no-scripts
+EXPOSE 8787
+CMD ["sh", "-c", "redis-server --supervised no & php start.php start"]
+```
+
+- 拉取、启动mysql、redis镜像
+
+```sh
+#拉取
+docker pull mysql
+docker pull redis
+#启动
+docker run -itd --name mysql-test -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql
+docker run --name some-redis -p 6379:6379 -d redis
+```
+
+- 构建镜像
+
+```sh
+docker build -t swift .
+```
+
+- 根据构建的镜像创建运行容器:
+
+```mysql
+docker run -d --name test-swift -p 8787:8787 swift
+docker ps #查看正在运行的容器
+
+#浏览器访问
+http://自己虚拟机的IP:8787
+#进入之后选择页面 有个127.0.0.1 换成自己虚拟机的IP
+```
+
diff --git "a/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\344\272\214/docker\351\203\250\347\275\262nodejs.md" "b/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\344\272\214/docker\351\203\250\347\275\262nodejs.md"
new file mode 100644
index 0000000000000000000000000000000000000000..5d7e74bceb9ff4a8faa64a23bf455347b61f9406
--- /dev/null
+++ "b/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\344\272\214/docker\351\203\250\347\275\262nodejs.md"
@@ -0,0 +1,80 @@
+## Nodejs
+
+- 环境部署
+
+```sh
+apt update
+apt install curl
+apt install nginx
+apt install sqlite3
+```
+
+```sh
+#下载安装脚本
+curl -fsSL https://deb.nodesource.com/setup_20.x -o nodesource_setup.sh
+
+#运行安装脚本
+bash nodesource_setup.sh
+
+#安装Node.js
+apt update
+apt install nodejs
+
+node -v #查看版本
+```
+
+- 使用npx安装依赖
+
+```sh
+#需要换源,不然下载很慢
+npm config set registry https://registry.npmmirror.com
+
+#安装依赖
+npx create-strapi-app@latest my-project #my-project 这个名字可以自己定义,如果出错,可能是网络问题,删掉项目,重新下载
+
+
+#出现如下情况
+Need to install the following packages:
+create-strapi-app@4.25.5
+Ok to proceed? (y) #输入y
+
+? Choose your installation type (Use arrow keys)
+❯ Quickstart (recommended) #选择这个,回车键确认,键盘上下键可以进行选择,默认使用sqlite3数据库,前面已经安装过
+ Custom (manual settings)
+
+? Please log in or sign up.
+ Login/Sign up
+❯ Skip #选择这个,回车键确认,键盘上下键可以进行选择
+
+#完成依赖安装之后,会出现如下情况
+ Project information
+
+┌────────────────────┬──────────────────────────────────────────────────┐
+│ Time │ Sat Jul 27 2024 18:40:30 GMT+0800 (China Standa… │
+│ Launched in │ 1204 ms │
+│ Environment │ development │
+│ Process PID │ 9240 │
+│ Version │ 4.25.5 (node v20.16.0) │
+│ Edition │ Community │
+│ Database │ sqlite │
+└────────────────────┴──────────────────────────────────────────────────┘
+
+ Actions available
+
+One more thing...
+Create your first administrator 💻 by going to the administration panel at:
+
+┌─────────────────────────────┐
+│ http://localhost:1337/admin │ #使用这个地址去浏览器访问 http://192.168.1.145:1337/admin localhost换成自己虚拟机的ip
+└─────────────────────────────┘
+
+#如果关掉之后,想要再次进入
+#安装完成之后会有个my-project目录
+cd my-project
+
+#启动运行
+npm run develop
+
+使用这个地址去浏览器访问 http://192.168.1.145:1337/admin localhost换成自己虚拟机的ip
+```
+
diff --git "a/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\344\272\214/img/C#\346\265\213\350\257\225.png" "b/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\344\272\214/img/C#\346\265\213\350\257\225.png"
new file mode 100644
index 0000000000000000000000000000000000000000..77f739a0426838bf18d79a6af7f77a04cbe2dcc6
Binary files /dev/null and "b/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\344\272\214/img/C#\346\265\213\350\257\225.png" differ
diff --git "a/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\344\272\214/img/C#\351\203\250\347\275\262\346\212\245\351\224\2311.png" "b/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\344\272\214/img/C#\351\203\250\347\275\262\346\212\245\351\224\2311.png"
new file mode 100644
index 0000000000000000000000000000000000000000..d7611d46a4c7a5a8c5e75c87a176450546cc0937
Binary files /dev/null and "b/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\344\272\214/img/C#\351\203\250\347\275\262\346\212\245\351\224\2311.png" differ
diff --git "a/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\344\272\214/img/C#\351\203\250\347\275\262\346\212\245\351\224\2312.png" "b/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\344\272\214/img/C#\351\203\250\347\275\262\346\212\245\351\224\2312.png"
new file mode 100644
index 0000000000000000000000000000000000000000..4db0c5e5e42f3fc0e35a6b41229becc8481af0c8
Binary files /dev/null and "b/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\344\272\214/img/C#\351\203\250\347\275\262\346\212\245\351\224\2312.png" differ
diff --git "a/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\344\272\214/img/C#\351\203\250\347\275\262\346\212\245\351\224\2313.png" "b/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\344\272\214/img/C#\351\203\250\347\275\262\346\212\245\351\224\2313.png"
new file mode 100644
index 0000000000000000000000000000000000000000..52e36283ea923eaf70b4cec38cc1534f1f7db23a
Binary files /dev/null and "b/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\344\272\214/img/C#\351\203\250\347\275\262\346\212\245\351\224\2313.png" differ
diff --git "a/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\344\272\214/img/c#\351\203\250\347\275\262.png" "b/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\344\272\214/img/c#\351\203\250\347\275\262.png"
new file mode 100644
index 0000000000000000000000000000000000000000..f1d2f25d51b5bd44441e478cdfb6ee69af525901
Binary files /dev/null and "b/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\344\272\214/img/c#\351\203\250\347\275\262.png" differ
diff --git "a/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\344\272\214/img/\345\211\215\347\253\257\346\223\215\344\275\234.png" "b/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\344\272\214/img/\345\211\215\347\253\257\346\223\215\344\275\234.png"
new file mode 100644
index 0000000000000000000000000000000000000000..b4cdfbf1728675651343d17e721ea7ad02dcb374
Binary files /dev/null and "b/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\344\272\214/img/\345\211\215\347\253\257\346\223\215\344\275\234.png" differ
diff --git "a/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\344\272\214/img/\345\211\215\347\253\257\346\265\213\350\257\225\347\231\273\345\275\225\351\241\265\351\235\242.png" "b/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\344\272\214/img/\345\211\215\347\253\257\346\265\213\350\257\225\347\231\273\345\275\225\351\241\265\351\235\242.png"
new file mode 100644
index 0000000000000000000000000000000000000000..8bef43a7a528b8c596739dfe6cb34cbd1952955b
Binary files /dev/null and "b/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\344\272\214/img/\345\211\215\347\253\257\346\265\213\350\257\225\347\231\273\345\275\225\351\241\265\351\235\242.png" differ
diff --git "a/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\344\272\214/img/\345\220\216\347\253\257\346\223\215\344\275\234.png" "b/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\344\272\214/img/\345\220\216\347\253\257\346\223\215\344\275\234.png"
new file mode 100644
index 0000000000000000000000000000000000000000..ebd421749906d0126d6fb5e40bd48edae6010075
Binary files /dev/null and "b/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\344\272\214/img/\345\220\216\347\253\257\346\223\215\344\275\234.png" differ
diff --git "a/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\344\272\214/img/\345\256\271\345\231\250ip\346\237\245\347\234\213.png" "b/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\344\272\214/img/\345\256\271\345\231\250ip\346\237\245\347\234\213.png"
new file mode 100644
index 0000000000000000000000000000000000000000..11d6169a2932c9f2adde663c53b70dd02f1db13c
Binary files /dev/null and "b/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\344\272\214/img/\345\256\271\345\231\250ip\346\237\245\347\234\213.png" differ
diff --git "a/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\344\272\214/img/\346\211\247\350\241\214\345\221\275\344\273\244.png" "b/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\344\272\214/img/\346\211\247\350\241\214\345\221\275\344\273\244.png"
new file mode 100644
index 0000000000000000000000000000000000000000..db415e9b34c0c09b82b9e5aeb914ef87e6fba229
Binary files /dev/null and "b/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\344\272\214/img/\346\211\247\350\241\214\345\221\275\344\273\244.png" differ
diff --git "a/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\344\272\214/img/\346\237\245\347\234\213docker\346\230\257\345\220\246\345\256\211\350\243\205\346\210\220\345\212\237.png" "b/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\344\272\214/img/\346\237\245\347\234\213docker\346\230\257\345\220\246\345\256\211\350\243\205\346\210\220\345\212\237.png"
new file mode 100644
index 0000000000000000000000000000000000000000..b1c29f6979945d7f313e53ced12cdf7e52f01337
Binary files /dev/null and "b/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\344\272\214/img/\346\237\245\347\234\213docker\346\230\257\345\220\246\345\256\211\350\243\205\346\210\220\345\212\237.png" differ
diff --git "a/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\344\272\214/img/\346\265\213\350\257\225.png" "b/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\344\272\214/img/\346\265\213\350\257\225.png"
new file mode 100644
index 0000000000000000000000000000000000000000..dd1d55fa28df789818cb3db5250c5eed337f60f9
Binary files /dev/null and "b/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\344\272\214/img/\346\265\213\350\257\225.png" differ
diff --git "a/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\344\272\214/img/\350\277\220\350\241\214docker\345\256\271\345\231\250.png" "b/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\344\272\214/img/\350\277\220\350\241\214docker\345\256\271\345\231\250.png"
new file mode 100644
index 0000000000000000000000000000000000000000..96674f6f91292b97a53dd75a70f0d8e31440a092
Binary files /dev/null and "b/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\344\272\214/img/\350\277\220\350\241\214docker\345\256\271\345\231\250.png" differ
diff --git "a/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\344\272\214/img/\351\205\215\347\275\256\346\226\207\344\273\266\344\277\256\346\224\271.png" "b/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\344\272\214/img/\351\205\215\347\275\256\346\226\207\344\273\266\344\277\256\346\224\271.png"
new file mode 100644
index 0000000000000000000000000000000000000000..9081ac91a32475017371940e243548bb36f27fe7
Binary files /dev/null and "b/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\344\272\214/img/\351\205\215\347\275\256\346\226\207\344\273\266\344\277\256\346\224\271.png" differ
diff --git "a/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\344\272\214/nodejs\357\274\210docker\357\274\211.md" "b/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\344\272\214/nodejs\357\274\210docker\357\274\211.md"
new file mode 100644
index 0000000000000000000000000000000000000000..3b74e6a720ad442a0db49c1177bd6b37c1381f7e
--- /dev/null
+++ "b/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\344\272\214/nodejs\357\274\210docker\357\274\211.md"
@@ -0,0 +1,188 @@
+## docker
+
+```sh
+apt update
+apt install ca-certificates curl
+install -m 0755 -d /etc/apt/keyrings
+
+#下载gnupg
+apt install gnupg
+
+#使用阿里源
+curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/debian/gpg | gpg --dearmor -o /etc/apt/keyrings/docker-archive-keyring.gpg
+
+#向 sources.list 中添加 Docker 软件源
+echo \
+ "deb [arch=amd64 signed-by=/etc/apt/keyrings/docker-archive-keyring.gpg] https://mirrors.aliyun.com/docker-ce/linux/debian \
+ $(lsb_release -cs) stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null
+```
+
+- 安装docker
+
+```sh
+apt update
+apt install docker-ce docker-ce-cli containerd.io docker-compose-plugin
+```
+
+- 启动docker
+
+```sh
+systemctl enable docker
+systemctl start docker
+```
+
+- 建立docker用户组
+
+```sh
+#建立 docker 组
+groupadd docker
+#将当前用户加入 docker 组
+usermod -aG docker $USER
+```
+
+* 修改 Docker 配置
+
+ 1. 限制日志文件大小,防止 Docker 日志塞满硬盘
+ 2. 添加docker构建镜像的国内源,加速使用,不然docker build 会泪奔
+
+ ```mysql
+ cat > /etc/docker/daemon.json << EOF
+ {
+ "registry-mirrors": [
+ "https://do.nark.eu.org",
+ "https://dc.j8.work",
+ "https://docker.m.daocloud.io",
+ "https://dockerproxy.com",
+ "https://docker.mirrors.ustc.edu.cn",
+ "https://docker.nju.edu.cn"
+ ],
+ "log-driver": "json-file",
+ "log-opts": {
+ "max-size": "20m",
+ "max-file": "3"
+ }
+ }
+ EOF
+ ```
+
+ 以上配置会增加一段自定义内网 IPv6 地址,开启容器的 IPv6 功能,以及限制日志文件大小
+
+ ## 重载Docker服务配置并重启Docker服务
+
+ ```mysql
+ systemctl daemon-reload && systemctl restart docker
+ ```
+
+- 测试 Docker 是否安装正确
+
+```sh
+docker version #查看版本
+
+docker run --rm hello-world
+
+#若能正常输出以下信息,则说明安装成功
+Unable to find image 'hello-world:latest' locally
+latest: Pulling from library/hello-world
+b8dfde127a29: Pull complete
+Digest: sha256:308866a43596e83578c7dfa15e27a73011bdd402185a84c5cd7f32a88b501a24
+Status: Downloaded newer image for hello-world:latest
+
+Hello from Docker!
+This message shows that your installation appears to be working correctly.
+
+To generate this message, Docker took the following steps:
+ 1. The Docker client contacted the Docker daemon.
+ 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
+ (amd64)
+ 3. The Docker daemon created a new container from that image which runs the
+ executable that produces the output you are currently reading.
+ 4. The Docker daemon streamed that output to the Docker client, which sent it
+ to your terminal.
+
+To try something more ambitious, you can run an Ubuntu container with:
+ $ docker run -it ubuntu bash
+
+Share images, automate workflows, and more with a free Docker ID:
+ https://hub.docker.com/
+
+For more examples and ideas, visit:
+ https://docs.docker.com/get-started/
+```
+
+## Nodejs
+
+- 环境部署
+
+```sh
+apt update
+apt install curl
+npm install -g npm@10.8.2
+```
+
+```sh
+✖ Authentication failed!
+You are running Node.js 22.5.1
+Strapi requires Node.js >=18.0.0 <=20.x.x
+Please make sure to use the right version of Node.#报错
+
+
+#下载安装脚本(下载版本不能太高)
+curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash -
+
+#运行安装脚本
+bash nodesource_setup.sh
+
+#安装Node.js
+apt update
+apt install nodejs
+```
+
+- 使用npx安装依赖
+
+```sh
+#需要换源,不然下载很慢
+npm config set registry https://registry.npmmirror.com
+
+#安装依赖
+npx create-strapi-app@latest my-project #my-project 这个名字可以自己定义,如果出错,可能是网络问题,删掉项目,重新下载
+```
+
+- 编辑Dockerfile
+
+```sh
+cd my-project #进入项目
+
+vim Dockerfile #创建和编辑文件
+
+from debian:latest
+workdir /app
+copy . .
+run echo 'deb [trusted=yes] http://mirrors.ustc.edu.cn/debian/ sid main contrib non-free' > /etc/apt/sources.list.d/ustc.list && apt-get update -y
+run apt-get install -y curl sudo
+run curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash -
+run apt-get update -y
+run apt-get install -y nodejs
+run npm config set strict-ssl false
+run npm config set registry https://registry.npmmirror.com
+run npm install -g npm@10.8.2
+cmd ["npm","start"]
+```
+
+- 构建镜像
+
+```sh
+docker build --no-cache -t admin . #admin是自定义镜像名
+```
+
+- 运行
+
+```sh
+docker run -d --name my-project -p 1337:1337 admin
+```
+
+- 访问
+
+```sh
+浏览器访问 虚拟机ip:1337 或 虚拟机ip:1337/admin
+```
+
diff --git "a/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\344\272\214/\344\272\206\350\247\243docker.md" "b/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\344\272\214/\344\272\206\350\247\243docker.md"
new file mode 100644
index 0000000000000000000000000000000000000000..90600dc5a250109e6613f679c12c45f0fad950a3
--- /dev/null
+++ "b/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\344\272\214/\344\272\206\350\247\243docker.md"
@@ -0,0 +1,7 @@
+## Docker概念(开源的应用容器引擎)
+
+1. Docker是一个开源的应用容器引擎。
+2. 使用Docker,只需要配置一次Docker容器上面的应用,就可以跨平台,跨服务器,实现应用程序跨平台间的无缝衔接
+3. Docker解决了运行环境和配置问题软件容器,方便持续集成并有助于整体发布的容器虚拟化技术。
+
+https://blog.csdn.net/qq_39241682/article/details/139740223
\ No newline at end of file
diff --git "a/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\344\272\214/\345\256\211\350\243\205docker.md" "b/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\344\272\214/\345\256\211\350\243\205docker.md"
new file mode 100644
index 0000000000000000000000000000000000000000..fb0366a1e7454a92bdee28dbb880630f22de474c
--- /dev/null
+++ "b/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\344\272\214/\345\256\211\350\243\205docker.md"
@@ -0,0 +1,150 @@
+## docker
+
+```sh
+apt update
+apt install ca-certificates curl
+install -m 0755 -d /etc/apt/keyrings
+
+#下载gnupg
+apt install gnupg
+
+#使用阿里源
+curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/debian/gpg | gpg --dearmor -o /etc/apt/keyrings/docker-archive-keyring.gpg
+
+#向 sources.list 中添加 Docker 软件源
+echo \
+ "deb [arch=amd64 signed-by=/etc/apt/keyrings/docker-archive-keyring.gpg] https://mirrors.aliyun.com/docker-ce/linux/debian \
+ $(lsb_release -cs) stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null
+```
+
+- 安装docker
+
+```sh
+apt update
+apt install docker-ce docker-ce-cli containerd.io docker-compose-plugin
+```
+
+- 启动docker
+
+```sh
+systemctl enable docker
+systemctl start docker
+```
+
+- 建立docker用户组
+
+```sh
+#建立 docker 组
+groupadd docker
+#将当前用户加入 docker 组
+usermod -aG docker $USER
+```
+
+- 配置镜像加速器
+
+```sh
+cd /etc/docker
+vim daemon.json #如果没有这个文件就新建一个
+{
+ "registry-mirrors": ["xxxxxx"] #xxxxx是镜像加速地址
+}
+#这是我自己的
+{
+ "registry-mirrors": ["https://jqyv7suv.mirror.aliyuncs.com"]
+}
+#镜像加速地址请登录阿里云获取 阿里云 -> 容器镜像服务 -> 镜像工具 -> 镜像加速器
+
+
+
+#为了防止日志将硬盘塞满,最好用这个,上面那个也可以,但是没这个好
+cat > /etc/docker/daemon.json << EOF
+{
+ "registry-mirrors": [
+ "https://do.nark.eu.org",
+ "https://dc.j8.work",
+ "https://docker.m.daocloud.io",
+ "https://dockerproxy.com",
+ "https://docker.mirrors.ustc.edu.cn",
+ "https://docker.nju.edu.cn"
+ ],
+ "log-driver": "json-file",
+ "log-opts": {
+ "max-size": "20m",
+ "max-file": "3"
+ }
+}
+EOF
+
+#设置完成之后重启服务
+systemctl daemon-reload
+systemctl restart docker
+```
+
+- 测试 Docker 是否安装正确
+
+```sh
+docker version #查看版本
+
+docker run --rm hello-world
+
+#若能正常输出以下信息,则说明安装成功
+Unable to find image 'hello-world:latest' locally
+latest: Pulling from library/hello-world
+b8dfde127a29: Pull complete
+Digest: sha256:308866a43596e83578c7dfa15e27a73011bdd402185a84c5cd7f32a88b501a24
+Status: Downloaded newer image for hello-world:latest
+
+Hello from Docker!
+This message shows that your installation appears to be working correctly.
+
+To generate this message, Docker took the following steps:
+ 1. The Docker client contacted the Docker daemon.
+ 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
+ (amd64)
+ 3. The Docker daemon created a new container from that image which runs the
+ executable that produces the output you are currently reading.
+ 4. The Docker daemon streamed that output to the Docker client, which sent it
+ to your terminal.
+
+To try something more ambitious, you can run an Ubuntu container with:
+ $ docker run -it ubuntu bash
+
+Share images, automate workflows, and more with a free Docker ID:
+ https://hub.docker.com/
+
+For more examples and ideas, visit:
+ https://docs.docker.com/get-started/
+```
+
+## 修改 Docker 配置
+
+1. 限制日志文件大小,防止 Docker 日志塞满硬盘
+2. 添加docker构建镜像的国内源,加速使用,不然docker build 会泪奔
+
+```mysql
+cat > /etc/docker/daemon.json << EOF
+{
+ "registry-mirrors": [
+ "https://do.nark.eu.org",
+ "https://dc.j8.work",
+ "https://docker.m.daocloud.io",
+ "https://dockerproxy.com",
+ "https://docker.mirrors.ustc.edu.cn",
+ "https://docker.nju.edu.cn"
+ ],
+ "log-driver": "json-file",
+ "log-opts": {
+ "max-size": "20m",
+ "max-file": "3"
+ }
+}
+EOF
+```
+
+以上配置会增加一段自定义内网 IPv6 地址,开启容器的 IPv6 功能,以及限制日志文件大小
+
+## 重载Docker服务配置并重启Docker服务
+
+```mysql
+ systemctl daemon-reload && systemctl restart docker
+```
diff --git "a/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\345\233\233/img/20240729150909.png" "b/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\345\233\233/img/20240729150909.png"
new file mode 100644
index 0000000000000000000000000000000000000000..568ea2c28cae44c7ef38d1ed11b2c32c1e9b448c
Binary files /dev/null and "b/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\345\233\233/img/20240729150909.png" differ
diff --git "a/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\345\233\233/img/20240729151640.png" "b/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\345\233\233/img/20240729151640.png"
new file mode 100644
index 0000000000000000000000000000000000000000..820e8a0aff713c934da3ba16ddede77b83931de5
Binary files /dev/null and "b/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\345\233\233/img/20240729151640.png" differ
diff --git "a/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\345\233\233/img/20240729151703.png" "b/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\345\233\233/img/20240729151703.png"
new file mode 100644
index 0000000000000000000000000000000000000000..760f4b15123d9ca55d28f2f31360539c53c9fb2b
Binary files /dev/null and "b/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\345\233\233/img/20240729151703.png" differ
diff --git "a/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\345\233\233/img/20240729151812.png" "b/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\345\233\233/img/20240729151812.png"
new file mode 100644
index 0000000000000000000000000000000000000000..c6fcb547685884d0b8e603a77ed116b210ec5375
Binary files /dev/null and "b/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\345\233\233/img/20240729151812.png" differ
diff --git "a/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\345\233\233/img/20240729155101.png" "b/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\345\233\233/img/20240729155101.png"
new file mode 100644
index 0000000000000000000000000000000000000000..41500c68a0caf43f913839709e8c1aba2ef4e45a
Binary files /dev/null and "b/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\345\233\233/img/20240729155101.png" differ
diff --git "a/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\345\233\233/img/20240729164149.png" "b/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\345\233\233/img/20240729164149.png"
new file mode 100644
index 0000000000000000000000000000000000000000..3b975994390b4c56c174395e3321275f2180abfe
Binary files /dev/null and "b/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\345\233\233/img/20240729164149.png" differ
diff --git "a/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\345\233\233/img/20240729164251.png" "b/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\345\233\233/img/20240729164251.png"
new file mode 100644
index 0000000000000000000000000000000000000000..cb74415c1cd72f89bd10a735fa21f1f2f817d3c5
Binary files /dev/null and "b/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\345\233\233/img/20240729164251.png" differ
diff --git "a/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\345\233\233/img/20240729164312.png" "b/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\345\233\233/img/20240729164312.png"
new file mode 100644
index 0000000000000000000000000000000000000000..c3d54d0d33d40bee0af59d6f3da4854a8fdda2ae
Binary files /dev/null and "b/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\345\233\233/img/20240729164312.png" differ
diff --git "a/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\345\233\233/img/20240729164342.png" "b/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\345\233\233/img/20240729164342.png"
new file mode 100644
index 0000000000000000000000000000000000000000..170cd5594f7221f20836e53f452dd7c0d9236c4d
Binary files /dev/null and "b/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\345\233\233/img/20240729164342.png" differ
diff --git "a/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\345\233\233/img/20240729164403.png" "b/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\345\233\233/img/20240729164403.png"
new file mode 100644
index 0000000000000000000000000000000000000000..caca742ae850f28f5d66fa11ac583bd9f98e7d55
Binary files /dev/null and "b/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\345\233\233/img/20240729164403.png" differ
diff --git "a/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\345\233\233/img/20240729164544.png" "b/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\345\233\233/img/20240729164544.png"
new file mode 100644
index 0000000000000000000000000000000000000000..94858b3b36b9e52373901c39d9ffec755b8cca94
Binary files /dev/null and "b/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\345\233\233/img/20240729164544.png" differ
diff --git "a/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\345\233\233/img/20240729164619.png" "b/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\345\233\233/img/20240729164619.png"
new file mode 100644
index 0000000000000000000000000000000000000000..0db5cb971fe1822acd5e67d2e0ddc2fef6d26f7f
Binary files /dev/null and "b/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\345\233\233/img/20240729164619.png" differ
diff --git "a/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\345\233\233/img/20240729164730.png" "b/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\345\233\233/img/20240729164730.png"
new file mode 100644
index 0000000000000000000000000000000000000000..10891ed23a5416db48dd8405bfbeabceed80d643
Binary files /dev/null and "b/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\345\233\233/img/20240729164730.png" differ
diff --git "a/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\345\233\233/img/20240729164810.png" "b/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\345\233\233/img/20240729164810.png"
new file mode 100644
index 0000000000000000000000000000000000000000..a8ae45b89f309c70b9b1bf731c863f2b4c0f518f
Binary files /dev/null and "b/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\345\233\233/img/20240729164810.png" differ
diff --git "a/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\345\233\233/img/20240729165437.png" "b/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\345\233\233/img/20240729165437.png"
new file mode 100644
index 0000000000000000000000000000000000000000..108514242a59ee7bb6ce828e52ed181494eaec75
Binary files /dev/null and "b/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\345\233\233/img/20240729165437.png" differ
diff --git "a/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\345\233\233/img/20240729165505.png" "b/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\345\233\233/img/20240729165505.png"
new file mode 100644
index 0000000000000000000000000000000000000000..c1f755aacac9748149d0c6ea626f677ac49039da
Binary files /dev/null and "b/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\345\233\233/img/20240729165505.png" differ
diff --git "a/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\345\233\233/img/20240729165551.png" "b/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\345\233\233/img/20240729165551.png"
new file mode 100644
index 0000000000000000000000000000000000000000..6f220e64f9ae5ee5c755f29112baa06b1ac40d52
Binary files /dev/null and "b/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\345\233\233/img/20240729165551.png" differ
diff --git "a/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\345\233\233/img/20240729175807.png" "b/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\345\233\233/img/20240729175807.png"
new file mode 100644
index 0000000000000000000000000000000000000000..a2072d95c8182afc1348b15298a9cd8842aebeec
Binary files /dev/null and "b/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\345\233\233/img/20240729175807.png" differ
diff --git "a/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\345\233\233/img/20240729175838.png" "b/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\345\233\233/img/20240729175838.png"
new file mode 100644
index 0000000000000000000000000000000000000000..4187d0a3e09c80aa86aa0c4029916ff42930b95a
Binary files /dev/null and "b/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\345\233\233/img/20240729175838.png" differ
diff --git "a/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\345\233\233/img/20240729180030.png" "b/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\345\233\233/img/20240729180030.png"
new file mode 100644
index 0000000000000000000000000000000000000000..f2bfd6d0c7678961f64eaaeab2548efcae9648f4
Binary files /dev/null and "b/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\345\233\233/img/20240729180030.png" differ
diff --git "a/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\345\233\233/img/20240729180102.png" "b/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\345\233\233/img/20240729180102.png"
new file mode 100644
index 0000000000000000000000000000000000000000..0c7fbbb9bc83684a857881251b1d3f9b0eb66f8a
Binary files /dev/null and "b/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\345\233\233/img/20240729180102.png" differ
diff --git "a/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\345\233\233/img/20240729180222.png" "b/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\345\233\233/img/20240729180222.png"
new file mode 100644
index 0000000000000000000000000000000000000000..44a574a35e51ae15328946f488af4fe2f689211c
Binary files /dev/null and "b/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\345\233\233/img/20240729180222.png" differ
diff --git "a/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\345\233\233/img/20240729180406.png" "b/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\345\233\233/img/20240729180406.png"
new file mode 100644
index 0000000000000000000000000000000000000000..427ab814c5bc40453a2270054e199523ba32986e
Binary files /dev/null and "b/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\345\233\233/img/20240729180406.png" differ
diff --git "a/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\345\233\233/img/20240729180512.png" "b/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\345\233\233/img/20240729180512.png"
new file mode 100644
index 0000000000000000000000000000000000000000..76c6181b16e6d415d68eca0c1bbeb1c87216fc7a
Binary files /dev/null and "b/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\345\233\233/img/20240729180512.png" differ
diff --git "a/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\345\233\233/img/20240729180635.png" "b/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\345\233\233/img/20240729180635.png"
new file mode 100644
index 0000000000000000000000000000000000000000..07a63d32b9589023abe70fef5040e30a97aec0cb
Binary files /dev/null and "b/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\345\233\233/img/20240729180635.png" differ
diff --git "a/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\345\233\233/img/20240729180709.png" "b/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\345\233\233/img/20240729180709.png"
new file mode 100644
index 0000000000000000000000000000000000000000..4dfa420d430550d5c454acf9844d1bf9133145b6
Binary files /dev/null and "b/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\345\233\233/img/20240729180709.png" differ
diff --git "a/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\345\233\233/img/20240729180805.png" "b/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\345\233\233/img/20240729180805.png"
new file mode 100644
index 0000000000000000000000000000000000000000..7865915858f236692e95ddfe27c9f1c40e2758f2
Binary files /dev/null and "b/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\345\233\233/img/20240729180805.png" differ
diff --git "a/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\345\233\233/img/20240729180911.png" "b/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\345\233\233/img/20240729180911.png"
new file mode 100644
index 0000000000000000000000000000000000000000..1a436e568ccfa59d002ef23ab3fd7876f8552e07
Binary files /dev/null and "b/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\345\233\233/img/20240729180911.png" differ
diff --git "a/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\345\233\233/img/20240729181200.png" "b/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\345\233\233/img/20240729181200.png"
new file mode 100644
index 0000000000000000000000000000000000000000..1b6de741ac02cd7889cf66477b1da3e984652f93
Binary files /dev/null and "b/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\345\233\233/img/20240729181200.png" differ
diff --git "a/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\345\233\233/img/20240729181453.png" "b/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\345\233\233/img/20240729181453.png"
new file mode 100644
index 0000000000000000000000000000000000000000..236054a225176a253fbca196cdd55703669a6201
Binary files /dev/null and "b/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\345\233\233/img/20240729181453.png" differ
diff --git "a/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\345\233\233/img/20240729181535.png" "b/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\345\233\233/img/20240729181535.png"
new file mode 100644
index 0000000000000000000000000000000000000000..5f6528dbb72c0df16735717b40e8fc1a35d2bdff
Binary files /dev/null and "b/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\345\233\233/img/20240729181535.png" differ
diff --git "a/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\345\233\233/img/20240729181658.png" "b/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\345\233\233/img/20240729181658.png"
new file mode 100644
index 0000000000000000000000000000000000000000..274daaf7d0cfc200a648290c55526a467ea48be8
Binary files /dev/null and "b/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\345\233\233/img/20240729181658.png" differ
diff --git "a/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\345\233\233/img/20240729181749.png" "b/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\345\233\233/img/20240729181749.png"
new file mode 100644
index 0000000000000000000000000000000000000000..1816a4f6e96ecda4946214ba321555f3d1b79100
Binary files /dev/null and "b/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\345\233\233/img/20240729181749.png" differ
diff --git "a/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\345\233\233/img/20240729181831.png" "b/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\345\233\233/img/20240729181831.png"
new file mode 100644
index 0000000000000000000000000000000000000000..929043354352112d0c4aaeb230c26e170c993019
Binary files /dev/null and "b/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\345\233\233/img/20240729181831.png" differ
diff --git "a/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\345\233\233/img/20240729182213.png" "b/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\345\233\233/img/20240729182213.png"
new file mode 100644
index 0000000000000000000000000000000000000000..fa5b544cbe40640d1c788241ac3476e29d5ba5a3
Binary files /dev/null and "b/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\345\233\233/img/20240729182213.png" differ
diff --git "a/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\345\233\233/img/20240729182419.png" "b/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\345\233\233/img/20240729182419.png"
new file mode 100644
index 0000000000000000000000000000000000000000..3b30d66dc7886f08221306f4940cc0b7029b98ff
Binary files /dev/null and "b/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\345\233\233/img/20240729182419.png" differ
diff --git "a/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\345\233\233/img/20240729182958.png" "b/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\345\233\233/img/20240729182958.png"
new file mode 100644
index 0000000000000000000000000000000000000000..43da56a42ae9669d49c1ab94695191eeb1370c49
Binary files /dev/null and "b/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\345\233\233/img/20240729182958.png" differ
diff --git "a/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\345\233\233/img/20240729183254.png" "b/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\345\233\233/img/20240729183254.png"
new file mode 100644
index 0000000000000000000000000000000000000000..a81bb6f7c8a6a28f8557171177483859d8d6487f
Binary files /dev/null and "b/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\345\233\233/img/20240729183254.png" differ
diff --git "a/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\345\233\233/img/20240729183430.png" "b/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\345\233\233/img/20240729183430.png"
new file mode 100644
index 0000000000000000000000000000000000000000..4274187a771060b2065572c74508b97b63359d8c
Binary files /dev/null and "b/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\345\233\233/img/20240729183430.png" differ
diff --git "a/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\345\233\233/img/20240729183522.png" "b/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\345\233\233/img/20240729183522.png"
new file mode 100644
index 0000000000000000000000000000000000000000..bac122f36af0d06c1f0e2061ab49c8d89d203be3
Binary files /dev/null and "b/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\345\233\233/img/20240729183522.png" differ
diff --git "a/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\345\233\233/img/20240729183711.png" "b/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\345\233\233/img/20240729183711.png"
new file mode 100644
index 0000000000000000000000000000000000000000..27b4d16bd7c0a9b1df4eec0d445678813d99f28d
Binary files /dev/null and "b/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\345\233\233/img/20240729183711.png" differ
diff --git "a/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\345\233\233/img/image-20240814083400556.png" "b/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\345\233\233/img/image-20240814083400556.png"
new file mode 100644
index 0000000000000000000000000000000000000000..f084dc315f4b89d676d8f66a3ea349a10e862db5
Binary files /dev/null and "b/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\345\233\233/img/image-20240814083400556.png" differ
diff --git "a/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\345\233\233/img/image-20240814083952014.png" "b/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\345\233\233/img/image-20240814083952014.png"
new file mode 100644
index 0000000000000000000000000000000000000000..1434b99aca6533b1f9a0c9b8b8c51f4a6e81d203
Binary files /dev/null and "b/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\345\233\233/img/image-20240814083952014.png" differ
diff --git "a/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\345\233\233/img/image-20240814084356609.png" "b/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\345\233\233/img/image-20240814084356609.png"
new file mode 100644
index 0000000000000000000000000000000000000000..8a3a0a44774a69a46d1f6301c5853d86273b4ba2
Binary files /dev/null and "b/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\345\233\233/img/image-20240814084356609.png" differ
diff --git "a/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\345\233\233/img/image-20240814084601226.png" "b/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\345\233\233/img/image-20240814084601226.png"
new file mode 100644
index 0000000000000000000000000000000000000000..8a8e2b79e6fc032f579dd8cd0e412b171e3a2774
Binary files /dev/null and "b/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\345\233\233/img/image-20240814084601226.png" differ
diff --git "a/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\345\233\233/img/image-20240814090128940.png" "b/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\345\233\233/img/image-20240814090128940.png"
new file mode 100644
index 0000000000000000000000000000000000000000..d184e8dfe42aa5a0839bd59de641799bf042e449
Binary files /dev/null and "b/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\345\233\233/img/image-20240814090128940.png" differ
diff --git "a/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\345\233\233/\346\214\201\347\273\255\351\233\206\346\210\220\344\270\216\344\272\244\344\273\230\357\274\210CI&CD\357\274\211.md" "b/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\345\233\233/\346\214\201\347\273\255\351\233\206\346\210\220\344\270\216\344\272\244\344\273\230\357\274\210CI&CD\357\274\211.md"
new file mode 100644
index 0000000000000000000000000000000000000000..6a40433c90d0e5a9e63a1924ec9a9de91404dfee
--- /dev/null
+++ "b/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\230\266\346\256\265\345\233\233/\346\214\201\347\273\255\351\233\206\346\210\220\344\270\216\344\272\244\344\273\230\357\274\210CI&CD\357\274\211.md"
@@ -0,0 +1,360 @@
+# CI/CD 持续集成与交付
+
+在软件开发过程中,CI/CD 通常指的是持续集成和持续交付或持续部署。CI/CD 通过在应用程序的构建、测试和部署中实施自动化,在开发和运营团队之间架起了桥梁。
+
+> 简单来说,CI/CD 在软件开发的过程中达到了自动化的效果。软件开发完成后通过 CI/CD 可以快速的构建、测试、部署应用。
+
+## 通过 GitHub 实现 CI/CD
+
+参考项目:
+
+1. 拉取仓库后,查看目录可见:
+
+2. 将参考项目拉取到本地主机C盘和D盘都可以)
+
+ 
+
+3. 自己在gitee中新建仓库
+
+ 
+
+4. 将第 1 步拉取仓库下的 .gitignore、package.json、app.js 复制到新拉取的仓库下,并在本机上使用 yarn 拉取依赖:
+
+ ```shell
+ npm config set registry https://registry.npmmirror.com
+ npm i -g yarn
+ yarn
+ ```
+
+ 
+
+ > 使用 yarn 或其他包管理器若报错则需使用管理员权限打开 PowerShell 使用 `set-ExecutionPolicy RemoteSigned` 命令。
+ >
+ > 
+ >
+ > 
+
+ 
+
+ 
+
+ 使用 `node app.js` 命令,查看服务运行:
+
+ 
+
+6. 配置 Webpack 打包:
+
+ - 安装 Webpack、babel 及其依赖:
+
+ > Webpack 是一个模块打包工具,可以将 JavaScript 文件、样式表、图片等资源打包成一个或多个静态文件。
+
+ ```shell
+ npm install --save-dev webpack webpack-cli webpack-node-externals
+ ```
+
+ - 配置打包配置文件:
+
+ 在根目录下创建 `webpack.config.cjs` 文件,并配置以下内容(可以在vscode中操作):
+
+ ```cjs
+ const path = require("path");
+ module.exports = {
+ // 设置为开发模式
+ mode: "development",
+ // 入口文件
+ entry: "./app.js",
+ // 环境
+ target: "node",
+ // 设置输出
+ output: {
+ // 输出目录
+ path: path.resolve(__dirname, "dist"),
+ // 输出文件名
+ filename: "bundle.js",
+ },
+ resolve: {
+ // 解析 .js
+ extensions: [".js"],
+ },
+ };
+ ```
+
+ - 修改 package.json 文件(这边可以在vscode中进行):
+
+ 添加以下内容:
+
+ ```json
+ "scripts": {
+ "build": "webpack --config webpack.config.cjs"
+ }
+ ```
+
+ - 运行打包命令,测试是否成功:
+
+ ```shell
+ npm run build
+ ```
+
+ 
+
+ 根目录下会生成 `dist/bundle.js` 文件。
+
+7. 在项目根目录下嵌套创建 `.github\workflows` 文件夹,并创建 `main.yml` 文件(名称自定义)(这边可以在vscode中进行):
+
+ `main.yml` 文件配置:
+
+ ```yml
+ # CI/CD 项目名称
+ name: Node.js CI/CD
+
+ on:
+ # 监听 push 和 PR 改动
+ push:
+ # 监听 main 分支
+ branches:
+ - main
+ pull_request:
+ branches:
+ - main
+
+ jobs:
+ # 构建
+ build:
+ # 运行环境
+ runs-on: ubuntu-latest
+
+ # 步骤
+ steps:
+ # 将代码仓库复制到工作目录,以便后续的步骤可以访问并操作这些文件
+ - name: 检出仓库
+ uses: actions/checkout@v3
+
+ - name: 安装 Node.js
+ uses: actions/setup-node@v3
+ with:
+ node-version: "20"
+
+ - name: 拉取依赖
+ run: npm install
+
+ - name: 打包项目
+ run: npm run build
+
+ # 将构建过程中生成的文件上传,以便在后续工作中继续使用
+ - name: 上传产品
+ uses: actions/upload-artifact@v3
+ with:
+ name: node-app
+ path: "dist/bundle.js"
+ ```
+
+7. 将仓库更改同步到 gitee上:
+
+ ```shell
+ git add .
+ git commit -m "push"
+ git branch -M main
+ git push -u origin main
+ ```
+
+## 通过 Gitee 实现 CI/CD
+
+1. 查看 Gitee 控制台,选择流水线:
+
+ 
+
+ 点击开通后,选择不创建:
+
+ 
+
+ 点击新建流水线:
+
+ 
+
+ 设置流水线名称和标识:
+
+ 
+
+ 设置监听分支:
+
+ 
+
+ 任务编排,新建任务:
+
+ 
+
+ 选择 Node.js 构建:
+
+ 
+
+ 编辑任务:
+
+ 
+
+ 完成后保存即可:
+
+ 
+
+2. 在本地仓库内:
+
+ ```shell
+ # 拉取更新
+ git pull
+ git add .
+ git commit -m "push"
+ git push
+ ```
+
+3. 提交到远程仓库后,查看流水线:
+
+ 
+
+ 查看构建过程:
+
+ 
+
+ 查看产出:
+
+ 
+
+## CI/CD 实现上传-打包-部署
+
+上述过程中实现了每次提交代码,都会在远程仓库的 CI/CD 任务下完成打包并输出文件,接下来将以 Gitee 为例,实现打包后文件直接部署在服务器上。
+
+示例项目仍为上节中 Node.js 项目,且前期工作(上传-打包)不在此赘述,接着上一步 Gitee 流水线为例。
+
+1. 查看仓库流水线:
+
+ 
+
+2. 编辑流水线:
+
+ 
+
+ 选择任务编排列表,在上一任务节点右侧选择添加新阶段,设置阶段名称:
+
+ 
+
+ 点击新的任务后,添加任务,并选择部署任务:
+
+ 
+
+ 选择主机部署:
+
+ 
+
+3. 进行到上一步后,需要在 Gitee 中配置主机组,接下来以阿里云为例:
+
+ - 查看主机组:
+
+ 前往 查看当前帐号的主机组:
+
+ 
+
+ - 添加主机组:
+
+ 若无主机组的话则需添加,此处以阿里云为例:
+
+ - 选择新建主机组:
+
+ 
+
+ 选择阿里云导入,点击下一步:
+
+ 
+
+ 自定义主机组名称和标识,点击凭证管理:
+
+ 
+
+ 选择新建凭证:
+
+ 
+
+ 选择阿里云,点击下一步后:
+
+ 
+
+ 前往阿里云控制台,获取自己的 AKID 和 AK 密钥,地址:
+
+ 界面如图所示,点击创建 AccessKey 后验证身份,获得 AccessKey:
+
+ > 此步骤弹窗先不要关闭,关闭后无法再获取此 ID 对应密钥!
+
+ 
+
+ - 回到 Gitee 凭证管理,将刚获取到的 AKID 和 AK 填写进去:
+
+ > 地域 ID 对应表,服务器在哪个地域就填哪个 ID:
+ >
+ > 
+
+ 填写完成后如图所示:
+
+ 
+
+ 点击保存即可。
+
+ - 回到新建主机组页面,选择刚创建的凭据:
+
+ 
+
+ 点击下一步,点击开始安装后安装云助手:
+
+ 
+
+ 点击确认后,查看主机组列表:
+
+ 
+
+4. 主机组配置完成后,继续编辑任务:
+
+ 执行主机组中,选择刚才添加的主机组:
+
+ 
+
+ 文件来源选择上游构建产出并选择上传文件:
+
+ 
+
+ 编写部署脚本:
+
+ 
+
+ 
+
+ > 参考脚本:
+ >
+ > ```shell
+ > # 安装 npm
+ > apt install npm -y
+ > # 创建目录
+ > mkdir -p /home/admin/app
+ > # 解压上游产出文件包
+ > tar zxvf ~/gitee_go/deploy/output.tar.gz -C /home/admin/app
+ > # 设置 npm 源为阿里源
+ > npm config set registry http://registry.npmmirror.com
+ > # 安装挂载软件 pm2
+ > npm install -g pm2
+ > # 将 node 项目挂载在 pm2 上
+ > pm2 start /home/admin/app/dist/bundle.js
+ > echo "OK"
+ > ```
+
+ 配置完成后,点击保存并更新:
+
+ 
+
+5. 回到流水线页面,查看正在进行的构建:
+
+ 
+
+ 稍等一会,等待部署完成:
+
+ 
+
+ 访问服务器的 3000 端口查看是否部署并运行:
+
+ > 服务器需先放行 3000 端口。
+
+ 
diff --git "a/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\241\271\347\233\256\350\246\201\346\261\202/8.DevOps\346\214\201\347\273\255\350\277\220\347\273\264\345\271\263\345\217\260.md" "b/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\241\271\347\233\256\350\246\201\346\261\202/8.DevOps\346\214\201\347\273\255\350\277\220\347\273\264\345\271\263\345\217\260.md"
new file mode 100644
index 0000000000000000000000000000000000000000..24a2a4e1c473d7d86d3c5ad3c8b881b3a6600b8f
--- /dev/null
+++ "b/39 \345\221\250\350\211\263/\345\256\236\350\256\255\351\241\271\347\233\256/\345\256\236\346\226\275\351\241\271\347\233\256\344\272\214/\351\241\271\347\233\256\350\246\201\346\261\202/8.DevOps\346\214\201\347\273\255\350\277\220\347\273\264\345\271\263\345\217\260.md"
@@ -0,0 +1,64 @@
+## 阶段一,部署以下不同的语言开发的各种系统,以安装相应的语言运行环境(如C#的SDK或运行时,Java的JDK或运行时)、相应数据等mysql、Postgresql等,来支撑以下应用,不得使用集成环境或工具(如宝塔等,docker容器等)
+
+
+1. C#Web应用:
+
+
+地址:https://gitee.com/zuohuaijun/Admin.NET
+
+
+2. Java Web应用
+
+地址:https://gitee.com/wuxw7/MicroCommunity
+
+
+3. Python Web应用
+
+地址:https://gitee.com/insistence2022/dash-fastapi-admin
+
+
+4. PHP Web应用
+
+地址:https://gitee.com/meystack/swiftadmin
+
+5. Go Web应用
+
+地址:https://gitee.com/tiger1103/gfast
+
+6. NodeJs Web应用
+
+地址:https://strapi.io/
+
+
+## 阶段二,将以上第1、第4、第6个项目,使用容器技术的方式部署到Debian服务器,要求前端正常nginx部署,后端使用Docker,而且必须是自己手写配置文件的形式部署
+
+> 建议,先了解清楚Docker的相关概念和理论,再实践动手,效率更高噢^_^
+
+## 阶段三,在本地虚拟机上,部署一个高可用,并具有横向扩容能力的k8s集群,部署的应用为nginx
+
+要求如下:
+
+1. 先搞明白k8s的一些概念和整体架构,再做一些简单的小部署,比如单台部署,再着手
+2. 虚拟机部署
+
+- 数量:共部署10台虚拟机。
+- 分配:其中2台作为master节点,8台作为node工作节点。
+
+3. IP分配
+
+- Master节点IP:
+ - 虚拟机1:192.168.18.10
+ - 虚拟机2:192.168.18.11
+- Node节点IP(假设使用192.168.18.0/24网络的后续IP地址):
+ - 虚拟机3-10的IP地址可以根据需要分配,例如从192.168.18.20开始连续分配。
+
+## 阶段四:
+
+## 将以下应用,以DeVOps的方式,利用CI/CD搭建流水线,将开发、测试、打包、部署结合起来,简化开发和运维,减少成本
+
+项目地址:https://gitee.com/myhfw003/dev-ops-deployment-project.git
+
+要求:
+
+1. 自行查找适合的平台,用于git托管和接下来的hook平台
+2. 要求master分支有推送,则自动完成测试(如果有)、打包、部署到指定服务器指定目录下的任务
\ No newline at end of file