From 8bc2914ec4eeca7cf59bf3953b707005d7ad8fc6 Mon Sep 17 00:00:00 2001 From: okxlin Date: Sun, 11 Jun 2023 23:17:24 +0800 Subject: [PATCH] =?UTF-8?q?feat:=E6=B7=BB=E5=8A=A0adguardhome=E5=88=B0?= =?UTF-8?q?=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/adguardhome/0.107.31/.env.sample | 13 + apps/adguardhome/0.107.31/data.yml | 96 ++++ apps/adguardhome/0.107.31/docker-compose.yml | 32 ++ apps/adguardhome/README.md | 529 +++++++++++++++++++ apps/adguardhome/data.yml.bak | 20 + apps/adguardhome/logo.png | Bin 0 -> 6363 bytes 6 files changed, 690 insertions(+) create mode 100644 apps/adguardhome/0.107.31/.env.sample create mode 100644 apps/adguardhome/0.107.31/data.yml create mode 100644 apps/adguardhome/0.107.31/docker-compose.yml create mode 100644 apps/adguardhome/README.md create mode 100644 apps/adguardhome/data.yml.bak create mode 100644 apps/adguardhome/logo.png diff --git a/apps/adguardhome/0.107.31/.env.sample b/apps/adguardhome/0.107.31/.env.sample new file mode 100644 index 00000000..5ab19ff8 --- /dev/null +++ b/apps/adguardhome/0.107.31/.env.sample @@ -0,0 +1,13 @@ +CONTAINER_NAME="adguardhome" +PLAIN_DNS_PORT="20053" +DHCP_PORT1="20067" +DHCP_PORT2="20068" +HTTP_PORT="23000" +PANEL_APP_PORT_HTTP="23000" +DOH_PORT="20443" +DOT_PORT="853" +QUIC_PORT1="20784" +QUIC_PORT2="8853" +DNS_CRYPT_PORT="5443" +WORK_PATH="./data/work" +CONFIG_PATH="./data/conf" diff --git a/apps/adguardhome/0.107.31/data.yml b/apps/adguardhome/0.107.31/data.yml new file mode 100644 index 00000000..a34517ba --- /dev/null +++ b/apps/adguardhome/0.107.31/data.yml @@ -0,0 +1,96 @@ +additionalProperties: + formFields: + - default: 20053 + edit: true + envKey: PLAIN_DNS_PORT + labelEn: plain DNS port + labelZh: 普通DNS端口 + required: true + rule: paramPort + type: number + - default: 20067 + edit: true + envKey: DHCP_PORT1 + labelEn: DHCP service port 1 + labelZh: DHCP服务端口1 + required: true + rule: paramPort + type: number + - default: 20068 + edit: true + envKey: DHCP_PORT2 + labelEn: DHCP service port 2 + labelZh: DHCP服务端口2 + required: true + rule: paramPort + type: number + - default: 23000 + edit: true + envKey: HTTP_PORT + labelEn: HTTP web port + labelZh: HTTP网页端口 + required: true + rule: paramPort + type: number + - default: 23000 + edit: true + envKey: PANEL_APP_PORT_HTTP + labelEn: web port + labelZh: 网页端口 + required: true + rule: paramPort + type: number + - default: 20443 + edit: true + envKey: DOH_PORT + labelEn: DOH service port + labelZh: DOH服务端口 + required: true + rule: paramPort + type: number + - default: 853 + edit: true + envKey: DOT_PORT + labelEn: DOT service port + labelZh: DOT服务端口 + required: true + rule: paramPort + type: number + - default: 20784 + edit: true + envKey: QUIC_PORT1 + labelEn: QUIC service port 1 + labelZh: QUIC服务端口1 + required: true + rule: paramPort + type: number + - default: 8853 + edit: true + envKey: QUIC_PORT2 + labelEn: QUIC service port 2 + labelZh: QUIC服务端口2 + required: true + rule: paramPort + type: number + - default: 5443 + edit: true + envKey: DNS_CRYPT_PORT + labelEn: DNS Crypt service port + labelZh: DNS Crypt服务端口 + required: true + rule: paramPort + type: number + - default: ./data/work + edit: true + envKey: WORK_PATH + labelEn: Work data folder path + labelZh: 工作数据文件夹路径 + required: true + type: text + - default: ./data/conf + edit: true + envKey: CONFIG_PATH + labelEn: Configuration file path + labelZh: 配置文件路径 + required: true + type: text diff --git a/apps/adguardhome/0.107.31/docker-compose.yml b/apps/adguardhome/0.107.31/docker-compose.yml new file mode 100644 index 00000000..3186061d --- /dev/null +++ b/apps/adguardhome/0.107.31/docker-compose.yml @@ -0,0 +1,32 @@ +version: '3' +services: + adguardhome: + container_name: ${CONTAINER_NAME} + restart: always + networks: + - 1panel-network + ports: + - ${PLAIN_DNS_PORT}:53/tcp + - ${PLAIN_DNS_PORT}:53/udp + - ${DHCP_PORT1}:67/udp + - ${DHCP_PORT2}:68/udp + - ${HTTP_PORT}:80/tcp + - ${DOH_PORT}:443/tcp + - ${DOH_PORT}:443/udp + - ${PANEL_APP_PORT_HTTP}:3000/tcp + - ${DOT_PORT}:853/tcp + - ${QUIC_PORT1}:784/udp + - ${DOT_PORT}:853/udp + - ${QUIC_PORT2}:8853/udp + - ${DNS_CRYPT_PORT}:5443/tcp + - ${DNS_CRYPT_PORT}:5443/udp + volumes: + - ${WORK_PATH}:/opt/adguardhome/work + - ${CONFIG_PATH}:/opt/adguardhome/conf + image: adguard/adguardhome + labels: + createdBy: "Apps" + +networks: + 1panel-network: + external: true diff --git a/apps/adguardhome/README.md b/apps/adguardhome/README.md new file mode 100644 index 00000000..623ef2bf --- /dev/null +++ b/apps/adguardhome/README.md @@ -0,0 +1,529 @@ +  +

+ + + AdGuard Home + +

+

Privacy protection center for you and your devices

+

+ Free and open source, powerful network-wide ads & trackers blocking DNS + server. +

+

+ AdGuard.com | + Wiki | + Reddit | + Twitter | + Telegram +

+ + Code Coverage + + + Go Report Card + + + Docker Pulls + +
+ + Latest release + + + adguard-home + +

+
+

+ +

+
+ +AdGuard Home is a network-wide software for blocking ads and tracking. After you +set it up, it'll cover ALL your home devices, and you don't need any client-side +software for that. + +It operates as a DNS server that re-routes tracking domains to a “black hole”, +thus preventing your devices from connecting to those servers. It's based on +software we use for our public [AdGuard DNS] servers, and both share a lot of +code. + +[AdGuard DNS]: https://adguard-dns.io/ + + + + * [Getting Started](#getting-started) + * [Automated install (Unix)](#automated-install-linux-and-mac) + * [Alternative methods](#alternative-methods) + * [Guides](#guides) + * [API](#api) + * [Comparing AdGuard Home to other solutions](#comparison) + * [How is this different from public AdGuard DNS servers?](#comparison-adguard-dns) + * [How does AdGuard Home compare to Pi-Hole](#comparison-pi-hole) + * [How does AdGuard Home compare to traditional ad blockers](#comparison-adblock) + * [Known limitations](#comparison-limitations) + * [How to build from source](#how-to-build) + * [Prerequisites](#prerequisites) + * [Building](#building) + * [Contributing](#contributing) + * [Test unstable versions](#test-unstable-versions) + * [Reporting issues](#reporting-issues) + * [Help with translations](#translate) + * [Other](#help-other) + * [Projects that use AdGuard Home](#uses) + * [Acknowledgments](#acknowledgments) + * [Privacy](#privacy) + + + +## Getting Started + + ### Automated install (Unix) + +To install with `curl` run the following command: + +```sh +curl -s -S -L https://raw.githubusercontent.com/AdguardTeam/AdGuardHome/master/scripts/install.sh | sh -s -- -v +``` + +To install with `wget` run the following command: + +```sh +wget --no-verbose -O - https://raw.githubusercontent.com/AdguardTeam/AdGuardHome/master/scripts/install.sh | sh -s -- -v +``` + +To install with `fetch` run the following command: + +```sh +fetch -o - https://raw.githubusercontent.com/AdguardTeam/AdGuardHome/master/scripts/install.sh | sh -s -- -v +``` + +The script also accepts some options: + + * `-c ` to use specified channel; + * `-r` to reinstall AdGuard Home; + * `-u` to uninstall AdGuard Home; + * `-v` for verbose output. + +Note that options `-r` and `-u` are mutually exclusive. + + + + ### Alternative methods + + #### Manual installation + +Please read the **[Getting Started][wiki-start]** article on our Wiki to learn +how to install AdGuard Home manually, and how to configure your devices to use +it. + + #### Docker + +You can use our official Docker image on [Docker Hub]. + + #### Snap Store + +If you're running **Linux,** there's a secure and easy way to install AdGuard +Home: get it from the [Snap Store]. + +[Docker Hub]: https://hub.docker.com/r/adguard/adguardhome +[Snap Store]: https://snapcraft.io/adguard-home +[wiki-start]: https://github.com/AdguardTeam/AdGuardHome/wiki/Getting-Started + + + + ### Guides + +See our [Wiki][wiki]. + +[wiki]: https://github.com/AdguardTeam/AdGuardHome/wiki + + + + ### API + +If you want to integrate with AdGuard Home, you can use our [REST API][openapi]. +Alternatively, you can use this [python client][pyclient], which is used to +build the [AdGuard Home Hass.io Add-on][hassio]. + +[hassio]: https://www.home-assistant.io/integrations/adguard/ +[openapi]: https://github.com/AdguardTeam/AdGuardHome/tree/master/openapi +[pyclient]: https://pypi.org/project/adguardhome/ + + + +## Comparing AdGuard Home to other solutions + + ### How is this different from public AdGuard DNS servers? + +Running your own AdGuard Home server allows you to do much more than using a +public DNS server. It's a completely different level. See for yourself: + + * Choose what exactly the server blocks and permits. + + * Monitor your network activity. + + * Add your own custom filtering rules. + + * **Most importantly, it's your own server, and you are the only one who's in + control.** + + + + ### How does AdGuard Home compare to Pi-Hole + +At this point, AdGuard Home has a lot in common with Pi-Hole. Both block ads +and trackers using the so-called “DNS sinkholing” method and both allow +customizing what's blocked. + + + +AdGuard Home provides a lot of features out-of-the-box with no need to install +and configure additional software. We want it to be simple to the point when +even casual users can set it up with minimal effort. + +**Disclaimer:** some of the listed features can be added to Pi-Hole by +installing additional software or by manually using SSH terminal and +reconfiguring one of the utilities Pi-Hole consists of. However, in our +opinion, this cannot be legitimately counted as a Pi-Hole's feature. + +| Feature | AdGuard Home | Pi-Hole | +|-------------------------------------------------------------------------|-------------------|-----------------------------------------------------------| +| Blocking ads and trackers | ✅ | ✅ | +| Customizing blocklists | ✅ | ✅ | +| Built-in DHCP server | ✅ | ✅ | +| HTTPS for the Admin interface | ✅ | Kind of, but you'll need to manually configure lighttpd | +| Encrypted DNS upstream servers (DNS-over-HTTPS, DNS-over-TLS, DNSCrypt) | ✅ | ❌ (requires additional software) | +| Cross-platform | ✅ | ❌ (not natively, only via Docker) | +| Running as a DNS-over-HTTPS or DNS-over-TLS server | ✅ | ❌ (requires additional software) | +| Blocking phishing and malware domains | ✅ | ❌ (requires non-default blocklists) | +| Parental control (blocking adult domains) | ✅ | ❌ | +| Force Safe search on search engines | ✅ | ❌ | +| Per-client (device) configuration | ✅ | ✅ | +| Access settings (choose who can use AGH DNS) | ✅ | ❌ | +| Running [without root privileges][wiki-noroot] | ✅ | ❌ | + +[wiki-noroot]: https://github.com/AdguardTeam/AdGuardHome/wiki/Getting-Started#running-without-superuser + + + + ### How does AdGuard Home compare to traditional ad blockers + +It depends. + +DNS sinkholing is capable of blocking a big percentage of ads, but it lacks +the flexibility and the power of traditional ad blockers. You can get a good +impression about the difference between these methods by reading [this +article][blog-adaway], which compares AdGuard for Android (a traditional ad +blocker) to hosts-level ad blockers (which are almost identical to DNS-based +blockers in their capabilities). This level of protection is enough for some +users. + +Additionally, using a DNS-based blocker can help to block ads, tracking and +analytics requests on other types of devices, such as SmartTVs, smart speakers +or other kinds of IoT devices (on which you can't install traditional ad +blockers). + + + + ### Known limitations + +Here are some examples of what cannot be blocked by a DNS-level blocker: + + * YouTube, Twitch ads; + + * Facebook, Twitter, Instagram sponsored posts. + +Essentially, any advertising that shares a domain with content cannot be blocked +by a DNS-level blocker. + +Is there a chance to handle this in the future? DNS will never be enough to do +this. Our only option is to use a content blocking proxy like what we do in the +standalone AdGuard applications. We're [going to bring][issue-1228] this +feature support to AdGuard Home in the future. Unfortunately, even in this +case, there still will be cases when this won't be enough or would require quite +a complicated configuration. + +[blog-adaway]: https://adguard.com/blog/adguard-vs-adaway-dns66.html +[issue-1228]: https://github.com/AdguardTeam/AdGuardHome/issues/1228 + + + +## How to build from source + + ### Prerequisites + +Run `make init` to prepare the development environment. + +You will need this to build AdGuard Home: + + * [Go](https://golang.org/dl/) v1.19 or later; + * [Node.js](https://nodejs.org/en/download/) v10.16.2 or later; + * [npm](https://www.npmjs.com/) v6.14 or later; + * [yarn](https://yarnpkg.com/) v1.22.5 or later. + + + + ### Building + +Open your terminal and execute these commands: + +```sh +git clone https://github.com/AdguardTeam/AdGuardHome +cd AdGuardHome +make +``` + +**NOTE:** The non-standard `-j` flag is currently not supported, so building +with `make -j 4` or setting your `MAKEFLAGS` to include, for example, `-j 4` is +likely to break the build. If you do have your `MAKEFLAGS` set to that, and you +don't want to change it, you can override it by running `make -j 1`. + +Check the [`Makefile`][src-makefile] to learn about other commands. + + #### Building for a different platform + +You can build AdGuard Home for any OS/ARCH that Go supports. In order to do +this, specify `GOOS` and `GOARCH` environment variables as macros when running +`make`. + +For example: + +```sh +env GOOS='linux' GOARCH='arm64' make +``` + +or: + +```sh +make GOOS='linux' GOARCH='arm64' +``` + + #### Preparing releases + +You'll need [`snapcraft`] to prepare a release build. Once installed, run the +following command: + +```sh +make build-release CHANNEL='...' VERSION='...' +``` + +See the [`build-release` target documentation][targ-release]. + + #### Docker image + +Run `make build-docker` to build the Docker image locally (the one that we +publish to DockerHub). Please note, that we're using [Docker Buildx][buildx] to +build our official image. + +You may need to prepare before using these builds: + + * (Linux-only) Install Qemu: + + ```sh + docker run --rm --privileged multiarch/qemu-user-static --reset -p yes --credential yes + ``` + + * Prepare the builder: + + ```sh + docker buildx create --name buildx-builder --driver docker-container --use + ``` + +See the [`build-docker` target documentation][targ-docker]. + + #### Debugging the frontend + +When you need to debug the frontend without recompiling the production version +every time, for example to check how your labels would look on a form, you can +run the frontend build a development environment. + +1. In a separate terminal, run: + + ```sh + ( cd ./client/ && env NODE_ENV='development' npm run watch ) + ``` + +2. Run your `AdGuardHome` binary with the `--local-frontend` flag, which + instructs AdGuard Home to ignore the built-in frontend files and use those + from the `./build/` directory. + +3. Now any changes you make in the `./client/` directory should be recompiled + and become available on the web UI. Make sure that you disable the browser + cache to make sure that you actually get the recompiled version. + +[`snapcraft`]: https://snapcraft.io/ +[buildx]: https://docs.docker.com/buildx/working-with-buildx/ +[src-makefile]: https://github.com/AdguardTeam/AdGuardHome/blob/master/Makefile +[targ-docker]: https://github.com/AdguardTeam/AdGuardHome/tree/master/scripts#build-dockersh-build-a-multi-architecture-docker-image +[targ-release]: https://github.com/AdguardTeam/AdGuardHome/tree/master/scripts#build-releasesh-build-a-release-for-all-platforms + + + +## Contributing + +You are welcome to fork this repository, make your changes and [submit a pull +request][pr]. Please make sure you follow our [code guidelines][guide] though. + +Please note that we don't expect people to contribute to both UI and backend +parts of the program simultaneously. Ideally, the backend part is implemented +first, i.e. configuration, API, and the functionality itself. The UI part can +be implemented later in a different pull request by a different person. + +[guide]: https://github.com/AdguardTeam/CodeGuidelines/ +[pr]: https://github.com/AdguardTeam/AdGuardHome/pulls + + + + ### Test unstable versions + +There are two update channels that you can use: + + * `beta`: beta versions of AdGuard Home. More or less stable versions, + usually released every two weeks or more often. + + * `edge`: the newest version of AdGuard Home from the development branch. New + updates are pushed to this channel daily. + +There are three options how you can install an unstable version: + +1. [Snap Store]: look for the `beta` and `edge` channels. + +2. [Docker Hub]: look for the `beta` and `edge` tags. + +3. Standalone builds. Use the automated installation script or look for the + available builds [on the Wiki][wiki-platf]. + + Script to install a beta version: + + ```sh + curl -s -S -L https://raw.githubusercontent.com/AdguardTeam/AdGuardHome/master/scripts/install.sh | sh -s -- -c beta + ``` + + Script to install an edge version: + + ```sh + curl -s -S -L https://raw.githubusercontent.com/AdguardTeam/AdGuardHome/master/scripts/install.sh | sh -s -- -c edge + ``` +[wiki-platf]: https://github.com/AdguardTeam/AdGuardHome/wiki/Platforms + + + + ### Report issues + +If you run into any problem or have a suggestion, head to [this page][iss] and +click on the “New issue” button. + +[iss]: https://github.com/AdguardTeam/AdGuardHome/issues + + + + ### Help with translations + +If you want to help with AdGuard Home translations, please learn more about +translating AdGuard products [in our Knowledge Base][kb-trans]. You can +contribute to the [AdGuardHome project on CrowdIn][crowdin]. + +[crowdin]: https://crowdin.com/project/adguard-applications/en#/adguard-home +[kb-trans]: https://kb.adguard.com/en/general/adguard-translations + + + + ### Other + +Another way you can contribute is by [looking for issues][iss-help] marked as +`help wanted`, asking if the issue is up for grabs, and sending a PR fixing the +bug or implementing the feature. + +[iss-help]: https://github.com/AdguardTeam/AdGuardHome/issues?q=is%3Aissue+is%3Aopen+label%3A%22help+wanted%22 + + + +## Projects that use AdGuard Home + + + + * [AdGuard Home Remote](https://apps.apple.com/app/apple-store/id1543143740): + iOS app by [Joost](https://rocketscience-it.nl/). + + * [Python library](https://github.com/frenck/python-adguardhome) by + [@frenck](https://github.com/frenck). + + * [Home Assistant add-on](https://github.com/hassio-addons/addon-adguard-home) + by [@frenck](https://github.com/frenck). + + * [OpenWrt LUCI app](https://github.com/kongfl888/luci-app-adguardhome) by + [@kongfl888](https://github.com/kongfl888) (originally by + [@rufengsuixing](https://github.com/rufengsuixing)). + + * [Prometheus exporter for AdGuard + Home](https://github.com/ebrianne/adguard-exporter) by + [@ebrianne](https://github.com/ebrianne). + + * [Terminal-based, real-time traffic monitoring and statistics for your AdGuard Home + instance](https://github.com/Lissy93/AdGuardian-Term) by + [@Lissy93](https://github.com/Lissy93) + + * [AdGuard Home on GLInet + routers](https://forum.gl-inet.com/t/adguardhome-on-gl-routers/10664) by + [Gl-Inet](https://gl-inet.com/). + + * [Cloudron app](https://git.cloudron.io/cloudron/adguard-home-app) by + [@gramakri](https://github.com/gramakri). + + * [Asuswrt-Merlin-AdGuardHome-Installer](https://github.com/jumpsmm7/Asuswrt-Merlin-AdGuardHome-Installer) + by [@jumpsmm7](https://github.com/jumpsmm7) aka + [@SomeWhereOverTheRainBow](https://www.snbforums.com/members/somewhereovertherainbow.64179/). + + * [Node.js library](https://github.com/Andrea055/AdguardHomeAPI) by + [@Andrea055](https://github.com/Andrea055/). + + + +## Acknowledgments + + + +This software wouldn't have been possible without: + + * [Go](https://golang.org/dl/) and its libraries: + * [gcache](https://github.com/bluele/gcache) + * [miekg's dns](https://github.com/miekg/dns) + * [go-yaml](https://github.com/go-yaml/yaml) + * [service](https://godoc.org/github.com/kardianos/service) + * [dnsproxy](https://github.com/AdguardTeam/dnsproxy) + * [urlfilter](https://github.com/AdguardTeam/urlfilter) + * [Node.js](https://nodejs.org/) and its libraries: + * And many more Node.js packages. + * [React.js](https://reactjs.org) + * [Tabler](https://github.com/tabler/tabler) + * [whotracks.me data](https://github.com/cliqz-oss/whotracks.me) + +You might have seen that [CoreDNS] was mentioned here before, but we've stopped +using it in AdGuard Home. + +For the full list of all Node.js packages in use, please take a look at +[`client/package.json`][src-packagejson] file. + +[CoreDNS]: https://coredns.io +[src-packagejson]: https://github.com/AdguardTeam/AdGuardHome/blob/master/client/package.json + + + +## Privacy + +Our main idea is that you are the one, who should be in control of your data. +So it is only natural, that AdGuard Home does not collect any usage statistics, +and does not use any web services unless you configure it to do so. See also +the [full privacy policy][privacy] with every bit that *could in theory be sent* +by AdGuard Home is available. + +[privacy]: https://adguard.com/en/privacy/home.html diff --git a/apps/adguardhome/data.yml.bak b/apps/adguardhome/data.yml.bak new file mode 100644 index 00000000..203301c3 --- /dev/null +++ b/apps/adguardhome/data.yml.bak @@ -0,0 +1,20 @@ +name: AdGuardHome +tags: + - 工具 +title: 自由且开源的,功能强大的网络广告和跟踪器屏蔽DNS服务器 +type: 工具 +description: 自由且开源的,功能强大的网络广告和跟踪器屏蔽DNS服务器 +additionalProperties: + key: adguardhome + name: AdGuardHome + tags: + - Tool + shortDescZh: 自由且开源的,功能强大的网络广告和跟踪器屏蔽DNS服务器 + shortDescEn: Free and open source, powerful network-wide ads & trackers blocking DNS server + type: tool + crossVersionUpdate: true + limit: 0 + recommend: 0 + website: https://hub.docker.com/r/adguard/adguardhome + github: https://github.com/AdguardTeam/AdGuardHome + document: https://github.com/AdguardTeam/AdGuardHome/wiki diff --git a/apps/adguardhome/logo.png b/apps/adguardhome/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..87ad08af453528cff500e66df77f2706f022a0d4 GIT binary patch literal 6363 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 literal 0 HcmV?d00001