diff --git a/docs/case/case1.md b/docs/case/case1.md new file mode 100644 index 0000000000..ba94f2a770 --- /dev/null +++ b/docs/case/case1.md @@ -0,0 +1,3 @@ +https://github.com/spiritLHLS/one-click-installation-script + +# 说明与用例稍后补充 \ No newline at end of file diff --git a/docs/case/case2.md b/docs/case/case2.md new file mode 100644 index 0000000000..bf319801dc --- /dev/null +++ b/docs/case/case2.md @@ -0,0 +1,3 @@ +https://github.com/spiritLHLS/ecs + +# 说明与用例稍后补充 \ No newline at end of file diff --git a/docs/case/case3.md b/docs/case/case3.md new file mode 100644 index 0000000000..6b8586f111 --- /dev/null +++ b/docs/case/case3.md @@ -0,0 +1,3 @@ +https://github.com/spiritLHLS/ecsspeed + +# 说明与用例稍后补充 \ No newline at end of file diff --git a/docs/case/case4.md b/docs/case/case4.md new file mode 100644 index 0000000000..49f05c5d63 --- /dev/null +++ b/docs/case/case4.md @@ -0,0 +1,3 @@ +https://github.com/spiritLHLS/Oracle-server-keep-alive-script + +# 说明与用例稍后补充 \ No newline at end of file diff --git a/docs/case/case5.md b/docs/case/case5.md new file mode 100644 index 0000000000..e9d2bc0efa --- /dev/null +++ b/docs/case/case5.md @@ -0,0 +1,3 @@ +https://github.com/spiritLHLS/convoypanel-scripts + +# 说明与用例稍后补充 \ No newline at end of file diff --git a/docs/case/index.md b/docs/case/index.md new file mode 100644 index 0000000000..2e67890c34 --- /dev/null +++ b/docs/case/index.md @@ -0,0 +1,12 @@ +--- +home: true +heroImage: https://raw.githubusercontent.com/spiritlhls/pages/main/logo.jpg +heroText: Linux相关项目 +tagline: 与Linux相关的一些项目 +actionText: 查看项目 → +actionLink: /case/case1 +features: +- title: 注意事项 + details: 注意每个项目说明,部分项目有可能对系统造成不可修复的错误,需要重装系统,请仔细查看说明 +--- +
本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。 diff --git a/docs/components/ComponentInHeader.vue b/docs/components/ComponentInHeader.vue new file mode 100644 index 0000000000..bbccc8ef2e --- /dev/null +++ b/docs/components/ComponentInHeader.vue @@ -0,0 +1,3 @@ + diff --git a/docs/developer/index.md b/docs/developer/index.md new file mode 100644 index 0000000000..2088b59359 --- /dev/null +++ b/docs/developer/index.md @@ -0,0 +1,10 @@ +--- +home: true +heroImage: https://raw.githubusercontent.com/spiritlhls/pages/main/logo.jpg +heroText: 开发手册 +tagline: 欢迎使用一键虚拟化项目开发手册,欢迎你提出高质量的Pull Request,帮助一键虚拟化项目变得更好! +actionText: 开始使用 → +actionLink: /developer/l10n +footer: Copyright © 2023-present oneclickvirt +--- +
本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。 \ No newline at end of file diff --git a/docs/developer/l10n.md b/docs/developer/l10n.md new file mode 100644 index 0000000000..ceaca394a2 --- /dev/null +++ b/docs/developer/l10n.md @@ -0,0 +1,10 @@ +**你可以在开发新功能时遵循以下步骤来支持本地化** + +## 介绍 +1. 你可以直接使用 `/resource/l10n/zh-CN.toml` 中已有的文本配置来替换新功能中的文本 +2. 如果新功能中有新增文本,请参考 `zh-CN.toml` 的配置文本,将新文本拉取到 `zh-CN.toml` 等其他语言的配置文件中,并添加翻译 + +## 新本地化文本的添加 +1. 在 `/resource/l10n/` 中添加新的语言文本配置 +2. 在新的语言文本配置中拉取其他语言已有的文本配置 +3. 为新的语言文本配置添加翻译 \ No newline at end of file diff --git a/docs/en_US/developer/index.md b/docs/en_US/developer/index.md new file mode 100644 index 0000000000..6b7e5c6810 --- /dev/null +++ b/docs/en_US/developer/index.md @@ -0,0 +1,10 @@ +--- +home: true +heroImage: https://raw.githubusercontent.com/spiritlhls/pages/main/logo.jpg +heroText: Development Manual +tagline: Welcome to the Nezha Monitoring Development Manual. +actionText: Start Now → +actionLink: /en_US/developer/l10n +footer: Copyright © 2023-present oneclickvirt +--- +
This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License. diff --git a/docs/en_US/developer/l10n.md b/docs/en_US/developer/l10n.md new file mode 100644 index 0000000000..4de5103ad7 --- /dev/null +++ b/docs/en_US/developer/l10n.md @@ -0,0 +1,10 @@ +**You can follow these steps to support localization when developing new features** + +## Introduction +1. You can directly use the text configuration already available in `/resource/l10n/en-US.toml` to replace the text in the new feature. +2. If there is new text in the new feature, please refer to the configuration text in `en-US.toml`, pull the new text into the configuration files of other languages such as `en-US.toml`, and add translations. + +## Adding a new localized text file +1. Add a new language text configuration in `/resource/l10n/`. +2. Pull existing text configurations from other languages in the new language text configuration. +3. Add translations for the new language text configuration. \ No newline at end of file diff --git a/docs/en_US/guide/dashboard.md b/docs/en_US/guide/dashboard.md new file mode 100644 index 0000000000..93f8113d5f --- /dev/null +++ b/docs/en_US/guide/dashboard.md @@ -0,0 +1,35 @@ +## 准备工作 + +需要虚拟化出服务器,你需要: +1. 一台可以连接公网的服务器( VPS 或 Dedicated Server),最好能完美访问 Github 的 RAW 页面,部分项目部分组件可能未使用 CDN 加速 +::: tip +如果您位于中国大陆,访问 Github 有困难,请注意配套脚本和项目是否有说明已使用 CDN 加速 +::: +2. 本地可以稳定连接SSH,如果不能稳定连接,请使用```screen```命令创建窗口后,在窗口内执行命令 +::: tip +不会用screen命令的,自行查找相关教程学习 +::: +3. 确保服务器的系统和硬件满足对应项目的要求,详见对应项目说明 + +**本文档将以VPS作为范例,且该VPS纯净,无原生环境问题,如有必要请重装系统保证初始环境的纯净** +:::warning +PVE项目可能造成宿主机出现问题,如果你不会看Bug和修复系统,那么不建议你在生产环境中使用,使用PVE相关脚本请确保宿主机随时可重装系统 +::: +
+
+ +## 项目仓库 + +欢迎Star和Fork + +### PVE相关的各种一键脚本 + +[https://github.com/spiritLHLS/pve](https://github.com/spiritLHLS/pve) + +### 通过LXD/LXC命令批量或单独开设NAT服务器以及维护 + +[https://github.com/spiritLHLS/lxc](https://github.com/spiritLHLS/lxc) + +### 通过docker批量或单独开设NAT服务器 + +[https://github.com/spiritLHLS/docker](https://github.com/spiritLHLS/docker) \ No newline at end of file diff --git a/docs/en_US/guide/dashboardq.md b/docs/en_US/guide/dashboardq.md new file mode 100644 index 0000000000..cbde71ff3d --- /dev/null +++ b/docs/en_US/guide/dashboardq.md @@ -0,0 +1,10 @@ + +Give me a cup of coffee. + +https://ko-fi.com/spiritlhl + +USDT-TRC20 + +```bash +TZ7nf8XAL9zQUo63xokazaBdCPeCgPfcwd +``` \ No newline at end of file diff --git a/docs/en_US/guide/docker_build.md b/docs/en_US/guide/docker_build.md new file mode 100644 index 0000000000..2a9e06ea03 --- /dev/null +++ b/docs/en_US/guide/docker_build.md @@ -0,0 +1,106 @@ +## 单独开设 + +下载脚本 + +国际 + +```shell +curl -L https://raw.githubusercontent.com/spiritLHLS/docker/main/scripts/onedocker.sh -o onedocker.sh && chmod +x onedocker.sh +``` + +国内 + +```shell +curl -L https://ghproxy.com/https://raw.githubusercontent.com/spiritLHLS/docker/main/scripts/onedocker.sh -o onedocker.sh && chmod +x onedocker.sh +``` + +运行 + +``` +./onedocker.sh name cpu memory password sshport startport endport system +``` + +目前system仅支持选择alpine或debian,默认是debian + +### 示例 + +* 以下为开设的示例容器的信息: +`容器名字` - test +`SSH登录的用户名` - root +`SSH登录的密码` - 123456 +`CPU核数` - 1 +`内存大小` - 512MB +`SSH端口` - 25000 +`内外网映射端口一致的区间` - 34975到35000 +`系统` - debian + +```shell +./onedocker.sh test 1 512 123456 25000 34975 35000 debian +``` + +删除示例 + +```shell +docker rm -f test +rm -rf test +ls +``` + +进入示例 + +```shell +docker exec -it test /bin/bash +``` + +要退出容器就执行```exit```退出。 + +### 查询信息 + +```shell +cat 容器名字 +``` + +输出格式 + +``` +容器名字 SSH端口 登陆的root密码 核数 内存 外网端口起 外网端口止 +``` + +## 批量开设 + +- 批量多次运行继承配置生成 +- 生成多个时为避免SSH连接中断建议在screen中执行 + +国际 + +```shell +curl -L https://raw.githubusercontent.com/spiritLHLS/docker/main/scripts/dockers.sh -o dockers.sh && chmod +x dockers.sh && bash dockers.sh +``` + +国内 + +```shell +curl -L https://ghproxy.com/https://raw.githubusercontent.com/spiritLHLS/docker/main/scripts/onedocker.sh -o onedocker.sh && chmod +x onedocker.sh +``` + +## 查询批量开设的信息 + +```shell +cat dclog +``` + +输出格式 + +``` +容器名字 SSH端口 登陆的root密码 核数 内存 外网端口起 外网端口止 +``` + +一行一个容器对应的信息 + +## 卸载所有docker容器和镜像 + +```shell +docker rm -f $(docker ps -aq); docker rmi $(docker images -aq) +rm -rf dclog +ls +``` \ No newline at end of file diff --git a/docs/en_US/guide/docker_install.md b/docs/en_US/guide/docker_install.md new file mode 100644 index 0000000000..561787d620 --- /dev/null +++ b/docs/en_US/guide/docker_install.md @@ -0,0 +1,17 @@ +## 环境预设 + +- 检测环境 +- 安装docker +- 下载预制脚本 + +国际 + +```shell +curl -L https://raw.githubusercontent.com/spiritLHLS/docker/main/scripts/pre_build.sh -o pre_build.sh && chmod +x pre_build.sh && bash pre_build.sh +``` + +国内 + +```shell +curl -L https://ghproxy.com/https://raw.githubusercontent.com/spiritLHLS/docker/main/scripts/pre_build.sh -o pre_build.sh && chmod +x pre_build.sh && bash pre_build.sh +``` \ No newline at end of file diff --git a/docs/en_US/guide/docker_precheck.md b/docs/en_US/guide/docker_precheck.md new file mode 100644 index 0000000000..826ead1c05 --- /dev/null +++ b/docs/en_US/guide/docker_precheck.md @@ -0,0 +1,21 @@ +## 项目特点 + +通过docker批量或单独开设NAT服务器(Bulk or individual NAT server provisioning via docker) + +默认使用debian系统,每个容器自带1个外网ssh端口,25个内外网一致端口 + +默认创建的是非特权容器,且不挂载与宿主机的docker的守护进程之间的通信,所以**宿主机创建的docker虚拟化的NAT服务器内无法再嵌套虚拟化docker** + +由于只是在宿主机进行了CPU和内存的限制未在容器内使用cgroup驱动,所以在容器内使用服务器测试脚本检测容器的可用资源是无效的,显示的会是宿主机的资源 + +由于大部分云服务器xfs文件系统不启用pquota选项,所以**默认共享宿主机硬盘,无法限制每个容器的磁盘大小** + +## 配置要求 + +系统可安装docker即可用,网络能连接Github的raw界面就能用,硬件配置只要不拉跨就行,空闲硬盘有3G就行 + +推荐在开设NAT服务器前先增加部分SWAP虚拟内存,避免突发的内存占用导致母鸡卡死 [跳转](https://github.com/spiritLHLS/addswap) + +PS: 如果硬件资源只是好了一点,需要限制更多东西并需要配置IPV6独立地址和限制硬盘大小,可使用LXD批量开LXC虚拟化的容器 [跳转](https://github.com/spiritLHLS/lxc) + +PS: 如果硬件非常好资源很多,可使用PVE批量开KVM虚拟化的虚拟机 [跳转](https://github.com/spiritLHLS/pve) \ No newline at end of file diff --git a/docs/en_US/guide/docker_qa.md b/docs/en_US/guide/docker_qa.md new file mode 100644 index 0000000000..e69de29bb2 diff --git a/docs/en_US/guide/docker_thanks.md b/docs/en_US/guide/docker_thanks.md new file mode 100644 index 0000000000..e69de29bb2 diff --git a/docs/en_US/guide/lxd_extra_config.md b/docs/en_US/guide/lxd_extra_config.md new file mode 100644 index 0000000000..01bb4296b4 --- /dev/null +++ b/docs/en_US/guide/lxd_extra_config.md @@ -0,0 +1,124 @@ +::tip +以下的配置安装会加重母鸡的负担,非必要不要安装 +如果是个人使用,可忽略防滥用部分脚本的安装 +:: + +## 自动配置IPV6地址 + +- (***非必须***,不使用的也没问题) +- **该脚本仅适用于母鸡有给```IPV6```子网且是```/64```的,且母鸡绑定了子网的```第一个IP```做```母鸡的IPV6地址或IPV6的gateway```** +- 自动为LXD创建的LXC容器配置```IPV6```地址 +- 已集成到```buildone.sh```中可使用变量控制且无需事先下载,该脚本可不手动使用,在使用```buildone.sh```时配置Y开启即可 + +下载脚本 + +国际 + +```bash +curl -L https://raw.githubusercontent.com/spiritLHLS/lxc/main/scripts/build_ipv6_network.sh -o build_ipv6_network.sh && chmod +x build_ipv6_network.sh +``` + +国内 + +```shell +curl -L https://ghproxy.com/https://raw.githubusercontent.com/spiritLHLS/lxc/main/scripts/build_ipv6_network.sh -o build_ipv6_network.sh && chmod +x build_ipv6_network.sh +``` + +自动为容器配置IPV6映射地址 + +```bash +bash build_ipv6_network.sh 容器名称 +``` + +映射完毕会打印信息 + +示例(给test容器自动配置IPV6地址,配置完成会写入一个test_v6的文件信息) + +```bash +bash build_ipv6_network.sh test +``` + +删除所有IPV6已映射的规则 + +```bash +ip6tables -t nat -F PREROUTING +ip6tables-legacy -t nat -F PREROUTING +ip6tables-save > /etc/iptables/rules.v6 +netfilter-persistent save +netfilter-persistent reload +service netfilter-persistent restart +``` + +卸载IPV6地址绑定的守护进程和对应的文件 + +```shell +systemctl stop add-ipv6.service +systemctl disable add-ipv6.service +rm /etc/systemd/system/add-ipv6.service +systemctl daemon-reload +rm /usr/local/bin/add-ipv6.sh +``` + +## 屏蔽容易被滥用的端口的出入流量以屏蔽端口和屏蔽滥用工具包 + +- (***非必须***,该脚本仅仅是为了防止容器滥用方便,不装的也没问题) +- 事前预防 + +国际 + +```shell +curl -L https://raw.githubusercontent.com/spiritLHLS/lxc/main/scripts/rules.sh -o rules.sh && chmod +x rules.sh && bash rules.sh +``` + +国内 + +```shell +curl -L https://ghproxy.com/https://raw.githubusercontent.com/spiritLHLS/lxc/main/scripts/rules.sh -o rules.sh && chmod +x rules.sh && bash rules.sh +``` + +##### 使用screen配置监控屏蔽某些进程的执行遇到某些进程的出现直接关闭容器 + +- 如需停止监控可使用```screen```命令停止```lxc_moniter```这个名字的窗口并删除 +- (***非必须***,该脚本仅仅是为了防止容器滥用方便,不装的也没问题) +- 事后停机 + +国际 + +```shell +curl -L https://raw.githubusercontent.com/spiritLHLS/lxc/main/scripts/build_monitor.sh -o build_monitor.sh && chmod +x build_monitor.sh && bash build_monitor.sh +``` + +国内 + +```shell +curl -L https://ghproxy.com/https://raw.githubusercontent.com/spiritLHLS/lxc/main/scripts/build_monitor.sh -o build_monitor.sh && chmod +x build_monitor.sh && bash build_monitor.sh +``` + +##### 一键安装开lxd母鸡所需要的带vnstat环境的常用预配置环境 + +- (***非必须***,该脚本仅仅是为了站点对接监控方便,不装的也没问题) + +国际 + +```shell +curl -L https://raw.githubusercontent.com/spiritLHLS/lxc/main/scripts/backend.sh -o backend.sh && chmod +x backend.sh && bash backend.sh +``` + +国内 + +```shell +curl -L https://ghproxy.com/https://raw.githubusercontent.com/spiritLHLS/lxc/main/scripts/backend.sh -o backend.sh && chmod +x backend.sh && bash backend.sh +``` + +##### 一键安装母鸡可视化操作的面板 + +- (***非必须***,该面板只是为了方便可视化操作,没有也没问题) +- 原作者仓库:[跳转](https://github.com/turtle0x1/LxdMosaic) + +```shell +lxc config set core.https_address [::] +lxc config set core.trust_password some-secret-string +snap install lxdmosaic +``` + +安装完毕后打开母鸡IP地址,按照提示设置admin的密码,其他一路默认就能使用面板了 diff --git a/docs/en_US/guide/lxd_install.md b/docs/en_US/guide/lxd_install.md new file mode 100644 index 0000000000..3dcf856365 --- /dev/null +++ b/docs/en_US/guide/lxd_install.md @@ -0,0 +1,104 @@ +## 手动安装 + +新手推荐,避免有bug不知道怎么修,当然如果只是图方便又是老手懂排查BUG,用后面的一键安装也行 + +### 关闭防火墙 + +```bash +apt update +apt install curl wget sudo dos2unix ufw jq -y +ufw disable +``` + +### 开设虚拟内存SWAP + +内存看你开多少小鸡,这里如果要开8个,换算需要2G内存,实际内存如果是512MB内存,还需要开1.5G,保守点开2G虚拟内存即可 + +执行下面命令,输入1,再输入2048,代表开2G虚拟内存 + +国际 + +```shell +curl -L https://raw.githubusercontent.com/spiritLHLS/lxc/main/scripts/swap.sh -o swap.sh && chmod +x swap.sh && bash swap.sh +``` + +国内 + +```shell +curl -L https://ghproxy.com/https://raw.githubusercontent.com/spiritLHLS/lxc/main/scripts/swap.sh -o swap.sh && chmod +x swap.sh && bash swap.sh +``` + +### 安装LXD + +实际swap开的虚拟内存应该是实际内存的2倍,也就是开1G是合理的,上面我描述的情况属于超开了 + +``` +apt install snapd -y +snap install lxd +/snap/bin/lxd init +``` + +如果上面的命令中出现下面的错误 + +(snap "lxd" assumes unsupported features: snapd2.39 (try to update snapd and refresh the core snap)) + +使用命令修补后再进行lxd的安装 + +``` +snap install core +``` + +如果无异常,上面三行命令执行结果如下 + +![图片](https://user-images.githubusercontent.com/103393591/233270028-5a43d0f7-45f5-4175-969e-d4d182cb877a.png) + +一般的选项回车默认即可 + +选择配置物理盘大小(提示默认最小1GB那个选项),一般我填空闲磁盘大小减去内存大小后乘以0.95并向下取整,这里我填了10GB + +提示带auto的更新image的选项记得选no,避免更新占用系统 + +测试lxc有没有软连接上 + +``` +lxc -h +``` + +如果报错则执行以下命令软连接lxc命令 + +```bash +! lxc -h >/dev/null 2>&1 && echo 'alias lxc="/snap/bin/lxc"' >> /root/.bashrc && source /root/.bashrc +export PATH=$PATH:/snap/bin +``` + +连接后再测试lxc命令是否有报错找不到 + +## 一键安装 + +::tip +如果是全新的服务器,务必保证apt update和apt install curl都无问题再执行本脚本 +且自开机起最好等待5分钟后再执行以下命令,避免系统默认设置中就执行了本脚本导致apt源卡死 +:: +- 环境要求:Ubuntu 18+(推荐),Debian 8+(仅限x86_64架构) + +**如果是Debian系的宿主机,务必在screen中执行本脚本,避免长期运行时SSH中断导致ZFS编译安装失败** + +这里的虚拟内存是说要开的SWAP大小,存储池则是你所有要开的小鸡占的盘的大小的总和 + +环境安装过程中可能需要重启服务器再次执行以加载含zfs的内核,一切以运行后命令行的提示为准 + +国际 + +```shell +curl -L https://raw.githubusercontent.com/spiritLHLS/lxc/main/scripts/lxdinstall.sh -o lxdinstall.sh && chmod +x lxdinstall.sh && bash lxdinstall.sh +``` + +国内 + +```shell +curl -L https://ghproxy.com/https://raw.githubusercontent.com/spiritLHLS/lxc/main/scripts/lxdinstall.sh -o lxdinstall.sh && chmod +x lxdinstall.sh && bash lxdinstall.sh +``` + +例子: + +如果系统盘除去已占用空间还有18G硬盘空余,想开2G虚拟内存(2048MB的SWAP),15G的存储池,按照命令行的提示则依次输入```2048```和```15``` \ No newline at end of file diff --git a/docs/en_US/guide/lxd_lxc.md b/docs/en_US/guide/lxd_lxc.md new file mode 100644 index 0000000000..29ff0806c1 --- /dev/null +++ b/docs/en_US/guide/lxd_lxc.md @@ -0,0 +1,218 @@ +## 普通的批量版本 + +开出的小鸡配置: + +- 1核256MB内存1GB硬盘限速250Mbps带宽 +- 带1个SSH端口,25个外网端口 +- 默认内存和硬盘大小 + +::tip +lxc若命令无问题,执行初始化开小鸡,这一步最好放```screen```中后台挂起执行,开小鸡时长与你开几个和母鸡配置相关 +:: + +执行下面命令加载开机脚本 + +国际 + +```shell +curl -L https://raw.githubusercontent.com/spiritLHLS/lxc/main/scripts/init.sh -o init.sh && chmod +x init.sh && dos2unix init.sh +``` + +国内 + +```shell +curl -L https://ghproxy.com/https://raw.githubusercontent.com/spiritLHLS/lxc/main/scripts/init.sh -o init.sh && chmod +x init.sh && dos2unix init.sh +``` + +下面命令为开小鸡名字前缀为**tj**的**10**个小鸡 + +```shell +./init.sh tj 10 +``` + +有时候init.sh的运行路径有问题,此时建议前面加上sudo强制根目录执行 + +### 只有一个SSH端口的版本 + +开出的小鸡配置: + +- 1核128MB内存300MB硬盘限速200Mbps带宽 +- 只有一个SSH端口 +- 无法挂载warp + +::tip +lxc若命令无问题,执行初始化开小鸡,这一步最好放```screen```中后台挂起执行,开小鸡时长与你开几个和母鸡配置相关 +:: + +加载开机脚本 + +国际 + +```shell +curl -L https://raw.githubusercontent.com/spiritLHLS/lxc/main/scripts/least.sh -o least.sh && chmod +x least.sh && dos2unix least.sh +``` + +国内 + +```shell +curl -L https://ghproxy.com/https://raw.githubusercontent.com/spiritLHLS/lxc/main/scripts/least.sh -o least.sh && chmod +x least.sh && dos2unix least.sh +``` + +下列命令最后一行为开小鸡名字前缀为**tj**的**10**个小鸡 + +```shell +./least.sh tj 10 +``` + +有时候least.sh的运行路径有问题,此时建议前面加上sudo强制根目录执行 + +## 查看已批量开设的信息 + +开完小鸡后,具体信息会生成在当前目录下的log文件中,格式如下 + +```shell +1号服务器名称 密码 ssh端口 外网端口起始 外网端口终止 +2号服务器名称 密码 ssh端口 外网端口起始 外网端口终止 +``` + +如果想要查看,只需在当前目录执行以下命令打印log文件即可 + +```shell +cat log +``` + +::warning +不要拿该脚本开出的小鸡当生产环境,LXC虚拟化不支持换内核,dd,开启bbr等操作 +:: + +## 部分常用LXD命令 + +查看所有 + +```bash +lxc list +``` + +查看个例 + +```bash +lxc info 服务器名字 +``` + +启动个例 + +```bash +lxc start 服务器名字 +``` + +停止个例 + +```bash +lxc stop 服务器名字 +``` + +删除个例 + +```bash +lxc delete -f 服务器名字 +``` + +进入内部 + +```bash +lxc exec 服务器名字 /bin/bash +``` + +退出则输入```exit```回车即可 + +删除所有LXC容器 + +```bash +lxc list | awk '{print $2}' | grep -v "^$" | xargs -I {} lxc delete -f {} +``` + +在容器内执行删除无用日志 + +```bash +sudo apt-get autoremove +sudo apt-get clean +sudo find /var/log -type f -delete +sudo find /var/tmp -type f -delete +sudo find /tmp -type f -delete +sudo find /var/cache/apt/archives -type f -delete +``` + +## 一键脚本老手推荐方便快捷 + +- 只生成一个NAT服务器,可自定义限制所有内容 + +### 只开一个NAT服务器 + +#### 下载开机脚本 + +- (***非必须***,如果你使用过一键安装LXD的命令,自动已下载对应的开机脚本,不用下载该脚本) + +国际 + +```shell +curl -L https://ghproxy.com/https://raw.githubusercontent.com/spiritLHLS/lxc/main/scripts/buildone.sh -o buildone.sh && chmod +x buildone.sh && dos2unix buildone.sh +``` + +国内 + +```shell +curl -L https://ghproxy.com/https://ghproxy.com/https://raw.githubusercontent.com/spiritLHLS/lxc/main/scripts/buildone.sh -o buildone.sh && chmod +x buildone.sh && dos2unix buildone.sh +``` + +##### 开NAT服务器 + +内存大小以MB计算,硬盘大小以GB计算,下载速度上传速度以Mbit计算,是否启用IPV6不一定要填Y或者N,没有这个参数也行 + +如果```外网起端口```和```外网止端口```都设置为0则不做区间外网端口映射了,只映射基础的SSH端口,注意```不能为空```,不进行映射需要设置为0 + +支持自定义小鸡的系统,注意传入参数为系统名字+版本号,如:debian11、ubuntu20,centos8,注意都是小写字母+数字的组合 + +``` +./buildone.sh 小鸡名称 内存大小 硬盘大小 SSH端口 外网起端口 外网止端口 下载速度 上传速度 是否启用IPV6(Y or N) 系统(留空则为debian11) +``` + +示例 + +``` +./buildone.sh test 256 2 20001 20002 20025 300 300 N +``` + +* 以下为开设的示例小鸡的信息: +`小鸡名字` - test +`SSH登录的用户名` - root +`SSH登录的密码` - 随机生成 +`CPU核数` - 1 +`内存大小` - 256MB +`磁盘大小` - 2G +`内外网映射端口一致的区间` - 20002到20025 +`上传带宽` - 300Mbit +`下载带宽` - 300Mbit +`自动设置外网IPV6地址` - N +`系统` - debian11 + +需要查看信息则执行 + +```shell +cat 小鸡名字 +``` + +比如查询示例的信息就是 + +```shell +cat test +``` + +如果已通过以上方法生成过小鸡,还需要批量生成小鸡,可使用手动安装部分的脚本,但注意先删除测试小鸡再进行批量生成小鸡 + +删除测试小鸡 + +```shell +lxc delete -f test +rm -rf test +ls +``` \ No newline at end of file diff --git a/docs/en_US/guide/lxd_precheck.md b/docs/en_US/guide/lxd_precheck.md new file mode 100644 index 0000000000..a27fb914bf --- /dev/null +++ b/docs/en_US/guide/lxd_precheck.md @@ -0,0 +1,40 @@ +## 配置要求 + +硬件要求: +- 系统:Debian 8+, Ubuntu 18+(推荐),系统越新越好 +- 虚拟化:推荐KVM、VMWARE虚拟化 +- 内存:内存至少512MB +- 硬盘:硬盘(系统盘)至少10G +- 网络:独立的IPV4地址,IPV6可有可无,带宽能下载脚本就行,网络能连接Github的raw页面就行 + +PS: 如果硬件非常好资源很多,可使用PVE批量开KVM虚拟化的虚拟机 [跳转](https://github.com/spiritLHLS/pve) + +PS: 如果硬件资源更烂,虚拟化不支持,可使用docker版本的,适配面更广 [跳转](https://github.com/spiritLHLS/docker) + +## 项目特点 + +- 本套脚本开发使用的Ubuntu20,Ubuntu别的长期维护版本应该也没问题,Debian无法使用zfs时自动切换别的存储类型 + +- 已设置同时进行TCP和UDP转发,除了SSH端口其他的映射内网外网端口一致 + +- 已设置支持开出的LXC容器进行docker嵌套虚拟,默认普通版本和纯探针版本使用debian11系统 + +- 已屏蔽容器内可能用于滥用的工具包和IPV4网络的TCP/UDP协议的端口( 3389 8888 54321 65432 ),以防止容器被用于扫描和爆破,且可外置进程检查有问题自动停机 + +- 已支持一键为LXC容器配置IPV6地址(前提是母鸡有IPV6子网,无IPV6地址则不配置) + +- 一定要在 ```/root``` 的路径下运行本仓库脚本,且使用```一键脚本```的**不要删除**路径下的```ssh.sh```和```config.sh```文件 + +- 保证你要开的盘为默认的系统盘(sda或者sda1)而不是挂载的盘(sdb之类的),不确定的使用```fdisk -l```和```df```查看 + +- 挂载其他盘的详看 [其他说明](https://github.com/spiritLHLS/lxc/blob/main/README_other.md) + +- 一键脚本支持自定义限制所有内容,普通版本支持多次运行批量生成不覆盖先前生成的配置 + +## 检测环境 + +**使用后续脚本的务必执行本命令检测母鸡是否符合要求** + +``` +bash <(wget -qO- --no-check-certificate https://raw.githubusercontent.com/spiritLHLS/lxc/main/scripts/pre_check.sh) +``` \ No newline at end of file diff --git a/docs/en_US/guide/lxd_qa.md b/docs/en_US/guide/lxd_qa.md new file mode 100644 index 0000000000..45bf1dca9f --- /dev/null +++ b/docs/en_US/guide/lxd_qa.md @@ -0,0 +1,7 @@ +## 目前已验证可开带独立IPV6地址容器的VPS商家 + +[kuroit](https://my.kuroit.com/aff.php?aff=5) 中的 美国凤凰城 regular + +[datalix](https://t.me/vps_reviews/338) 中的 德国AMD 促销款 + +[luxvps](https://billing.luxvps.xyz/aff.php?aff=36) 中的 德国AMD 促销款 \ No newline at end of file diff --git a/docs/en_US/guide/lxd_thanks.md b/docs/en_US/guide/lxd_thanks.md new file mode 100644 index 0000000000..e843350bff --- /dev/null +++ b/docs/en_US/guide/lxd_thanks.md @@ -0,0 +1,19 @@ +## 致谢 + +https://github.com/lxc/lxd + +https://lxdware.com/ + +https://discuss.linuxcontainers.org/ + +https://discuss.linuxcontainers.org/t/how-to-run-docker-inside-lxc-container/13017/4 + +https://discuss.linuxcontainers.org/t/error-seccomp-notify-not-supported-on-container-start/15038/3 + +https://discuss.linuxcontainers.org/t/how-do-i-assign-a-public-ipv6-address-to-a-lxc-container/6028 + +https://github.com/turtle0x1/LxdMosaic + +https://openzfs.github.io/openzfs-docs/Getting%20Started/Debian/index.html + +感谢 [@Ella-Alinda](https://github.com/Ella-Alinda) [@fscarmen](https://github.com/fscarmen) 提供的指导 \ No newline at end of file diff --git a/docs/en_US/guide/pve_install.md b/docs/en_US/guide/pve_install.md new file mode 100644 index 0000000000..d23fce15d7 --- /dev/null +++ b/docs/en_US/guide/pve_install.md @@ -0,0 +1,74 @@ +## 一键安装PVE + +- 安装的是当下apt源最新的PVE +- 比如debian10则是pve6.4,debian11则是pve7.x,debian12则是pve8.x +::tip +建议debian11而不是debian12,因为后者是beta版本,debian11安装的才是稳定版 +:: +- /etc/hosts文件修改(修正商家hostname设置错误以及新增PVE所需的内容) +- 已设置```/etc/hosts```为只读模式,避免重启后文件被覆写,如需修改请使用```chattr -i /etc/hosts```取消只读锁定,修改完毕请执行```chattr +i /etc/hosts```只读锁定 +- 检测```/etc/cloud/cloud.cfg```如果发现```preserve_hostname```是```false```,则改为```true```,同上,也用chattr命令进行了文件锁定避免重启覆盖设置 +- 检测是否为中国IP,如果为中国IP使用清华镜像源,否则使用官方源 +- 安装PVE开虚拟机需要的必备工具包 +- 替换apt源中的企业订阅为社区源 +- 打印查询Linux系统内核和PVE内核是否已安装 +- 检测```/etc/resolv.conf```是否为空,为空则设置检测```8.8.8.8```的开机自启添加DNS的systemd服务 +- 新增PVE的APT源链接后,下载PVE并打印输出登陆信息 + +国际 + +```shell +curl -L https://raw.githubusercontent.com/spiritLHLS/pve/main/scripts/install_pve.sh -o install_pve.sh && chmod +x install_pve.sh && bash install_pve.sh +``` + +国内 + +```shell +curl -L https://ghproxy.com/https://raw.githubusercontent.com/spiritLHLS/pve/main/scripts/install_pve.sh -o install_pve.sh && chmod +x install_pve.sh && bash install_pve.sh +``` + +## 预配置环境 + +- 创建资源池mypool +- 移除订阅弹窗 +- 尝试开启硬件直通 +- 检测AppArmor模块并试图安装 +- 重启系统前推荐挂上[nezha探针](https://github.com/naiba/nezha)方便在后台不通过SSH使用命令行,避免SSH可能因为商家奇葩的预设导致重启后root密码丢失 +- **执行完毕建议等待几分钟后再重启服务器**,执行```reboot```前需要等待后台任务执行完毕,一些宿主机的系统apt命令执行很慢,得等一会才能执行完毕 + +国际 + +```shell +bash <(wget -qO- --no-check-certificate https://raw.githubusercontent.com/spiritLHLS/pve/main/scripts/build_backend.sh) +``` + +国内 + +```shell +bash <(wget -qO- --no-check-certificate https://ghproxy.com/https://raw.githubusercontent.com/spiritLHLS/pve/main/scripts/build_backend.sh) +``` + +### 自动配置宿主机的网关 + +::warning +使用前请保证重启过服务器且此时PVE能正常使用WEB端再执行,重启机器后不要立即执行此命令,待WEB端启动成功后至少等5分钟再执行本命令 +这一步是最容易造成SSH断开的,原因是未等待PVE内核启动就修改网络会造成设置冲突,所以至少等几分钟待内核启动也就是WEB端启动成功后再执行 +:: +- 创建vmbr0,母鸡允许addr和gateway为内网IP或外网IP,已自动识别 +- vmbr0创建支持纯IPV4或双栈服务器,自动识别IPV4地址和IPV6地址,自动识别对应的IP区间 +- 创建vmbr1(NAT网关) +- 开NAT虚拟机时网关(IPV4)使用```172.16.1.1```,IPV4/CIDR使用```172.16.1.x/24```,这里的x不能是1,当然如果后续使用本套脚本无需关注这点细枝末节的东西 +- 想查看完整设置可以执行```cat /etc/network/interfaces```查看 +- 加载iptables并设置回源且允许NAT端口转发 + +国际 + +```shell +bash <(wget -qO- --no-check-certificate https://raw.githubusercontent.com/spiritLHLS/pve/main/scripts/build_nat_network.sh) +``` + +国内 + +```shell +bash <(wget -qO- --no-check-certificate https://ghproxy.com/https://raw.githubusercontent.com/spiritLHLS/pve/main/scripts/build_nat_network.sh) +``` \ No newline at end of file diff --git a/docs/en_US/guide/pve_kvm.md b/docs/en_US/guide/pve_kvm.md new file mode 100644 index 0000000000..a039b91604 --- /dev/null +++ b/docs/en_US/guide/pve_kvm.md @@ -0,0 +1,196 @@ +## 部分注意事项 + +**执行本项目的第一个检测环境的命令**,展示如下 + +
+![coode](/images/pve_kvm/pve_kvm_1.png) +
+ +查询如上的只需使用下面的一键脚本自动创建虚拟机即可,无需手动再修改WEB端设置 + +
+![coode](/images/pve_kvm/pve_kvm_2.png) +
+ +查询如上的在使用后续脚本创建了虚拟机后,**可能**需要手动修改WEB端设置,需要关闭对应每个虚拟机的硬件嵌套虚拟化,如下图 + +
+![coode](/images/pve_kvm/pve_kvm_3.png) +
+ +先停止虚拟机再修改,修改完后再开机才能使用NOVNC,不关闭**可能**导致这个虚拟机有BUG无法使用 + +如果强行安装PVE开KVM,启动不了的也可以关闭这个选项试试能不能启动虚拟机 + +### 单独开设KVM虚拟化的VM + +- 自动开设NAT服务器,默认使用Debian10镜像,因为该镜像占用最小 +- 可在命令中自定义需要使用的镜像,这里有给出配置好的镜像,镜像自带空间设置是2~10G硬盘,日常使用**至少10G以上**即可,除非某些镜像开不起来再增加硬盘大小 +- 可在命令中指定存储盘位置,默认不指定时为local盘即系统盘,可指定为PVE中显示的挂载盘 +- 自定义内存大小推荐512MB内存 +::tip +需要注意的是宿主机内存记得开点swap免得机器炸了[开SWAP点我跳转](https://github.com/spiritLHLS/addswap) +:: +- 自动进行内外网端口映射,含22,80,443端口以及其他25个内外网端口号一样的端口 +- 生成后需要等待一段时间虚拟机内部的cloud-init配置好网络以及登陆信息,大概需要5分钟 +- 虚拟机的相关信息将会存储到WEB端对应VM的NOTES中,可在WEB端查看 + +国际 + +```shell +curl -L https://raw.githubusercontent.com/spiritLHLS/pve/main/scripts/buildvm.sh -o buildvm.sh && chmod +x buildvm.sh +``` + +国内 + +```shell +curl -L https://ghproxy.com/https://raw.githubusercontent.com/spiritLHLS/pve/main/scripts/buildvm.sh -o buildvm.sh && chmod +x buildvm.sh +``` + +#### 使用方法 + +- 系统支持:详见 [跳转](https://github.com/spiritLHLS/Images/releases/tag/v1.0) 中列出的系统,使用时只需写文件名字,不需要.qcow2尾缀 +::tip +注意这里的用户名不能是纯数字,会造成cloudinit出问题,最好是纯英文或英文开头 +:: + +```shell +./buildvm.sh VMID 用户名 密码 CPU核数 内存 硬盘 SSH端口 80端口 443端口 外网端口起 外网端口止 系统 存储盘 +``` + +#### 测试示例 + +* 以下为开设的示例VM的信息: +`VMID` - 102 +`SSH登录的用户名` - test1 +`SSH登录的密码` - 1234567 +`CPU核数` - 1 +`内存大小` - 512MB +`磁盘大小` - 10G +`SSH端口` - 40001 +`80端口` - 40002 +`443端口` - 40003 +`内外网映射端口一致的区间` - 50000到50025 +`系统` - ubuntu20 +`宿主机的存储盘` - local + +```shell +./buildvm.sh 102 test1 1234567 1 512 10 40001 40002 40003 50000 50025 ubuntu20 local +``` + +开设完毕可执行```cat vm102```查看信息,或到WEB端对应VM的NOTES中查看 + +#### 删除示例 + +- 停止VM +- 删除VM +- 删除端口映射 +- 重启网络 +- 删除log文件 + +```shell +qm stop 102 +qm destroy 102 +iptables -t nat -F +iptables -t filter -F +service networking restart +systemctl restart networking.service +rm -rf vm102 +``` + +#### 相关qcow2镜像 + +- 已预安装开启cloudinit,开启SSH登陆,预设值SSH监听V4和V6的22端口,开启允许密码验证登陆,开启允许ROOT登陆 + +目前使用的镜像列表为 + +[https://github.com/spiritLHLS/Images/releases/tag/v1.0](https://github.com/spiritLHLS/Images/releases/tag/v1.0) + +### 批量开设NAT的KVM虚拟化的VM + +::warning +初次使用前需要保证当前PVE纯净且宿主机未进行过任何端口映射,否则设置冲突可能出现BUG +开设前请使用screen挂起执行,避免批量开设时间过长,SSH不稳定导致中间执行中断 +:: +- 可多次运行批量生成VM +- 自动开设NAT服务器,选项留空默认使用debian11镜像,可自定义使用镜像名字,支持的系统名字详见上文支持的镜像列表 +- 自动进行内外网端口映射,含22,80,443端口以及其他25个内外网端口号一样的端口 +- 生成后需要等待一段时间虚拟机内部的cloudinit配置好网络以及登陆信息,大概需要5分钟,每个虚拟机创建之间有间隔等待60秒避免突发性能不足 +- 默认批量开设的虚拟机网络配置为:22,80,443端口及一个25个端口区间的内外网映射 +- 可自定义批量开设的核心数,内存大小,硬盘大小,使用宿主机哪个存储盘,记得自己计算好空闲资源开设 +- 虚拟机的相关信息将会存储到WEB端对应VM的NOTES中,可在WEB端查看 + +国际 + +```shell +curl -L https://raw.githubusercontent.com/spiritLHLS/pve/main/scripts/create_vm.sh -o create_vm.sh && chmod +x create_vm.sh && bash create_vm.sh +``` + +国内 + +```shell +curl -L https://ghproxy.com/https://raw.githubusercontent.com/spiritLHLS/pve/main/scripts/create_vm.sh -o create_vm.sh && chmod +x create_vm.sh && bash create_vm.sh +``` + +开设完毕可执行```cat vmlog```查看信息,或到WEB端对应VM的NOTES中查看 + +#### 删除所有VM + +- 删除所有VM +- 删除所有nat的端口映射 +- 重启网络 +- 删除log文件 + +```shell +for vmid in $(qm list | awk '{if(NR>1) print $1}'); do qm stop $vmid; qm destroy $vmid; rm -rf /var/lib/vz/images/$vmid*; done +iptables -t nat -F +iptables -t filter -F +service networking restart +systemctl restart networking.service +rm -rf vmlog +``` + +::tip +PVE修改VM配置前都得停机先,再修改配置,修改完再启动,免得出现配置重载错误 +:: + +### 开设独立IPV4地址的VM + +::warning +使用前需要保证当前宿主机的IP段带了至少2个IP,且有空余的IP未配置,该空余的IP未绑定宿主机 +开设前请使用screen挂起执行,避免开设时间过长,SSH不稳定导致中间执行中断 +:: +- 自动检测可用的IP区间,通过ping检测空余可使用的IP,选取其中之一绑定到虚拟机上 +- 系统的相关信息将会存储到对应的虚拟机的NOTE中,可在WEB端查看 + +国际 + +```shell +curl -L https://raw.githubusercontent.com/spiritLHLS/pve/main/scripts/buildvm_extraip.sh -o buildvm_extraip.sh && chmod +x buildvm_extraip.sh +``` + +国内 + +```shell +curl -L https://ghproxy.com/https://raw.githubusercontent.com/spiritLHLS/pve/main/scripts/buildvm_extraip.sh -o buildvm_extraip.sh && chmod +x buildvm_extraip.sh +``` + +#### 创建示例 + +```shell +./buildvm_extraip.sh VMID 用户名 密码 CPU核数 内存大小以MB计算 硬盘大小以GB计算 系统 存储盘 +``` + +```shell +./buildvm_extraip.sh 152 test1 1234567 1 1024 10 ubuntu20 local +``` + +上述命令意义为开设一个带独立IPV4地址的虚拟机,VMID是152,用户名是test1,密码是1234567,CPU是1核,内存是1024MB,硬盘是10G,系统是Ubuntu20,存储盘是local盘也就是系统盘 + +### 删除示例 + +```shell +qm stop 152 +qm destroy 152 +rm -rf vm152 +``` diff --git a/docs/en_US/guide/pve_lxc.md b/docs/en_US/guide/pve_lxc.md new file mode 100644 index 0000000000..955a56b81d --- /dev/null +++ b/docs/en_US/guide/pve_lxc.md @@ -0,0 +1,120 @@ +## 单独开设LXC虚拟化的CT + +::warning +初次使用前需要保证当前PVE纯净且宿主机未进行过任何端口映射,否则设置冲突可能出现BUG +开设前请使用screen挂起执行,避免批量开设时间过长,SSH不稳定导致中间执行中断 +:: +- 自动开设NAT服务器,默认使用Debian11镜像,也可自定义系统 +- 自动进行内外网端口映射,含22,80,443端口以及其他25个内外网端口号一样的端口 +- 生成后需要等待一段时间虚拟机内部配置好网络以及登陆信息,大概需要3分钟 +- 默认开设的网络配置为:22,80,443端口及一个25个端口区间的内外网映射 +- 可自定义开设的核心数,内存大小,硬盘大小,使用宿主机哪个存储盘,记得自己计算好空闲资源开设 +- 可在命令中指定存储盘位置,默认不指定时为local盘即系统盘,可指定为PVE中显示的挂载盘 +- 开设的CT默认已启用SSH且允许root登陆,且已设置支持使用docker的嵌套虚拟化 +- 容器的相关信息将会存储到对应的容器的NOTE中,可在WEB端查看 + +国际 + +```shell +curl -L https://raw.githubusercontent.com/spiritLHLS/pve/main/scripts/buildct.sh -o buildct.sh && chmod +x buildct.sh +``` + +国内 + +```shell +curl -L https://ghproxy.com/https://raw.githubusercontent.com/spiritLHLS/pve/main/scripts/buildct.sh -o buildct.sh && chmod +x buildct.sh +``` + +#### 使用方法 + +- 系统支持:debian10,debian11,ubuntu18,ubuntu20,ubuntu22,centos8,almalinux9等 +- 系统参数一律是小写的系统名字拼接版本号,具体可执行```pveam available --section system```查看可用的系统名字和版本号(注意脚本使用的参数只有小写的英文系统名字拼接版本号) +- 其他系统可能支持可能不支持,自行测试 +- 默认用户名是root + +```shell +./buildct.sh CTID 密码 CPU核数 内存 硬盘 SSH端口 80端口 443端口 外网端口起 外网端口止 系统 存储盘 +``` + +#### 测试示例 + +* 以下为开设的示例CT的信息: +`VMID` - 102 +`SSH登录的用户名` - root +`SSH登录的密码` - 1234567 +`CPU核数` - 1 +`内存大小` - 512MB +`磁盘大小` - 5G +`SSH端口` - 20001 +`80端口` - 20002 +`443端口` - 20003 +`内外网映射端口一致的区间` - 30000到30025 +`系统` - debian11 +`宿主机的存储盘` - local + +```shell +./buildct.sh 102 1234567 1 512 5 20001 20002 20003 30000 30025 debian11 local +``` + +开设完毕可执行```cat ct102```查看信息,或在web端的NOTES查看 + +#### 删除示例 + +- 停止CT +- 删除CT +- 删除端口映射 +- 重启网络 +- 删除log文件 + +```shell +pct stop 102 +pct destroy 102 +rm -rf ct102 +iptables -t nat -F +iptables -t filter -F +service networking restart +systemctl restart networking.service +``` + +## 批量开设NAT的LXC虚拟化的CT + +::warning +初次使用前需要保证当前PVE纯净且宿主机未进行过任何端口映射,否则设置冲突可能出现BUG +开设前请使用screen挂起执行,避免批量开设时间过长,SSH不稳定导致中间执行中断 +:: +- 可多次运行批量生成CT容器,但需要注意的是母鸡内存记得开点swap免得机器炸了[开SWAP点我跳转](https://github.com/spiritLHLS/addswap) +- 每个容器创建之间有间隔等待60秒避免突发性能不足 +- 可自定义批量开设的核心数,内存大小,硬盘大小,使用宿主机哪个存储盘,记得自己计算好空闲资源开设 +- 开设的CT默认已启用SSH且允许root登陆,且已设置支持使用docker的嵌套虚拟化 +- 容器的相关信息将会存储到对应的容器的NOTE中,可在WEB端查看 + +国际 + +```shell +curl -L https://raw.githubusercontent.com/spiritLHLS/pve/main/scripts/create_ct.sh -o create_ct.sh && chmod +x create_ct.sh && bash create_ct.sh +``` + +国内 + +```shell +curl -L https://ghproxy.com/https://raw.githubusercontent.com/spiritLHLS/pve/main/scripts/create_ct.sh -o create_ct.sh && chmod +x create_ct.sh && bash create_ct.sh +``` + +开设完毕可执行```cat ctlog```查看信息,或在web端的NOTES查看 + + +#### 删除所有CT + +- 删除所有CT +- 删除所有nat的端口映射 +- 重启网络 +- 删除log文件 + +```shell +pct list | awk 'NR>1{print $1}' | xargs -I {} sh -c 'pct stop {}; pct destroy {}' +rm -rf ct* +iptables -t nat -F +iptables -t filter -F +service networking restart +systemctl restart networking.service +``` diff --git a/docs/en_US/guide/pve_precheck.md b/docs/en_US/guide/pve_precheck.md new file mode 100644 index 0000000000..36d7abeb39 --- /dev/null +++ b/docs/en_US/guide/pve_precheck.md @@ -0,0 +1,42 @@ +# 系统要求与配置 + +## 各种要求 + +建议debian在使用前尽量使用最新的稳定版本的系统 + +非debian11可使用 [debian一键升级](https://github.com/spiritLHLS/one-click-installation-script#%E4%B8%80%E9%94%AE%E5%8D%87%E7%BA%A7%E4%BD%8E%E7%89%88%E6%9C%ACdebian%E4%B8%BAdebian11) 来升级系统 + +本项目只适配Debian系统(非Debian无法通过APT源安装,官方只给了Debian的镜像,其他系统只能使用ISO安装) + +- 系统要求:Debian 8+ +::tip +建议debian11而不是debian12,因为后者是beta版本,debian11安装的才是稳定版 +:: +- 硬件要求:2核2G内存x86_64架构服务器硬盘至少20G +::warning +内存开点swap免得机器炸了[开SWAP点我跳转](https://github.com/spiritLHLS/addswap) +:: +- 可开KVM的硬件要求:VM-X或AMD-V支持 (部分VPS和全部独服支持) +- 如果硬件或系统需求不满足,可使用LXD批量开LXC容器[跳转](https://github.com/spiritLHLS/lxc) + +**遇到选项不会选的可无脑回车安装,本项目所有脚本内置国内外IP自动判断,使用的是不同的安装源与配置文件,有使用CDN加速镜像下载** + +## 检测环境 + +- 本项目相关脚本执行前务必执行本脚本检测环境,如果不符合安装PVE的要求则无法使用后续的脚本 +- 检测硬件配置是否满足最低要求 +- 检测硬件环境是否可嵌套虚拟化KVM类型的服务器 +- 检测系统环境是否可嵌套虚拟化KVM类型的服务器 +- 不可嵌套虚拟化KVM类型的服务器也可以开LXC虚拟化的服务器,但不推荐安装PVE,不如使用[LXD](https://github.com/spiritLHLS/lxc) + +国际 + +``` +bash <(wget -qO- --no-check-certificate https://raw.githubusercontent.com/spiritLHLS/pve/main/scripts/check_kernal.sh) +``` + +国内 + +``` +bash <(wget -qO- --no-check-certificate https://ghproxy.com/https://raw.githubusercontent.com/spiritLHLS/pve/main/scripts/check_kernal.sh) +``` \ No newline at end of file diff --git a/docs/en_US/guide/pve_qa.md b/docs/en_US/guide/pve_qa.md new file mode 100644 index 0000000000..8aa50f56b2 --- /dev/null +++ b/docs/en_US/guide/pve_qa.md @@ -0,0 +1,23 @@ +## 目前已验证的VPS商家 + +### 可开设KVM虚拟化的NAT的商家 + +[nocix](https://www.nocix.net/) 中的特价最低配15美元独服 (IPV6不自带,需要找客服要) + +[amhost](http://amhost.net/vps/?cid=29317) 中的测试款 + +[digitalocean](https://m.do.co/c/e9712622ee89) 中的 Perminu Intel 和 Regular 4核款 + +[skrime](https://hosting.skrime.eu/a/server) 中的 AMD Ryzen KVM Server 最低配款 + +[webdock](https://webdock.io/en?maff=wdaff--150) 中的 AMD KVM Server + +[4vps](https://clck.ru/33VQmc) 中的 俄罗斯和希腊 测试款 + +[hostaris](https://deploy.hostaris.com/) 中的 德国款 (商家的系统模板有问题,IPV6已失效和Github的连通稳定性很差) + +### 只可开设LXC虚拟化的NAT的商家 + +[腾讯云](https://curl.qcloud.com/tPrMnfZm) 中的无忧款和特惠款(学生机) + +[spectraip](https://my.spectraip.net/aff.php?aff=35) 中的KVM服务器 \ No newline at end of file diff --git a/docs/en_US/guide/pve_thanks.md b/docs/en_US/guide/pve_thanks.md new file mode 100644 index 0000000000..853ad35c48 --- /dev/null +++ b/docs/en_US/guide/pve_thanks.md @@ -0,0 +1,17 @@ +## 致谢 + +https://blog.ilolicon.com/archives/615 + +https://github.com/Ella-Alinda/somescripts/blob/main/nat.sh + +https://pve.proxmox.com/pve-docs/qm.1.html + +https://down.idc.wiki/Image/realServer-Template/ + +https://mirrors.tuna.tsinghua.edu.cn/proxmox/ + +https://github.com/roacn/pve/blob/main/pve.sh + +https://github.com/spiritLHLS/lxc + +感谢 [@Ella-Alinda](https://github.com/Ella-Alinda) 提供的PVE指导 \ No newline at end of file diff --git a/docs/en_US/index.md b/docs/en_US/index.md new file mode 100644 index 0000000000..9ab4280726 --- /dev/null +++ b/docs/en_US/index.md @@ -0,0 +1,22 @@ +--- +home: true +heroImage: https://raw.githubusercontent.com/spiritlhls/pages/main/logo.jpg +heroText: One Click Virtualization Project +tagline: Open source, easy to use server virtualization project +actionText: Learn More → +actionLink: /en_US/guide/dashboard +features: +- title: One-Click Installation + details: Support one-click script installation, easy to use; based on Debian, Ubuntu long-term maintenance version development, try to ensure that the host system and development environment consistent +- title: Comes with internal and external port forwarding + details: Support automatic intranet port forwarding, including TCP and UDP protocols +- title: Batch Virtualization + details: Support for KVM, LXC, Docker virtualization batch opening of virtual machines (containers) +- title: Self-limiting abuse + details: Partially virtualized containers/VMs have been masked and loaded with restrictions to avoid being used for abuse +footer: Copyright © 2022-present Nezhahq +--- + +Documentation has not been translated yet, waiting for translation. + +
This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License. \ No newline at end of file diff --git a/docs/guide/dashboard.md b/docs/guide/dashboard.md new file mode 100644 index 0000000000..93f8113d5f --- /dev/null +++ b/docs/guide/dashboard.md @@ -0,0 +1,35 @@ +## 准备工作 + +需要虚拟化出服务器,你需要: +1. 一台可以连接公网的服务器( VPS 或 Dedicated Server),最好能完美访问 Github 的 RAW 页面,部分项目部分组件可能未使用 CDN 加速 +::: tip +如果您位于中国大陆,访问 Github 有困难,请注意配套脚本和项目是否有说明已使用 CDN 加速 +::: +2. 本地可以稳定连接SSH,如果不能稳定连接,请使用```screen```命令创建窗口后,在窗口内执行命令 +::: tip +不会用screen命令的,自行查找相关教程学习 +::: +3. 确保服务器的系统和硬件满足对应项目的要求,详见对应项目说明 + +**本文档将以VPS作为范例,且该VPS纯净,无原生环境问题,如有必要请重装系统保证初始环境的纯净** +:::warning +PVE项目可能造成宿主机出现问题,如果你不会看Bug和修复系统,那么不建议你在生产环境中使用,使用PVE相关脚本请确保宿主机随时可重装系统 +::: +
+
+ +## 项目仓库 + +欢迎Star和Fork + +### PVE相关的各种一键脚本 + +[https://github.com/spiritLHLS/pve](https://github.com/spiritLHLS/pve) + +### 通过LXD/LXC命令批量或单独开设NAT服务器以及维护 + +[https://github.com/spiritLHLS/lxc](https://github.com/spiritLHLS/lxc) + +### 通过docker批量或单独开设NAT服务器 + +[https://github.com/spiritLHLS/docker](https://github.com/spiritLHLS/docker) \ No newline at end of file diff --git a/docs/guide/dashboardq.md b/docs/guide/dashboardq.md new file mode 100644 index 0000000000..cbde71ff3d --- /dev/null +++ b/docs/guide/dashboardq.md @@ -0,0 +1,10 @@ + +Give me a cup of coffee. + +https://ko-fi.com/spiritlhl + +USDT-TRC20 + +```bash +TZ7nf8XAL9zQUo63xokazaBdCPeCgPfcwd +``` \ No newline at end of file diff --git a/docs/guide/docker_build.md b/docs/guide/docker_build.md new file mode 100644 index 0000000000..2a9e06ea03 --- /dev/null +++ b/docs/guide/docker_build.md @@ -0,0 +1,106 @@ +## 单独开设 + +下载脚本 + +国际 + +```shell +curl -L https://raw.githubusercontent.com/spiritLHLS/docker/main/scripts/onedocker.sh -o onedocker.sh && chmod +x onedocker.sh +``` + +国内 + +```shell +curl -L https://ghproxy.com/https://raw.githubusercontent.com/spiritLHLS/docker/main/scripts/onedocker.sh -o onedocker.sh && chmod +x onedocker.sh +``` + +运行 + +``` +./onedocker.sh name cpu memory password sshport startport endport system +``` + +目前system仅支持选择alpine或debian,默认是debian + +### 示例 + +* 以下为开设的示例容器的信息: +`容器名字` - test +`SSH登录的用户名` - root +`SSH登录的密码` - 123456 +`CPU核数` - 1 +`内存大小` - 512MB +`SSH端口` - 25000 +`内外网映射端口一致的区间` - 34975到35000 +`系统` - debian + +```shell +./onedocker.sh test 1 512 123456 25000 34975 35000 debian +``` + +删除示例 + +```shell +docker rm -f test +rm -rf test +ls +``` + +进入示例 + +```shell +docker exec -it test /bin/bash +``` + +要退出容器就执行```exit```退出。 + +### 查询信息 + +```shell +cat 容器名字 +``` + +输出格式 + +``` +容器名字 SSH端口 登陆的root密码 核数 内存 外网端口起 外网端口止 +``` + +## 批量开设 + +- 批量多次运行继承配置生成 +- 生成多个时为避免SSH连接中断建议在screen中执行 + +国际 + +```shell +curl -L https://raw.githubusercontent.com/spiritLHLS/docker/main/scripts/dockers.sh -o dockers.sh && chmod +x dockers.sh && bash dockers.sh +``` + +国内 + +```shell +curl -L https://ghproxy.com/https://raw.githubusercontent.com/spiritLHLS/docker/main/scripts/onedocker.sh -o onedocker.sh && chmod +x onedocker.sh +``` + +## 查询批量开设的信息 + +```shell +cat dclog +``` + +输出格式 + +``` +容器名字 SSH端口 登陆的root密码 核数 内存 外网端口起 外网端口止 +``` + +一行一个容器对应的信息 + +## 卸载所有docker容器和镜像 + +```shell +docker rm -f $(docker ps -aq); docker rmi $(docker images -aq) +rm -rf dclog +ls +``` \ No newline at end of file diff --git a/docs/guide/docker_install.md b/docs/guide/docker_install.md new file mode 100644 index 0000000000..561787d620 --- /dev/null +++ b/docs/guide/docker_install.md @@ -0,0 +1,17 @@ +## 环境预设 + +- 检测环境 +- 安装docker +- 下载预制脚本 + +国际 + +```shell +curl -L https://raw.githubusercontent.com/spiritLHLS/docker/main/scripts/pre_build.sh -o pre_build.sh && chmod +x pre_build.sh && bash pre_build.sh +``` + +国内 + +```shell +curl -L https://ghproxy.com/https://raw.githubusercontent.com/spiritLHLS/docker/main/scripts/pre_build.sh -o pre_build.sh && chmod +x pre_build.sh && bash pre_build.sh +``` \ No newline at end of file diff --git a/docs/guide/docker_precheck.md b/docs/guide/docker_precheck.md new file mode 100644 index 0000000000..826ead1c05 --- /dev/null +++ b/docs/guide/docker_precheck.md @@ -0,0 +1,21 @@ +## 项目特点 + +通过docker批量或单独开设NAT服务器(Bulk or individual NAT server provisioning via docker) + +默认使用debian系统,每个容器自带1个外网ssh端口,25个内外网一致端口 + +默认创建的是非特权容器,且不挂载与宿主机的docker的守护进程之间的通信,所以**宿主机创建的docker虚拟化的NAT服务器内无法再嵌套虚拟化docker** + +由于只是在宿主机进行了CPU和内存的限制未在容器内使用cgroup驱动,所以在容器内使用服务器测试脚本检测容器的可用资源是无效的,显示的会是宿主机的资源 + +由于大部分云服务器xfs文件系统不启用pquota选项,所以**默认共享宿主机硬盘,无法限制每个容器的磁盘大小** + +## 配置要求 + +系统可安装docker即可用,网络能连接Github的raw界面就能用,硬件配置只要不拉跨就行,空闲硬盘有3G就行 + +推荐在开设NAT服务器前先增加部分SWAP虚拟内存,避免突发的内存占用导致母鸡卡死 [跳转](https://github.com/spiritLHLS/addswap) + +PS: 如果硬件资源只是好了一点,需要限制更多东西并需要配置IPV6独立地址和限制硬盘大小,可使用LXD批量开LXC虚拟化的容器 [跳转](https://github.com/spiritLHLS/lxc) + +PS: 如果硬件非常好资源很多,可使用PVE批量开KVM虚拟化的虚拟机 [跳转](https://github.com/spiritLHLS/pve) \ No newline at end of file diff --git a/docs/guide/docker_qa.md b/docs/guide/docker_qa.md new file mode 100644 index 0000000000..e69de29bb2 diff --git a/docs/guide/docker_thanks.md b/docs/guide/docker_thanks.md new file mode 100644 index 0000000000..e69de29bb2 diff --git a/docs/guide/lxd_extra_config.md b/docs/guide/lxd_extra_config.md new file mode 100644 index 0000000000..01bb4296b4 --- /dev/null +++ b/docs/guide/lxd_extra_config.md @@ -0,0 +1,124 @@ +::tip +以下的配置安装会加重母鸡的负担,非必要不要安装 +如果是个人使用,可忽略防滥用部分脚本的安装 +:: + +## 自动配置IPV6地址 + +- (***非必须***,不使用的也没问题) +- **该脚本仅适用于母鸡有给```IPV6```子网且是```/64```的,且母鸡绑定了子网的```第一个IP```做```母鸡的IPV6地址或IPV6的gateway```** +- 自动为LXD创建的LXC容器配置```IPV6```地址 +- 已集成到```buildone.sh```中可使用变量控制且无需事先下载,该脚本可不手动使用,在使用```buildone.sh```时配置Y开启即可 + +下载脚本 + +国际 + +```bash +curl -L https://raw.githubusercontent.com/spiritLHLS/lxc/main/scripts/build_ipv6_network.sh -o build_ipv6_network.sh && chmod +x build_ipv6_network.sh +``` + +国内 + +```shell +curl -L https://ghproxy.com/https://raw.githubusercontent.com/spiritLHLS/lxc/main/scripts/build_ipv6_network.sh -o build_ipv6_network.sh && chmod +x build_ipv6_network.sh +``` + +自动为容器配置IPV6映射地址 + +```bash +bash build_ipv6_network.sh 容器名称 +``` + +映射完毕会打印信息 + +示例(给test容器自动配置IPV6地址,配置完成会写入一个test_v6的文件信息) + +```bash +bash build_ipv6_network.sh test +``` + +删除所有IPV6已映射的规则 + +```bash +ip6tables -t nat -F PREROUTING +ip6tables-legacy -t nat -F PREROUTING +ip6tables-save > /etc/iptables/rules.v6 +netfilter-persistent save +netfilter-persistent reload +service netfilter-persistent restart +``` + +卸载IPV6地址绑定的守护进程和对应的文件 + +```shell +systemctl stop add-ipv6.service +systemctl disable add-ipv6.service +rm /etc/systemd/system/add-ipv6.service +systemctl daemon-reload +rm /usr/local/bin/add-ipv6.sh +``` + +## 屏蔽容易被滥用的端口的出入流量以屏蔽端口和屏蔽滥用工具包 + +- (***非必须***,该脚本仅仅是为了防止容器滥用方便,不装的也没问题) +- 事前预防 + +国际 + +```shell +curl -L https://raw.githubusercontent.com/spiritLHLS/lxc/main/scripts/rules.sh -o rules.sh && chmod +x rules.sh && bash rules.sh +``` + +国内 + +```shell +curl -L https://ghproxy.com/https://raw.githubusercontent.com/spiritLHLS/lxc/main/scripts/rules.sh -o rules.sh && chmod +x rules.sh && bash rules.sh +``` + +##### 使用screen配置监控屏蔽某些进程的执行遇到某些进程的出现直接关闭容器 + +- 如需停止监控可使用```screen```命令停止```lxc_moniter```这个名字的窗口并删除 +- (***非必须***,该脚本仅仅是为了防止容器滥用方便,不装的也没问题) +- 事后停机 + +国际 + +```shell +curl -L https://raw.githubusercontent.com/spiritLHLS/lxc/main/scripts/build_monitor.sh -o build_monitor.sh && chmod +x build_monitor.sh && bash build_monitor.sh +``` + +国内 + +```shell +curl -L https://ghproxy.com/https://raw.githubusercontent.com/spiritLHLS/lxc/main/scripts/build_monitor.sh -o build_monitor.sh && chmod +x build_monitor.sh && bash build_monitor.sh +``` + +##### 一键安装开lxd母鸡所需要的带vnstat环境的常用预配置环境 + +- (***非必须***,该脚本仅仅是为了站点对接监控方便,不装的也没问题) + +国际 + +```shell +curl -L https://raw.githubusercontent.com/spiritLHLS/lxc/main/scripts/backend.sh -o backend.sh && chmod +x backend.sh && bash backend.sh +``` + +国内 + +```shell +curl -L https://ghproxy.com/https://raw.githubusercontent.com/spiritLHLS/lxc/main/scripts/backend.sh -o backend.sh && chmod +x backend.sh && bash backend.sh +``` + +##### 一键安装母鸡可视化操作的面板 + +- (***非必须***,该面板只是为了方便可视化操作,没有也没问题) +- 原作者仓库:[跳转](https://github.com/turtle0x1/LxdMosaic) + +```shell +lxc config set core.https_address [::] +lxc config set core.trust_password some-secret-string +snap install lxdmosaic +``` + +安装完毕后打开母鸡IP地址,按照提示设置admin的密码,其他一路默认就能使用面板了 diff --git a/docs/guide/lxd_install.md b/docs/guide/lxd_install.md new file mode 100644 index 0000000000..3dcf856365 --- /dev/null +++ b/docs/guide/lxd_install.md @@ -0,0 +1,104 @@ +## 手动安装 + +新手推荐,避免有bug不知道怎么修,当然如果只是图方便又是老手懂排查BUG,用后面的一键安装也行 + +### 关闭防火墙 + +```bash +apt update +apt install curl wget sudo dos2unix ufw jq -y +ufw disable +``` + +### 开设虚拟内存SWAP + +内存看你开多少小鸡,这里如果要开8个,换算需要2G内存,实际内存如果是512MB内存,还需要开1.5G,保守点开2G虚拟内存即可 + +执行下面命令,输入1,再输入2048,代表开2G虚拟内存 + +国际 + +```shell +curl -L https://raw.githubusercontent.com/spiritLHLS/lxc/main/scripts/swap.sh -o swap.sh && chmod +x swap.sh && bash swap.sh +``` + +国内 + +```shell +curl -L https://ghproxy.com/https://raw.githubusercontent.com/spiritLHLS/lxc/main/scripts/swap.sh -o swap.sh && chmod +x swap.sh && bash swap.sh +``` + +### 安装LXD + +实际swap开的虚拟内存应该是实际内存的2倍,也就是开1G是合理的,上面我描述的情况属于超开了 + +``` +apt install snapd -y +snap install lxd +/snap/bin/lxd init +``` + +如果上面的命令中出现下面的错误 + +(snap "lxd" assumes unsupported features: snapd2.39 (try to update snapd and refresh the core snap)) + +使用命令修补后再进行lxd的安装 + +``` +snap install core +``` + +如果无异常,上面三行命令执行结果如下 + +![图片](https://user-images.githubusercontent.com/103393591/233270028-5a43d0f7-45f5-4175-969e-d4d182cb877a.png) + +一般的选项回车默认即可 + +选择配置物理盘大小(提示默认最小1GB那个选项),一般我填空闲磁盘大小减去内存大小后乘以0.95并向下取整,这里我填了10GB + +提示带auto的更新image的选项记得选no,避免更新占用系统 + +测试lxc有没有软连接上 + +``` +lxc -h +``` + +如果报错则执行以下命令软连接lxc命令 + +```bash +! lxc -h >/dev/null 2>&1 && echo 'alias lxc="/snap/bin/lxc"' >> /root/.bashrc && source /root/.bashrc +export PATH=$PATH:/snap/bin +``` + +连接后再测试lxc命令是否有报错找不到 + +## 一键安装 + +::tip +如果是全新的服务器,务必保证apt update和apt install curl都无问题再执行本脚本 +且自开机起最好等待5分钟后再执行以下命令,避免系统默认设置中就执行了本脚本导致apt源卡死 +:: +- 环境要求:Ubuntu 18+(推荐),Debian 8+(仅限x86_64架构) + +**如果是Debian系的宿主机,务必在screen中执行本脚本,避免长期运行时SSH中断导致ZFS编译安装失败** + +这里的虚拟内存是说要开的SWAP大小,存储池则是你所有要开的小鸡占的盘的大小的总和 + +环境安装过程中可能需要重启服务器再次执行以加载含zfs的内核,一切以运行后命令行的提示为准 + +国际 + +```shell +curl -L https://raw.githubusercontent.com/spiritLHLS/lxc/main/scripts/lxdinstall.sh -o lxdinstall.sh && chmod +x lxdinstall.sh && bash lxdinstall.sh +``` + +国内 + +```shell +curl -L https://ghproxy.com/https://raw.githubusercontent.com/spiritLHLS/lxc/main/scripts/lxdinstall.sh -o lxdinstall.sh && chmod +x lxdinstall.sh && bash lxdinstall.sh +``` + +例子: + +如果系统盘除去已占用空间还有18G硬盘空余,想开2G虚拟内存(2048MB的SWAP),15G的存储池,按照命令行的提示则依次输入```2048```和```15``` \ No newline at end of file diff --git a/docs/guide/lxd_lxc.md b/docs/guide/lxd_lxc.md new file mode 100644 index 0000000000..29ff0806c1 --- /dev/null +++ b/docs/guide/lxd_lxc.md @@ -0,0 +1,218 @@ +## 普通的批量版本 + +开出的小鸡配置: + +- 1核256MB内存1GB硬盘限速250Mbps带宽 +- 带1个SSH端口,25个外网端口 +- 默认内存和硬盘大小 + +::tip +lxc若命令无问题,执行初始化开小鸡,这一步最好放```screen```中后台挂起执行,开小鸡时长与你开几个和母鸡配置相关 +:: + +执行下面命令加载开机脚本 + +国际 + +```shell +curl -L https://raw.githubusercontent.com/spiritLHLS/lxc/main/scripts/init.sh -o init.sh && chmod +x init.sh && dos2unix init.sh +``` + +国内 + +```shell +curl -L https://ghproxy.com/https://raw.githubusercontent.com/spiritLHLS/lxc/main/scripts/init.sh -o init.sh && chmod +x init.sh && dos2unix init.sh +``` + +下面命令为开小鸡名字前缀为**tj**的**10**个小鸡 + +```shell +./init.sh tj 10 +``` + +有时候init.sh的运行路径有问题,此时建议前面加上sudo强制根目录执行 + +### 只有一个SSH端口的版本 + +开出的小鸡配置: + +- 1核128MB内存300MB硬盘限速200Mbps带宽 +- 只有一个SSH端口 +- 无法挂载warp + +::tip +lxc若命令无问题,执行初始化开小鸡,这一步最好放```screen```中后台挂起执行,开小鸡时长与你开几个和母鸡配置相关 +:: + +加载开机脚本 + +国际 + +```shell +curl -L https://raw.githubusercontent.com/spiritLHLS/lxc/main/scripts/least.sh -o least.sh && chmod +x least.sh && dos2unix least.sh +``` + +国内 + +```shell +curl -L https://ghproxy.com/https://raw.githubusercontent.com/spiritLHLS/lxc/main/scripts/least.sh -o least.sh && chmod +x least.sh && dos2unix least.sh +``` + +下列命令最后一行为开小鸡名字前缀为**tj**的**10**个小鸡 + +```shell +./least.sh tj 10 +``` + +有时候least.sh的运行路径有问题,此时建议前面加上sudo强制根目录执行 + +## 查看已批量开设的信息 + +开完小鸡后,具体信息会生成在当前目录下的log文件中,格式如下 + +```shell +1号服务器名称 密码 ssh端口 外网端口起始 外网端口终止 +2号服务器名称 密码 ssh端口 外网端口起始 外网端口终止 +``` + +如果想要查看,只需在当前目录执行以下命令打印log文件即可 + +```shell +cat log +``` + +::warning +不要拿该脚本开出的小鸡当生产环境,LXC虚拟化不支持换内核,dd,开启bbr等操作 +:: + +## 部分常用LXD命令 + +查看所有 + +```bash +lxc list +``` + +查看个例 + +```bash +lxc info 服务器名字 +``` + +启动个例 + +```bash +lxc start 服务器名字 +``` + +停止个例 + +```bash +lxc stop 服务器名字 +``` + +删除个例 + +```bash +lxc delete -f 服务器名字 +``` + +进入内部 + +```bash +lxc exec 服务器名字 /bin/bash +``` + +退出则输入```exit```回车即可 + +删除所有LXC容器 + +```bash +lxc list | awk '{print $2}' | grep -v "^$" | xargs -I {} lxc delete -f {} +``` + +在容器内执行删除无用日志 + +```bash +sudo apt-get autoremove +sudo apt-get clean +sudo find /var/log -type f -delete +sudo find /var/tmp -type f -delete +sudo find /tmp -type f -delete +sudo find /var/cache/apt/archives -type f -delete +``` + +## 一键脚本老手推荐方便快捷 + +- 只生成一个NAT服务器,可自定义限制所有内容 + +### 只开一个NAT服务器 + +#### 下载开机脚本 + +- (***非必须***,如果你使用过一键安装LXD的命令,自动已下载对应的开机脚本,不用下载该脚本) + +国际 + +```shell +curl -L https://ghproxy.com/https://raw.githubusercontent.com/spiritLHLS/lxc/main/scripts/buildone.sh -o buildone.sh && chmod +x buildone.sh && dos2unix buildone.sh +``` + +国内 + +```shell +curl -L https://ghproxy.com/https://ghproxy.com/https://raw.githubusercontent.com/spiritLHLS/lxc/main/scripts/buildone.sh -o buildone.sh && chmod +x buildone.sh && dos2unix buildone.sh +``` + +##### 开NAT服务器 + +内存大小以MB计算,硬盘大小以GB计算,下载速度上传速度以Mbit计算,是否启用IPV6不一定要填Y或者N,没有这个参数也行 + +如果```外网起端口```和```外网止端口```都设置为0则不做区间外网端口映射了,只映射基础的SSH端口,注意```不能为空```,不进行映射需要设置为0 + +支持自定义小鸡的系统,注意传入参数为系统名字+版本号,如:debian11、ubuntu20,centos8,注意都是小写字母+数字的组合 + +``` +./buildone.sh 小鸡名称 内存大小 硬盘大小 SSH端口 外网起端口 外网止端口 下载速度 上传速度 是否启用IPV6(Y or N) 系统(留空则为debian11) +``` + +示例 + +``` +./buildone.sh test 256 2 20001 20002 20025 300 300 N +``` + +* 以下为开设的示例小鸡的信息: +`小鸡名字` - test +`SSH登录的用户名` - root +`SSH登录的密码` - 随机生成 +`CPU核数` - 1 +`内存大小` - 256MB +`磁盘大小` - 2G +`内外网映射端口一致的区间` - 20002到20025 +`上传带宽` - 300Mbit +`下载带宽` - 300Mbit +`自动设置外网IPV6地址` - N +`系统` - debian11 + +需要查看信息则执行 + +```shell +cat 小鸡名字 +``` + +比如查询示例的信息就是 + +```shell +cat test +``` + +如果已通过以上方法生成过小鸡,还需要批量生成小鸡,可使用手动安装部分的脚本,但注意先删除测试小鸡再进行批量生成小鸡 + +删除测试小鸡 + +```shell +lxc delete -f test +rm -rf test +ls +``` \ No newline at end of file diff --git a/docs/guide/lxd_precheck.md b/docs/guide/lxd_precheck.md new file mode 100644 index 0000000000..a27fb914bf --- /dev/null +++ b/docs/guide/lxd_precheck.md @@ -0,0 +1,40 @@ +## 配置要求 + +硬件要求: +- 系统:Debian 8+, Ubuntu 18+(推荐),系统越新越好 +- 虚拟化:推荐KVM、VMWARE虚拟化 +- 内存:内存至少512MB +- 硬盘:硬盘(系统盘)至少10G +- 网络:独立的IPV4地址,IPV6可有可无,带宽能下载脚本就行,网络能连接Github的raw页面就行 + +PS: 如果硬件非常好资源很多,可使用PVE批量开KVM虚拟化的虚拟机 [跳转](https://github.com/spiritLHLS/pve) + +PS: 如果硬件资源更烂,虚拟化不支持,可使用docker版本的,适配面更广 [跳转](https://github.com/spiritLHLS/docker) + +## 项目特点 + +- 本套脚本开发使用的Ubuntu20,Ubuntu别的长期维护版本应该也没问题,Debian无法使用zfs时自动切换别的存储类型 + +- 已设置同时进行TCP和UDP转发,除了SSH端口其他的映射内网外网端口一致 + +- 已设置支持开出的LXC容器进行docker嵌套虚拟,默认普通版本和纯探针版本使用debian11系统 + +- 已屏蔽容器内可能用于滥用的工具包和IPV4网络的TCP/UDP协议的端口( 3389 8888 54321 65432 ),以防止容器被用于扫描和爆破,且可外置进程检查有问题自动停机 + +- 已支持一键为LXC容器配置IPV6地址(前提是母鸡有IPV6子网,无IPV6地址则不配置) + +- 一定要在 ```/root``` 的路径下运行本仓库脚本,且使用```一键脚本```的**不要删除**路径下的```ssh.sh```和```config.sh```文件 + +- 保证你要开的盘为默认的系统盘(sda或者sda1)而不是挂载的盘(sdb之类的),不确定的使用```fdisk -l```和```df```查看 + +- 挂载其他盘的详看 [其他说明](https://github.com/spiritLHLS/lxc/blob/main/README_other.md) + +- 一键脚本支持自定义限制所有内容,普通版本支持多次运行批量生成不覆盖先前生成的配置 + +## 检测环境 + +**使用后续脚本的务必执行本命令检测母鸡是否符合要求** + +``` +bash <(wget -qO- --no-check-certificate https://raw.githubusercontent.com/spiritLHLS/lxc/main/scripts/pre_check.sh) +``` \ No newline at end of file diff --git a/docs/guide/lxd_qa.md b/docs/guide/lxd_qa.md new file mode 100644 index 0000000000..45bf1dca9f --- /dev/null +++ b/docs/guide/lxd_qa.md @@ -0,0 +1,7 @@ +## 目前已验证可开带独立IPV6地址容器的VPS商家 + +[kuroit](https://my.kuroit.com/aff.php?aff=5) 中的 美国凤凰城 regular + +[datalix](https://t.me/vps_reviews/338) 中的 德国AMD 促销款 + +[luxvps](https://billing.luxvps.xyz/aff.php?aff=36) 中的 德国AMD 促销款 \ No newline at end of file diff --git a/docs/guide/lxd_thanks.md b/docs/guide/lxd_thanks.md new file mode 100644 index 0000000000..e843350bff --- /dev/null +++ b/docs/guide/lxd_thanks.md @@ -0,0 +1,19 @@ +## 致谢 + +https://github.com/lxc/lxd + +https://lxdware.com/ + +https://discuss.linuxcontainers.org/ + +https://discuss.linuxcontainers.org/t/how-to-run-docker-inside-lxc-container/13017/4 + +https://discuss.linuxcontainers.org/t/error-seccomp-notify-not-supported-on-container-start/15038/3 + +https://discuss.linuxcontainers.org/t/how-do-i-assign-a-public-ipv6-address-to-a-lxc-container/6028 + +https://github.com/turtle0x1/LxdMosaic + +https://openzfs.github.io/openzfs-docs/Getting%20Started/Debian/index.html + +感谢 [@Ella-Alinda](https://github.com/Ella-Alinda) [@fscarmen](https://github.com/fscarmen) 提供的指导 \ No newline at end of file diff --git a/docs/guide/pve_install.md b/docs/guide/pve_install.md new file mode 100644 index 0000000000..d23fce15d7 --- /dev/null +++ b/docs/guide/pve_install.md @@ -0,0 +1,74 @@ +## 一键安装PVE + +- 安装的是当下apt源最新的PVE +- 比如debian10则是pve6.4,debian11则是pve7.x,debian12则是pve8.x +::tip +建议debian11而不是debian12,因为后者是beta版本,debian11安装的才是稳定版 +:: +- /etc/hosts文件修改(修正商家hostname设置错误以及新增PVE所需的内容) +- 已设置```/etc/hosts```为只读模式,避免重启后文件被覆写,如需修改请使用```chattr -i /etc/hosts```取消只读锁定,修改完毕请执行```chattr +i /etc/hosts```只读锁定 +- 检测```/etc/cloud/cloud.cfg```如果发现```preserve_hostname```是```false```,则改为```true```,同上,也用chattr命令进行了文件锁定避免重启覆盖设置 +- 检测是否为中国IP,如果为中国IP使用清华镜像源,否则使用官方源 +- 安装PVE开虚拟机需要的必备工具包 +- 替换apt源中的企业订阅为社区源 +- 打印查询Linux系统内核和PVE内核是否已安装 +- 检测```/etc/resolv.conf```是否为空,为空则设置检测```8.8.8.8```的开机自启添加DNS的systemd服务 +- 新增PVE的APT源链接后,下载PVE并打印输出登陆信息 + +国际 + +```shell +curl -L https://raw.githubusercontent.com/spiritLHLS/pve/main/scripts/install_pve.sh -o install_pve.sh && chmod +x install_pve.sh && bash install_pve.sh +``` + +国内 + +```shell +curl -L https://ghproxy.com/https://raw.githubusercontent.com/spiritLHLS/pve/main/scripts/install_pve.sh -o install_pve.sh && chmod +x install_pve.sh && bash install_pve.sh +``` + +## 预配置环境 + +- 创建资源池mypool +- 移除订阅弹窗 +- 尝试开启硬件直通 +- 检测AppArmor模块并试图安装 +- 重启系统前推荐挂上[nezha探针](https://github.com/naiba/nezha)方便在后台不通过SSH使用命令行,避免SSH可能因为商家奇葩的预设导致重启后root密码丢失 +- **执行完毕建议等待几分钟后再重启服务器**,执行```reboot```前需要等待后台任务执行完毕,一些宿主机的系统apt命令执行很慢,得等一会才能执行完毕 + +国际 + +```shell +bash <(wget -qO- --no-check-certificate https://raw.githubusercontent.com/spiritLHLS/pve/main/scripts/build_backend.sh) +``` + +国内 + +```shell +bash <(wget -qO- --no-check-certificate https://ghproxy.com/https://raw.githubusercontent.com/spiritLHLS/pve/main/scripts/build_backend.sh) +``` + +### 自动配置宿主机的网关 + +::warning +使用前请保证重启过服务器且此时PVE能正常使用WEB端再执行,重启机器后不要立即执行此命令,待WEB端启动成功后至少等5分钟再执行本命令 +这一步是最容易造成SSH断开的,原因是未等待PVE内核启动就修改网络会造成设置冲突,所以至少等几分钟待内核启动也就是WEB端启动成功后再执行 +:: +- 创建vmbr0,母鸡允许addr和gateway为内网IP或外网IP,已自动识别 +- vmbr0创建支持纯IPV4或双栈服务器,自动识别IPV4地址和IPV6地址,自动识别对应的IP区间 +- 创建vmbr1(NAT网关) +- 开NAT虚拟机时网关(IPV4)使用```172.16.1.1```,IPV4/CIDR使用```172.16.1.x/24```,这里的x不能是1,当然如果后续使用本套脚本无需关注这点细枝末节的东西 +- 想查看完整设置可以执行```cat /etc/network/interfaces```查看 +- 加载iptables并设置回源且允许NAT端口转发 + +国际 + +```shell +bash <(wget -qO- --no-check-certificate https://raw.githubusercontent.com/spiritLHLS/pve/main/scripts/build_nat_network.sh) +``` + +国内 + +```shell +bash <(wget -qO- --no-check-certificate https://ghproxy.com/https://raw.githubusercontent.com/spiritLHLS/pve/main/scripts/build_nat_network.sh) +``` \ No newline at end of file diff --git a/docs/guide/pve_kvm.md b/docs/guide/pve_kvm.md new file mode 100644 index 0000000000..a039b91604 --- /dev/null +++ b/docs/guide/pve_kvm.md @@ -0,0 +1,196 @@ +## 部分注意事项 + +**执行本项目的第一个检测环境的命令**,展示如下 + +
+![coode](/images/pve_kvm/pve_kvm_1.png) +
+ +查询如上的只需使用下面的一键脚本自动创建虚拟机即可,无需手动再修改WEB端设置 + +
+![coode](/images/pve_kvm/pve_kvm_2.png) +
+ +查询如上的在使用后续脚本创建了虚拟机后,**可能**需要手动修改WEB端设置,需要关闭对应每个虚拟机的硬件嵌套虚拟化,如下图 + +
+![coode](/images/pve_kvm/pve_kvm_3.png) +
+ +先停止虚拟机再修改,修改完后再开机才能使用NOVNC,不关闭**可能**导致这个虚拟机有BUG无法使用 + +如果强行安装PVE开KVM,启动不了的也可以关闭这个选项试试能不能启动虚拟机 + +### 单独开设KVM虚拟化的VM + +- 自动开设NAT服务器,默认使用Debian10镜像,因为该镜像占用最小 +- 可在命令中自定义需要使用的镜像,这里有给出配置好的镜像,镜像自带空间设置是2~10G硬盘,日常使用**至少10G以上**即可,除非某些镜像开不起来再增加硬盘大小 +- 可在命令中指定存储盘位置,默认不指定时为local盘即系统盘,可指定为PVE中显示的挂载盘 +- 自定义内存大小推荐512MB内存 +::tip +需要注意的是宿主机内存记得开点swap免得机器炸了[开SWAP点我跳转](https://github.com/spiritLHLS/addswap) +:: +- 自动进行内外网端口映射,含22,80,443端口以及其他25个内外网端口号一样的端口 +- 生成后需要等待一段时间虚拟机内部的cloud-init配置好网络以及登陆信息,大概需要5分钟 +- 虚拟机的相关信息将会存储到WEB端对应VM的NOTES中,可在WEB端查看 + +国际 + +```shell +curl -L https://raw.githubusercontent.com/spiritLHLS/pve/main/scripts/buildvm.sh -o buildvm.sh && chmod +x buildvm.sh +``` + +国内 + +```shell +curl -L https://ghproxy.com/https://raw.githubusercontent.com/spiritLHLS/pve/main/scripts/buildvm.sh -o buildvm.sh && chmod +x buildvm.sh +``` + +#### 使用方法 + +- 系统支持:详见 [跳转](https://github.com/spiritLHLS/Images/releases/tag/v1.0) 中列出的系统,使用时只需写文件名字,不需要.qcow2尾缀 +::tip +注意这里的用户名不能是纯数字,会造成cloudinit出问题,最好是纯英文或英文开头 +:: + +```shell +./buildvm.sh VMID 用户名 密码 CPU核数 内存 硬盘 SSH端口 80端口 443端口 外网端口起 外网端口止 系统 存储盘 +``` + +#### 测试示例 + +* 以下为开设的示例VM的信息: +`VMID` - 102 +`SSH登录的用户名` - test1 +`SSH登录的密码` - 1234567 +`CPU核数` - 1 +`内存大小` - 512MB +`磁盘大小` - 10G +`SSH端口` - 40001 +`80端口` - 40002 +`443端口` - 40003 +`内外网映射端口一致的区间` - 50000到50025 +`系统` - ubuntu20 +`宿主机的存储盘` - local + +```shell +./buildvm.sh 102 test1 1234567 1 512 10 40001 40002 40003 50000 50025 ubuntu20 local +``` + +开设完毕可执行```cat vm102```查看信息,或到WEB端对应VM的NOTES中查看 + +#### 删除示例 + +- 停止VM +- 删除VM +- 删除端口映射 +- 重启网络 +- 删除log文件 + +```shell +qm stop 102 +qm destroy 102 +iptables -t nat -F +iptables -t filter -F +service networking restart +systemctl restart networking.service +rm -rf vm102 +``` + +#### 相关qcow2镜像 + +- 已预安装开启cloudinit,开启SSH登陆,预设值SSH监听V4和V6的22端口,开启允许密码验证登陆,开启允许ROOT登陆 + +目前使用的镜像列表为 + +[https://github.com/spiritLHLS/Images/releases/tag/v1.0](https://github.com/spiritLHLS/Images/releases/tag/v1.0) + +### 批量开设NAT的KVM虚拟化的VM + +::warning +初次使用前需要保证当前PVE纯净且宿主机未进行过任何端口映射,否则设置冲突可能出现BUG +开设前请使用screen挂起执行,避免批量开设时间过长,SSH不稳定导致中间执行中断 +:: +- 可多次运行批量生成VM +- 自动开设NAT服务器,选项留空默认使用debian11镜像,可自定义使用镜像名字,支持的系统名字详见上文支持的镜像列表 +- 自动进行内外网端口映射,含22,80,443端口以及其他25个内外网端口号一样的端口 +- 生成后需要等待一段时间虚拟机内部的cloudinit配置好网络以及登陆信息,大概需要5分钟,每个虚拟机创建之间有间隔等待60秒避免突发性能不足 +- 默认批量开设的虚拟机网络配置为:22,80,443端口及一个25个端口区间的内外网映射 +- 可自定义批量开设的核心数,内存大小,硬盘大小,使用宿主机哪个存储盘,记得自己计算好空闲资源开设 +- 虚拟机的相关信息将会存储到WEB端对应VM的NOTES中,可在WEB端查看 + +国际 + +```shell +curl -L https://raw.githubusercontent.com/spiritLHLS/pve/main/scripts/create_vm.sh -o create_vm.sh && chmod +x create_vm.sh && bash create_vm.sh +``` + +国内 + +```shell +curl -L https://ghproxy.com/https://raw.githubusercontent.com/spiritLHLS/pve/main/scripts/create_vm.sh -o create_vm.sh && chmod +x create_vm.sh && bash create_vm.sh +``` + +开设完毕可执行```cat vmlog```查看信息,或到WEB端对应VM的NOTES中查看 + +#### 删除所有VM + +- 删除所有VM +- 删除所有nat的端口映射 +- 重启网络 +- 删除log文件 + +```shell +for vmid in $(qm list | awk '{if(NR>1) print $1}'); do qm stop $vmid; qm destroy $vmid; rm -rf /var/lib/vz/images/$vmid*; done +iptables -t nat -F +iptables -t filter -F +service networking restart +systemctl restart networking.service +rm -rf vmlog +``` + +::tip +PVE修改VM配置前都得停机先,再修改配置,修改完再启动,免得出现配置重载错误 +:: + +### 开设独立IPV4地址的VM + +::warning +使用前需要保证当前宿主机的IP段带了至少2个IP,且有空余的IP未配置,该空余的IP未绑定宿主机 +开设前请使用screen挂起执行,避免开设时间过长,SSH不稳定导致中间执行中断 +:: +- 自动检测可用的IP区间,通过ping检测空余可使用的IP,选取其中之一绑定到虚拟机上 +- 系统的相关信息将会存储到对应的虚拟机的NOTE中,可在WEB端查看 + +国际 + +```shell +curl -L https://raw.githubusercontent.com/spiritLHLS/pve/main/scripts/buildvm_extraip.sh -o buildvm_extraip.sh && chmod +x buildvm_extraip.sh +``` + +国内 + +```shell +curl -L https://ghproxy.com/https://raw.githubusercontent.com/spiritLHLS/pve/main/scripts/buildvm_extraip.sh -o buildvm_extraip.sh && chmod +x buildvm_extraip.sh +``` + +#### 创建示例 + +```shell +./buildvm_extraip.sh VMID 用户名 密码 CPU核数 内存大小以MB计算 硬盘大小以GB计算 系统 存储盘 +``` + +```shell +./buildvm_extraip.sh 152 test1 1234567 1 1024 10 ubuntu20 local +``` + +上述命令意义为开设一个带独立IPV4地址的虚拟机,VMID是152,用户名是test1,密码是1234567,CPU是1核,内存是1024MB,硬盘是10G,系统是Ubuntu20,存储盘是local盘也就是系统盘 + +### 删除示例 + +```shell +qm stop 152 +qm destroy 152 +rm -rf vm152 +``` diff --git a/docs/guide/pve_lxc.md b/docs/guide/pve_lxc.md new file mode 100644 index 0000000000..955a56b81d --- /dev/null +++ b/docs/guide/pve_lxc.md @@ -0,0 +1,120 @@ +## 单独开设LXC虚拟化的CT + +::warning +初次使用前需要保证当前PVE纯净且宿主机未进行过任何端口映射,否则设置冲突可能出现BUG +开设前请使用screen挂起执行,避免批量开设时间过长,SSH不稳定导致中间执行中断 +:: +- 自动开设NAT服务器,默认使用Debian11镜像,也可自定义系统 +- 自动进行内外网端口映射,含22,80,443端口以及其他25个内外网端口号一样的端口 +- 生成后需要等待一段时间虚拟机内部配置好网络以及登陆信息,大概需要3分钟 +- 默认开设的网络配置为:22,80,443端口及一个25个端口区间的内外网映射 +- 可自定义开设的核心数,内存大小,硬盘大小,使用宿主机哪个存储盘,记得自己计算好空闲资源开设 +- 可在命令中指定存储盘位置,默认不指定时为local盘即系统盘,可指定为PVE中显示的挂载盘 +- 开设的CT默认已启用SSH且允许root登陆,且已设置支持使用docker的嵌套虚拟化 +- 容器的相关信息将会存储到对应的容器的NOTE中,可在WEB端查看 + +国际 + +```shell +curl -L https://raw.githubusercontent.com/spiritLHLS/pve/main/scripts/buildct.sh -o buildct.sh && chmod +x buildct.sh +``` + +国内 + +```shell +curl -L https://ghproxy.com/https://raw.githubusercontent.com/spiritLHLS/pve/main/scripts/buildct.sh -o buildct.sh && chmod +x buildct.sh +``` + +#### 使用方法 + +- 系统支持:debian10,debian11,ubuntu18,ubuntu20,ubuntu22,centos8,almalinux9等 +- 系统参数一律是小写的系统名字拼接版本号,具体可执行```pveam available --section system```查看可用的系统名字和版本号(注意脚本使用的参数只有小写的英文系统名字拼接版本号) +- 其他系统可能支持可能不支持,自行测试 +- 默认用户名是root + +```shell +./buildct.sh CTID 密码 CPU核数 内存 硬盘 SSH端口 80端口 443端口 外网端口起 外网端口止 系统 存储盘 +``` + +#### 测试示例 + +* 以下为开设的示例CT的信息: +`VMID` - 102 +`SSH登录的用户名` - root +`SSH登录的密码` - 1234567 +`CPU核数` - 1 +`内存大小` - 512MB +`磁盘大小` - 5G +`SSH端口` - 20001 +`80端口` - 20002 +`443端口` - 20003 +`内外网映射端口一致的区间` - 30000到30025 +`系统` - debian11 +`宿主机的存储盘` - local + +```shell +./buildct.sh 102 1234567 1 512 5 20001 20002 20003 30000 30025 debian11 local +``` + +开设完毕可执行```cat ct102```查看信息,或在web端的NOTES查看 + +#### 删除示例 + +- 停止CT +- 删除CT +- 删除端口映射 +- 重启网络 +- 删除log文件 + +```shell +pct stop 102 +pct destroy 102 +rm -rf ct102 +iptables -t nat -F +iptables -t filter -F +service networking restart +systemctl restart networking.service +``` + +## 批量开设NAT的LXC虚拟化的CT + +::warning +初次使用前需要保证当前PVE纯净且宿主机未进行过任何端口映射,否则设置冲突可能出现BUG +开设前请使用screen挂起执行,避免批量开设时间过长,SSH不稳定导致中间执行中断 +:: +- 可多次运行批量生成CT容器,但需要注意的是母鸡内存记得开点swap免得机器炸了[开SWAP点我跳转](https://github.com/spiritLHLS/addswap) +- 每个容器创建之间有间隔等待60秒避免突发性能不足 +- 可自定义批量开设的核心数,内存大小,硬盘大小,使用宿主机哪个存储盘,记得自己计算好空闲资源开设 +- 开设的CT默认已启用SSH且允许root登陆,且已设置支持使用docker的嵌套虚拟化 +- 容器的相关信息将会存储到对应的容器的NOTE中,可在WEB端查看 + +国际 + +```shell +curl -L https://raw.githubusercontent.com/spiritLHLS/pve/main/scripts/create_ct.sh -o create_ct.sh && chmod +x create_ct.sh && bash create_ct.sh +``` + +国内 + +```shell +curl -L https://ghproxy.com/https://raw.githubusercontent.com/spiritLHLS/pve/main/scripts/create_ct.sh -o create_ct.sh && chmod +x create_ct.sh && bash create_ct.sh +``` + +开设完毕可执行```cat ctlog```查看信息,或在web端的NOTES查看 + + +#### 删除所有CT + +- 删除所有CT +- 删除所有nat的端口映射 +- 重启网络 +- 删除log文件 + +```shell +pct list | awk 'NR>1{print $1}' | xargs -I {} sh -c 'pct stop {}; pct destroy {}' +rm -rf ct* +iptables -t nat -F +iptables -t filter -F +service networking restart +systemctl restart networking.service +``` diff --git a/docs/guide/pve_precheck.md b/docs/guide/pve_precheck.md new file mode 100644 index 0000000000..36d7abeb39 --- /dev/null +++ b/docs/guide/pve_precheck.md @@ -0,0 +1,42 @@ +# 系统要求与配置 + +## 各种要求 + +建议debian在使用前尽量使用最新的稳定版本的系统 + +非debian11可使用 [debian一键升级](https://github.com/spiritLHLS/one-click-installation-script#%E4%B8%80%E9%94%AE%E5%8D%87%E7%BA%A7%E4%BD%8E%E7%89%88%E6%9C%ACdebian%E4%B8%BAdebian11) 来升级系统 + +本项目只适配Debian系统(非Debian无法通过APT源安装,官方只给了Debian的镜像,其他系统只能使用ISO安装) + +- 系统要求:Debian 8+ +::tip +建议debian11而不是debian12,因为后者是beta版本,debian11安装的才是稳定版 +:: +- 硬件要求:2核2G内存x86_64架构服务器硬盘至少20G +::warning +内存开点swap免得机器炸了[开SWAP点我跳转](https://github.com/spiritLHLS/addswap) +:: +- 可开KVM的硬件要求:VM-X或AMD-V支持 (部分VPS和全部独服支持) +- 如果硬件或系统需求不满足,可使用LXD批量开LXC容器[跳转](https://github.com/spiritLHLS/lxc) + +**遇到选项不会选的可无脑回车安装,本项目所有脚本内置国内外IP自动判断,使用的是不同的安装源与配置文件,有使用CDN加速镜像下载** + +## 检测环境 + +- 本项目相关脚本执行前务必执行本脚本检测环境,如果不符合安装PVE的要求则无法使用后续的脚本 +- 检测硬件配置是否满足最低要求 +- 检测硬件环境是否可嵌套虚拟化KVM类型的服务器 +- 检测系统环境是否可嵌套虚拟化KVM类型的服务器 +- 不可嵌套虚拟化KVM类型的服务器也可以开LXC虚拟化的服务器,但不推荐安装PVE,不如使用[LXD](https://github.com/spiritLHLS/lxc) + +国际 + +``` +bash <(wget -qO- --no-check-certificate https://raw.githubusercontent.com/spiritLHLS/pve/main/scripts/check_kernal.sh) +``` + +国内 + +``` +bash <(wget -qO- --no-check-certificate https://ghproxy.com/https://raw.githubusercontent.com/spiritLHLS/pve/main/scripts/check_kernal.sh) +``` \ No newline at end of file diff --git a/docs/guide/pve_qa.md b/docs/guide/pve_qa.md new file mode 100644 index 0000000000..8aa50f56b2 --- /dev/null +++ b/docs/guide/pve_qa.md @@ -0,0 +1,23 @@ +## 目前已验证的VPS商家 + +### 可开设KVM虚拟化的NAT的商家 + +[nocix](https://www.nocix.net/) 中的特价最低配15美元独服 (IPV6不自带,需要找客服要) + +[amhost](http://amhost.net/vps/?cid=29317) 中的测试款 + +[digitalocean](https://m.do.co/c/e9712622ee89) 中的 Perminu Intel 和 Regular 4核款 + +[skrime](https://hosting.skrime.eu/a/server) 中的 AMD Ryzen KVM Server 最低配款 + +[webdock](https://webdock.io/en?maff=wdaff--150) 中的 AMD KVM Server + +[4vps](https://clck.ru/33VQmc) 中的 俄罗斯和希腊 测试款 + +[hostaris](https://deploy.hostaris.com/) 中的 德国款 (商家的系统模板有问题,IPV6已失效和Github的连通稳定性很差) + +### 只可开设LXC虚拟化的NAT的商家 + +[腾讯云](https://curl.qcloud.com/tPrMnfZm) 中的无忧款和特惠款(学生机) + +[spectraip](https://my.spectraip.net/aff.php?aff=35) 中的KVM服务器 \ No newline at end of file diff --git a/docs/guide/pve_thanks.md b/docs/guide/pve_thanks.md new file mode 100644 index 0000000000..853ad35c48 --- /dev/null +++ b/docs/guide/pve_thanks.md @@ -0,0 +1,17 @@ +## 致谢 + +https://blog.ilolicon.com/archives/615 + +https://github.com/Ella-Alinda/somescripts/blob/main/nat.sh + +https://pve.proxmox.com/pve-docs/qm.1.html + +https://down.idc.wiki/Image/realServer-Template/ + +https://mirrors.tuna.tsinghua.edu.cn/proxmox/ + +https://github.com/roacn/pve/blob/main/pve.sh + +https://github.com/spiritLHLS/lxc + +感谢 [@Ella-Alinda](https://github.com/Ella-Alinda) 提供的PVE指导 \ No newline at end of file diff --git a/docs/images/pve_kvm/pve_kvm_1.png b/docs/images/pve_kvm/pve_kvm_1.png new file mode 100644 index 0000000000..d610889dd6 Binary files /dev/null and b/docs/images/pve_kvm/pve_kvm_1.png differ diff --git a/docs/images/pve_kvm/pve_kvm_2.png b/docs/images/pve_kvm/pve_kvm_2.png new file mode 100644 index 0000000000..410c1bd544 Binary files /dev/null and b/docs/images/pve_kvm/pve_kvm_2.png differ diff --git a/docs/images/pve_kvm/pve_kvm_3.png b/docs/images/pve_kvm/pve_kvm_3.png new file mode 100644 index 0000000000..64cf2925e3 Binary files /dev/null and b/docs/images/pve_kvm/pve_kvm_3.png differ diff --git a/docs/index.md b/docs/index.md new file mode 100644 index 0000000000..f75de8bb57 --- /dev/null +++ b/docs/index.md @@ -0,0 +1,19 @@ +--- +home: true +heroImage: https://raw.githubusercontent.com/spiritlhls/pages/main/logo.jpg +heroText: 一键虚拟化项目 +tagline: 开源、易于使用的服务器虚拟化项目 +actionText: 开始使用 → +actionLink: /guide/dashboard +features: +- title: 一键安装 + details: 支持一键脚本安装,轻松使用;基于 Debian、Ubuntu 的长期维护版本开发,尽量保证宿主机系统与开发环境一致 +- title: 自带内外网端口转发 + details: 支持自动的内网端口转发,含TCP、UDP协议 +- title: 批量虚拟化 + details: 支持 KVM、LXC、Docker 虚拟化批量开设虚拟机(容器) +- title: 自限制滥用 + details: 部分虚拟化开设的容器/虚拟机已屏蔽和装载限制,避免被用于滥用 +footer: Copyright © 2023-present oneclickvirt +--- +
本项目采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。 \ No newline at end of file diff --git a/docs/package.json b/docs/package.json new file mode 100644 index 0000000000..6c27c876a0 --- /dev/null +++ b/docs/package.json @@ -0,0 +1,4 @@ +{ + "private": true, + "name": "vitepress-docs" +} diff --git a/docs/public/_headers b/docs/public/_headers new file mode 100644 index 0000000000..f7fa3afc62 --- /dev/null +++ b/docs/public/_headers @@ -0,0 +1,3 @@ +/assets/* + cache-control: max-age=31536000 + cache-control: immutable \ No newline at end of file diff --git a/docs/snippets/snippet-with-region.js b/docs/snippets/snippet-with-region.js new file mode 100644 index 0000000000..9c7faaebca --- /dev/null +++ b/docs/snippets/snippet-with-region.js @@ -0,0 +1,7 @@ +// #region snippet +function foo() { + // .. +} +// #endregion snippet + +export default foo diff --git a/docs/snippets/snippet.js b/docs/snippets/snippet.js new file mode 100644 index 0000000000..575039d1ec --- /dev/null +++ b/docs/snippets/snippet.js @@ -0,0 +1,3 @@ +export default function () { + // .. +} diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000000..50c0e4dd8b --- /dev/null +++ b/package-lock.json @@ -0,0 +1,1858 @@ +{ + "name": "oneclickvirt.github.io", + "version": "1.0.0", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "oneclickvirt.github.io", + "version": "1.0.0", + "license": "ISC", + "devDependencies": { + "vitepress": "^0.22.4" + } + }, + "node_modules/@algolia/autocomplete-core": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.5.2.tgz", + "integrity": "sha512-DY0bhyczFSS1b/CqJlTE/nQRtnTAHl6IemIkBy0nEWnhDzRDdtdx4p5Uuk3vwAFxwEEgi1WqKwgSSMx6DpNL4A==", + "dev": true, + "dependencies": { + "@algolia/autocomplete-shared": "1.5.2" + } + }, + "node_modules/@algolia/autocomplete-preset-algolia": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.5.2.tgz", + "integrity": "sha512-3MRYnYQFJyovANzSX2CToS6/5cfVjbLLqFsZTKcvF3abhQzxbqwwaMBlJtt620uBUOeMzhdfasKhCc40+RHiZw==", + "dev": true, + "dependencies": { + "@algolia/autocomplete-shared": "1.5.2" + }, + "peerDependencies": { + "@algolia/client-search": "^4.9.1", + "algoliasearch": "^4.9.1" + } + }, + "node_modules/@algolia/autocomplete-shared": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.5.2.tgz", + "integrity": "sha512-ylQAYv5H0YKMfHgVWX0j0NmL8XBcAeeeVQUmppnnMtzDbDnca6CzhKj3Q8eF9cHCgcdTDdb5K+3aKyGWA0obug==", + "dev": true + }, + "node_modules/@algolia/cache-browser-local-storage": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.13.0.tgz", + "integrity": "sha512-nj1vHRZauTqP/bluwkRIgEADEimqojJgoTRCel5f6q8WCa9Y8QeI4bpDQP28FoeKnDRYa3J5CauDlN466jqRhg==", + "dev": true, + "dependencies": { + "@algolia/cache-common": "4.13.0" + } + }, + "node_modules/@algolia/cache-common": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@algolia/cache-common/-/cache-common-4.13.0.tgz", + "integrity": "sha512-f9mdZjskCui/dA/fA/5a+6hZ7xnHaaZI5tM/Rw9X8rRB39SUlF/+o3P47onZ33n/AwkpSbi5QOyhs16wHd55kA==", + "dev": true + }, + "node_modules/@algolia/cache-in-memory": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@algolia/cache-in-memory/-/cache-in-memory-4.13.0.tgz", + "integrity": "sha512-hHdc+ahPiMM92CQMljmObE75laYzNFYLrNOu0Q3/eyvubZZRtY2SUsEEgyUEyzXruNdzrkcDxFYa7YpWBJYHAg==", + "dev": true, + "dependencies": { + "@algolia/cache-common": "4.13.0" + } + }, + "node_modules/@algolia/client-account": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@algolia/client-account/-/client-account-4.13.0.tgz", + "integrity": "sha512-FzFqFt9b0g/LKszBDoEsW+dVBuUe1K3scp2Yf7q6pgHWM1WqyqUlARwVpLxqyc+LoyJkTxQftOKjyFUqddnPKA==", + "dev": true, + "dependencies": { + "@algolia/client-common": "4.13.0", + "@algolia/client-search": "4.13.0", + "@algolia/transporter": "4.13.0" + } + }, + "node_modules/@algolia/client-analytics": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-4.13.0.tgz", + "integrity": "sha512-klmnoq2FIiiMHImkzOm+cGxqRLLu9CMHqFhbgSy9wtXZrqb8BBUIUE2VyBe7azzv1wKcxZV2RUyNOMpFqmnRZA==", + "dev": true, + "dependencies": { + "@algolia/client-common": "4.13.0", + "@algolia/client-search": "4.13.0", + "@algolia/requester-common": "4.13.0", + "@algolia/transporter": "4.13.0" + } + }, + "node_modules/@algolia/client-common": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.13.0.tgz", + "integrity": "sha512-GoXfTp0kVcbgfSXOjfrxx+slSipMqGO9WnNWgeMmru5Ra09MDjrcdunsiiuzF0wua6INbIpBQFTC2Mi5lUNqGA==", + "dev": true, + "dependencies": { + "@algolia/requester-common": "4.13.0", + "@algolia/transporter": "4.13.0" + } + }, + "node_modules/@algolia/client-personalization": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-4.13.0.tgz", + "integrity": "sha512-KneLz2WaehJmNfdr5yt2HQETpLaCYagRdWwIwkTqRVFCv4DxRQ2ChPVW9jeTj4YfAAhfzE6F8hn7wkQ/Jfj6ZA==", + "dev": true, + "dependencies": { + "@algolia/client-common": "4.13.0", + "@algolia/requester-common": "4.13.0", + "@algolia/transporter": "4.13.0" + } + }, + "node_modules/@algolia/client-search": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.13.0.tgz", + "integrity": "sha512-blgCKYbZh1NgJWzeGf+caKE32mo3j54NprOf0LZVCubQb3Kx37tk1Hc8SDs9bCAE8hUvf3cazMPIg7wscSxspA==", + "dev": true, + "dependencies": { + "@algolia/client-common": "4.13.0", + "@algolia/requester-common": "4.13.0", + "@algolia/transporter": "4.13.0" + } + }, + "node_modules/@algolia/logger-common": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@algolia/logger-common/-/logger-common-4.13.0.tgz", + "integrity": "sha512-8yqXk7rMtmQJ9wZiHOt/6d4/JDEg5VCk83gJ39I+X/pwUPzIsbKy9QiK4uJ3aJELKyoIiDT1hpYVt+5ia+94IA==", + "dev": true + }, + "node_modules/@algolia/logger-console": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@algolia/logger-console/-/logger-console-4.13.0.tgz", + "integrity": "sha512-YepRg7w2/87L0vSXRfMND6VJ5d6699sFJBRWzZPOlek2p5fLxxK7O0VncYuc/IbVHEgeApvgXx0WgCEa38GVuQ==", + "dev": true, + "dependencies": { + "@algolia/logger-common": "4.13.0" + } + }, + "node_modules/@algolia/requester-browser-xhr": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.13.0.tgz", + "integrity": "sha512-Dj+bnoWR5MotrnjblzGKZ2kCdQi2cK/VzPURPnE616NU/il7Ypy6U6DLGZ/ZYz+tnwPa0yypNf21uqt84fOgrg==", + "dev": true, + "dependencies": { + "@algolia/requester-common": "4.13.0" + } + }, + "node_modules/@algolia/requester-common": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-common/-/requester-common-4.13.0.tgz", + "integrity": "sha512-BRTDj53ecK+gn7ugukDWOOcBRul59C4NblCHqj4Zm5msd5UnHFjd/sGX+RLOEoFMhetILAnmg6wMrRrQVac9vw==", + "dev": true + }, + "node_modules/@algolia/requester-node-http": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-4.13.0.tgz", + "integrity": "sha512-9b+3O4QFU4azLhGMrZAr/uZPydvzOR4aEZfSL8ZrpLZ7fbbqTO0S/5EVko+QIgglRAtVwxvf8UJ1wzTD2jvKxQ==", + "dev": true, + "dependencies": { + "@algolia/requester-common": "4.13.0" + } + }, + "node_modules/@algolia/transporter": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@algolia/transporter/-/transporter-4.13.0.tgz", + "integrity": "sha512-8tSQYE+ykQENAdeZdofvtkOr5uJ9VcQSWgRhQ9h01AehtBIPAczk/b2CLrMsw5yQZziLs5cZ3pJ3478yI+urhA==", + "dev": true, + "dependencies": { + "@algolia/cache-common": "4.13.0", + "@algolia/logger-common": "4.13.0", + "@algolia/requester-common": "4.13.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.17.12.tgz", + "integrity": "sha512-FLzHmN9V3AJIrWfOpvRlZCeVg/WLdicSnTMsLur6uDj9TT8ymUlG9XxURdW/XvuygK+2CW0poOJABdA4m/YKxA==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@docsearch/css": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-3.0.0.tgz", + "integrity": "sha512-1kkV7tkAsiuEd0shunYRByKJe3xQDG2q7wYg24SOw1nV9/2lwEd4WrUYRJC/ukGTl2/kHeFxsaUvtiOy0y6fFA==", + "dev": true + }, + "node_modules/@docsearch/js": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@docsearch/js/-/js-3.0.0.tgz", + "integrity": "sha512-j3tUJWlgW3slYqzGB8fm7y05kh2qqrIK1dZOXHeMUm/5gdKE85fiz/ltfCPMDFb/MXF+bLZChJXSMzqY0Ck30Q==", + "dev": true, + "dependencies": { + "@docsearch/react": "3.0.0", + "preact": "^10.0.0" + } + }, + "node_modules/@docsearch/react": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-3.0.0.tgz", + "integrity": "sha512-yhMacqS6TVQYoBh/o603zszIb5Bl8MIXuOc6Vy617I74pirisDzzcNh0NEaYQt50fVVR3khUbeEhUEWEWipESg==", + "dev": true, + "dependencies": { + "@algolia/autocomplete-core": "1.5.2", + "@algolia/autocomplete-preset-algolia": "1.5.2", + "@docsearch/css": "3.0.0", + "algoliasearch": "^4.0.0" + }, + "peerDependencies": { + "@types/react": ">= 16.8.0 < 18.0.0", + "react": ">= 16.8.0 < 18.0.0", + "react-dom": ">= 16.8.0 < 18.0.0" + } + }, + "node_modules/@types/prop-types": { + "version": "15.7.5", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", + "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==", + "dev": true, + "peer": true + }, + "node_modules/@types/react": { + "version": "17.0.45", + "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.45.tgz", + "integrity": "sha512-YfhQ22Lah2e3CHPsb93tRwIGNiSwkuz1/blk4e6QrWS0jQzCSNbGLtOEYhPg02W0yGTTmpajp7dCTbBAMN3qsg==", + "dev": true, + "peer": true, + "dependencies": { + "@types/prop-types": "*", + "@types/scheduler": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@types/scheduler": { + "version": "0.16.2", + "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz", + "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==", + "dev": true, + "peer": true + }, + "node_modules/@vitejs/plugin-vue": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-2.3.3.tgz", + "integrity": "sha512-SmQLDyhz+6lGJhPELsBdzXGc+AcaT8stgkbiTFGpXPe8Tl1tJaBw1A6pxDqDuRsVkD8uscrkx3hA7QDOoKYtyw==", + "dev": true, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "vite": "^2.5.10", + "vue": "^3.2.25" + } + }, + "node_modules/@vue/compiler-core": { + "version": "3.2.33", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.2.33.tgz", + "integrity": "sha512-AAmr52ji3Zhk7IKIuigX2osWWsb2nQE5xsdFYjdnmtQ4gymmqXbjLvkSE174+fF3A3kstYrTgGkqgOEbsdLDpw==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.16.4", + "@vue/shared": "3.2.33", + "estree-walker": "^2.0.2", + "source-map": "^0.6.1" + } + }, + "node_modules/@vue/compiler-dom": { + "version": "3.2.33", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.2.33.tgz", + "integrity": "sha512-GhiG1C8X98Xz9QUX/RlA6/kgPBWJkjq0Rq6//5XTAGSYrTMBgcLpP9+CnlUg1TFxnnCVughAG+KZl28XJqw8uQ==", + "dev": true, + "dependencies": { + "@vue/compiler-core": "3.2.33", + "@vue/shared": "3.2.33" + } + }, + "node_modules/@vue/compiler-sfc": { + "version": "3.2.33", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.2.33.tgz", + "integrity": "sha512-H8D0WqagCr295pQjUYyO8P3IejM3vEzeCO1apzByAEaAR/WimhMYczHfZVvlCE/9yBaEu/eu9RdiWr0kF8b71Q==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.16.4", + "@vue/compiler-core": "3.2.33", + "@vue/compiler-dom": "3.2.33", + "@vue/compiler-ssr": "3.2.33", + "@vue/reactivity-transform": "3.2.33", + "@vue/shared": "3.2.33", + "estree-walker": "^2.0.2", + "magic-string": "^0.25.7", + "postcss": "^8.1.10", + "source-map": "^0.6.1" + } + }, + "node_modules/@vue/compiler-ssr": { + "version": "3.2.33", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.2.33.tgz", + "integrity": "sha512-XQh1Xdk3VquDpXsnoCd7JnMoWec9CfAzQDQsaMcSU79OrrO2PNR0ErlIjm/mGq3GmBfkQjzZACV+7GhfRB8xMQ==", + "dev": true, + "dependencies": { + "@vue/compiler-dom": "3.2.33", + "@vue/shared": "3.2.33" + } + }, + "node_modules/@vue/reactivity": { + "version": "3.2.33", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.2.33.tgz", + "integrity": "sha512-62Sq0mp9/0bLmDuxuLD5CIaMG2susFAGARLuZ/5jkU1FCf9EDbwUuF+BO8Ub3Rbodx0ziIecM/NsmyjardBxfQ==", + "dev": true, + "dependencies": { + "@vue/shared": "3.2.33" + } + }, + "node_modules/@vue/reactivity-transform": { + "version": "3.2.33", + "resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.2.33.tgz", + "integrity": "sha512-4UL5KOIvSQb254aqenW4q34qMXbfZcmEsV/yVidLUgvwYQQ/D21bGX3DlgPUGI3c4C+iOnNmDCkIxkILoX/Pyw==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.16.4", + "@vue/compiler-core": "3.2.33", + "@vue/shared": "3.2.33", + "estree-walker": "^2.0.2", + "magic-string": "^0.25.7" + } + }, + "node_modules/@vue/runtime-core": { + "version": "3.2.33", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.2.33.tgz", + "integrity": "sha512-N2D2vfaXsBPhzCV3JsXQa2NECjxP3eXgZlFqKh4tgakp3iX6LCGv76DLlc+IfFZq+TW10Y8QUfeihXOupJ1dGw==", + "dev": true, + "dependencies": { + "@vue/reactivity": "3.2.33", + "@vue/shared": "3.2.33" + } + }, + "node_modules/@vue/runtime-dom": { + "version": "3.2.33", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.2.33.tgz", + "integrity": "sha512-LSrJ6W7CZTSUygX5s8aFkraDWlO6K4geOwA3quFF2O+hC3QuAMZt/0Xb7JKE3C4JD4pFwCSO7oCrZmZ0BIJUnw==", + "dev": true, + "dependencies": { + "@vue/runtime-core": "3.2.33", + "@vue/shared": "3.2.33", + "csstype": "^2.6.8" + } + }, + "node_modules/@vue/runtime-dom/node_modules/csstype": { + "version": "2.6.20", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.20.tgz", + "integrity": "sha512-/WwNkdXfckNgw6S5R125rrW8ez139lBHWouiBvX8dfMFtcn6V81REDqnH7+CRpRipfYlyU1CmOnOxrmGcFOjeA==", + "dev": true + }, + "node_modules/@vue/server-renderer": { + "version": "3.2.33", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.2.33.tgz", + "integrity": "sha512-4jpJHRD4ORv8PlbYi+/MfP8ec1okz6rybe36MdpkDrGIdEItHEUyaHSKvz+ptNEyQpALmmVfRteHkU9F8vxOew==", + "dev": true, + "dependencies": { + "@vue/compiler-ssr": "3.2.33", + "@vue/shared": "3.2.33" + }, + "peerDependencies": { + "vue": "3.2.33" + } + }, + "node_modules/@vue/shared": { + "version": "3.2.33", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.2.33.tgz", + "integrity": "sha512-UBc1Pg1T3yZ97vsA2ueER0F6GbJebLHYlEi4ou1H5YL4KWvMOOWwpYo9/QpWq93wxKG6Wo13IY74Hcn/f7c7Bg==", + "dev": true + }, + "node_modules/algoliasearch": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.13.0.tgz", + "integrity": "sha512-oHv4faI1Vl2s+YC0YquwkK/TsaJs79g2JFg5FDm2rKN12VItPTAeQ7hyJMHarOPPYuCnNC5kixbtcqvb21wchw==", + "dev": true, + "dependencies": { + "@algolia/cache-browser-local-storage": "4.13.0", + "@algolia/cache-common": "4.13.0", + "@algolia/cache-in-memory": "4.13.0", + "@algolia/client-account": "4.13.0", + "@algolia/client-analytics": "4.13.0", + "@algolia/client-common": "4.13.0", + "@algolia/client-personalization": "4.13.0", + "@algolia/client-search": "4.13.0", + "@algolia/logger-common": "4.13.0", + "@algolia/logger-console": "4.13.0", + "@algolia/requester-browser-xhr": "4.13.0", + "@algolia/requester-common": "4.13.0", + "@algolia/requester-node-http": "4.13.0", + "@algolia/transporter": "4.13.0" + } + }, + "node_modules/csstype": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.0.tgz", + "integrity": "sha512-uX1KG+x9h5hIJsaKR9xHUeUraxf8IODOwq9JLNPq6BwB04a/xgpq3rcx47l5BZu5zBPlgD342tdke3Hom/nJRA==", + "dev": true, + "peer": true + }, + "node_modules/esbuild": { + "version": "0.14.39", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.14.39.tgz", + "integrity": "sha512-2kKujuzvRWYtwvNjYDY444LQIA3TyJhJIX3Yo4+qkFlDDtGlSicWgeHVJqMUP/2sSfH10PGwfsj+O2ro1m10xQ==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "esbuild-android-64": "0.14.39", + "esbuild-android-arm64": "0.14.39", + "esbuild-darwin-64": "0.14.39", + "esbuild-darwin-arm64": "0.14.39", + "esbuild-freebsd-64": "0.14.39", + "esbuild-freebsd-arm64": "0.14.39", + "esbuild-linux-32": "0.14.39", + "esbuild-linux-64": "0.14.39", + "esbuild-linux-arm": "0.14.39", + "esbuild-linux-arm64": "0.14.39", + "esbuild-linux-mips64le": "0.14.39", + "esbuild-linux-ppc64le": "0.14.39", + "esbuild-linux-riscv64": "0.14.39", + "esbuild-linux-s390x": "0.14.39", + "esbuild-netbsd-64": "0.14.39", + "esbuild-openbsd-64": "0.14.39", + "esbuild-sunos-64": "0.14.39", + "esbuild-windows-32": "0.14.39", + "esbuild-windows-64": "0.14.39", + "esbuild-windows-arm64": "0.14.39" + } + }, + "node_modules/esbuild-android-64": { + "version": "0.14.39", + "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.14.39.tgz", + "integrity": "sha512-EJOu04p9WgZk0UoKTqLId9VnIsotmI/Z98EXrKURGb3LPNunkeffqQIkjS2cAvidh+OK5uVrXaIP229zK6GvhQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-android-arm64": { + "version": "0.14.39", + "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.14.39.tgz", + "integrity": "sha512-+twajJqO7n3MrCz9e+2lVOnFplRsaGRwsq1KL/uOy7xK7QdRSprRQcObGDeDZUZsacD5gUkk6OiHiYp6RzU3CA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-darwin-64": { + "version": "0.14.39", + "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.14.39.tgz", + "integrity": "sha512-ImT6eUw3kcGcHoUxEcdBpi6LfTRWaV6+qf32iYYAfwOeV+XaQ/Xp5XQIBiijLeo+LpGci9M0FVec09nUw41a5g==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-darwin-arm64": { + "version": "0.14.39", + "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.39.tgz", + "integrity": "sha512-/fcQ5UhE05OiT+bW5v7/up1bDsnvaRZPJxXwzXsMRrr7rZqPa85vayrD723oWMT64dhrgWeA3FIneF8yER0XTw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-freebsd-64": { + "version": "0.14.39", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.39.tgz", + "integrity": "sha512-oMNH8lJI4wtgN5oxuFP7BQ22vgB/e3Tl5Woehcd6i2r6F3TszpCnNl8wo2d/KvyQ4zvLvCWAlRciumhQg88+kQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-freebsd-arm64": { + "version": "0.14.39", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.39.tgz", + "integrity": "sha512-1GHK7kwk57ukY2yI4ILWKJXaxfr+8HcM/r/JKCGCPziIVlL+Wi7RbJ2OzMcTKZ1HpvEqCTBT/J6cO4ZEwW4Ypg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-32": { + "version": "0.14.39", + "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.14.39.tgz", + "integrity": "sha512-g97Sbb6g4zfRLIxHgW2pc393DjnkTRMeq3N1rmjDUABxpx8SjocK4jLen+/mq55G46eE2TA0MkJ4R3SpKMu7dg==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-64": { + "version": "0.14.39", + "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.14.39.tgz", + "integrity": "sha512-4tcgFDYWdI+UbNMGlua9u1Zhu0N5R6u9tl5WOM8aVnNX143JZoBZLpCuUr5lCKhnD0SCO+5gUyMfupGrHtfggQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-arm": { + "version": "0.14.39", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.14.39.tgz", + "integrity": "sha512-t0Hn1kWVx5UpCzAJkKRfHeYOLyFnXwYynIkK54/h3tbMweGI7dj400D1k0Vvtj2u1P+JTRT9tx3AjtLEMmfVBQ==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-arm64": { + "version": "0.14.39", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.39.tgz", + "integrity": "sha512-23pc8MlD2D6Px1mV8GMglZlKgwgNKAO8gsgsLLcXWSs9lQsCYkIlMo/2Ycfo5JrDIbLdwgP8D2vpfH2KcBqrDQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-mips64le": { + "version": "0.14.39", + "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.39.tgz", + "integrity": "sha512-epwlYgVdbmkuRr5n4es3B+yDI0I2e/nxhKejT9H0OLxFAlMkeQZxSpxATpDc9m8NqRci6Kwyb/SfmD1koG2Zuw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-ppc64le": { + "version": "0.14.39", + "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.39.tgz", + "integrity": "sha512-W/5ezaq+rQiQBThIjLMNjsuhPHg+ApVAdTz2LvcuesZFMsJoQAW2hutoyg47XxpWi7aEjJGrkS26qCJKhRn3QQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-riscv64": { + "version": "0.14.39", + "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.39.tgz", + "integrity": "sha512-IS48xeokcCTKeQIOke2O0t9t14HPvwnZcy+5baG13Z1wxs9ZrC5ig5ypEQQh4QMKxURD5TpCLHw2W42CLuVZaA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-s390x": { + "version": "0.14.39", + "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.39.tgz", + "integrity": "sha512-zEfunpqR8sMomqXhNTFEKDs+ik7HC01m3M60MsEjZOqaywHu5e5682fMsqOlZbesEAAaO9aAtRBsU7CHnSZWyA==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-netbsd-64": { + "version": "0.14.39", + "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.39.tgz", + "integrity": "sha512-Uo2suJBSIlrZCe4E0k75VDIFJWfZy+bOV6ih3T4MVMRJh1lHJ2UyGoaX4bOxomYN3t+IakHPyEoln1+qJ1qYaA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-openbsd-64": { + "version": "0.14.39", + "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.39.tgz", + "integrity": "sha512-secQU+EpgUPpYjJe3OecoeGKVvRMLeKUxSMGHnK+aK5uQM3n1FPXNJzyz1LHFOo0WOyw+uoCxBYdM4O10oaCAA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-sunos-64": { + "version": "0.14.39", + "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.14.39.tgz", + "integrity": "sha512-qHq0t5gePEDm2nqZLb+35p/qkaXVS7oIe32R0ECh2HOdiXXkj/1uQI9IRogGqKkK+QjDG+DhwiUw7QoHur/Rwg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-windows-32": { + "version": "0.14.39", + "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.14.39.tgz", + "integrity": "sha512-XPjwp2OgtEX0JnOlTgT6E5txbRp6Uw54Isorm3CwOtloJazeIWXuiwK0ONJBVb/CGbiCpS7iP2UahGgd2p1x+Q==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-windows-64": { + "version": "0.14.39", + "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.14.39.tgz", + "integrity": "sha512-E2wm+5FwCcLpKsBHRw28bSYQw0Ikxb7zIMxw3OPAkiaQhLVr3dnVO8DofmbWhhf6b97bWzg37iSZ45ZDpLw7Ow==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-windows-arm64": { + "version": "0.14.39", + "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.39.tgz", + "integrity": "sha512-sBZQz5D+Gd0EQ09tZRnz/PpVdLwvp/ufMtJ1iDFYddDaPpZXKqPyaxfYBLs3ueiaksQ26GGa7sci0OqFzNs7KA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "dev": true + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/is-core-module": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz", + "integrity": "sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "peer": true + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dev": true, + "peer": true, + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/magic-string": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", + "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", + "dev": true, + "dependencies": { + "sourcemap-codec": "^1.4.8" + } + }, + "node_modules/nanoid": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", + "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==", + "dev": true, + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true, + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "node_modules/postcss": { + "version": "8.4.13", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.13.tgz", + "integrity": "sha512-jtL6eTBrza5MPzy8oJLFuUscHDXTV5KcLlqAWHl5q5WYRfnNRGSmOZmOZ1T6Gy7A99mOZfqungmZMpMmCVJ8ZA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + } + ], + "dependencies": { + "nanoid": "^3.3.3", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/preact": { + "version": "10.7.2", + "resolved": "https://registry.npmjs.org/preact/-/preact-10.7.2.tgz", + "integrity": "sha512-GLjn0I3r6ka+NvxJUppsVFqb4V0qDTEHT/QxHlidPuClGaxF/4AI2Qti4a0cv3XMh5n1+D3hLScW10LRIm5msQ==", + "dev": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/preact" + } + }, + "node_modules/prismjs": { + "version": "1.28.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.28.0.tgz", + "integrity": "sha512-8aaXdYvl1F7iC7Xm1spqSaY/OJBpYW3v+KJ+F17iYxvdc8sfjW194COK5wVhMZX45tGteiBQgdvD/nhxcRwylw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/react": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react/-/react-17.0.2.tgz", + "integrity": "sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==", + "dev": true, + "peer": true, + "dependencies": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz", + "integrity": "sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA==", + "dev": true, + "peer": true, + "dependencies": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "scheduler": "^0.20.2" + }, + "peerDependencies": { + "react": "17.0.2" + } + }, + "node_modules/resolve": { + "version": "1.22.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz", + "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==", + "dev": true, + "dependencies": { + "is-core-module": "^2.8.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/rollup": { + "version": "2.73.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.73.0.tgz", + "integrity": "sha512-h/UngC3S4Zt28mB3g0+2YCMegT5yoftnQplwzPqGZcKvlld5e+kT/QRmJiL+qxGyZKOYpgirWGdLyEO1b0dpLQ==", + "dev": true, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=10.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/scheduler": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz", + "integrity": "sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==", + "dev": true, + "peer": true, + "dependencies": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sourcemap-codec": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", + "dev": true + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/vite": { + "version": "2.9.9", + "resolved": "https://registry.npmjs.org/vite/-/vite-2.9.9.tgz", + "integrity": "sha512-ffaam+NgHfbEmfw/Vuh6BHKKlI/XIAhxE5QSS7gFLIngxg171mg1P3a4LSRME0z2ZU1ScxoKzphkipcYwSD5Ew==", + "dev": true, + "dependencies": { + "esbuild": "^0.14.27", + "postcss": "^8.4.13", + "resolve": "^1.22.0", + "rollup": "^2.59.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": ">=12.2.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + }, + "peerDependencies": { + "less": "*", + "sass": "*", + "stylus": "*" + }, + "peerDependenciesMeta": { + "less": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + } + } + }, + "node_modules/vitepress": { + "version": "0.22.4", + "resolved": "https://registry.npmjs.org/vitepress/-/vitepress-0.22.4.tgz", + "integrity": "sha512-oZUnLO/SpYdThaBKefDeOiVlr0Rie4Ppx3FzMnMyLtJnI5GlBMNjqYqMy/4+umm/iC+ZDJfI+IlDKxv5fZnYzA==", + "dev": true, + "dependencies": { + "@docsearch/css": "^3.0.0", + "@docsearch/js": "^3.0.0", + "@vitejs/plugin-vue": "^2.3.2", + "prismjs": "^1.25.0", + "vite": "^2.9.7", + "vue": "^3.2.33" + }, + "bin": { + "vitepress": "bin/vitepress.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/vue": { + "version": "3.2.33", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.2.33.tgz", + "integrity": "sha512-si1ExAlDUrLSIg/V7D/GgA4twJwfsfgG+t9w10z38HhL/HA07132pUQ2KuwAo8qbCyMJ9e6OqrmWrOCr+jW7ZQ==", + "dev": true, + "dependencies": { + "@vue/compiler-dom": "3.2.33", + "@vue/compiler-sfc": "3.2.33", + "@vue/runtime-dom": "3.2.33", + "@vue/server-renderer": "3.2.33", + "@vue/shared": "3.2.33" + } + } + }, + "dependencies": { + "@algolia/autocomplete-core": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.5.2.tgz", + "integrity": "sha512-DY0bhyczFSS1b/CqJlTE/nQRtnTAHl6IemIkBy0nEWnhDzRDdtdx4p5Uuk3vwAFxwEEgi1WqKwgSSMx6DpNL4A==", + "dev": true, + "requires": { + "@algolia/autocomplete-shared": "1.5.2" + } + }, + "@algolia/autocomplete-preset-algolia": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.5.2.tgz", + "integrity": "sha512-3MRYnYQFJyovANzSX2CToS6/5cfVjbLLqFsZTKcvF3abhQzxbqwwaMBlJtt620uBUOeMzhdfasKhCc40+RHiZw==", + "dev": true, + "requires": { + "@algolia/autocomplete-shared": "1.5.2" + } + }, + "@algolia/autocomplete-shared": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.5.2.tgz", + "integrity": "sha512-ylQAYv5H0YKMfHgVWX0j0NmL8XBcAeeeVQUmppnnMtzDbDnca6CzhKj3Q8eF9cHCgcdTDdb5K+3aKyGWA0obug==", + "dev": true + }, + "@algolia/cache-browser-local-storage": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.13.0.tgz", + "integrity": "sha512-nj1vHRZauTqP/bluwkRIgEADEimqojJgoTRCel5f6q8WCa9Y8QeI4bpDQP28FoeKnDRYa3J5CauDlN466jqRhg==", + "dev": true, + "requires": { + "@algolia/cache-common": "4.13.0" + } + }, + "@algolia/cache-common": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@algolia/cache-common/-/cache-common-4.13.0.tgz", + "integrity": "sha512-f9mdZjskCui/dA/fA/5a+6hZ7xnHaaZI5tM/Rw9X8rRB39SUlF/+o3P47onZ33n/AwkpSbi5QOyhs16wHd55kA==", + "dev": true + }, + "@algolia/cache-in-memory": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@algolia/cache-in-memory/-/cache-in-memory-4.13.0.tgz", + "integrity": "sha512-hHdc+ahPiMM92CQMljmObE75laYzNFYLrNOu0Q3/eyvubZZRtY2SUsEEgyUEyzXruNdzrkcDxFYa7YpWBJYHAg==", + "dev": true, + "requires": { + "@algolia/cache-common": "4.13.0" + } + }, + "@algolia/client-account": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@algolia/client-account/-/client-account-4.13.0.tgz", + "integrity": "sha512-FzFqFt9b0g/LKszBDoEsW+dVBuUe1K3scp2Yf7q6pgHWM1WqyqUlARwVpLxqyc+LoyJkTxQftOKjyFUqddnPKA==", + "dev": true, + "requires": { + "@algolia/client-common": "4.13.0", + "@algolia/client-search": "4.13.0", + "@algolia/transporter": "4.13.0" + } + }, + "@algolia/client-analytics": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-4.13.0.tgz", + "integrity": "sha512-klmnoq2FIiiMHImkzOm+cGxqRLLu9CMHqFhbgSy9wtXZrqb8BBUIUE2VyBe7azzv1wKcxZV2RUyNOMpFqmnRZA==", + "dev": true, + "requires": { + "@algolia/client-common": "4.13.0", + "@algolia/client-search": "4.13.0", + "@algolia/requester-common": "4.13.0", + "@algolia/transporter": "4.13.0" + } + }, + "@algolia/client-common": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.13.0.tgz", + "integrity": "sha512-GoXfTp0kVcbgfSXOjfrxx+slSipMqGO9WnNWgeMmru5Ra09MDjrcdunsiiuzF0wua6INbIpBQFTC2Mi5lUNqGA==", + "dev": true, + "requires": { + "@algolia/requester-common": "4.13.0", + "@algolia/transporter": "4.13.0" + } + }, + "@algolia/client-personalization": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-4.13.0.tgz", + "integrity": "sha512-KneLz2WaehJmNfdr5yt2HQETpLaCYagRdWwIwkTqRVFCv4DxRQ2ChPVW9jeTj4YfAAhfzE6F8hn7wkQ/Jfj6ZA==", + "dev": true, + "requires": { + "@algolia/client-common": "4.13.0", + "@algolia/requester-common": "4.13.0", + "@algolia/transporter": "4.13.0" + } + }, + "@algolia/client-search": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.13.0.tgz", + "integrity": "sha512-blgCKYbZh1NgJWzeGf+caKE32mo3j54NprOf0LZVCubQb3Kx37tk1Hc8SDs9bCAE8hUvf3cazMPIg7wscSxspA==", + "dev": true, + "requires": { + "@algolia/client-common": "4.13.0", + "@algolia/requester-common": "4.13.0", + "@algolia/transporter": "4.13.0" + } + }, + "@algolia/logger-common": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@algolia/logger-common/-/logger-common-4.13.0.tgz", + "integrity": "sha512-8yqXk7rMtmQJ9wZiHOt/6d4/JDEg5VCk83gJ39I+X/pwUPzIsbKy9QiK4uJ3aJELKyoIiDT1hpYVt+5ia+94IA==", + "dev": true + }, + "@algolia/logger-console": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@algolia/logger-console/-/logger-console-4.13.0.tgz", + "integrity": "sha512-YepRg7w2/87L0vSXRfMND6VJ5d6699sFJBRWzZPOlek2p5fLxxK7O0VncYuc/IbVHEgeApvgXx0WgCEa38GVuQ==", + "dev": true, + "requires": { + "@algolia/logger-common": "4.13.0" + } + }, + "@algolia/requester-browser-xhr": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.13.0.tgz", + "integrity": "sha512-Dj+bnoWR5MotrnjblzGKZ2kCdQi2cK/VzPURPnE616NU/il7Ypy6U6DLGZ/ZYz+tnwPa0yypNf21uqt84fOgrg==", + "dev": true, + "requires": { + "@algolia/requester-common": "4.13.0" + } + }, + "@algolia/requester-common": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-common/-/requester-common-4.13.0.tgz", + "integrity": "sha512-BRTDj53ecK+gn7ugukDWOOcBRul59C4NblCHqj4Zm5msd5UnHFjd/sGX+RLOEoFMhetILAnmg6wMrRrQVac9vw==", + "dev": true + }, + "@algolia/requester-node-http": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-4.13.0.tgz", + "integrity": "sha512-9b+3O4QFU4azLhGMrZAr/uZPydvzOR4aEZfSL8ZrpLZ7fbbqTO0S/5EVko+QIgglRAtVwxvf8UJ1wzTD2jvKxQ==", + "dev": true, + "requires": { + "@algolia/requester-common": "4.13.0" + } + }, + "@algolia/transporter": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@algolia/transporter/-/transporter-4.13.0.tgz", + "integrity": "sha512-8tSQYE+ykQENAdeZdofvtkOr5uJ9VcQSWgRhQ9h01AehtBIPAczk/b2CLrMsw5yQZziLs5cZ3pJ3478yI+urhA==", + "dev": true, + "requires": { + "@algolia/cache-common": "4.13.0", + "@algolia/logger-common": "4.13.0", + "@algolia/requester-common": "4.13.0" + } + }, + "@babel/parser": { + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.17.12.tgz", + "integrity": "sha512-FLzHmN9V3AJIrWfOpvRlZCeVg/WLdicSnTMsLur6uDj9TT8ymUlG9XxURdW/XvuygK+2CW0poOJABdA4m/YKxA==", + "dev": true + }, + "@docsearch/css": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-3.0.0.tgz", + "integrity": "sha512-1kkV7tkAsiuEd0shunYRByKJe3xQDG2q7wYg24SOw1nV9/2lwEd4WrUYRJC/ukGTl2/kHeFxsaUvtiOy0y6fFA==", + "dev": true + }, + "@docsearch/js": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@docsearch/js/-/js-3.0.0.tgz", + "integrity": "sha512-j3tUJWlgW3slYqzGB8fm7y05kh2qqrIK1dZOXHeMUm/5gdKE85fiz/ltfCPMDFb/MXF+bLZChJXSMzqY0Ck30Q==", + "dev": true, + "requires": { + "@docsearch/react": "3.0.0", + "preact": "^10.0.0" + } + }, + "@docsearch/react": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-3.0.0.tgz", + "integrity": "sha512-yhMacqS6TVQYoBh/o603zszIb5Bl8MIXuOc6Vy617I74pirisDzzcNh0NEaYQt50fVVR3khUbeEhUEWEWipESg==", + "dev": true, + "requires": { + "@algolia/autocomplete-core": "1.5.2", + "@algolia/autocomplete-preset-algolia": "1.5.2", + "@docsearch/css": "3.0.0", + "algoliasearch": "^4.0.0" + } + }, + "@types/prop-types": { + "version": "15.7.5", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", + "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==", + "dev": true, + "peer": true + }, + "@types/react": { + "version": "17.0.45", + "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.45.tgz", + "integrity": "sha512-YfhQ22Lah2e3CHPsb93tRwIGNiSwkuz1/blk4e6QrWS0jQzCSNbGLtOEYhPg02W0yGTTmpajp7dCTbBAMN3qsg==", + "dev": true, + "peer": true, + "requires": { + "@types/prop-types": "*", + "@types/scheduler": "*", + "csstype": "^3.0.2" + } + }, + "@types/scheduler": { + "version": "0.16.2", + "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz", + "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==", + "dev": true, + "peer": true + }, + "@vitejs/plugin-vue": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-2.3.3.tgz", + "integrity": "sha512-SmQLDyhz+6lGJhPELsBdzXGc+AcaT8stgkbiTFGpXPe8Tl1tJaBw1A6pxDqDuRsVkD8uscrkx3hA7QDOoKYtyw==", + "dev": true, + "requires": {} + }, + "@vue/compiler-core": { + "version": "3.2.33", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.2.33.tgz", + "integrity": "sha512-AAmr52ji3Zhk7IKIuigX2osWWsb2nQE5xsdFYjdnmtQ4gymmqXbjLvkSE174+fF3A3kstYrTgGkqgOEbsdLDpw==", + "dev": true, + "requires": { + "@babel/parser": "^7.16.4", + "@vue/shared": "3.2.33", + "estree-walker": "^2.0.2", + "source-map": "^0.6.1" + } + }, + "@vue/compiler-dom": { + "version": "3.2.33", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.2.33.tgz", + "integrity": "sha512-GhiG1C8X98Xz9QUX/RlA6/kgPBWJkjq0Rq6//5XTAGSYrTMBgcLpP9+CnlUg1TFxnnCVughAG+KZl28XJqw8uQ==", + "dev": true, + "requires": { + "@vue/compiler-core": "3.2.33", + "@vue/shared": "3.2.33" + } + }, + "@vue/compiler-sfc": { + "version": "3.2.33", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.2.33.tgz", + "integrity": "sha512-H8D0WqagCr295pQjUYyO8P3IejM3vEzeCO1apzByAEaAR/WimhMYczHfZVvlCE/9yBaEu/eu9RdiWr0kF8b71Q==", + "dev": true, + "requires": { + "@babel/parser": "^7.16.4", + "@vue/compiler-core": "3.2.33", + "@vue/compiler-dom": "3.2.33", + "@vue/compiler-ssr": "3.2.33", + "@vue/reactivity-transform": "3.2.33", + "@vue/shared": "3.2.33", + "estree-walker": "^2.0.2", + "magic-string": "^0.25.7", + "postcss": "^8.1.10", + "source-map": "^0.6.1" + } + }, + "@vue/compiler-ssr": { + "version": "3.2.33", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.2.33.tgz", + "integrity": "sha512-XQh1Xdk3VquDpXsnoCd7JnMoWec9CfAzQDQsaMcSU79OrrO2PNR0ErlIjm/mGq3GmBfkQjzZACV+7GhfRB8xMQ==", + "dev": true, + "requires": { + "@vue/compiler-dom": "3.2.33", + "@vue/shared": "3.2.33" + } + }, + "@vue/reactivity": { + "version": "3.2.33", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.2.33.tgz", + "integrity": "sha512-62Sq0mp9/0bLmDuxuLD5CIaMG2susFAGARLuZ/5jkU1FCf9EDbwUuF+BO8Ub3Rbodx0ziIecM/NsmyjardBxfQ==", + "dev": true, + "requires": { + "@vue/shared": "3.2.33" + } + }, + "@vue/reactivity-transform": { + "version": "3.2.33", + "resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.2.33.tgz", + "integrity": "sha512-4UL5KOIvSQb254aqenW4q34qMXbfZcmEsV/yVidLUgvwYQQ/D21bGX3DlgPUGI3c4C+iOnNmDCkIxkILoX/Pyw==", + "dev": true, + "requires": { + "@babel/parser": "^7.16.4", + "@vue/compiler-core": "3.2.33", + "@vue/shared": "3.2.33", + "estree-walker": "^2.0.2", + "magic-string": "^0.25.7" + } + }, + "@vue/runtime-core": { + "version": "3.2.33", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.2.33.tgz", + "integrity": "sha512-N2D2vfaXsBPhzCV3JsXQa2NECjxP3eXgZlFqKh4tgakp3iX6LCGv76DLlc+IfFZq+TW10Y8QUfeihXOupJ1dGw==", + "dev": true, + "requires": { + "@vue/reactivity": "3.2.33", + "@vue/shared": "3.2.33" + } + }, + "@vue/runtime-dom": { + "version": "3.2.33", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.2.33.tgz", + "integrity": "sha512-LSrJ6W7CZTSUygX5s8aFkraDWlO6K4geOwA3quFF2O+hC3QuAMZt/0Xb7JKE3C4JD4pFwCSO7oCrZmZ0BIJUnw==", + "dev": true, + "requires": { + "@vue/runtime-core": "3.2.33", + "@vue/shared": "3.2.33", + "csstype": "^2.6.8" + }, + "dependencies": { + "csstype": { + "version": "2.6.20", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.20.tgz", + "integrity": "sha512-/WwNkdXfckNgw6S5R125rrW8ez139lBHWouiBvX8dfMFtcn6V81REDqnH7+CRpRipfYlyU1CmOnOxrmGcFOjeA==", + "dev": true + } + } + }, + "@vue/server-renderer": { + "version": "3.2.33", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.2.33.tgz", + "integrity": "sha512-4jpJHRD4ORv8PlbYi+/MfP8ec1okz6rybe36MdpkDrGIdEItHEUyaHSKvz+ptNEyQpALmmVfRteHkU9F8vxOew==", + "dev": true, + "requires": { + "@vue/compiler-ssr": "3.2.33", + "@vue/shared": "3.2.33" + } + }, + "@vue/shared": { + "version": "3.2.33", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.2.33.tgz", + "integrity": "sha512-UBc1Pg1T3yZ97vsA2ueER0F6GbJebLHYlEi4ou1H5YL4KWvMOOWwpYo9/QpWq93wxKG6Wo13IY74Hcn/f7c7Bg==", + "dev": true + }, + "algoliasearch": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.13.0.tgz", + "integrity": "sha512-oHv4faI1Vl2s+YC0YquwkK/TsaJs79g2JFg5FDm2rKN12VItPTAeQ7hyJMHarOPPYuCnNC5kixbtcqvb21wchw==", + "dev": true, + "requires": { + "@algolia/cache-browser-local-storage": "4.13.0", + "@algolia/cache-common": "4.13.0", + "@algolia/cache-in-memory": "4.13.0", + "@algolia/client-account": "4.13.0", + "@algolia/client-analytics": "4.13.0", + "@algolia/client-common": "4.13.0", + "@algolia/client-personalization": "4.13.0", + "@algolia/client-search": "4.13.0", + "@algolia/logger-common": "4.13.0", + "@algolia/logger-console": "4.13.0", + "@algolia/requester-browser-xhr": "4.13.0", + "@algolia/requester-common": "4.13.0", + "@algolia/requester-node-http": "4.13.0", + "@algolia/transporter": "4.13.0" + } + }, + "csstype": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.0.tgz", + "integrity": "sha512-uX1KG+x9h5hIJsaKR9xHUeUraxf8IODOwq9JLNPq6BwB04a/xgpq3rcx47l5BZu5zBPlgD342tdke3Hom/nJRA==", + "dev": true, + "peer": true + }, + "esbuild": { + "version": "0.14.39", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.14.39.tgz", + "integrity": "sha512-2kKujuzvRWYtwvNjYDY444LQIA3TyJhJIX3Yo4+qkFlDDtGlSicWgeHVJqMUP/2sSfH10PGwfsj+O2ro1m10xQ==", + "dev": true, + "requires": { + "esbuild-android-64": "0.14.39", + "esbuild-android-arm64": "0.14.39", + "esbuild-darwin-64": "0.14.39", + "esbuild-darwin-arm64": "0.14.39", + "esbuild-freebsd-64": "0.14.39", + "esbuild-freebsd-arm64": "0.14.39", + "esbuild-linux-32": "0.14.39", + "esbuild-linux-64": "0.14.39", + "esbuild-linux-arm": "0.14.39", + "esbuild-linux-arm64": "0.14.39", + "esbuild-linux-mips64le": "0.14.39", + "esbuild-linux-ppc64le": "0.14.39", + "esbuild-linux-riscv64": "0.14.39", + "esbuild-linux-s390x": "0.14.39", + "esbuild-netbsd-64": "0.14.39", + "esbuild-openbsd-64": "0.14.39", + "esbuild-sunos-64": "0.14.39", + "esbuild-windows-32": "0.14.39", + "esbuild-windows-64": "0.14.39", + "esbuild-windows-arm64": "0.14.39" + } + }, + "esbuild-android-64": { + "version": "0.14.39", + "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.14.39.tgz", + "integrity": "sha512-EJOu04p9WgZk0UoKTqLId9VnIsotmI/Z98EXrKURGb3LPNunkeffqQIkjS2cAvidh+OK5uVrXaIP229zK6GvhQ==", + "dev": true, + "optional": true + }, + "esbuild-android-arm64": { + "version": "0.14.39", + "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.14.39.tgz", + "integrity": "sha512-+twajJqO7n3MrCz9e+2lVOnFplRsaGRwsq1KL/uOy7xK7QdRSprRQcObGDeDZUZsacD5gUkk6OiHiYp6RzU3CA==", + "dev": true, + "optional": true + }, + "esbuild-darwin-64": { + "version": "0.14.39", + "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.14.39.tgz", + "integrity": "sha512-ImT6eUw3kcGcHoUxEcdBpi6LfTRWaV6+qf32iYYAfwOeV+XaQ/Xp5XQIBiijLeo+LpGci9M0FVec09nUw41a5g==", + "dev": true, + "optional": true + }, + "esbuild-darwin-arm64": { + "version": "0.14.39", + "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.39.tgz", + "integrity": "sha512-/fcQ5UhE05OiT+bW5v7/up1bDsnvaRZPJxXwzXsMRrr7rZqPa85vayrD723oWMT64dhrgWeA3FIneF8yER0XTw==", + "dev": true, + "optional": true + }, + "esbuild-freebsd-64": { + "version": "0.14.39", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.39.tgz", + "integrity": "sha512-oMNH8lJI4wtgN5oxuFP7BQ22vgB/e3Tl5Woehcd6i2r6F3TszpCnNl8wo2d/KvyQ4zvLvCWAlRciumhQg88+kQ==", + "dev": true, + "optional": true + }, + "esbuild-freebsd-arm64": { + "version": "0.14.39", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.39.tgz", + "integrity": "sha512-1GHK7kwk57ukY2yI4ILWKJXaxfr+8HcM/r/JKCGCPziIVlL+Wi7RbJ2OzMcTKZ1HpvEqCTBT/J6cO4ZEwW4Ypg==", + "dev": true, + "optional": true + }, + "esbuild-linux-32": { + "version": "0.14.39", + "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.14.39.tgz", + "integrity": "sha512-g97Sbb6g4zfRLIxHgW2pc393DjnkTRMeq3N1rmjDUABxpx8SjocK4jLen+/mq55G46eE2TA0MkJ4R3SpKMu7dg==", + "dev": true, + "optional": true + }, + "esbuild-linux-64": { + "version": "0.14.39", + "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.14.39.tgz", + "integrity": "sha512-4tcgFDYWdI+UbNMGlua9u1Zhu0N5R6u9tl5WOM8aVnNX143JZoBZLpCuUr5lCKhnD0SCO+5gUyMfupGrHtfggQ==", + "dev": true, + "optional": true + }, + "esbuild-linux-arm": { + "version": "0.14.39", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.14.39.tgz", + "integrity": "sha512-t0Hn1kWVx5UpCzAJkKRfHeYOLyFnXwYynIkK54/h3tbMweGI7dj400D1k0Vvtj2u1P+JTRT9tx3AjtLEMmfVBQ==", + "dev": true, + "optional": true + }, + "esbuild-linux-arm64": { + "version": "0.14.39", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.39.tgz", + "integrity": "sha512-23pc8MlD2D6Px1mV8GMglZlKgwgNKAO8gsgsLLcXWSs9lQsCYkIlMo/2Ycfo5JrDIbLdwgP8D2vpfH2KcBqrDQ==", + "dev": true, + "optional": true + }, + "esbuild-linux-mips64le": { + "version": "0.14.39", + "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.39.tgz", + "integrity": "sha512-epwlYgVdbmkuRr5n4es3B+yDI0I2e/nxhKejT9H0OLxFAlMkeQZxSpxATpDc9m8NqRci6Kwyb/SfmD1koG2Zuw==", + "dev": true, + "optional": true + }, + "esbuild-linux-ppc64le": { + "version": "0.14.39", + "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.39.tgz", + "integrity": "sha512-W/5ezaq+rQiQBThIjLMNjsuhPHg+ApVAdTz2LvcuesZFMsJoQAW2hutoyg47XxpWi7aEjJGrkS26qCJKhRn3QQ==", + "dev": true, + "optional": true + }, + "esbuild-linux-riscv64": { + "version": "0.14.39", + "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.39.tgz", + "integrity": "sha512-IS48xeokcCTKeQIOke2O0t9t14HPvwnZcy+5baG13Z1wxs9ZrC5ig5ypEQQh4QMKxURD5TpCLHw2W42CLuVZaA==", + "dev": true, + "optional": true + }, + "esbuild-linux-s390x": { + "version": "0.14.39", + "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.39.tgz", + "integrity": "sha512-zEfunpqR8sMomqXhNTFEKDs+ik7HC01m3M60MsEjZOqaywHu5e5682fMsqOlZbesEAAaO9aAtRBsU7CHnSZWyA==", + "dev": true, + "optional": true + }, + "esbuild-netbsd-64": { + "version": "0.14.39", + "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.39.tgz", + "integrity": "sha512-Uo2suJBSIlrZCe4E0k75VDIFJWfZy+bOV6ih3T4MVMRJh1lHJ2UyGoaX4bOxomYN3t+IakHPyEoln1+qJ1qYaA==", + "dev": true, + "optional": true + }, + "esbuild-openbsd-64": { + "version": "0.14.39", + "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.39.tgz", + "integrity": "sha512-secQU+EpgUPpYjJe3OecoeGKVvRMLeKUxSMGHnK+aK5uQM3n1FPXNJzyz1LHFOo0WOyw+uoCxBYdM4O10oaCAA==", + "dev": true, + "optional": true + }, + "esbuild-sunos-64": { + "version": "0.14.39", + "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.14.39.tgz", + "integrity": "sha512-qHq0t5gePEDm2nqZLb+35p/qkaXVS7oIe32R0ECh2HOdiXXkj/1uQI9IRogGqKkK+QjDG+DhwiUw7QoHur/Rwg==", + "dev": true, + "optional": true + }, + "esbuild-windows-32": { + "version": "0.14.39", + "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.14.39.tgz", + "integrity": "sha512-XPjwp2OgtEX0JnOlTgT6E5txbRp6Uw54Isorm3CwOtloJazeIWXuiwK0ONJBVb/CGbiCpS7iP2UahGgd2p1x+Q==", + "dev": true, + "optional": true + }, + "esbuild-windows-64": { + "version": "0.14.39", + "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.14.39.tgz", + "integrity": "sha512-E2wm+5FwCcLpKsBHRw28bSYQw0Ikxb7zIMxw3OPAkiaQhLVr3dnVO8DofmbWhhf6b97bWzg37iSZ45ZDpLw7Ow==", + "dev": true, + "optional": true + }, + "esbuild-windows-arm64": { + "version": "0.14.39", + "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.39.tgz", + "integrity": "sha512-sBZQz5D+Gd0EQ09tZRnz/PpVdLwvp/ufMtJ1iDFYddDaPpZXKqPyaxfYBLs3ueiaksQ26GGa7sci0OqFzNs7KA==", + "dev": true, + "optional": true + }, + "estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "dev": true + }, + "fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "optional": true + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, + "is-core-module": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz", + "integrity": "sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "peer": true + }, + "loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dev": true, + "peer": true, + "requires": { + "js-tokens": "^3.0.0 || ^4.0.0" + } + }, + "magic-string": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", + "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", + "dev": true, + "requires": { + "sourcemap-codec": "^1.4.8" + } + }, + "nanoid": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", + "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==", + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true, + "peer": true + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "postcss": { + "version": "8.4.13", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.13.tgz", + "integrity": "sha512-jtL6eTBrza5MPzy8oJLFuUscHDXTV5KcLlqAWHl5q5WYRfnNRGSmOZmOZ1T6Gy7A99mOZfqungmZMpMmCVJ8ZA==", + "dev": true, + "requires": { + "nanoid": "^3.3.3", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + } + }, + "preact": { + "version": "10.7.2", + "resolved": "https://registry.npmjs.org/preact/-/preact-10.7.2.tgz", + "integrity": "sha512-GLjn0I3r6ka+NvxJUppsVFqb4V0qDTEHT/QxHlidPuClGaxF/4AI2Qti4a0cv3XMh5n1+D3hLScW10LRIm5msQ==", + "dev": true + }, + "prismjs": { + "version": "1.28.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.28.0.tgz", + "integrity": "sha512-8aaXdYvl1F7iC7Xm1spqSaY/OJBpYW3v+KJ+F17iYxvdc8sfjW194COK5wVhMZX45tGteiBQgdvD/nhxcRwylw==", + "dev": true + }, + "react": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react/-/react-17.0.2.tgz", + "integrity": "sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==", + "dev": true, + "peer": true, + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" + } + }, + "react-dom": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz", + "integrity": "sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA==", + "dev": true, + "peer": true, + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "scheduler": "^0.20.2" + } + }, + "resolve": { + "version": "1.22.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz", + "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==", + "dev": true, + "requires": { + "is-core-module": "^2.8.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "rollup": { + "version": "2.73.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.73.0.tgz", + "integrity": "sha512-h/UngC3S4Zt28mB3g0+2YCMegT5yoftnQplwzPqGZcKvlld5e+kT/QRmJiL+qxGyZKOYpgirWGdLyEO1b0dpLQ==", + "dev": true, + "requires": { + "fsevents": "~2.3.2" + } + }, + "scheduler": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz", + "integrity": "sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==", + "dev": true, + "peer": true, + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "dev": true + }, + "sourcemap-codec": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", + "dev": true + }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true + }, + "vite": { + "version": "2.9.9", + "resolved": "https://registry.npmjs.org/vite/-/vite-2.9.9.tgz", + "integrity": "sha512-ffaam+NgHfbEmfw/Vuh6BHKKlI/XIAhxE5QSS7gFLIngxg171mg1P3a4LSRME0z2ZU1ScxoKzphkipcYwSD5Ew==", + "dev": true, + "requires": { + "esbuild": "^0.14.27", + "fsevents": "~2.3.2", + "postcss": "^8.4.13", + "resolve": "^1.22.0", + "rollup": "^2.59.0" + } + }, + "vitepress": { + "version": "0.22.4", + "resolved": "https://registry.npmjs.org/vitepress/-/vitepress-0.22.4.tgz", + "integrity": "sha512-oZUnLO/SpYdThaBKefDeOiVlr0Rie4Ppx3FzMnMyLtJnI5GlBMNjqYqMy/4+umm/iC+ZDJfI+IlDKxv5fZnYzA==", + "dev": true, + "requires": { + "@docsearch/css": "^3.0.0", + "@docsearch/js": "^3.0.0", + "@vitejs/plugin-vue": "^2.3.2", + "prismjs": "^1.25.0", + "vite": "^2.9.7", + "vue": "^3.2.33" + } + }, + "vue": { + "version": "3.2.33", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.2.33.tgz", + "integrity": "sha512-si1ExAlDUrLSIg/V7D/GgA4twJwfsfgG+t9w10z38HhL/HA07132pUQ2KuwAo8qbCyMJ9e6OqrmWrOCr+jW7ZQ==", + "dev": true, + "requires": { + "@vue/compiler-dom": "3.2.33", + "@vue/compiler-sfc": "3.2.33", + "@vue/runtime-dom": "3.2.33", + "@vue/server-renderer": "3.2.33", + "@vue/shared": "3.2.33" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000000..f9be06a622 --- /dev/null +++ b/package.json @@ -0,0 +1,26 @@ +{ + "name": "nezhahq.github.io", + "version": "1.0.0", + "description": "", + "main": "index.js", + "directories": { + "doc": "docs" + }, + "scripts": { + "dev": "vitepress dev docs", + "build": "vitepress build docs" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/oneclickvirt/oneclickvirt.github.io.git" + }, + "author": "", + "license": "ISC", + "bugs": { + "url": "https://github.com/oneclickvirt/oneclickvirt.github.io/issues" + }, + "homepage": "https://github.com/oneclickvirt/oneclickvirt.github.io#readme", + "devDependencies": { + "vitepress": "^0.22.4" + } +} \ No newline at end of file