From c235aaeb4f6d63de4f4b8c893111159fabc73149 Mon Sep 17 00:00:00 2001 From: okxlin Date: Wed, 20 Nov 2024 00:34:12 +0800 Subject: [PATCH] =?UTF-8?q?feat:=E6=B7=BB=E5=8A=A0wireguard=E5=88=B0?= =?UTF-8?q?=E5=88=97=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/wireguard/1.0.20210914/.env.sample | 13 +++ apps/wireguard/1.0.20210914/data.yml | 92 ++++++++++++++++++ .../wireguard/1.0.20210914/docker-compose.yml | 35 +++++++ apps/wireguard/README.md | 5 + apps/wireguard/data.yml | 21 ++++ apps/wireguard/latest/.env.sample | 13 +++ apps/wireguard/latest/data.yml | 92 ++++++++++++++++++ apps/wireguard/latest/docker-compose.yml | 35 +++++++ apps/wireguard/logo.png | Bin 0 -> 9651 bytes 9 files changed, 306 insertions(+) create mode 100644 apps/wireguard/1.0.20210914/.env.sample create mode 100644 apps/wireguard/1.0.20210914/data.yml create mode 100644 apps/wireguard/1.0.20210914/docker-compose.yml create mode 100644 apps/wireguard/README.md create mode 100644 apps/wireguard/data.yml create mode 100644 apps/wireguard/latest/.env.sample create mode 100644 apps/wireguard/latest/data.yml create mode 100644 apps/wireguard/latest/docker-compose.yml create mode 100644 apps/wireguard/logo.png diff --git a/apps/wireguard/1.0.20210914/.env.sample b/apps/wireguard/1.0.20210914/.env.sample new file mode 100644 index 00000000..6a14a674 --- /dev/null +++ b/apps/wireguard/1.0.20210914/.env.sample @@ -0,0 +1,13 @@ +ALLOWEDIPS="10.0.8.0/24" +CONFIG_PATH="./config" +CONTAINER_NAME="wireguard" +INTERNAL_SUBNET="10.0.8.0" +LOG_CONFS="true" +PEERDNS="119.29.29.29,1.1.1.1" +PEERS=1 +PERSISTENTKEEPALIVE_PEERS=25 +PGID=1000 +PUID=1000 +SERVERPORT=51820 +SERVERURL="172.17.0.1" +TIME_ZONE="Asia/Shanghai" diff --git a/apps/wireguard/1.0.20210914/data.yml b/apps/wireguard/1.0.20210914/data.yml new file mode 100644 index 00000000..80b3f83f --- /dev/null +++ b/apps/wireguard/1.0.20210914/data.yml @@ -0,0 +1,92 @@ +additionalProperties: + formFields: + - default: "1000" + edit: true + envKey: PUID + labelEn: User ID + labelZh: 用户 ID + required: true + type: number + - default: "1000" + edit: true + envKey: PGID + labelEn: Group ID + labelZh: 组 ID + required: true + type: number + - default: "Asia/Shanghai" + edit: true + envKey: TIME_ZONE + labelEn: Time Zone + labelZh: 时区 + required: true + type: text + - default: "51820" + edit: true + envKey: SERVERPORT + labelEn: Wireguard port + labelZh: Wireguard 端口 + required: true + rule: paramPort + type: number + - default: "172.17.0.1" + edit: true + envKey: SERVERURL + labelEn: Host address (must change item) + labelZh: 本机地址 (必改项) + required: true + type: text + - default: "1" + edit: true + envKey: PEERS + labelEn: Number of Peers + labelZh: 客户端数量 + required: true + type: number + - default: "119.29.29.29,1.1.1.1" + edit: true + envKey: PEERDNS + labelEn: Peer DNS + labelZh: 客户端 DNS + required: true + type: text + - default: "10.0.8.0" + edit: true + envKey: INTERNAL_SUBNET + labelEn: Default Wireguard Segment Subnet + labelZh: 默认 Wireguard 网段子网 + required: true + type: text + - default: "10.0.8.0/24" + edit: true + envKey: ALLOWEDIPS + labelEn: Wireguard Allowed IPs + labelZh: Wireguard 允许的 IP 段 + required: true + type: text + - default: "25" + edit: true + envKey: PERSISTENTKEEPALIVE_PEERS + labelEn: Wireguard Persistent Keepalive + labelZh: Wireguard 保活间隔 + required: true + type: number + - default: "true" + edit: true + envKey: LOG_CONFS + labelEn: Log Configurations + labelZh: 日志配置 + required: true + type: select + values: + - label: "True" + value: "true" + - label: "False" + value: "false" + - default: "./config" + disabled: true + envKey: CONFIG_PATH + labelEn: Config Path + labelZh: 配置路径 + required: true + type: text diff --git a/apps/wireguard/1.0.20210914/docker-compose.yml b/apps/wireguard/1.0.20210914/docker-compose.yml new file mode 100644 index 00000000..20f5ea3e --- /dev/null +++ b/apps/wireguard/1.0.20210914/docker-compose.yml @@ -0,0 +1,35 @@ +services: + wireguard: + image: "linuxserver/wireguard:1.0.20210914" + container_name: ${CONTAINER_NAME} + restart: always + networks: + - 1panel-network + ports: + - "${SERVERPORT}:${SERVERPORT}/udp" + environment: + - PUID=${PUID} + - PGID=${PGID} + - TZ=${TIME_ZONE} + - SERVERURL=${SERVERURL} + - SERVERPORT=${SERVERPORT} + - PEERS=${PEERS} + - PEERDNS=${PEERDNS} + - INTERNAL_SUBNET=${INTERNAL_SUBNET} + - ALLOWEDIPS=${ALLOWEDIPS} + - PERSISTENTKEEPALIVE_PEERS=${PERSISTENTKEEPALIVE_PEERS} + - LOG_CONFS=${LOG_CONFS} + volumes: + - ${CONFIG_PATH}:/config + - /lib/modules:/lib/modules + cap_add: + - NET_ADMIN + - SYS_MODULE + sysctls: + net.ipv4.conf.all.src_valid_mark: "1" + labels: + createdBy: "Apps" + +networks: + 1panel-network: + external: true diff --git a/apps/wireguard/README.md b/apps/wireguard/README.md new file mode 100644 index 00000000..14e84c17 --- /dev/null +++ b/apps/wireguard/README.md @@ -0,0 +1,5 @@ +# WireGuard + +[WireGuard®](https://www.wireguard.com/) 是一种极其简单、高速且现代化的 VPN,采用了最先进的加密技术。它旨在比 IPsec 更快、更简单、更轻量,同时避免复杂的配置问题,并在性能上远超 OpenVPN。WireGuard 被设计为通用 VPN,可在嵌入式设备和超级计算机上运行,适用于多种场景。 + +最初发布于 Linux 内核,如今已支持多平台(Windows、macOS、BSD、iOS、Android),并广泛部署。尽管仍在积极开发中,WireGuard 已被认为是行业内最安全、最易用、最简单的 VPN 解决方案之一。 \ No newline at end of file diff --git a/apps/wireguard/data.yml b/apps/wireguard/data.yml new file mode 100644 index 00000000..ee4b1e64 --- /dev/null +++ b/apps/wireguard/data.yml @@ -0,0 +1,21 @@ +name: WireGuard +tags: + - 实用工具 + - 安全 +title: 一种极其简单但快速且现代的 VPN +description: 一种极其简单但快速且现代的 VPN +additionalProperties: + key: wireguard + name: WireGuard + tags: + - Tool + - Security + shortDescZh: 一种极其简单但快速且现代的 VPN + shortDescEn: An extremely simple yet fast and modern VPN + type: tool + crossVersionUpdate: true + limit: 0 + recommend: 0 + website: https://www.wireguard.com + github: https://github.com/wireguard + document: https://www.wireguard.com \ No newline at end of file diff --git a/apps/wireguard/latest/.env.sample b/apps/wireguard/latest/.env.sample new file mode 100644 index 00000000..6a14a674 --- /dev/null +++ b/apps/wireguard/latest/.env.sample @@ -0,0 +1,13 @@ +ALLOWEDIPS="10.0.8.0/24" +CONFIG_PATH="./config" +CONTAINER_NAME="wireguard" +INTERNAL_SUBNET="10.0.8.0" +LOG_CONFS="true" +PEERDNS="119.29.29.29,1.1.1.1" +PEERS=1 +PERSISTENTKEEPALIVE_PEERS=25 +PGID=1000 +PUID=1000 +SERVERPORT=51820 +SERVERURL="172.17.0.1" +TIME_ZONE="Asia/Shanghai" diff --git a/apps/wireguard/latest/data.yml b/apps/wireguard/latest/data.yml new file mode 100644 index 00000000..80b3f83f --- /dev/null +++ b/apps/wireguard/latest/data.yml @@ -0,0 +1,92 @@ +additionalProperties: + formFields: + - default: "1000" + edit: true + envKey: PUID + labelEn: User ID + labelZh: 用户 ID + required: true + type: number + - default: "1000" + edit: true + envKey: PGID + labelEn: Group ID + labelZh: 组 ID + required: true + type: number + - default: "Asia/Shanghai" + edit: true + envKey: TIME_ZONE + labelEn: Time Zone + labelZh: 时区 + required: true + type: text + - default: "51820" + edit: true + envKey: SERVERPORT + labelEn: Wireguard port + labelZh: Wireguard 端口 + required: true + rule: paramPort + type: number + - default: "172.17.0.1" + edit: true + envKey: SERVERURL + labelEn: Host address (must change item) + labelZh: 本机地址 (必改项) + required: true + type: text + - default: "1" + edit: true + envKey: PEERS + labelEn: Number of Peers + labelZh: 客户端数量 + required: true + type: number + - default: "119.29.29.29,1.1.1.1" + edit: true + envKey: PEERDNS + labelEn: Peer DNS + labelZh: 客户端 DNS + required: true + type: text + - default: "10.0.8.0" + edit: true + envKey: INTERNAL_SUBNET + labelEn: Default Wireguard Segment Subnet + labelZh: 默认 Wireguard 网段子网 + required: true + type: text + - default: "10.0.8.0/24" + edit: true + envKey: ALLOWEDIPS + labelEn: Wireguard Allowed IPs + labelZh: Wireguard 允许的 IP 段 + required: true + type: text + - default: "25" + edit: true + envKey: PERSISTENTKEEPALIVE_PEERS + labelEn: Wireguard Persistent Keepalive + labelZh: Wireguard 保活间隔 + required: true + type: number + - default: "true" + edit: true + envKey: LOG_CONFS + labelEn: Log Configurations + labelZh: 日志配置 + required: true + type: select + values: + - label: "True" + value: "true" + - label: "False" + value: "false" + - default: "./config" + disabled: true + envKey: CONFIG_PATH + labelEn: Config Path + labelZh: 配置路径 + required: true + type: text diff --git a/apps/wireguard/latest/docker-compose.yml b/apps/wireguard/latest/docker-compose.yml new file mode 100644 index 00000000..c78baa73 --- /dev/null +++ b/apps/wireguard/latest/docker-compose.yml @@ -0,0 +1,35 @@ +services: + wireguard: + image: "linuxserver/wireguard:latest" + container_name: ${CONTAINER_NAME} + restart: always + networks: + - 1panel-network + ports: + - "${SERVERPORT}:${SERVERPORT}/udp" + environment: + - PUID=${PUID} + - PGID=${PGID} + - TZ=${TIME_ZONE} + - SERVERURL=${SERVERURL} + - SERVERPORT=${SERVERPORT} + - PEERS=${PEERS} + - PEERDNS=${PEERDNS} + - INTERNAL_SUBNET=${INTERNAL_SUBNET} + - ALLOWEDIPS=${ALLOWEDIPS} + - PERSISTENTKEEPALIVE_PEERS=${PERSISTENTKEEPALIVE_PEERS} + - LOG_CONFS=${LOG_CONFS} + volumes: + - ${CONFIG_PATH}:/config + - /lib/modules:/lib/modules + cap_add: + - NET_ADMIN + - SYS_MODULE + sysctls: + net.ipv4.conf.all.src_valid_mark: "1" + labels: + createdBy: "Apps" + +networks: + 1panel-network: + external: true diff --git a/apps/wireguard/logo.png b/apps/wireguard/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..cf4b8c488540048c331c3c0fbb8a30189ea4ff36 GIT binary patch literal 9651 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 LlqG9E8$