前言

在当下的大环境下,不得已要做点副业维持生计,我所做的主要是帮别人搭建私有化服务。而经常遇到有人想要预览一下某个服务的功能是否满足他的需求,最开始我用 Tailscale,让他连到我的内网环境中,这样每次都要让对方去下载 Tailscale 和注册等一系列操作!

不仅如此,因为我本地使用的是自签名的证书,所以对方还要添加可信任的 CA,以及修改 hosts 的解析配置。

这听起来就很麻烦……所以我一直在找简单的解决方案,最终返现了 Expose 这个工具!

简介

Expose 是 BeyoundCode 这个团队基于 PHP 开发的,内置简洁美观的管理 UI,以及简单易用的 CLI。

Console

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(`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…