返回博客列表

公网探索计划:没有服务器,我用 NAS 也能遨游互联网!

2026-01-29
3 min read
服务器运维

!! info 🛰️ 穷人的公网探索计划:没有服务器,我用 NAS 也能遨游互联网! 在预算有限的情况下,如何不购买云服务器,也能将本地 NAS 打造成“对外服务”的强大平台?本文记录了我用 本地设备 + 内网穿透 + 开源面板 实现公网可访问服务的完整方案。 !!! ✅ 方案一览 [x] 零刻小电脑 小巧静音、性能足够、功耗低,是我用来充当“伪服务器”的利器。 - [x] 部署飞牛云 NAS...

!!! info 🛰️ 穷人的公网探索计划:没有服务器,我用 NAS 也能遨游互联网!

在预算有限的情况下,如何不购买云服务器,也能将本地 NAS 打造成“对外服务”的强大平台?本文记录了我用 本地设备 + 内网穿透 + 开源面板 实现公网可访问服务的完整方案。 !!!

✅ 方案一览

  • 零刻小电脑 小巧静音、性能足够、功耗低,是我用来充当“伪服务器”的利器。

  • 部署飞牛云 NAS 系统 飞牛云基于国产 openNAS 系统,界面友好、功能丰富,适合折腾。

  • 安装 1Panel 面板 用于部署和管理服务(如网站、数据库等),一个面板搞定一切。

  • 网络环境设置

使用 PassNat 内网穿透 无需公网服务器,通过选择稳定、价格合适的 PassNat 节点实现对外服务。(如果你家里网络有公网ip 就可以忽略这一步了)

  • 使用 Certd 管理 HTTPS 证书 一键申请 Let's Encrypt 证书,支持自动续期,让公网访问更安全、更专业。

  • cloudflare域名解析

部署过程

mini电脑、pve、飞牛nas这些硬件环境直接就跳过了

PassNat 内网穿透

PassNat

服务端配置

控制台配置

这里先配置控制台,选择内网穿透的端口和 ip。这里配置完成后会给这个隧道生成一个公网 ip。

自定义域名时候要使用。

客户端配置

docker 直接搜索这个镜像 uhub.service.ucloud.cn/ucpublic/frpc

cloudflare域名解析

在这里填写passnat 这个隧道分配的公网 ip,如果你本来就有公网 ip那么就可以跳过前面哪一步,直接填你的公网 ip即可。

certd 证书管理平台

docker部署

使用介绍

你可以直接使用 docker 命令部署。也可以使用 docker-compose 文件部署。

我这边在文件夹中下载 docker-compose 并指定了使用本地的 mysql 作为数据库。 注意下面的 mysql 是我本地的数据库,如果你也要用,要换成你自己的地址和账户信息。 如果你不想用 mysql 或者不想配置数据库,可以到官网找默认的配置。

yml
version: '3.3' # 兼容旧版docker-compose
services:
  certd:
    # 镜像                                                  #  ↓↓↓↓↓ ---- 镜像版本号,建议改成固定版本号,例如:certd:1.29.0
    image: registry.cn-shenzhen.aliyuncs.com/handsfree/certd:latest
    # image: ghcr.io/certd/certd:latest                    #   --------- 如果 报镜像not found,可以尝试其他镜像源
    # image: greper/certd:latest
    container_name: certd # 容器名
    restart: unless-stopped # 自动重启
    volumes:
      #   ↓↓↓↓↓ -------------------------------------------------------- 数据库以及证书存储路径,默认存在宿主机的/data/certd/目录下,【您需要定时备份此目录,以保障数据容灾】
      #                                                                  只要修改冒号前面的,冒号后面的/app/data不要动
      - /data/certd:/app/data
    ports: # 端口映射
      #  ↓↓↓↓ ---------------------------------------------------------- 如果端口有冲突,可以修改第一个7001为其他不冲突的端口号,第二个7001不要动
      - "7001:7001"
      #  ↓↓↓↓ ---------------------------------------------------------- https端口,可以根据实际情况,是否暴露该端口
      - "7002:7002"
    #↓↓↓↓ -------------------------------------------------------------- 如果出现getaddrinfo EAI_AGAIN 或 getaddrinfo ENOTFOUND 错误,可以尝试设置dns
#    dns:
#      - 223.5.5.5      # 阿里云公共dns
#      - 223.6.6.6
#       # ↓↓↓↓ --------------------------------------------------------- 如果你服务器在腾讯云,可以用这个替换上面阿里云的公共dns
#      - 119.29.29.29  # 腾讯云公共dns
#      - 182.254.116.116
#       # ↓↓↓↓ --------------------------------------------------------- 如果你服务器部署在国外,可以用这个替换上面阿里云的公共dns
#      - 8.8.8.8       # 谷歌公共dns
#      - 8.8.4.4
#    extra_hosts:
#        # ↓↓↓↓ -------------------------------------------------------- 这里可以配置自定义hosts,外网域名可以指向本地局域网ip地址
#      - "localdomain.com:192.168.1.3"
#        #         ↓↓↓↓ ------------------------------------------------ 直接使用主机的网络,如果网络问题实在找不到原因,可以尝试打开此参数
#    network_mode: host
    labels:
      com.centurylinklabs.watchtower.enable: "true"
#    ↓↓↓↓ -------------------------------------------------------------- 启用ipv6网络,还需要把下面networks的注释放开
#    networks:
#      - ip6net
    environment:
#             ↓↓↓↓ ----------------------------------------------------- 使用上海东八时区
#      - TZ=Asia/Shanghai
#     设置环境变量即可自定义certd配置
#     配置项见: packages/ui/certd-server/src/config/config.default.ts
#     配置规则: certd_ + 配置项, 点号用_代替
#                                    #↓↓↓↓ ----------------------------- 如果忘记管理员密码,可以设置为true,重启之后,管理员密码将改成123456,然后请及时修改回false
      - certd_system_resetAdminPasswd=false

#     默认使用sqlite文件数据库,如果需要使用其他数据库,请设置以下环境变量
#     注意: 选定使用一种数据库之后,不支持更换数据库。
#     数据库迁移方法:1、使用新数据库重新部署一套,然后将旧数据同步过去,注意flyway_history表的数据不要同步
#                                    #↓↓↓↓ ----------------------------- 使用postgresql数据库,需要提前创建数据库
#      - certd_flyway_scriptDir=./db/migration-pg                        # 升级脚本目录
#      - certd_typeorm_dataSource_default_type=postgres                  # 数据库类型
#      - certd_typeorm_dataSource_default_host=localhost                 # 数据库地址
#      - certd_typeorm_dataSource_default_port=5433                      # 数据库端口
#      - certd_typeorm_dataSource_default_username=postgres              # 用户名
#      - certd_typeorm_dataSource_default_password=yourpasswd            # 密码
#      - certd_typeorm_dataSource_default_database=certd                 # 数据库名

#                                    #↓↓↓↓ ----------------------------- 使用mysql数据库,需要提前创建数据库 charset=utf8mb4, collation=utf8mb4_bin
      - certd_flyway_scriptDir=./db/migration-mysql                     # 升级脚本目录
      - certd_typeorm_dataSource_default_type=mysql                     # 数据库类型, 或者 mariadb
      - certd_typeorm_dataSource_default_host=192.168.1.18                 # 数据库地址
      - certd_typeorm_dataSource_default_port=3306                      # 数据库端口
      - certd_typeorm_dataSource_default_username=certd2                  # 用户名
      - certd_typeorm_dataSource_default_password=dMrwtH4ZAzM            # 密码
      - certd_typeorm_dataSource_default_database=certd                 # 数据库名

#         ↓↓↓↓ ---------------------------------------------------------  自动升级,上面certd的版本号要保持为latest
#  certd-updater:  # 添加 Watchtower 服务
#    image: containrrr/watchtower:latest
#    container_name: certd-updater
#    restart: unless-stopped
#    volumes:
#      - /var/run/docker.sock:/var/run/docker.sock
#    # 配置 自动更新
#    environment:
#      - WATCHTOWER_CLEANUP=true            # 自动清理旧版本容器
#      - WATCHTOWER_INCLUDE_STOPPED=false   # 不更新已停止的容器
#      - WATCHTOWER_LABEL_ENABLE=true       # 根据容器标签进行更新
#      - WATCHTOWER_POLL_INTERVAL=600       # 每 10 分钟检查一次更新


#    ↓↓↓↓ -------------------------------------------------------------- 启用ipv6网络,还需要把上面networks的注释放开
#networks:
#  ip6net:
#    enable_ipv6: true
#    ipam:
#      config:
#        - subnet: 2001:db8::/64

基础配置

默认的用户名是 admin/123456,第一次登录会让你改密码。

邮箱配置

工作流配置

配置好就长这样,会向着 cloudflare 申请证书并将证书放到你宿主机指定的位置。

申请证书配置

放到指定位置

这里小编要放到我的宿主机,然后供 passnat 客户端使用。

到这里证书已经会自动下载到你的宿主机了。然后把你证书映射到 frpc 的路径中。

然后在passnat 服务端配置下证书地址。

然后将这个配置复制到这里,然后重启容器就好了

返回博客列表
最后更新于 2026-01-29
想法或问题?在 GitHub Issue 下方参与讨论
去评论