diff --git a/apps/headscale-ui/README.md b/apps/headscale-ui/README.md new file mode 100644 index 00000000..25cfcb7f --- /dev/null +++ b/apps/headscale-ui/README.md @@ -0,0 +1,128 @@ +# 使用说明 + +**Headscale 服务器地址,只能用经过域名反向代理的地址。** + +# 原始相关 +*** +# Headscale-UI +A web frontend for the [headscale](https://github.com/juanfont/headscale) Tailscale-compatible coordination server. + +## Installation +Headscale-UI is currently released as a static site: just take the release and host with your favorite web server. Headscale-UI expects to be served from the `/web` path to avoid overlap with headscale on the same domain. Note that due to CORS (see https://github.com/juanfont/headscale/issues/623), headscale UI *must* be served on the same subdomain, or CORS headers injected via reverse proxy. + +### Docker Installation +If you are using docker, you can install `headscale` alongside `headscale-ui`, like so: + +```yaml +version: '3.5' +services: + headscale: + image: headscale/headscale:latest + container_name: headscale + volumes: + - ./container-config:/etc/headscale + - ./container-data/data:/var/lib/headscale + # ports: + # - 27896:8080 + command: headscale serve + restart: unless-stopped + headscale-ui: + image: ghcr.io/gurucomputing/headscale-ui:latest + restart: unless-stopped + container_name: headscale-ui + # ports: + # - 9443:443 +``` + +Headscale UI serves on port 443 and uses a self signed cert by default. You will need to add a `config.yaml` file under your `container-config` folder so that `headscale` has all of the required settings declared. An example from the official `headscale` repo is [here](https://github.com/juanfont/headscale/blob/main/config-example.yaml). + +### Additional Docker Settings +The docker container lets you set the following settings: +| Variable | Description | Example | +|----|----|----| +| HTTP_PORT | Sets the HTTP port to an alternate value | `80` | +| HTTPS_PORT | Sets the HTTPS port to an alternate value | `443` | + +### Proxy Settings +You will need a reverse proxy to install `headscale-ui` on your domain. Here is an example [Caddy Config](https://caddyserver.com/) to achieve this: +``` +https://hs.yourdomain.com.au { + reverse_proxy /web* https://headscale-ui { + transport http { + tls_insecure_skip_verify + } + } + + reverse_proxy * http://headscale:8080 +} + + +``` + +### Cross Domain Installation +If you do not want to configure headscale-ui on the same subdomain as headscale, you must intercept headscale traffic via your reverse proxy to fix CORS (see https://github.com/juanfont/headscale/issues/623). Here is an example fix with Caddy, replacing your headscale UI domain with `hs-ui.yourdomain.com.au`: +``` +https://hs.yourdomain.com.au { + @hs-options { + host hs.yourdomain.com.au + method OPTIONS + } + @hs-other { + host hs.yourdomain.com.au + } + handle @hs-options { + header { + Access-Control-Allow-Origin https://hs-ui.yourdomain.au + Access-Control-Allow-Headers * + Access-Control-Allow-Methods "POST, GET, OPTIONS, DELETE" + } + respond 204 + } + handle @hs-other { + reverse_proxy http://headscale:8080 { + header_down Access-Control-Allow-Origin https://hs-ui.yourdomain.com.au + header_down Access-Control-Allow-Methods "POST, GET, OPTIONS, DELETE" + header_down Access-Control-Allow-Headers * + } + } +} + +``` + +### Other Configurations +See [Other Configurations](https://github.com/gurucomputing/headscale-ui/blob/master/documentation/configuration.md) for further proxy examples, such as Traefik + +## Versioning +The following versions correspond to the appropriate headscale version +| Headscale Version | HS-UI Version | +|-------------------|---------------| +| 19+ | 2023-01-30+ | +| <19 | <2023-01-30 | + +## Troubleshooting +Make sure you are using the latest version of headscale. Headscale-UI is only tested against: + +* The current stable version of headscale +* Chrome/Chrome Mobile +* Firefox/Firefox Mobile + +Note that while mobile is checked for functionality, the web experience is not mobile optimised. + +If you are getting errors about preflight checks, it's probably CORS related. Make sure your UI sits on the same subdomain as headscale or inject CORS headers. + +### Errors related to "Missing Bearer Prefix" +Your API key is either not saved or you haven't configured your reverse proxy. Create an API key in `headscale` (via command line) with `headscale apikeys create` or `docker exec headscale apikeys create` and save it in `settings`. + +HS-UI *has* to be ran on the same subdomain as headscale or you need to configure CORS. Yes you need to use a reverse proxy to do this. Use a reverse proxy. If you are trying to use raw IPs and ports, it *will* not work. + +## Security +see [security](https://github.com/gurucomputing/headscale-ui/blob/master/SECURITY.md) for details + +## Development +see [development](https://github.com/gurucomputing/headscale-ui/blob/master/documentation/development.md) for details + +## Style Guide +see [style](https://github.com/gurucomputing/headscale-ui/blob/master/documentation/style.md) for details + +## Architecture +See [architecture](https://github.com/gurucomputing/headscale-ui/blob/master/documentation/architecture.md) for details \ No newline at end of file diff --git a/apps/headscale-ui/data.yml b/apps/headscale-ui/data.yml new file mode 100644 index 00000000..414f80bd --- /dev/null +++ b/apps/headscale-ui/data.yml @@ -0,0 +1,20 @@ +name: Headscale-UI +tags: + - 工具 +title: Headscale 与 Tailscale 兼容的协调服务器的 Web 前端 +type: 工具 +description: Headscale 与 Tailscale 兼容的协调服务器的 Web 前端 +additionalProperties: + key: headscale-ui + name: Headscale-UI + tags: + - Tool + shortDescZh: Headscale 与 Tailscale 兼容的协调服务器的 Web 前端 + shortDescEn: A web frontend for the headscale Tailscale-compatible coordination server + type: tool + crossVersionUpdate: true + limit: 0 + recommend: 0 + website: https://github.com/gurucomputing/headscale-ui + github: https://github.com/gurucomputing/headscale-ui + document: https://github.com/gurucomputing/headscale-ui diff --git a/apps/headscale-ui/latest/.env.sample b/apps/headscale-ui/latest/.env.sample new file mode 100644 index 00000000..6c018e30 --- /dev/null +++ b/apps/headscale-ui/latest/.env.sample @@ -0,0 +1,2 @@ +CONTAINER_NAME="headscale-ui" +PANEL_APP_PORT_HTTPS="40182" diff --git a/apps/headscale-ui/latest/data.yml b/apps/headscale-ui/latest/data.yml new file mode 100644 index 00000000..be3b107d --- /dev/null +++ b/apps/headscale-ui/latest/data.yml @@ -0,0 +1,10 @@ +additionalProperties: + formFields: + - default: 40182 + edit: true + envKey: PANEL_APP_PORT_HTTPS + labelEn: Port + labelZh: 端口 + required: true + rule: paramPort + type: number diff --git a/apps/headscale-ui/latest/docker-compose.yml b/apps/headscale-ui/latest/docker-compose.yml new file mode 100644 index 00000000..dc5714fc --- /dev/null +++ b/apps/headscale-ui/latest/docker-compose.yml @@ -0,0 +1,16 @@ +version: '3' +services: + headscale-ui: + container_name: ${CONTAINER_NAME} + restart: always + networks: + - 1panel-network + ports: + - "${PANEL_APP_PORT_HTTPS}:443" + image: ghcr.io/gurucomputing/headscale-ui:latest + labels: + createdBy: "Apps" + +networks: + 1panel-network: + external: true diff --git a/apps/headscale-ui/logo.png b/apps/headscale-ui/logo.png new file mode 100644 index 00000000..52a47667 Binary files /dev/null and b/apps/headscale-ui/logo.png differ