Fix cloudflared configuration with simple direct service

This commit is contained in:
Julian Sutter 2025-07-18 22:20:08 -07:00
parent bddfe0b656
commit 12b1281e88

View file

@ -1,78 +1,20 @@
{ config, lib, pkgs, ... }: { config, pkgs, ... }:
let {
# Cloudflare tunnel definitions environment.systemPackages = [ pkgs.cloudflared ];
tunnels = {
warp = { systemd.services.cloudflared-warp-ssh = {
remoteHost = "warp.ftl.host"; # Cloudflare hostname description = "Cloudflared SSH tunnel to warp.ftl.host localhost:22";
remoteTarget = "localhost:22"; # Where traffic routes to wantedBy = [ "multi-user.target" ];
localBindPort = 4401; # Local port exposed by cloudflared after = [ "network-online.target" ];
logPath = "/var/log/cloudflared/warp.log"; serviceConfig = {
ExecStart = "${pkgs.cloudflared}/bin/cloudflared access tcp --hostname warp.ftl.host --url localhost:22 --port 4401 --logfile /var/log/cloudflared-warp.log";
Restart = "always";
User = "root";
}; };
}; };
in {
# Install cloudflared
environment.systemPackages = with pkgs; [ cloudflared ];
# Ensure /var/log/cloudflared exists
systemd.tmpfiles.rules = [ systemd.tmpfiles.rules = [
"d /var/log/cloudflared 0755 root root -" "d /var/log 0755 root root -"
]; ];
# Systemd services per tunnel
systemd.services = lib.mapAttrs (name: tunnel: {
description = "Cloudflared Access TCP Tunnel for ${tunnel.remoteHost}";
after = [ "network-online.target" ];
wants = [ "network-online.target" ];
wantedBy = [ "multi-user.target" ];
# Use StateDirectory for persistent storage of logs
serviceConfig = {
StateDirectory = "cloudflared";
StateDirectoryMode = "0755";
RuntimeDirectory = "cloudflared";
RuntimeDirectoryMode = "0700";
# The key setting to ensure the service stays running
Type = "simple";
ExecStart = "${pkgs.cloudflared}/bin/cloudflared access tcp --hostname ${tunnel.remoteHost} --url ${tunnel.remoteTarget} --port ${toString tunnel.localBindPort} --logfile /var/lib/cloudflared/warp.log";
Restart = "always";
RestartSec = "5s";
# Use systemd's built-in user
User = "cloudflared";
Group = "cloudflared";
# Standard outputs
StandardOutput = "journal";
StandardError = "journal";
};
# Ensure the user exists
users.users.cloudflared = {
isSystemUser = true;
group = "cloudflared";
description = "Cloudflared service user";
};
users.groups.cloudflared = {};
}) tunnels;
# Activation step to ensure log directory exists
system.activationScripts.cloudflaredLogs = lib.stringAfter [ "users" ] ''
mkdir -p /var/log/cloudflared
chmod 755 /var/log/cloudflared
'';
# Optional documentation metadata
meta.doc = ''
This module defines persistent cloudflared TCP tunnels using access tcp.
Add tunnels by appending to the `tunnels` attribute set.
Required keys:
- remoteHost: The public hostname exposed via Cloudflare Tunnel.
- remoteTarget: The internal service to forward traffic to (e.g. localhost:22).
- localBindPort: The port to expose locally (e.g. 4401).
- logPath: File path to capture logs.
'';
} }