Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
100 commits
Select commit Hold shift + click to select a range
4d01ecd
chore: ignore local workspace files
nothingnesses May 26, 2026
454fbcc
chore: remove test output caching
nothingnesses May 26, 2026
8c7d965
Add RustFS package to devenv
nothingnesses May 26, 2026
d57b8d1
Ignore Nix build result symlinks
nothingnesses May 26, 2026
c44c465
Replace services-flake services with RustFS
nothingnesses May 26, 2026
ed6a872
Verify RustFS identity during bootstrap
nothingnesses May 26, 2026
b9028ba
Rename storage configuration to S3
nothingnesses May 26, 2026
513432f
Migrate backend storage to AWS SDK
nothingnesses May 26, 2026
08f5c3f
Add storage bootstrap helper and tests
nothingnesses May 26, 2026
6e5359b
Add storage integration CI
nothingnesses May 26, 2026
4569ce5
Remove obsolete MinIO advisory ignore
nothingnesses May 26, 2026
8ffc653
Generalize Nix flake update workflow
nothingnesses May 26, 2026
050a97b
Update Nix flake inputs
nothingnesses May 27, 2026
bd3b24d
Update frontend dependencies
nothingnesses May 27, 2026
4e064cb
Update Rust dependencies
nothingnesses May 27, 2026
908c9f1
Document production deployment
nothingnesses May 27, 2026
566a223
Stop tracking frontend runtime config
nothingnesses May 27, 2026
e702ec7
Centralize local service defaults
nothingnesses May 27, 2026
a94031f
Regenerate frontend UnoCSS output
nothingnesses May 27, 2026
55e3035
Fix local app startup and upload flow
nothingnesses May 27, 2026
19a515d
Add Playwright test infrastructure
nothingnesses May 29, 2026
17497c9
Stub map tiles in Playwright tests
nothingnesses May 29, 2026
abc29c1
Add headless E2E runner
nothingnesses May 29, 2026
406aa64
Add authenticated E2E workflow coverage
nothingnesses May 29, 2026
d6c29d4
Add E2E CI job
nothingnesses May 29, 2026
6c1e835
Fix CI OIDC permissions
nothingnesses May 29, 2026
4f1c004
Use GitHub cache for Nix CI
nothingnesses May 29, 2026
8363385
Avoid service wrapper in default dev shell
nothingnesses May 29, 2026
abdbbf1
Use RustFS release binary in CI services
nothingnesses May 31, 2026
791c459
Harden CI E2E and cargo-deny checks
nothingnesses May 31, 2026
90d2577
Use runner temp cargo-deny cache in CI
nothingnesses May 31, 2026
6b1e4b4
Prefetch cargo-deny advisory DB in CI
nothingnesses May 31, 2026
fd786c7
Use Nix git in dev shell
nothingnesses May 31, 2026
203fb0a
Stabilize E2E logout navigation
nothingnesses May 31, 2026
6f0d78f
Extract reusable backend app construction
nothingnesses May 31, 2026
7be00ac
Validate object coordinates before persistence
nothingnesses May 31, 2026
719648e
Add backend API auth integration tests
nothingnesses May 31, 2026
76d7261
Satisfy clippy in backend tests
nothingnesses May 31, 2026
3e7985c
Add storage config unit tests
nothingnesses May 31, 2026
a582c08
Refactor object storage lifecycle
nothingnesses May 31, 2026
443a1f9
Rework object storage lifecycle
nothingnesses May 31, 2026
d83198c
Refactor object storage lifecycle maintenance
nothingnesses May 31, 2026
e1c1d1e
Address object lifecycle review findings
nothingnesses May 31, 2026
33aa7be
fix(backend): security and correctness batch
nothingnesses May 31, 2026
ad0227d
refactor(backend): object lifecycle architecture
nothingnesses May 31, 2026
a9efbe7
refactor(backend): unified Config with MEMORY_MAP__ env prefix
nothingnesses Jun 1, 2026
7fca392
refactor(backend): byte-bounded response cache, drop mutation lowercase
nothingnesses Jun 1, 2026
1266beb
refactor(backend, frontend): structured error codes + thiserror
nothingnesses Jun 1, 2026
e4ea983
refactor(backend): minor cleanups (#15, #17, #23, #24, #26)
nothingnesses Jun 1, 2026
4298ae5
Refine GraphQL caching and E2E orchestration
nothingnesses Jun 1, 2026
8bade68
Convert E2E tests to TypeScript
nothingnesses Jun 1, 2026
6c43aa3
Propagate auth lookup database errors
nothingnesses Jun 1, 2026
3f76f27
Validate auth cookie secret length
nothingnesses Jun 1, 2026
5b5870d
Index object lifecycle claim paths
nothingnesses Jun 1, 2026
6ea3dad
Stabilize storage deletion claim tests
nothingnesses Jun 1, 2026
12ec094
Add upload session backend foundation
nothingnesses Jun 1, 2026
ebd9ea1
Fold pending migration history
nothingnesses Jun 1, 2026
d4cc781
Add upload session policy config
nothingnesses Jun 1, 2026
d8616ad
Add upload session create and presign mutations
nothingnesses Jun 1, 2026
4a814c6
Add upload completion and abort mutations
nothingnesses Jun 1, 2026
7947ce0
Reconcile expired upload sessions
nothingnesses Jun 1, 2026
1565243
Add frontend direct upload flow
nothingnesses Jun 1, 2026
22b1faf
Remove proxied upload endpoint
nothingnesses Jun 1, 2026
3a92fd4
Cover direct upload cleanup edge cases
nothingnesses Jun 1, 2026
3f9469c
Document filtered just workflow
nothingnesses Jun 2, 2026
6a7d52d
Cover direct upload abort flow in e2e
nothingnesses Jun 2, 2026
4b05467
Add available objects view
nothingnesses Jun 2, 2026
ea1e1e1
Add password reset email outbox
nothingnesses Jun 2, 2026
a219bc9
Use single statement for allowed users
nothingnesses Jun 2, 2026
5dc7fe6
Resolve GraphQL caller identity at boundary
nothingnesses Jun 2, 2026
d0877be
Return AppError from row conversions
nothingnesses Jun 2, 2026
856c1b1
Remove obsolete upload error constant
nothingnesses Jun 2, 2026
c391c21
Add explicit auth cookie secure config
nothingnesses Jun 2, 2026
f471fd1
Add generic GraphQL operation runner
nothingnesses Jun 2, 2026
5a38e2f
Share backend integration test helpers
nothingnesses Jun 2, 2026
7bd065a
Use production storage config in tests
nothingnesses Jun 2, 2026
d022a11
Decouple storage bootstrap readiness
nothingnesses Jun 2, 2026
0e41f47
Assert direct upload credential boundary
nothingnesses Jun 2, 2026
801de24
Extract runner disk cleanup action
nothingnesses Jun 2, 2026
4c4ddd4
Share process-compose orchestration helpers
nothingnesses Jun 2, 2026
e3fd8cf
Update generated UnoCSS output
nothingnesses Jun 2, 2026
5d11bc8
Add shell script linting
nothingnesses Jun 2, 2026
e4f4588
Annotate RustFS pre-1.0 pin
nothingnesses Jun 2, 2026
70e24d4
refactor(backend): remove unused SELECT_OBJECT_UPLOAD_SESSION_QUERY
nothingnesses Jun 3, 2026
15a24cb
refactor(backend): drop write-only processing_expires_at column
nothingnesses Jun 3, 2026
4cfd389
refactor: share MAX_PRESIGN_PARTS_PER_REQUEST across the API boundary
nothingnesses Jun 3, 2026
f4f615e
refactor(backend): extract generic interval-worker driver
nothingnesses Jun 3, 2026
6e0262e
refactor(backend): extract OutboxRetryConfig view and rename maintena…
nothingnesses Jun 3, 2026
b907209
feat(backend): add optional layered TOML config loader
nothingnesses Jun 3, 2026
58dc7cc
refactor(backend): unify storage and email outboxes behind drain_outbox
nothingnesses Jun 3, 2026
ef2aec8
refactor(backend): read upload-session cleanup policy via OutboxRetry…
nothingnesses Jun 3, 2026
566fbb9
refactor(backend): single-source the object RETURNING projection
nothingnesses Jun 4, 2026
06acbb4
refactor(backend): build ObjectLifecycleService via a ContextWrapper …
nothingnesses Jun 4, 2026
2502b23
refactor(backend): tidy object-lifecycle internals
nothingnesses Jun 4, 2026
a878349
docs(backend): note upload_object/object_content_type are test-only
nothingnesses Jun 4, 2026
152c8d9
fix(backend): serve script-capable object types as downloads
nothingnesses Jun 4, 2026
03d0d48
refactor(backend): object-lifecycle split and review follow-ups
nothingnesses Jun 4, 2026
10678ba
ci: drop vestigial id-token write permission
nothingnesses Jun 4, 2026
e72be52
build: make just verify the full suite and add verify-fast
nothingnesses Jun 4, 2026
d259bb0
test(backend): guard .env.example against config drift
nothingnesses Jun 4, 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
66 changes: 49 additions & 17 deletions .env.example
Original file line number Diff line number Diff line change
@@ -1,19 +1,51 @@
PG__DBNAME=db
PG__HOST=127.0.0.1
PG__PORT=5432
RUST_LOG="INFO"
BUILD_MODE=debug
ENABLE_REGISTRATION=true
SMTP_HOST=smtp.example.com
SMTP_USER=user
SMTP_PASS=password
SMTP_FROM=noreply@example.com
COOKIE_SECRET=supersecretkeymustbeatleast64byteslongforsecurityreasons1234567890
FRONTEND_URL=http://localhost:3000
MINIO_ACCESS_KEY=minioadmin
MINIO_SECRET_KEY=minioadmin
MINIO_URL=http://localhost:9000/
S3_BUCKET_NAME=memory-map
SERVER_HOST=127.0.0.1
SERVER_PORT=8000
CORS_ALLOWED_ORIGINS=http://127.0.0.1:3000

MEMORY_MAP__PG__DBNAME=db
MEMORY_MAP__PG__HOST=127.0.0.1
MEMORY_MAP__PG__PORT=5432

MEMORY_MAP__SERVER__HOST=127.0.0.1
MEMORY_MAP__SERVER__PORT=8000

MEMORY_MAP__SMTP__HOST=smtp.example.com
MEMORY_MAP__SMTP__USER=user
MEMORY_MAP__SMTP__PASS=password
MEMORY_MAP__SMTP__FROM=noreply@example.com

MEMORY_MAP__AUTH__COOKIE_SECRET=supersecretkeymustbeatleast64byteslongforsecurityreasons1234567890
MEMORY_MAP__AUTH__ENABLE_REGISTRATION=true

MEMORY_MAP__FRONTEND__URL=http://localhost:3000

MEMORY_MAP__CORS__ALLOWED_ORIGINS=http://127.0.0.1:3000

MEMORY_MAP__STORAGE__ENDPOINT_URL=http://127.0.0.1:9000/
MEMORY_MAP__STORAGE__PUBLIC_ENDPOINT_URL=http://127.0.0.1:9000/
MEMORY_MAP__STORAGE__ACCESS_KEY=memorymapdev
MEMORY_MAP__STORAGE__SECRET_KEY=memorymapdevsecret
MEMORY_MAP__STORAGE__BUCKET_NAME=memory-map
MEMORY_MAP__STORAGE__REGION=us-east-1
MEMORY_MAP__STORAGE__FORCE_PATH_STYLE=true
MEMORY_MAP__STORAGE__PRESIGNED_URL_TTL_SECONDS=604800

MEMORY_MAP__OBJECT_LIFECYCLE__PENDING_UPLOAD_TIMEOUT_SECONDS=3600
MEMORY_MAP__OBJECT_LIFECYCLE__UPLOAD_MAX_FILE_SIZE_BYTES=1073741824
MEMORY_MAP__OBJECT_LIFECYCLE__UPLOAD_PART_SIZE_BYTES=8388608
MEMORY_MAP__OBJECT_LIFECYCLE__UPLOAD_MAX_PART_COUNT=10000
MEMORY_MAP__OBJECT_LIFECYCLE__UPLOAD_SESSION_TTL_SECONDS=3600
MEMORY_MAP__OBJECT_LIFECYCLE__UPLOAD_SESSION_CLEANUP_RETRY_SECONDS=60
MEMORY_MAP__OBJECT_LIFECYCLE__UPLOAD_SESSION_CLEANUP_LEASE_SECONDS=300
MEMORY_MAP__OBJECT_LIFECYCLE__UPLOAD_SESSION_CLEANUP_MAX_ATTEMPTS=10
MEMORY_MAP__OBJECT_LIFECYCLE__UPLOAD_SESSION_CLEANUP_BATCH_SIZE=1000
MEMORY_MAP__OBJECT_LIFECYCLE__STORAGE_DELETION_RETRY_SECONDS=60
MEMORY_MAP__OBJECT_LIFECYCLE__STORAGE_DELETION_LEASE_SECONDS=300
MEMORY_MAP__OBJECT_LIFECYCLE__MAINTENANCE_INTERVAL_SECONDS=30
MEMORY_MAP__OBJECT_LIFECYCLE__STORAGE_DELETION_BATCH_SIZE=1000
MEMORY_MAP__OBJECT_LIFECYCLE__STORAGE_DELETION_MAX_ATTEMPTS=10

MEMORY_MAP__EMAIL_OUTBOX__RETRY_SECONDS=60
MEMORY_MAP__EMAIL_OUTBOX__LEASE_SECONDS=300
MEMORY_MAP__EMAIL_OUTBOX__WORKER_INTERVAL_SECONDS=30
MEMORY_MAP__EMAIL_OUTBOX__BATCH_SIZE=100
MEMORY_MAP__EMAIL_OUTBOX__MAX_ATTEMPTS=10
12 changes: 12 additions & 0 deletions .github/actions/free-runner-space/action.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
name: Free runner disk space
description: Remove unused hosted-runner tool caches before disk-heavy CI jobs.
runs:
using: composite
steps:
- name: Free runner disk space
shell: bash
run: |
df -h
sudo rm -rf /usr/share/dotnet /usr/local/lib/android /opt/ghc /opt/hostedtoolcache/CodeQL
docker system prune --all --force || true
df -h
92 changes: 92 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,9 @@ concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true

permissions:
contents: read

env:
CARGO_TERM_COLOR: always
SKIP_DIRENV: "1"
Expand All @@ -22,6 +25,9 @@ jobs:
- uses: actions/checkout@v6
- uses: DeterminateSystems/nix-installer-action@main
- uses: DeterminateSystems/magic-nix-cache-action@main
with:
use-flakehub: false
use-gha-cache: true
- run: cd devenv && nix fmt -- --ci

check:
Expand All @@ -31,6 +37,9 @@ jobs:
- uses: actions/checkout@v6
- uses: DeterminateSystems/nix-installer-action@main
- uses: DeterminateSystems/magic-nix-cache-action@main
with:
use-flakehub: false
use-gha-cache: true
- run: nix develop ./devenv/ --command just check

clippy:
Expand All @@ -40,6 +49,9 @@ jobs:
- uses: actions/checkout@v6
- uses: DeterminateSystems/nix-installer-action@main
- uses: DeterminateSystems/magic-nix-cache-action@main
with:
use-flakehub: false
use-gha-cache: true
- run: nix develop ./devenv/ --command just clippy

test:
Expand All @@ -49,6 +61,9 @@ jobs:
- uses: actions/checkout@v6
- uses: DeterminateSystems/nix-installer-action@main
- uses: DeterminateSystems/magic-nix-cache-action@main
with:
use-flakehub: false
use-gha-cache: true
- run: nix develop ./devenv/ --command just test

doc:
Expand All @@ -58,6 +73,9 @@ jobs:
- uses: actions/checkout@v6
- uses: DeterminateSystems/nix-installer-action@main
- uses: DeterminateSystems/magic-nix-cache-action@main
with:
use-flakehub: false
use-gha-cache: true
- run: nix develop ./devenv/ --command just doc

deny:
Expand All @@ -67,6 +85,9 @@ jobs:
- uses: actions/checkout@v6
- uses: DeterminateSystems/nix-installer-action@main
- uses: DeterminateSystems/magic-nix-cache-action@main
with:
use-flakehub: false
use-gha-cache: true
- run: nix develop ./devenv/ --command just deny

frontend:
Expand All @@ -76,4 +97,75 @@ jobs:
- uses: actions/checkout@v6
- uses: DeterminateSystems/nix-installer-action@main
- uses: DeterminateSystems/magic-nix-cache-action@main
with:
use-flakehub: false
use-gha-cache: true
- run: nix develop ./devenv/ --command just frontend-config
- run: nix develop ./devenv/ --command just frontend-build

storage-integration:
name: Storage Integration
runs-on: ubuntu-latest
timeout-minutes: 45
steps:
- uses: actions/checkout@v6
- uses: ./.github/actions/free-runner-space
- uses: DeterminateSystems/nix-installer-action@main
- uses: DeterminateSystems/magic-nix-cache-action@main
with:
use-flakehub: false
use-gha-cache: true
- run: nix develop ./devenv/ --command just storage-ci
- name: Upload process-compose log
if: failure()
uses: actions/upload-artifact@v7
with:
name: process-compose-log
path: process-compose.log
if-no-files-found: ignore

backend-integration:
name: Backend Integration
runs-on: ubuntu-latest
timeout-minutes: 45
steps:
- uses: actions/checkout@v6
- uses: ./.github/actions/free-runner-space
- uses: DeterminateSystems/nix-installer-action@main
- uses: DeterminateSystems/magic-nix-cache-action@main
with:
use-flakehub: false
use-gha-cache: true
- run: nix develop ./devenv/ --command just backend-integration
- name: Upload backend integration logs
if: failure()
uses: actions/upload-artifact@v7
with:
name: backend-integration-logs
path: backend-integration-logs/
if-no-files-found: ignore

e2e:
name: E2E
runs-on: ubuntu-latest
timeout-minutes: 45
steps:
- uses: actions/checkout@v6
- uses: ./.github/actions/free-runner-space
- uses: DeterminateSystems/nix-installer-action@main
- uses: DeterminateSystems/magic-nix-cache-action@main
with:
use-flakehub: false
use-gha-cache: true
- run: nix develop ./devenv/ --command just e2e
- name: Upload E2E logs and artifacts
if: failure()
uses: actions/upload-artifact@v7
with:
name: e2e-artifacts
path: |
e2e-logs/
frontend/playwright-report/
frontend/test-results/
frontend/blob-report/
if-no-files-found: ignore
23 changes: 22 additions & 1 deletion .github/workflows/update-cargo-deps.yml
Original file line number Diff line number Diff line change
Expand Up @@ -15,17 +15,38 @@ jobs:
contents: write
pull-requests: write
steps:
- name: Generate app token
id: app-token
uses: actions/create-github-app-token@v3
with:
app-id: ${{ secrets.APP_ID }}
private-key: ${{ secrets.APP_PRIVATE_KEY }}

- uses: actions/checkout@v6
- uses: DeterminateSystems/nix-installer-action@main
- uses: DeterminateSystems/magic-nix-cache-action@main

- name: Update Cargo dependencies
run: nix develop ./devenv/ --command cargo update

- name: Check for changes
id: diff
run: |
if git diff --quiet Cargo.lock; then
echo "changed=false" >> "$GITHUB_OUTPUT"
else
echo "changed=true" >> "$GITHUB_OUTPUT"
fi

- name: Disable git hooks
if: steps.diff.outputs.changed == 'true'
run: git config --unset core.hooksPath || true

- name: Create pull request
if: steps.diff.outputs.changed == 'true'
uses: peter-evans/create-pull-request@v7
with:
token: ${{ secrets.GITHUB_TOKEN }}
token: ${{ steps.app-token.outputs.token }}
commit-message: "chore: update Cargo dependencies"
branch: update-cargo-deps
title: "chore: update Cargo dependencies"
Expand Down
37 changes: 29 additions & 8 deletions .github/workflows/update-nixpkgs.yml
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
name: Update nixpkgs
name: Update Nix flake inputs

on:
schedule:
Expand All @@ -12,19 +12,40 @@ jobs:
contents: write
pull-requests: write
steps:
- name: Generate app token
id: app-token
uses: actions/create-github-app-token@v3
with:
app-id: ${{ secrets.APP_ID }}
private-key: ${{ secrets.APP_PRIVATE_KEY }}

- uses: actions/checkout@v6
- uses: DeterminateSystems/nix-installer-action@main
- uses: DeterminateSystems/magic-nix-cache-action@main

- name: Update nixpkgs input
run: nix flake update nixpkgs --flake ./devenv/
- name: Update Nix flake inputs
run: nix flake update --flake ./devenv/

- name: Check for changes
id: diff
run: |
if git diff --quiet devenv/flake.lock; then
echo "changed=false" >> "$GITHUB_OUTPUT"
else
echo "changed=true" >> "$GITHUB_OUTPUT"
fi

- name: Disable git hooks
if: steps.diff.outputs.changed == 'true'
run: git config --unset core.hooksPath || true

- name: Create pull request
if: steps.diff.outputs.changed == 'true'
uses: peter-evans/create-pull-request@v7
with:
token: ${{ secrets.GITHUB_TOKEN }}
commit-message: "chore: update nixpkgs input"
branch: update-nixpkgs
title: "chore: update nixpkgs input"
token: ${{ steps.app-token.outputs.token }}
commit-message: "chore: update Nix flake inputs"
branch: update-nix-flake-inputs
title: "chore: update Nix flake inputs"
body: |
Automated weekly update of the `nixpkgs` flake input.
Automated weekly update of moving Nix flake inputs.
19 changes: 17 additions & 2 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,9 +1,24 @@
target/
data/
data/minio1/
data/pg1/
data/postgres/
data/rustfs/
.env
config.toml
config.local.toml
frontend/public/config.json
.direnv/
.cache/test-output/
/result
/result-*
process-compose.log
backend-integration-logs/
e2e-logs/
frontend/playwright-report/
frontend/test-results/
frontend/blob-report/
.claude/worktrees/
.codex/worktrees/
.pre-commit-config.yaml
.playwright-mcp/
.cargo-deny/
*.code-workspace
Loading
Loading