Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
51 commits
Select commit Hold shift + click to select a range
25678f7
Add support for SS over WSS into shadowbox
lunarthegrey Jul 27, 2025
56439e4
Attempt to fix shadowbox builds
lunarthegrey Jul 27, 2025
8d5159a
Attempt to fix shadowbox builds
lunarthegrey Jul 27, 2025
daa17fc
Attempt to fix shadowbox builds
lunarthegrey Jul 27, 2025
42471bb
Attempt to fix shadowbox linting errors
lunarthegrey Jul 27, 2025
33c398a
Attempt to fix license-check
lunarthegrey Jul 27, 2025
8a1c714
Attempt to fix dynamic configs
lunarthegrey Jul 27, 2025
00de304
Bump outline-ss-server to v1.9.2
lunarthegrey Jul 27, 2025
54eefed
Attempt to fix shadowbox builds
lunarthegrey Jul 27, 2025
e82a101
Attempt to fix shadowbox builds
lunarthegrey Jul 27, 2025
b673773
Attempt to fix dynamic access key display issues
lunarthegrey Jul 27, 2025
f0e75c8
Attempt to fix dynamic access key display issues
lunarthegrey Jul 27, 2025
465a8cd
Rethink how dynamic access keys are displayed
lunarthegrey Jul 27, 2025
e6eb42f
Update .gitignore
lunarthegrey Jul 28, 2025
fe12228
Remove dynamicAccessKeyUrl as it's not necessary
lunarthegrey Jul 29, 2025
f64efdc
Improve error handling for WebSocket keys
lunarthegrey Aug 5, 2025
2b84622
Migrate WebSocket support to listener-based API model
lunarthegrey Aug 29, 2025
f423735
Satisfy linting
lunarthegrey Aug 29, 2025
b9dbf82
Attempt to fix tests
lunarthegrey Aug 29, 2025
05fb79c
Fix yaml for dynamic keys
lunarthegrey Aug 29, 2025
8575e20
Attempt to fix builds
lunarthegrey Aug 29, 2025
42a9671
Enable WebSocket server when a WebSocket key is created
lunarthegrey Aug 29, 2025
f5989c1
Improve WS server config insertion when new WS keys are added
lunarthegrey Aug 29, 2025
7f02575
Add embedded OutlineCaddy integration and listener-aware WebSocket su…
lunarthegrey Oct 9, 2025
b964685
Fix builds
lunarthegrey Oct 9, 2025
799c34a
Update releases
lunarthegrey Oct 9, 2025
72bb7c7
Update go.sum
lunarthegrey Oct 9, 2025
e394dca
Attempt different method for outlinecaddy build
lunarthegrey Oct 9, 2025
73cd6a9
Fix builds
lunarthegrey Oct 9, 2025
55f04b4
Fix builds
lunarthegrey Oct 9, 2025
cdd1070
Update Taskfile to use `trimPrefix` instead of `replace` for XCADDY v…
lunarthegrey Dec 3, 2025
573e674
Update caddy-l4 plugin version in Taskfile.yml
lunarthegrey Dec 3, 2025
859b152
Add whitespace for consistency in manager_service.spec.ts.
lunarthegrey Dec 4, 2025
c962ddf
Include listeners in manager service server info property checks and …
lunarthegrey Dec 4, 2025
faf0fef
Correctly assert access key properties when created without listeners
lunarthegrey Dec 4, 2025
54bc6b3
Add WebSocket support (SS over WSS) documentation and refactor manage…
lunarthegrey Dec 4, 2025
7cbfa67
Add workflow-specific prefixes to GitHub Actions concurrency groups.
lunarthegrey Dec 4, 2025
4db6d7c
Add spaces around curly braces in imports and object literals
lunarthegrey Dec 4, 2025
280ffb3
Update manager service tests to correctly await asynchronous calls an…
lunarthegrey Dec 4, 2025
9ca4a55
Switch Caddy configuration from JSON to YAML
lunarthegrey Dec 8, 2025
fe609c7
Add Caddy API proxy support with a new configuration option and Caddy…
lunarthegrey Dec 9, 2025
bd83c54
Add spaces around curly braces in import statements and object literals.
lunarthegrey Dec 9, 2025
ed9c121
Add dynamic configuration to WebSocket-enabled access keys in the API…
lunarthegrey Dec 10, 2025
a41c796
Make Shadowsocks-specific access key fields optional and conditionall…
lunarthegrey Dec 11, 2025
6776978
Adjust dataLimit field inclusion in access key API responses for all …
lunarthegrey Dec 11, 2025
efc0886
Consolidate dynamic access key config into `/access-keys/{id}` endpoi…
lunarthegrey Dec 14, 2025
739d2ec
Refactor `outline-caddy` build to use `go tool xcaddy` and rename `Ca…
lunarthegrey Dec 15, 2025
bec26bd
Update Go module dependencies
lunarthegrey Dec 15, 2025
be31e61
refactor(api): make listeners mutable and add dedicated dynamic confi…
lunarthegrey Jan 17, 2026
44aa0c8
Merge branch 'OutlineFoundation:master' into master
lunarthegrey Jan 17, 2026
724ae44
Update Caddy server's reverse proxy transport protocol to HTTP for lo…
lunarthegrey Jan 17, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
141 changes: 141 additions & 0 deletions .github/workflows/build-shadowbox.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,141 @@
# Copyright 2024 The Outline Authors
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

name: Build and Push Shadowbox Docker Image

on:
push:
branches:
- '**' # Build on push to any branch
paths:
- 'src/shadowbox/**'
- '.github/workflows/build-shadowbox.yml'
pull_request:
paths:
- 'src/shadowbox/**'
workflow_dispatch:
inputs:
tag_suffix:
description: 'Tag suffix for the Docker image (e.g., "wss-test")'
required: false
default: ''

env:
REGISTRY: ghcr.io
IMAGE_NAME: outline/shadowbox

jobs:
build:
runs-on: ubuntu-latest
permissions:
contents: read
packages: write

steps:
- name: Checkout repository
uses: actions/checkout@v4

- name: Set up QEMU
uses: docker/setup-qemu-action@v3

- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3

- name: Log in to GitHub Container Registry
if: github.event_name != 'pull_request'
uses: docker/login-action@v3
with:
registry: ${{ env.REGISTRY }}
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}

- name: Extract metadata
id: meta
uses: docker/metadata-action@v5
with:
images: ${{ env.REGISTRY }}/${{ github.repository_owner }}/${{ env.IMAGE_NAME }}
tags: |
# Branch name
type=ref,event=branch
# Tag name
type=ref,event=tag
# PR number
type=ref,event=pr
# Latest tag for main/master branch
type=raw,value=latest,enable={{is_default_branch}}
# SHA short
type=sha,prefix={{branch}}-
# Custom suffix if provided
type=raw,value={{branch}}-${{ github.event.inputs.tag_suffix }},enable=${{ github.event.inputs.tag_suffix != '' }}
# WSS-specific tags
type=raw,value=wss-latest,enable=${{ startsWith(github.ref, 'refs/heads/wss-') }}
type=raw,value=wss-{{branch}},enable=${{ startsWith(github.ref, 'refs/heads/wss-') }}

- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '18'
cache: 'npm'

- name: Setup Go
uses: actions/setup-go@v4
with:
go-version: '1.21'

- name: Install dependencies
run: npm ci

- name: Update Go dependencies
run: |
go mod download
go mod tidy

- name: Install Task
run: sh -c "$(curl --location https://taskfile.dev/install.sh)" -- -d -b /usr/local/bin

- name: Build Shadowbox for amd64
env:
OUTPUT_BASE: ${{ github.workspace }}/build
DOCKER_CONTENT_TRUST: "0" # Disable content trust for CI builds
run: |
# Build from root directory to have access to all taskfiles
task shadowbox:docker:build TARGET_ARCH=x86_64 IMAGE_NAME=${{ env.REGISTRY }}/${{ github.repository_owner }}/${{ env.IMAGE_NAME }}:amd64-${{ github.sha }} IMAGE_VERSION=${{ github.sha }}

- name: Build Shadowbox for arm64
env:
OUTPUT_BASE: ${{ github.workspace }}/build
DOCKER_CONTENT_TRUST: "0" # Disable content trust for CI builds
run: |
# Build from root directory to have access to all taskfiles
task shadowbox:docker:build TARGET_ARCH=arm64 IMAGE_NAME=${{ env.REGISTRY }}/${{ github.repository_owner }}/${{ env.IMAGE_NAME }}:arm64-${{ github.sha }} IMAGE_VERSION=${{ github.sha }}

- name: Push images
if: github.event_name != 'pull_request'
run: |
docker push ${{ env.REGISTRY }}/${{ github.repository_owner }}/${{ env.IMAGE_NAME }}:amd64-${{ github.sha }}
docker push ${{ env.REGISTRY }}/${{ github.repository_owner }}/${{ env.IMAGE_NAME }}:arm64-${{ github.sha }}

- name: Create and push manifest
if: github.event_name != 'pull_request'
env:
DOCKER_CLI_EXPERIMENTAL: enabled
run: |
# Parse tags and create/push manifest for each
echo "${{ steps.meta.outputs.tags }}" | while read -r tag; do
echo "Creating manifest for ${tag}"
docker manifest create ${tag} \
--amend ${{ env.REGISTRY }}/${{ github.repository_owner }}/${{ env.IMAGE_NAME }}:amd64-${{ github.sha }} \
--amend ${{ env.REGISTRY }}/${{ github.repository_owner }}/${{ env.IMAGE_NAME }}:arm64-${{ github.sha }}
docker manifest push ${tag}
done
2 changes: 1 addition & 1 deletion .github/workflows/build_and_test_debug.yml
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
name: Build and Test

concurrency:
group: ${{ github.head_ref || github.ref }}
group: build-and-test-${{ github.head_ref || github.ref }}
cancel-in-progress: true

on:
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/license.yml
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
name: License checks

concurrency:
group: ${{ github.head_ref || github.ref }}
group: license-${{ github.head_ref || github.ref }}
cancel-in-progress: true

on:
Expand Down
3 changes: 2 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -8,4 +8,5 @@
/task
macos-signing-certificate.p12
node_modules/
third_party/shellcheck/download/
third_party/shellcheck/download/
CLAUDE.md
56 changes: 36 additions & 20 deletions go.mod
Original file line number Diff line number Diff line change
@@ -1,47 +1,63 @@
module localhost

go 1.21
go 1.23

toolchain go1.24.5

require (
github.com/Jigsaw-Code/outline-ss-server v1.7.3
github.com/Jigsaw-Code/outline-ss-server v1.9.2
github.com/go-task/task/v3 v3.36.0
github.com/google/addlicense v1.1.1
)

tool (
github.com/caddyserver/xcaddy/cmd/xcaddy
)

require (
github.com/Jigsaw-Code/outline-sdk v0.0.14 // indirect
github.com/Masterminds/semver/v3 v3.2.1 // indirect
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
github.com/Masterminds/semver/v3 v3.4.0 // indirect
github.com/akavel/rsrc v0.10.2 // indirect
github.com/beorn7/perks v1.0.1 // indirect
github.com/bmatcuk/doublestar/v4 v4.0.2 // indirect
github.com/cespare/xxhash/v2 v2.2.0 // indirect
github.com/caddyserver/xcaddy v0.4.5 // indirect
github.com/cespare/xxhash/v2 v2.3.0 // indirect
github.com/davecgh/go-spew v1.1.1 // indirect
github.com/fatih/color v1.16.0 // indirect
github.com/go-task/slim-sprig/v3 v3.0.0 // indirect
github.com/golang/protobuf v1.5.3 // indirect
github.com/go-viper/mapstructure/v2 v2.2.1 // indirect
github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 // indirect
github.com/gorilla/handlers v1.4.1 // indirect
github.com/gorilla/websocket v1.5.3 // indirect
github.com/inconshreveable/mousetrap v1.1.0 // indirect
github.com/joho/godotenv v1.5.1 // indirect
github.com/klauspost/cpuid/v2 v2.0.9 // indirect
github.com/josephspurrier/goversioninfo v1.5.0 // indirect
github.com/klauspost/compress v1.17.11 // indirect
github.com/klauspost/cpuid/v2 v2.2.9 // indirect
github.com/lmittmann/tint v1.0.5 // indirect
github.com/mattn/go-colorable v0.1.13 // indirect
github.com/mattn/go-isatty v0.0.20 // indirect
github.com/mattn/go-zglob v0.0.4 // indirect
github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect
github.com/mitchellh/hashstructure/v2 v2.0.2 // indirect
github.com/oschwald/geoip2-golang v1.8.0 // indirect
github.com/oschwald/maxminddb-golang v1.10.0 // indirect
github.com/prometheus/client_golang v1.15.0 // indirect
github.com/prometheus/client_model v0.3.0 // indirect
github.com/prometheus/common v0.42.0 // indirect
github.com/prometheus/procfs v0.9.0 // indirect
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
github.com/oschwald/geoip2-golang v1.11.0 // indirect
github.com/oschwald/maxminddb-golang v1.13.1 // indirect
github.com/prometheus/client_golang v1.20.5 // indirect
github.com/prometheus/client_model v0.6.1 // indirect
github.com/prometheus/common v0.62.0 // indirect
github.com/prometheus/procfs v0.15.1 // indirect
github.com/radovskyb/watcher v1.0.7 // indirect
github.com/sajari/fuzzy v1.0.0 // indirect
github.com/shadowsocks/go-shadowsocks2 v0.1.5 // indirect
github.com/spf13/pflag v1.0.5 // indirect
github.com/spf13/cobra v1.9.1 // indirect
github.com/spf13/pflag v1.0.6 // indirect
github.com/zeebo/xxh3 v1.0.2 // indirect
golang.org/x/crypto v0.31.0 // indirect
golang.org/x/sync v0.7.0 // indirect
golang.org/x/sys v0.28.0 // indirect
golang.org/x/term v0.27.0 // indirect
google.golang.org/protobuf v1.30.0 // indirect
golang.org/x/crypto v0.32.0 // indirect
golang.org/x/sync v0.11.0 // indirect
golang.org/x/sys v0.29.0 // indirect
golang.org/x/term v0.28.0 // indirect
google.golang.org/protobuf v1.36.4 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
mvdan.cc/sh/v3 v3.8.0 // indirect
)
Loading