菜单

部署

相关源文件

本文档介绍了 frp (Fast Reverse Proxy) 的各种部署方法,包括从源码构建、使用预编译二进制文件以及容器化部署。它涵盖了构建系统的架构、交叉编译能力以及 frps (服务器) 和 frpc (客户端) 组件的官方分发机制。

有关部署后配置的信息,请参阅 配置

部署架构

frp 提供了多种部署选项,以适应不同的环境和需求。下图说明了主要的可用部署路径

来源: Makefile1-71 Makefile.cross-compiles1-38 package.sh1-75 .github/workflows/build-and-push-image.yml1-84 .github/workflows/goreleaser.yml1-31

从源代码构建

从源码构建 frp 提供了最大的灵活性,并允许自定义构建过程。

先决条件

  • Go 1.18 或更高版本 (当前代码库使用 Go 1.23)
  • Make 工具

基本构建

基本构建过程使用项目的 Makefile 为当前平台编译 frpc 和 frps 二进制文件。

Makefile 定义了以下关键目标

  • make: 运行环境检查、代码格式化,并构建 frpc 和 frps
  • make frpc: 仅构建客户端二进制文件
  • make frps: 仅构建服务器二进制文件
  • make clean: 删除生成的二进制文件

来源: Makefile5-71

交叉编译

frp 使用 Makefile.cross-compiles 文件支持交叉编译到多种操作系统和架构。

交叉编译过程会为以下组合生成二进制文件

交叉编译系统定义在 Makefile.cross-compiles 中,并使用相应的构建标志处理每个操作系统-架构组合。

来源: Makefile.cross-compiles1-38

打包

交叉编译后,您可以使用 package.sh 脚本来创建分发包。

该脚本

  1. 使用 Make 构建二进制文件
  2. 为所有支持的平台进行交叉编译
  3. release/packages/ 目录中创建包
    • Windows 的 .zip 归档文件
    • 其他平台的 .tar.gz 归档文件
  4. 每个包包含
    • 二进制可执行文件 (frpc/frps)
    • 许可证文件
    • 示例配置文件

来源: package.sh1-75

Docker 部署

frp 为 frpc 和 frps 组件都提供了官方 Docker 镜像,提供容器化部署选项。

官方 Docker 镜像

官方镜像可在 DockerHub 和 GitHub Container Registry 上获取。

组件DockerHubGitHub Container Registry
frpcfatedier/frpcghcr.io/fatedier/frpc
frpsfatedier/frpsghcr.io/fatedier/frps

Docker 部署架构

使用 Docker 运行

运行 frps 服务器

运行 frpc 客户端

自定义 Docker 构建

您可以使用提供的 Dockerfiles 构建自定义 Docker 镜像。

Dockerfiles 使用多阶段构建过程。

  1. 第一阶段: 从 golang:1.23 镜像构建并编译 frp
  2. 第二阶段: 创建一个最小的基于 Alpine 的镜像,只包含必要的二进制文件

来源: dockerfiles/Dockerfile-for-frpc1-15 dockerfiles/Dockerfile-for-frps1-15 .github/workflows/build-and-push-image.yml1-84

CI/CD集成

frp 包含 GitHub Actions 工作流程,用于自动化构建和发布,从而促进持续集成和部署。

构建系统架构

GitHub Actions 工作流

该项目包含几个用于自动化任务的 GitHub Actions 工作流程

  1. 构建和推送 Docker 镜像 (.github/workflows/build-and-push-image.yml)

    • 在发布或手动分派时触发
    • 构建多架构 Docker 镜像 (amd64, arm/v7, arm64, ppc64le, s390x)
    • 将镜像推送到 DockerHub 和 GitHub Container Registry
  2. GoReleaser (.github/workflows/goreleaser.yml)

    • 手动触发
    • 使用 package.sh 创建跨平台二进制文件
    • 使用构建的包创建 GitHub 发布
  3. 代码质量 (.github/workflows/golangci-lint.yml)

    • 运行 linting 和代码质量检查

来源: .github/workflows/build-and-push-image.yml1-84 .github/workflows/goreleaser.yml1-31 .github/workflows/golangci-lint.yml1-43 .circleci/config.yml1-17

自动重试机制

frp 包含复杂的重试机制,以确保部署的稳定性。 BackoffManager 接口提供了一种实现指数退避(带抖动)的方法,以在不稳定的环境中实现更可靠的重连。

关键组件

  • FastBackoffManager: 实现带有可配置参数的退避
  • BackoffUntil: 用于带有退避的定期重试操作的函数
  • Until: 用于更简单的定期重试的函数

这些机制在 frp 的不稳定的网络环境部署中特别有用,可以确保临时故障无需手动干预。

来源: pkg/util/wait/backoff.go1-176 pkg/util/util/util.go1-137

总结

frp 提供多种部署选项,以适应不同的环境和需求

部署方法用例优点
从源代码构建开发、定制完全控制,最新功能
预编译二进制文件生产、快速设置简单,广泛的平台支持
Docker 容器容器化环境隔离、编排支持

每种部署方法都得到一个具有交叉编译能力和 CI/CD 集成的强大构建系统的支持。

有关部署 frp 后如何配置的信息,请参考 配置 页面。