私有化部署 Expose 实现内网 Tunnel
![Cover Image 私有化部署 Expose 实现内网 Tunnel](https://george.betterde.com/covers/20240714-expose-tunnel.jpg)
前言⌗
在当下的大环境下,不得已要做点副业维持生计,我所做的主要是帮别人搭建私有化服务。而经常遇到有人想要预览一下某个服务的功能是否满足他的需求,最开始我用 Tailscale,让他连到我的内网环境中,这样每次都要让对方去下载 Tailscale 和注册等一系列操作!
不仅如此,因为我本地使用的是自签名的证书,所以对方还要添加可信任的 CA,以及修改 hosts 的解析配置。
这听起来就很麻烦……所以我一直在找简单的解决方案,最终返现了 Expose 这个工具!
简介⌗
Expose 是 BeyoundCode 这个团队基于 PHP 开发的,内置简洁美观的管理 UI,以及简单易用的 CLI。
Server⌗
Expose Server 的 docker-compose.yaml
配置文件:
services:
expose:
image: beyondcodegmbh/expose-server:latest
labels:
- traefik.enable=true
- traefik.http.routers.expose.tls=true
- traefik.http.routers.expose.tls.certResolver=betterde
- traefik.http.routers.expose.rule=Host(`expose.example.com`)
- traefik.http.routers.expose.service=expose
- traefik.http.routers.expose.entrypoints=http,https
- traefik.http.services.expose.loadbalancer.server.port=443
- traefik.http.routers.tunnel.tls=true
- traefik.http.routers.tunnel.tls.certResolver=example
- traefik.http.routers.tunnel.tls.domains[0].main=example.com
- traefik.http.routers.tunnel.tls.domains[0].sans=*.example.com
- traefik.http.routers.tunnel.rule=HostRegexp(`^.+.example.com$`)
- traefik.http.routers.tunnel.service=tunnel
- traefik.http.routers.tunnel.priority=5
- traefik.http.routers.tunnel.entrypoints=http,https
- traefik.http.services.tunnel.loadbalancer.server.port=443
restart: no
volumes:
- ./config/expose.php:/src/config/expose.php
- ./database/expose.db:/root/.expose
hostname: expose
networks:
- traefik
extra_hosts:
- host.docker.internal:host-gateway
environment:
port: 443
domain: example.com
username: ${USERNAME}
password: ${PASSWORD}
container_name: expose
networks:
traefik:
external: true
Expose 的管理后台的子域名必须是 expose
,如果无法使用该子域名,需要修改其默认配置文件,在容器内的 /src/config/expose.php
文件中,找到 admin.subdomain
,修改为你自己的子域名即可。例如这里的是 tunnel.example.com
。
Client⌗
安装 CLI:
composer global require beyondcode/expose
然后根据实际情况修改 ~/.expose/config.php
文件中的如下配置:
- servers.main.host: Expose Server 的 Domain;
- servers.main.port: Expose Server 的 Port;
- server_endpoint: Expose API 的 URL;
- default_server: 默认服务器,该值为
servers
数组中的key
,也就是main
; - default_domain: Tunnel 启动后对应的访问域名 TLD;
- auth_token: 在管理后台为用户创建的 Token。
配置完成后就可以共享本地的服务了!
共享⌗
# 启动本地的服务
miniserve --index index.html --port 4000
miniserve v0.27.1
Bound to [::]:4000, 0.0.0.0:4000
Serving path /Users/George/Develop/betterde/website
Available at (non-exhaustive list):
http://10.0.6.8:4000
http://10.8.10.0:4000
http://127.0.0.1:4000
http://198.19.249.3:4000
http://[::1]:4000
http://[240e:b65:d60:83bb:871:86ee:8e39:2a65]:4000
http://[240e:b65:d60:83bb:14b2:8244:b01f:aa47]:4000
http://[240e:b65:d60:83bb:4cac:d479:9839:f5ac]:4000
http://[240e:b65:d60:83bb:a837:4ab:1706:e731]:4000
http://[240e:b65:d60:83bb:bed0:74ff:fe20:1efe]:4000
http://[fd07:b51a:cc66:0:a617:db5e:ab7:e9f1]:4000
Quit by pressing CTRL-C
# 启动 expose tunnel
expose share --subdomain www -- http://127.0.0.1:4000
Thank you for using expose.
Shared URL: 127.0.0.1:4000
Dashboard: http://127.0.0.1:4040
Public HTTP: http://www.example.com
Public HTTPS: https://www.example.com
接下来就可以将外部连接共享给访问者了,如果有需要有偿协助部署的可以联系微信:GeorgeBornAgain
,请注明来意,谢谢!
总结⌗
Expose 不仅对 Laravel 的 Valet 支持较好,还能够支持绝大多数服务,甚至是 TCP 端口的连接转发。部署好以后,就不用再为服务部署 Demo 的事情而发愁了!
I hope this is helpful, Happy hacking…