Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
40 changes: 20 additions & 20 deletions .github/workflows/backend.yml
Original file line number Diff line number Diff line change
Expand Up @@ -41,8 +41,8 @@ jobs:
# full pipeline. On PRs, run only when backend-relevant paths changed.
backend: ${{ github.event_name != 'pull_request' || steps.filter.outputs.backend == 'true' }}
steps:
- uses: actions/checkout@v6
- uses: dorny/paths-filter@v3
- uses: actions/checkout@v7
- uses: dorny/paths-filter@v4
id: filter
with:
filters: |
Expand All @@ -59,15 +59,15 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v6
uses: actions/checkout@v7

- name: Setup .NET SDK
uses: actions/setup-dotnet@v5
uses: actions/setup-dotnet@v6
with:
global-json-file: global.json

- name: Cache NuGet packages
uses: actions/cache@v5
uses: actions/cache@v6
with:
path: ~/.nuget/packages
key: ${{ runner.os }}-nuget-${{ hashFiles('**/Directory.Packages.props') }}
Expand Down Expand Up @@ -128,15 +128,15 @@ jobs:
# Testcontainers requires Docker — ubuntu-latest has it pre-installed.
steps:
- name: Checkout
uses: actions/checkout@v6
uses: actions/checkout@v7

- name: Setup .NET SDK
uses: actions/setup-dotnet@v5
uses: actions/setup-dotnet@v6
with:
global-json-file: global.json

- name: Cache NuGet packages
uses: actions/cache@v5
uses: actions/cache@v6
with:
path: ~/.nuget/packages
key: ${{ runner.os }}-nuget-${{ hashFiles('**/Directory.Packages.props') }}
Expand Down Expand Up @@ -182,7 +182,7 @@ jobs:
# against an ephemeral Postgres, asserts exit 0.
services:
postgres:
image: postgres:17-alpine
image: postgres:18-alpine
env:
POSTGRES_PASSWORD: migrator_smoke_pwd
POSTGRES_DB: fsh_migrator_smoke
Expand All @@ -196,15 +196,15 @@ jobs:

steps:
- name: Checkout
uses: actions/checkout@v6
uses: actions/checkout@v7

- name: Setup .NET SDK
uses: actions/setup-dotnet@v5
uses: actions/setup-dotnet@v6
with:
global-json-file: global.json

- name: Cache NuGet packages
uses: actions/cache@v5
uses: actions/cache@v6
with:
path: ~/.nuget/packages
key: ${{ runner.os }}-nuget-${{ hashFiles('**/Directory.Packages.props') }}
Expand Down Expand Up @@ -240,10 +240,10 @@ jobs:
MIN_LINE: '80'
steps:
- name: Checkout
uses: actions/checkout@v6
uses: actions/checkout@v7

- name: Setup .NET SDK
uses: actions/setup-dotnet@v5
uses: actions/setup-dotnet@v6
with:
global-json-file: global.json

Expand Down Expand Up @@ -288,15 +288,15 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v6
uses: actions/checkout@v7

- name: Setup .NET SDK
uses: actions/setup-dotnet@v5
uses: actions/setup-dotnet@v6
with:
global-json-file: global.json

- name: Cache NuGet packages
uses: actions/cache@v5
uses: actions/cache@v6
with:
path: ~/.nuget/packages
key: ${{ runner.os }}-nuget-${{ hashFiles('**/Directory.Packages.props') }}
Expand Down Expand Up @@ -336,15 +336,15 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v6
uses: actions/checkout@v7

- name: Setup .NET SDK
uses: actions/setup-dotnet@v5
uses: actions/setup-dotnet@v6
with:
global-json-file: global.json

- name: Cache NuGet packages
uses: actions/cache@v5
uses: actions/cache@v6
with:
path: ~/.nuget/packages
key: ${{ runner.os }}-nuget-${{ hashFiles('**/Directory.Packages.props') }}
Expand Down
18 changes: 13 additions & 5 deletions .github/workflows/codeql.yml
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
name: CodeQL Analysis
on:
push:
branches: [main]
paths:
- 'src/**'
pull_request:
branches: [main]
paths:
Expand All @@ -15,12 +19,16 @@ jobs:
analyze:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- uses: github/codeql-action/init@v3
- uses: actions/checkout@v7
- uses: github/codeql-action/init@v4
with:
languages: csharp
- uses: actions/setup-dotnet@v5
build-mode: manual
- uses: actions/setup-dotnet@v6
with:
global-json-file: global.json
- run: dotnet build src/FSH.Starter.slnx -c Release
- uses: github/codeql-action/analyze@v3
# NuGet audit is off for this build only. The weekly scan runs against an unchanged main, so a
# newly published advisory fails restore under TreatWarningsAsErrors and the code scan never runs
# (that is what broke it every week from 2026-10-19). Backend CI still gates advisories on every PR.
- run: dotnet build src/FSH.Starter.slnx -c Release -p:NuGetAudit=false
- uses: github/codeql-action/analyze@v4
14 changes: 7 additions & 7 deletions .github/workflows/frontend.yml
Original file line number Diff line number Diff line change
Expand Up @@ -27,8 +27,8 @@ jobs:
outputs:
frontend: ${{ github.event_name != 'pull_request' || steps.filter.outputs.frontend == 'true' }}
steps:
- uses: actions/checkout@v6
- uses: dorny/paths-filter@v3
- uses: actions/checkout@v7
- uses: dorny/paths-filter@v4
id: filter
with:
filters: |
Expand All @@ -50,10 +50,10 @@ jobs:
working-directory: clients/${{ matrix.app }}
steps:
- name: Checkout
uses: actions/checkout@v6
uses: actions/checkout@v7

- name: Setup Node.js
uses: actions/setup-node@v4
uses: actions/setup-node@v7
with:
node-version: 22
cache: npm
Expand Down Expand Up @@ -83,10 +83,10 @@ jobs:
working-directory: clients/${{ matrix.app }}
steps:
- name: Checkout
uses: actions/checkout@v6
uses: actions/checkout@v7

- name: Setup Node.js
uses: actions/setup-node@v4
uses: actions/setup-node@v7
with:
node-version: 22
cache: npm
Expand Down Expand Up @@ -125,7 +125,7 @@ jobs:
app: [admin, dashboard]
steps:
- name: Checkout
uses: actions/checkout@v6
uses: actions/checkout@v7

- name: Build image
run: docker build -t fsh-${{ matrix.app }}:ci clients/${{ matrix.app }}
Expand Down
14 changes: 7 additions & 7 deletions .github/workflows/template-smoke.yml
Original file line number Diff line number Diff line change
Expand Up @@ -41,20 +41,20 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v6
uses: actions/checkout@v7

- name: Setup .NET SDK
uses: actions/setup-dotnet@v5
uses: actions/setup-dotnet@v6
with:
global-json-file: global.json

- name: Setup Node.js
uses: actions/setup-node@v4
uses: actions/setup-node@v7
with:
node-version: '22'

- name: Cache NuGet packages
uses: actions/cache@v5
uses: actions/cache@v6
with:
path: ~/.nuget/packages
key: ${{ runner.os }}-nuget-${{ hashFiles('**/Directory.Packages.props') }}
Expand Down Expand Up @@ -90,15 +90,15 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v6
uses: actions/checkout@v7

- name: Setup .NET SDK
uses: actions/setup-dotnet@v5
uses: actions/setup-dotnet@v6
with:
global-json-file: global.json

- name: Cache NuGet packages
uses: actions/cache@v5
uses: actions/cache@v6
with:
path: ~/.nuget/packages
key: ${{ runner.os }}-nuget-${{ hashFiles('**/Directory.Packages.props') }}
Expand Down
6 changes: 3 additions & 3 deletions deploy/docker/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,9 @@ This brings up the full stack on a single host:
| `dashboard` | `fsh/dashboard:local` | `FSH_DASHBOARD_PORT` (default 8082) | Tenant dashboard (nginx + React) |
| `migrator` | `fsh/dbmigrator:local` | — | One-shot: applies EF migrations + seeds the root tenant + creates the default admin user |
| `postgres` | `postgres:18-alpine` | (internal) | Identity, tenant catalog, module schemas |
| `redis` | `valkey/valkey:9.1.0-alpine` | (internal) | HybridCache L2, Data Protection keys, idempotency store |
| `rustfs` | `rustfs/rustfs:1.0.0` | `FSH_S3_PORT` (default 9000), S3 API only | S3-compatible blob store for the Files module ([RustFS](https://rustfs.com)); published because browsers upload to it through presigned URLs |
| `mailpit` | `axllent/mailpit:v1.31.3` | `127.0.0.1:FSH_MAILPIT_PORT` (default 8025), SMTP 1025 internal | Local mail catcher ([Mailpit](https://mailpit.axllent.org)), only with the `mail-catcher` profile, which `.env.example` enables |
| `redis` | `valkey/valkey:9.1.3-alpine` | (internal) | HybridCache L2, Data Protection keys, idempotency store |
| `rustfs` | `rustfs/rustfs:1.0.4` | `FSH_S3_PORT` (default 9000), S3 API only | S3-compatible blob store for the Files module ([RustFS](https://rustfs.com)); published because browsers upload to it through presigned URLs |
| `mailpit` | `axllent/mailpit:v1.33.0` | `127.0.0.1:FSH_MAILPIT_PORT` (default 8025), SMTP 1025 internal | Local mail catcher ([Mailpit](https://mailpit.axllent.org)), only with the `mail-catcher` profile, which `.env.example` enables |

The compose file does **not** include a reverse proxy or TLS terminator. You bring your own edge — Cloudflare Tunnel, AWS ALB, Tailscale Funnel, your existing nginx, anything that can route a TLS subdomain to a host:port on this machine.

Expand Down
8 changes: 4 additions & 4 deletions deploy/docker/docker-compose.yml
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ services:
# - "5432:5432"

redis:
image: valkey/valkey:9.1.0-alpine
image: valkey/valkey:9.1.3-alpine
container_name: fsh-redis
restart: unless-stopped
command:
Expand All @@ -58,7 +58,7 @@ services:
# - "6379:6379"

rustfs:
image: rustfs/rustfs:1.0.0
image: rustfs/rustfs:1.0.4
container_name: fsh-rustfs
restart: unless-stopped
environment:
Expand Down Expand Up @@ -91,7 +91,7 @@ services:
# everything else (private/, and keys from before public/ existed) needs a
# presigned URL. Re-applied on every `up`, so it also narrows older policies.
rustfs-init:
image: amazon/aws-cli:2.37.3
image: amazon/aws-cli:2.39.3
container_name: fsh-rustfs-init
restart: "no"
depends_on:
Expand All @@ -112,7 +112,7 @@ services:
# Local mail catcher, started only with the mail-catcher profile
# (COMPOSE_PROFILES in .env). SMTP (1025) stays on the compose network.
mailpit:
image: axllent/mailpit:v1.31.3
image: axllent/mailpit:v1.33.0
container_name: fsh-mailpit
restart: unless-stopped
profiles: [mail-catcher]
Expand Down
2 changes: 1 addition & 1 deletion deploy/terraform/.terraform-version
Original file line number Diff line number Diff line change
@@ -1 +1 @@
1.14.0
1.15.4
75 changes: 39 additions & 36 deletions deploy/terraform/apps/starter/app_stack/.terraform.lock.hcl

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading
Loading