From 739d2ec436d6fac3cf753cc53ed04ffe0e7cb3d3 Mon Sep 17 00:00:00 2001 From: lunarthegrey Date: Sun, 14 Dec 2025 22:15:07 -0600 Subject: [PATCH] Refactor `outline-caddy` build to use `go tool xcaddy` and rename `CaddyWebServerConfig` to `WebServerConfig` --- go.mod | 4 ++ src/shadowbox/Taskfile.yml | 41 ++++++-------------- src/shadowbox/server/api.yml | 4 +- src/shadowbox/server/manager_service.ts | 6 +-- src/shadowbox/server/outline_caddy_server.ts | 4 +- src/shadowbox/server/server_config.ts | 4 +- 6 files changed, 24 insertions(+), 39 deletions(-) diff --git a/go.mod b/go.mod index 3f337575..ae105c59 100644 --- a/go.mod +++ b/go.mod @@ -10,6 +10,10 @@ require ( github.com/google/addlicense v1.1.1 ) +tool ( + github.com/caddyserver/xcaddy/cmd/xcaddy +) + require ( github.com/Jigsaw-Code/outline-sdk v0.0.18-0.20241106233708-faffebb12629 // indirect github.com/Jigsaw-Code/outline-sdk/x v0.0.2-0.20250304133713-52f1a365e5ed // indirect diff --git a/src/shadowbox/Taskfile.yml b/src/shadowbox/Taskfile.yml index 52719f43..52e2b2d2 100644 --- a/src/shadowbox/Taskfile.yml +++ b/src/shadowbox/Taskfile.yml @@ -18,31 +18,17 @@ requires: vars: [OUTPUT_BASE] tasks: - download_xcaddy: - desc: Download xcaddy - requires: {vars: [TARGET_DIR, XCADDY_OS, XCADDY_ARCH]} - vars: - XCADDY_VERSION: v0.4.5 - XCADDY_VERSION_NUMBER: '{{trimPrefix "v" .XCADDY_VERSION}}' - XCADDY_ARCH_LABEL: '{{if eq .XCADDY_ARCH "x86_64"}}amd64{{else if eq .XCADDY_ARCH "arm64"}}arm64{{else if eq .XCADDY_ARCH "armv6"}}armv6{{else if eq .XCADDY_ARCH "armv7"}}armv7{{else}}{{.XCADDY_ARCH}}{{end}}' - XCADDY_OS_LABEL: '{{if eq .XCADDY_OS "darwin"}}mac{{else}}{{.XCADDY_OS}}{{end}}' - XCADDY_FILE: 'xcaddy_{{.XCADDY_VERSION_NUMBER}}_{{.XCADDY_OS_LABEL}}_{{.XCADDY_ARCH_LABEL}}{{if eq .XCADDY_OS_LABEL "windows"}}.zip{{else}}.tar.gz{{end}}' - XCADDY_URL: 'https://github.com/caddyserver/xcaddy/releases/download/{{.XCADDY_VERSION}}/{{.XCADDY_FILE}}' + build_outline_caddy: + desc: Build the OutlineCaddy binary using xcaddy + requires: {vars: [TARGET_DIR, TARGET_OS, GOARCH]} cmds: - mkdir -p '{{.TARGET_DIR}}' - | - tmpdir=$(mktemp -d) - curl -fsSL '{{.XCADDY_URL}}' -o "$tmpdir/xcaddy.pkg" - {{- if eq .XCADDY_OS "windows" }} - unzip -oq "$tmpdir/xcaddy.pkg" -d '{{.TARGET_DIR}}' - {{- else }} - tar -xzf "$tmpdir/xcaddy.pkg" -C '{{.TARGET_DIR}}' xcaddy - {{- end }} - rm -rf "$tmpdir" - - | - {{- if ne .XCADDY_OS_LABEL "windows" -}} - chmod +x '{{joinPath .TARGET_DIR "xcaddy"}}' - {{- end -}} + XCADDY_GOOS={{.TARGET_OS}} XCADDY_GOARCH={{.GOARCH}} go tool xcaddy build \ + --output '{{joinPath .TARGET_DIR "outline-caddy"}}' \ + --with github.com/Jigsaw-Code/outline-ss-server/outlinecaddy@v0.0.1 \ + --with github.com/iamd3vil/caddy_yaml_adapter \ + --with github.com/mholt/caddy-l4 build: desc: Build the Outline Server Node.js app @@ -66,16 +52,11 @@ tasks: vars: {TARGET_DIR: '{{.BIN_DIR}}'} # Set CGO_ENABLED=0 to force static linkage. See https://mt165.co.uk/blog/static-link-go/. - GOOS={{.TARGET_OS}} GOARCH={{.GOARCH}} CGO_ENABLED=0 go build -ldflags='-s -w -X main.version=embedded' -o '{{.BIN_DIR}}/' github.com/Jigsaw-Code/outline-ss-server/cmd/outline-ss-server - - task: download_xcaddy + - task: build_outline_caddy vars: TARGET_DIR: '{{.BIN_DIR}}' - XCADDY_OS: '{{.TARGET_OS}}' - XCADDY_ARCH: '{{.GOARCH}}' - - | - '{{joinPath .BIN_DIR "xcaddy"}}' build --output '{{joinPath .BIN_DIR "outline-caddy"}}' \ - --with github.com/Jigsaw-Code/outline-ss-server/outlinecaddy@v0.0.1 \ - --with github.com/iamd3vil/caddy_yaml_adapter@v0.0.0-20200503183711-d479c29b475a \ - --with github.com/mholt/caddy-l4@v0.0.0-20251201210923-0c96591f5650 + TARGET_OS: '{{.TARGET_OS}}' + GOARCH: '{{.GOARCH}}' start: desc: Run the Outline server locally diff --git a/src/shadowbox/server/api.yml b/src/shadowbox/server/api.yml index 17b88ed9..e20875af 100644 --- a/src/shadowbox/server/api.yml +++ b/src/shadowbox/server/api.yml @@ -135,7 +135,7 @@ paths: content: application/json: schema: - $ref: "#/components/schemas/CaddyWebServerConfig" + $ref: "#/components/schemas/WebServerConfig" examples: 'Enable with auto HTTPS': value: '{"enabled": true, "autoHttps": true, "email": "admin@example.com", "domain": "example.com"}' @@ -730,7 +730,7 @@ components: $ref: "#/components/schemas/ListenerConfig" description: WebSocket packet (UDP) listener configuration - CaddyWebServerConfig: + WebServerConfig: properties: enabled: type: boolean diff --git a/src/shadowbox/server/manager_service.ts b/src/shadowbox/server/manager_service.ts index e356fd3a..28f032f1 100644 --- a/src/shadowbox/server/manager_service.ts +++ b/src/shadowbox/server/manager_service.ts @@ -25,7 +25,7 @@ import * as errors from '../model/errors'; import * as version from './version'; import {ManagerMetrics} from './manager_metrics'; -import {ServerConfigJson, ListenersForNewAccessKeys, CaddyWebServerConfig} from './server_config'; +import {ServerConfigJson, ListenersForNewAccessKeys, WebServerConfig} from './server_config'; import {SharedMetricsPublisher} from './shared_metrics'; import {ShadowsocksServer} from '../model/shadowsocks_server'; import type {OutlineCaddyController} from './outline_caddy_server'; @@ -851,7 +851,7 @@ export class ShadowsocksManagerService { try { logging.debug(`configureCaddyWebServer request ${JSON.stringify(req.params)}`); - const config = req.params as unknown as CaddyWebServerConfig; + const config = req.params as unknown as WebServerConfig; if (!config || typeof config !== 'object') { return next( new restifyErrors.InvalidArgumentError({statusCode: 400}, 'Invalid Caddy configuration') @@ -892,7 +892,7 @@ export class ShadowsocksManagerService { // Store Caddy configuration const configData = this.serverConfig.data(); if (configData) { - const caddyConfig: CaddyWebServerConfig = { + const caddyConfig: WebServerConfig = { enabled: config.enabled ?? false, autoHttps: config.autoHttps ?? false, email: config.email, diff --git a/src/shadowbox/server/outline_caddy_server.ts b/src/shadowbox/server/outline_caddy_server.ts index f07f6ab1..e6635f65 100644 --- a/src/shadowbox/server/outline_caddy_server.ts +++ b/src/shadowbox/server/outline_caddy_server.ts @@ -21,12 +21,12 @@ import * as yaml from 'js-yaml'; import * as file from '../infrastructure/file'; import * as logging from '../infrastructure/logging'; import {AccessKey, ListenerType} from '../model/access_key'; -import {CaddyWebServerConfig, ListenerConfig, ListenersForNewAccessKeys} from './server_config'; +import {WebServerConfig, ListenerConfig, ListenersForNewAccessKeys} from './server_config'; export interface OutlineCaddyConfigPayload { accessKeys: AccessKey[]; listeners?: ListenersForNewAccessKeys; - caddyConfig?: CaddyWebServerConfig; + caddyConfig?: WebServerConfig; hostname?: string; apiPort?: number; // Internal API port for reverse proxy } diff --git a/src/shadowbox/server/server_config.ts b/src/shadowbox/server/server_config.ts index 5fe7c9f6..4763fbd6 100644 --- a/src/shadowbox/server/server_config.ts +++ b/src/shadowbox/server/server_config.ts @@ -32,7 +32,7 @@ export interface ListenersForNewAccessKeys { } // Caddy web server configuration -export interface CaddyWebServerConfig { +export interface WebServerConfig { enabled?: boolean; autoHttps?: boolean; email?: string; // For ACME @@ -56,7 +56,7 @@ export interface ServerConfigJson { // Listeners configuration for new access keys (supersedes portForNewAccessKeys) listenersForNewAccessKeys?: ListenersForNewAccessKeys; // Caddy web server configuration for automatic HTTPS - caddyWebServer?: CaddyWebServerConfig; + caddyWebServer?: WebServerConfig; // Which staged rollouts we should force enabled or disabled. rollouts?: RolloutConfigJson[]; // We don't serialize the shadowbox version, this is obtained dynamically from node.