From 1dc7f69edc1ea2d0dc709806375a08bdd42a4b9c Mon Sep 17 00:00:00 2001 From: arch3rPro <30855883+arch3rPro@users.noreply.github.com> Date: Wed, 2 Jul 2025 14:19:01 +0800 Subject: [PATCH] Add App Lucky --- apps/lucky/README.md | 85 +++++++++++++++++++++++++++ apps/lucky/README_en.md | 72 +++++++++++++++++++++++ apps/lucky/bridge/data.yml | 17 ++++++ apps/lucky/bridge/docker-compose.yml | 9 +++ apps/lucky/data.yml | 48 +++++++++++++++ apps/lucky/host/data.yml | 17 ++++++ apps/lucky/host/docker-compose.yml | 8 +++ apps/lucky/logo.png | Bin 0 -> 10866 bytes 8 files changed, 256 insertions(+) create mode 100644 apps/lucky/README.md create mode 100644 apps/lucky/README_en.md create mode 100644 apps/lucky/bridge/data.yml create mode 100644 apps/lucky/bridge/docker-compose.yml create mode 100644 apps/lucky/data.yml create mode 100644 apps/lucky/host/data.yml create mode 100644 apps/lucky/host/docker-compose.yml create mode 100644 apps/lucky/logo.png diff --git a/apps/lucky/README.md b/apps/lucky/README.md new file mode 100644 index 0000000..1441fe6 --- /dev/null +++ b/apps/lucky/README.md @@ -0,0 +1,85 @@ +# Lucky + +Lucky 是一款集端口转发、流量转发、WAF、防火墙、备份等多功能于一体的网络加速与安全工具,支持 OpenWrt、Docker、Linux 等多平台部署,适用于家庭、企业、开发者等多种场景。 + +## 主要功能 + +- **端口转发/流量转发**:支持多种协议的端口转发,轻松实现内外网互通。 +- **WAF 防火墙**:内置 Web 应用防火墙,有效防护常见攻击。 +- **多平台支持**:兼容 OpenWrt、Docker、Linux、Windows 等主流平台。 +- **IPv4/IPv6 支持**:支持双栈网络,适应多种网络环境。 +- **配置备份与还原**:一键备份/恢复配置,升级无忧。 +- **Web 管理界面**:直观易用的 Web UI,支持多用户管理。 +- **自动升级**:支持后台上传升级包或手动替换升级。 + +## 部署模式说明 + +Lucky 提供两种 Docker 部署模式: + +- **host 模式(推荐)**: + - 使用主机网络,支持 IPv4/IPv6,端口固定 16601。 + - 适合需要完整网络能力、IPv6、端口穿透等高级场景。 +- **bridge 模式**: + - 支持自定义端口映射(默认 16601:16601),仅支持 IPv4。 + - 适合需要端口隔离、面板统一管理的场景。 + +> 配置目录(容器内):`/goodluck`,主机目录可自定义,建议持久化保存。 + +## 典型使用场景 + +- 家庭/企业内网穿透与端口映射 +- 多端口/多协议转发与流量管理 +- Web 服务安全防护(WAF) +- OpenWrt 路由器高级网络管理 +- Docker 环境下的统一端口转发与备份 + +## 平台与架构支持 + +- OpenWrt、Docker、Linux、Windows +- 支持 amd64、arm64、arm/v7 等主流架构 + +## 快速部署(Docker 示例) + +**host 网络模式(推荐,支持 IPv4/IPv6)** +```yaml +services: + lucky: + image: gdy666/lucky + container_name: lucky + network_mode: host + volumes: + - ./luckyconf:/goodluck + restart: always +``` + +**bridge 网络模式(仅支持 IPv4,部分功能受限)** +```yaml +services: + lucky: + image: gdy666/lucky + container_name: lucky + ports: + - 16601:16601 + volumes: + - ./luckyconf:/goodluck + restart: always +``` + +## 常见问题 FAQ + +- **Q: 默认管理端口和账号密码?** + A: 默认端口 16601,账号/密码均为 666。 +- **Q: 如何备份和升级?** + A: 可在 Web 后台一键备份/还原配置,或上传升级包升级。 +- **Q: bridge 模式下端口无法访问?** + A: 建议优先使用 host 模式,bridge 模式部分环境下端口访问有限制。 +- **Q: 支持哪些平台?** + A: OpenWrt、Docker、Linux、Windows 等。 +- **Q: 配置目录如何持久化?** + A: 挂载主机目录到 `/goodluck`,如 `./luckyconf:/goodluck`,升级/重装不丢失配置。 + +## 官方文档与支持 + +- 官网:[https://lucky666.cn/](https://lucky666.cn/) +- 安装文档:[https://lucky666.cn/docs/install](https://lucky666.cn/docs/install) +- GitHub:[https://github.com/gdy666/lucky](https://github.com/gdy666/lucky) \ No newline at end of file diff --git a/apps/lucky/README_en.md b/apps/lucky/README_en.md new file mode 100644 index 0000000..17698d6 --- /dev/null +++ b/apps/lucky/README_en.md @@ -0,0 +1,72 @@ +# Lucky + +Lucky is an all-in-one network acceleration and security tool integrating port forwarding, traffic proxy, WAF, firewall, and backup. It supports OpenWrt, Docker, Linux, and more, suitable for home, enterprise, and developer scenarios. + +## Main Features + +- **Port/Traffic Forwarding**: Supports multiple protocols, easily connect internal and external networks. +- **WAF Firewall**: Built-in web application firewall for effective protection. +- **Multi-Platform Support**: Compatible with OpenWrt, Docker, Linux, Windows, etc. +- **IPv4/IPv6 Support**: Dual-stack network support for various environments. +- **Config Backup & Restore**: One-click backup/restore, worry-free upgrades. +- **Web UI**: Intuitive web management, multi-user support. +- **Auto Upgrade**: Upgrade via web or manual replacement. + +## Typical Use Cases + +- Home/enterprise NAT traversal and port mapping +- Multi-port/protocol forwarding and traffic management +- Web service security (WAF) +- Advanced network management for OpenWrt routers +- Unified port forwarding and backup in Docker + +## Platform & Architecture Support + +- OpenWrt, Docker, Linux, Windows +- Supports amd64, arm64, arm/v7, etc. + +## Quick Deployment (Docker Example) + +**Host network mode (recommended, IPv4/IPv6 supported)** +```yaml +services: + lucky: + image: gdy666/lucky + container_name: lucky + network_mode: host + volumes: + - ./luckyconf:/goodluck + restart: always +``` + +**Bridge network mode (IPv4 only, some features limited)** +```yaml +services: + lucky: + image: gdy666/lucky + container_name: lucky + ports: + - 16601:16601 + volumes: + - ./luckyconf:/goodluck + restart: always +``` + +> Config directory (in container): `/goodluck`, host path customizable. + +## FAQ + +- **Q: Default admin port and credentials?** + A: Default port 16601, username/password: 666/666. +- **Q: How to backup and upgrade?** + A: Use web UI for one-click backup/restore or upload upgrade package. +- **Q: Bridge mode port not accessible?** + A: Host mode is recommended; bridge mode may have port access issues in some environments. +- **Q: Which platforms are supported?** + A: OpenWrt, Docker, Linux, Windows, etc. + +## Official Docs & Support + +- Website: [https://lucky666.cn/](https://lucky666.cn/) +- Install Guide: [https://lucky666.cn/docs/install](https://lucky666.cn/docs/install) +- GitHub: [https://github.com/gdy666/lucky](https://github.com/gdy666/lucky) \ No newline at end of file diff --git a/apps/lucky/bridge/data.yml b/apps/lucky/bridge/data.yml new file mode 100644 index 0000000..3b68a99 --- /dev/null +++ b/apps/lucky/bridge/data.yml @@ -0,0 +1,17 @@ +additionalProperties: + formFields: + - default: 16601 + edit: true + envKey: PANEL_APP_PORT_HTTP + labelEn: Port + labelZh: 管理端口 + required: true + rule: paramPort + type: number + - default: ./luckyconf + edit: true + envKey: LUCKY_CONF_PATH + labelEn: Config Path + labelZh: 配置目录 + required: true + type: string \ No newline at end of file diff --git a/apps/lucky/bridge/docker-compose.yml b/apps/lucky/bridge/docker-compose.yml new file mode 100644 index 0000000..22defa2 --- /dev/null +++ b/apps/lucky/bridge/docker-compose.yml @@ -0,0 +1,9 @@ +services: + lucky: + image: gdy666/lucky + container_name: lucky + ports: + - "${PANEL_APP_PORT_HTTP:-16601}:16601" + volumes: + - "${LUCKY_CONF_PATH:-./luckyconf}:/goodluck" + restart: always \ No newline at end of file diff --git a/apps/lucky/data.yml b/apps/lucky/data.yml new file mode 100644 index 0000000..7806d67 --- /dev/null +++ b/apps/lucky/data.yml @@ -0,0 +1,48 @@ +name: Lucky + +tags: + - 实用工具 + - 网络工具 + - 代理 + - 防火墙 + - 端口转发 + - OpenWrt + - Docker + - 备份 + - 跨平台 +title: 一站式网络加速与端口转发工具 +description: Lucky 是一款集端口转发、流量转发、WAF、备份等多功能于一体的网络加速与安全工具,支持多平台部署。 +additionalProperties: + key: lucky + name: Lucky + tags: + - Tool + - Network + - Proxy + - Firewall + - OpenWrt + - Docker + - Backup + - CrossPlatform + shortDescZh: 一站式网络加速与端口转发工具,支持多平台和多架构。 + shortDescEn: All-in-one network acceleration and port forwarding tool, cross-platform and multi-architecture supported. + description: + en: All-in-one network acceleration, port forwarding, WAF, and backup tool. Supports OpenWrt, Docker, and more. Easy to deploy, powerful and secure. + ja: 多機能ネットワーク加速・ポート転送・WAF・バックアップツール。OpenWrtやDocker等に対応。 + ms: Alat pecutan rangkaian, pemajuan port, WAF dan sandaran serba lengkap, menyokong pelbagai platform. + pt-br: Ferramenta completa de aceleração de rede, encaminhamento de portas, WAF e backup, com suporte multiplataforma. + ru: Многофункциональный инструмент для ускорения сети, проброса портов, WAF и резервного копирования, поддержка разных платформ. + ko: 네트워크 가속, 포트 포워딩, WAF, 백업을 지원하는 올인원 도구, 다양한 플랫폼 지원. + zh-hant: 一站式網絡加速與端口轉發工具,支援多平台和多架構。 + zh: Lucky 是一款集端口转发、流量转发、WAF、备份等多功能于一体的网络加速与安全工具,支持多平台部署。 + type: website + crossVersionUpdate: true + limit: 0 + recommend: 0 + website: https://lucky666.cn/ + github: https://github.com/gdy666/lucky + document: https://lucky666.cn/docs/install + architectures: + - amd64 + - arm64 + - arm/v7 \ No newline at end of file diff --git a/apps/lucky/host/data.yml b/apps/lucky/host/data.yml new file mode 100644 index 0000000..3b68a99 --- /dev/null +++ b/apps/lucky/host/data.yml @@ -0,0 +1,17 @@ +additionalProperties: + formFields: + - default: 16601 + edit: true + envKey: PANEL_APP_PORT_HTTP + labelEn: Port + labelZh: 管理端口 + required: true + rule: paramPort + type: number + - default: ./luckyconf + edit: true + envKey: LUCKY_CONF_PATH + labelEn: Config Path + labelZh: 配置目录 + required: true + type: string \ No newline at end of file diff --git a/apps/lucky/host/docker-compose.yml b/apps/lucky/host/docker-compose.yml new file mode 100644 index 0000000..5ed30e1 --- /dev/null +++ b/apps/lucky/host/docker-compose.yml @@ -0,0 +1,8 @@ +services: + lucky: + image: gdy666/lucky + container_name: lucky + network_mode: host + volumes: + - "${LUCKY_CONF_PATH:-./luckyconf}:/goodluck" + restart: always \ No newline at end of file diff --git a/apps/lucky/logo.png b/apps/lucky/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..aebfc741e75d1b892188d5035ef332dffb13bbe1 GIT binary patch literal 10866 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 d!NS$e#KGx*XV&a^RsLfDvXV*?^