1{ pkgs, lib, ... }:
2{
3 name = "frp";
4 meta.maintainers = with lib.maintainers; [ zaldnoay ];
5 nodes = {
6 frps = {
7 networking = {
8 useNetworkd = true;
9 useDHCP = false;
10 firewall.enable = false;
11 };
12
13 systemd.network.networks."01-eth1" = {
14 name = "eth1";
15 networkConfig.Address = "10.0.0.1/24";
16 };
17
18 services.frp = {
19 enable = true;
20 role = "server";
21 settings = {
22 bindPort = 7000;
23 vhostHTTPPort = 80;
24 };
25 };
26 };
27
28 frpc = {
29 networking = {
30 useNetworkd = true;
31 useDHCP = false;
32 };
33
34 systemd.network.networks."01-eth1" = {
35 name = "eth1";
36 networkConfig.Address = "10.0.0.2/24";
37 };
38
39 services.httpd = {
40 enable = true;
41 adminAddr = "admin@example.com";
42 virtualHosts."test-appication" =
43 let
44 testdir = pkgs.writeTextDir "web/index.php" "<?php phpinfo();";
45 in
46 {
47 documentRoot = "${testdir}/web";
48 locations."/" = {
49 index = "index.php index.html";
50 };
51 };
52 phpPackage = pkgs.php81;
53 enablePHP = true;
54 };
55
56 services.frp = {
57 enable = true;
58 role = "client";
59 settings = {
60 serverAddr = "10.0.0.1";
61 serverPort = 7000;
62 proxies = [
63 {
64 name = "web";
65 type = "http";
66 localPort = 80;
67 customDomains = [ "10.0.0.1" ];
68 }
69 ];
70 };
71 };
72 };
73 };
74
75 testScript = ''
76 start_all()
77 frps.wait_for_unit("frp.service")
78 frps.wait_for_open_port(80)
79 frpc.wait_for_unit("frp.service")
80 response = frpc.succeed("curl -fvvv -s http://127.0.0.1/")
81 assert "PHP Version ${pkgs.php81.version}" in response, "PHP version not detected"
82 response = frpc.succeed("curl -fvvv -s http://10.0.0.1/")
83 assert "PHP Version ${pkgs.php81.version}" in response, "PHP version not detected"
84 '';
85}