refactor: use docker-compose with testcontainers#3476
Conversation
|
|
The latest updates on your projects. Learn more about Vercel for Git ↗︎
|
|
Caution Review failedThe pull request is closed. 📝 WalkthroughWalkthroughThis change introduces the initial implementation of the Unkey Deploy system, adding new services ( Changes
Sequence Diagram(s)sequenceDiagram
participant User
participant DashboardUI
participant API
participant AssetManagerd
participant Billaged
participant Builderd
participant Storage
participant Registry
User->>DashboardUI: Start onboarding/key creation
DashboardUI->>API: Submit key creation form
API->>AssetManagerd: Register asset (e.g. rootfs)
AssetManagerd->>Registry: Store asset metadata
AssetManagerd->>Storage: Store asset data
AssetManagerd->>Builderd: (If needed) Trigger rootfs build
Builderd->>AssetManagerd: Notify build completion
AssetManagerd->>API: Respond with asset info
API->>DashboardUI: Confirm key creation
Note over AssetManagerd, Billaged: Periodically, Billaged aggregates VM usage from metald and reports billing stats.
Possibly related PRs
Suggested reviewers
✨ Finishing Touches
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. 🪧 TipsChatThere are 3 ways to chat with CodeRabbit:
SupportNeed help? Create a ticket on our support page for assistance with any issues or questions. Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments. CodeRabbit Commands (Invoked using PR comments)
Other keywords and placeholders
CodeRabbit Configuration File (
|
This stack of pull requests is managed by Graphite. Learn more about stacking. |
|
Thank you for following the naming conventions for pull request titles! 🙏 |
There was a problem hiding this comment.
Actionable comments posted: 11
🔭 Outside diff range comments (1)
go/go.mod (1)
53-318: Update container-related and Docker dependencies to latest patch versions and run a vulnerability scan.The following modules have newer patch releases—please bump them in
go/go.mod:
- github.com/containerd/console v1.0.4 → v1.0.5
- github.com/containerd/containerd/api v1.8.0 → v1.9.0
- github.com/containerd/containerd/v2 v2.0.4 → v2.1.3
- github.com/containerd/fuse-overlayfs-snapshotter/v2 v2.1.1 → v2.1.6
- github.com/containerd/nydus-snapshotter v0.15.0 → v0.15.2
- github.com/docker/cli v28.2.2 → v28.3.1
- github.com/docker/cli-docs-tool v0.9.0 → v0.10.0
- github.com/docker/compose/v2 v2.35.0 → v2.38.2
- github.com/docker/docker v28.2.2 → v28.3.1
- github.com/docker/docker-credential-helpers v0.8.2 → v0.9.3
- github.com/moby/buildkit v0.20.1 → v0.23.2
- github.com/moby/spdystream v0.4.0 → v0.5.0
After updating, run:
cd go go mod tidy go list -u -m all | grep -E "(containerd|docker|moby)" go run golang.org/x/vuln/cmd/govulncheck@latest ./...to verify no other updates are available and scan for known vulnerabilities. Integrating
govulncheckinto your CI pipeline is also recommended.
📜 Review details
Configuration used: CodeRabbit UI
Review profile: ASSERTIVE
Plan: Pro
⛔ Files ignored due to path filters (1)
go/go.sumis excluded by!**/*.sum
📒 Files selected for processing (26)
deployment/Dockerfile.mysql(1 hunks)deployment/docker-compose.yaml(4 hunks)go/.golangci.yaml(2 hunks)go/Makefile(1 hunks)go/apps/api/cancel_test.go(1 hunks)go/apps/api/integration/harness.go(4 hunks)go/apps/api/integration/http.go(2 hunks)go/go.mod(5 hunks)go/pkg/counter/redis_test.go(2 hunks)go/pkg/hydra/test_helpers.go(1 hunks)go/pkg/testutil/containers/api.go(0 hunks)go/pkg/testutil/containers/clickhouse.go(0 hunks)go/pkg/testutil/containers/constants.go(0 hunks)go/pkg/testutil/containers/containers.go(1 hunks)go/pkg/testutil/containers/doc.go(1 hunks)go/pkg/testutil/containers/mysql.go(0 hunks)go/pkg/testutil/containers/otel.go(0 hunks)go/pkg/testutil/containers/redis.go(0 hunks)go/pkg/testutil/containers/s3.go(0 hunks)go/pkg/testutil/http.go(4 hunks)go/pkg/testutil/testservices.go(1 hunks)go/pkg/vault/integration/coldstart_test.go(1 hunks)go/pkg/vault/integration/migrate_deks_test.go(1 hunks)go/pkg/vault/integration/reencryption_test.go(1 hunks)go/pkg/vault/integration/reusing_deks_test.go(2 hunks)go/pkg/vault/storage/s3.go(2 hunks)
💤 Files with no reviewable changes (7)
- go/pkg/testutil/containers/s3.go
- go/pkg/testutil/containers/constants.go
- go/pkg/testutil/containers/redis.go
- go/pkg/testutil/containers/otel.go
- go/pkg/testutil/containers/api.go
- go/pkg/testutil/containers/mysql.go
- go/pkg/testutil/containers/clickhouse.go
🧰 Additional context used
🧠 Learnings (2)
deployment/Dockerfile.mysql (1)
Learnt from: chronark
PR: unkeyed/unkey#3426
File: deployment/init-databases.sql:0-0
Timestamp: 2025-07-07T13:22:10.960Z
Learning: The database initialization script in deployment/init-databases.sql is specifically for local development environments, not production. The permissive settings (wildcard host '%' and ALL PRIVILEGES) are intentionally used for local dev convenience.
go/pkg/hydra/test_helpers.go (1)
Learnt from: chronark
PR: unkeyed/unkey#3420
File: go/pkg/hydra/store/gorm/gorm.go:486-498
Timestamp: 2025-07-02T11:51:58.572Z
Learning: The Hydra package (go/pkg/hydra) is planned to be migrated from GORM to sqlc for database operations, which explains why raw SQL queries are acceptable in the current implementation.
🧬 Code Graph Analysis (7)
go/pkg/vault/integration/reencryption_test.go (2)
go/pkg/testutil/containers/containers.go (2)
S3(153-160)S3Config(18-34)go/pkg/vault/storage/s3.go (2)
NewS3(33-73)S3Config(25-31)
go/pkg/vault/integration/migrate_deks_test.go (2)
go/pkg/testutil/containers/containers.go (2)
S3(153-160)S3Config(18-34)go/pkg/vault/storage/s3.go (2)
NewS3(33-73)S3Config(25-31)
go/pkg/hydra/test_helpers.go (1)
go/pkg/testutil/containers/containers.go (1)
MySQL(88-99)
go/pkg/counter/redis_test.go (1)
go/pkg/testutil/containers/containers.go (1)
Redis(109-111)
go/apps/api/cancel_test.go (1)
go/pkg/testutil/containers/containers.go (2)
MySQL(88-99)Redis(109-111)
go/pkg/testutil/http.go (5)
go/pkg/zen/server.go (1)
Server(22-33)go/pkg/zen/validation/validator.go (1)
Validator(24-26)go/pkg/sim/simulation.go (1)
Validator(13-13)go/pkg/testutil/containers/containers.go (6)
StartAllServices(67-70)MySQL(88-99)Redis(109-111)ClickHouse(130-132)S3(153-160)S3Config(18-34)go/pkg/vault/storage/s3.go (2)
NewS3(33-73)S3Config(25-31)
go/pkg/testutil/testservices.go (1)
go/pkg/testutil/containers/containers.go (7)
MySQL(88-99)Redis(109-111)ClickHouse(130-132)S3(153-160)S3Config(18-34)OTEL(181-187)OTELConfig(41-53)
🪛 Checkov (3.2.334)
deployment/Dockerfile.mysql
[LOW] 1-1: Ensure the base image uses a non latest version tag
(CKV_DOCKER_7)
[LOW] 1-9: Ensure that HEALTHCHECK instructions have been added to container images
(CKV_DOCKER_2)
[LOW] 1-9: Ensure that a user for the container has been created
(CKV_DOCKER_3)
🪛 Hadolint (2.12.0)
deployment/Dockerfile.mysql
[warning] 1-1: Using latest is prone to errors if the image will ever update. Pin the version explicitly to a release tag
(DL3007)
🪛 checkmake (0.2.2)
go/Makefile
[warning] 13-13: Target body for "up" exceeds allowed length of 5 (12).
(maxbodylength)
[warning] 1-1: Missing required phony target "all"
(minphony)
[warning] 1-1: Missing required phony target "clean"
(minphony)
[warning] 1-1: Missing required phony target "test"
(minphony)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (25)
- GitHub Check: Test Go API Local / Test (Shard 6/8)
- GitHub Check: Test Go API Local / Test (Shard 3/8)
- GitHub Check: Build / Build
- GitHub Check: Test Go API Local / Test (Shard 4/8)
- GitHub Check: Test Agent Local / test_agent_local
- GitHub Check: Test Go API Local / Test (Shard 8/8)
- GitHub Check: Test Go API Local / Test (Shard 7/8)
- GitHub Check: Test Go API Local / Test (Shard 1/8)
- GitHub Check: Test Go API Local / Test (Shard 5/8)
- GitHub Check: Test Go API Local / Test (Shard 2/8)
- GitHub Check: Test API / API Test Local
- GitHub Check: Test Packages / Test ./packages/cache
- GitHub Check: Test Packages / Test ./packages/api
- GitHub Check: Test Packages / Test ./packages/rbac
- GitHub Check: Test Packages / Test ./packages/nextjs
- GitHub Check: Test Packages / Test ./apps/dashboard
- GitHub Check: Test Packages / Test ./internal/resend
- GitHub Check: Test Packages / Test ./packages/hono
- GitHub Check: Test Packages / Test ./internal/id
- GitHub Check: Test Packages / Test ./internal/keys
- GitHub Check: Test Packages / Test ./internal/hash
- GitHub Check: Test Packages / Test ./internal/clickhouse
- GitHub Check: Test Packages / Test ./internal/billing
- GitHub Check: Test Packages / Test ./internal/encryption
- GitHub Check: Analyze (javascript-typescript)
🔇 Additional comments (26)
go/.golangci.yaml (2)
73-74: LGTM - Redis client exclusions align with container refactoring.The addition of Redis client option exclusions from the
exhaustructlinter is consistent with the move to static container configurations described in the PR objectives.
96-98: LGTM - Reasonable goconst configuration.The minimum constant length of 4 characters and minimum occurrence count of 5 are sensible defaults for detecting repeated constants.
go/pkg/counter/redis_test.go (2)
17-17: LGTM - Simplified Redis container setup.The change from container manager instantiation to direct
containers.Redis(t)call aligns with the PR's goal of simplifying container management by relying on externally managed docker-compose services.
327-327: LGTM - Consistent Redis container setup.Same beneficial simplification as in the previous test function.
go/pkg/vault/integration/migrate_deks_test.go (2)
25-25: LGTM - Simplified S3 container setup.The change from container manager instantiation to direct
containers.S3(t)call is consistent with the PR's container management simplification.
30-30: LGTM - Corrected field name capitalization.The change from
S3AccessKeyIdtoS3AccessKeyIDfollows Go naming conventions where "ID" should be capitalized as a complete acronym.go/pkg/vault/storage/s3.go (2)
28-28: LGTM - Corrected field name capitalization.The change from
S3AccessKeyIdtoS3AccessKeyIDfollows Go naming conventions where "ID" should be capitalized as a complete acronym.
51-51: LGTM - Updated field usage to match renamed struct field.The usage of the field is correctly updated to match the renamed struct field.
go/pkg/hydra/test_helpers.go (1)
22-23: LGTM! Clean simplification of container setup.The migration from explicit container management to the simplified
containers.MySQL(t)call effectively reduces test complexity while maintaining the same functionality. The approach aligns well with using external docker-compose services.go/pkg/vault/integration/coldstart_test.go (2)
22-22: LGTM! Simplified S3 container setup.The migration from explicit container management to
containers.S3(t)follows the same pattern as other test files and aligns with the docker-compose-based approach.
29-29: Good catch! Field name corrected to follow Go naming conventions.The change from
S3AccessKeyIdtoS3AccessKeyIDproperly follows Go naming conventions for acronyms and matches the updated field name in thestorage.S3Configstruct.go/pkg/vault/integration/reencryption_test.go (1)
25-25: LGTM! Consistent changes align with the container refactor.The S3 container setup simplification and field name correction (
S3AccessKeyId→S3AccessKeyID) are consistent with the changes in other vault integration tests, demonstrating a systematic approach to the refactor.Also applies to: 30-30
go/apps/api/cancel_test.go (1)
22-22: LGTM! Consistent simplification of MySQL and Redis container setup.The migration to
containers.MySQL(t)andcontainers.Redis(t)effectively removes explicit container management complexity while maintaining the same test functionality. This aligns well with the docker-compose-based approach adopted across the codebase.Also applies to: 25-25
go/pkg/vault/integration/reusing_deks_test.go (1)
24-24: LGTM! Consistent S3 container setup changes applied to both test functions.The S3 container setup simplification and field name correction (
S3AccessKeyId→S3AccessKeyID) are consistently applied across both test functions, maintaining the same systematic approach to the container refactor seen in other vault integration tests.Also applies to: 29-29, 67-67, 72-72
go/apps/api/integration/http.go (1)
65-69: LGTM! Improved URL scheme handling.The updated logic correctly handles cases where
addralready includes a scheme, preventing duplicate prefixes like "http://http://...". This defensive approach improves compatibility with the new in-process API server cluster architecture.deployment/docker-compose.yaml (1)
93-93: LGTM! Explicit container naming improves predictability.Adding explicit
container_nameattributes provides consistent, predictable naming that aligns with the service names. This supports the migration to static configuration by ensuring containers can be reliably referenced by name.Also applies to: 99-99, 122-122, 152-152, 174-174
go/pkg/testutil/containers/doc.go (1)
1-91: Excellent comprehensive documentation!The rewritten documentation provides clear guidance on the package's new static configuration approach. The explanation of design decisions (hardcoded ports vs. dynamic discovery), usage examples, and prerequisites makes the package easily adoptable. The distinction between host and docker configurations is particularly valuable.
go/pkg/testutil/http.go (2)
58-66: LGTM! Simplified harness initialization.The refactoring successfully removes dynamic container management complexity in favor of static configurations. Using
containers.StartAllServices(t)as a no-op and the simplified accessor functions (MySQL(t),Redis(t)) makes the code cleaner and more maintainable.
137-137: Good fix for Go naming convention.Correcting
S3AccessKeyIdtoS3AccessKeyIDproperly follows Go naming conventions where "ID" should be capitalized as a whole when it's an acronym.go/pkg/testutil/containers/containers.go (4)
9-54: Well-structured configuration types with excellent documentation.The
S3ConfigandOTELConfigstructs are well-designed with clear field documentation that explains the dual URL pattern for host vs docker connections. The field naming follows Go conventions correctly.
72-99: Well-implemented MySQL configuration with good practices.The function correctly configures MySQL with ParseTime enabled and uses NopLogger to reduce test output noise. The empty DBName with clear documentation is a good practice to avoid test conflicts.
101-132: Simple and effective service configuration functions.Both Redis and ClickHouse functions provide appropriate connection strings with good documentation. The ClickHouse DSN includes appropriate security settings for testing environments.
134-187: Comprehensive service configurations with excellent documentation.Both S3 and OTEL functions return complete configurations with all necessary endpoints and credentials. The documentation includes helpful usage examples, and the credentials properly match the docker-compose setup.
go/Makefile (2)
6-11: Good improvements to fmt and pull targets.Running
golangci-lintafter formatting ensures code quality, and usingdocker compose pullis more maintainable than managing individual image pulls.
30-37: Well-configured test targets with proper dependencies.Both test targets correctly depend on the
uptarget to ensure services are running. Good practices include race detection for unit tests and appropriate timeout settings.go/apps/api/integration/harness.go (1)
253-259: Properly implemented getter method.Good defensive programming by checking for nil apiCluster.
| // StopContainer stops a specific API container (for chaos testing) | ||
| func (h *Harness) StopContainer(index int) error { | ||
| if h.apiCluster == nil || index >= len(h.apiCluster.Resources) { | ||
| return fmt.Errorf("invalid container index: %d", index) | ||
| } | ||
|
|
||
| pool, err := dockertest.NewPool("") | ||
| if err != nil { | ||
| return err | ||
| } | ||
| return pool.Client.StopContainer(h.apiCluster.Resources[index].Container.ID, 10) | ||
| } | ||
|
|
||
| // StartContainer starts a stopped API container (for chaos testing) | ||
| func (h *Harness) StartContainer(index int) error { | ||
| if h.apiCluster == nil || index >= len(h.apiCluster.Resources) { | ||
| return fmt.Errorf("invalid container index: %d", index) | ||
| } | ||
|
|
||
| pool, err := dockertest.NewPool("") | ||
| if err != nil { | ||
| return err | ||
| } | ||
| return pool.Client.StartContainer(h.apiCluster.Resources[index].Container.ID, nil) | ||
| } |
There was a problem hiding this comment.
🧹 Nitpick (assertive)
Chaos testing methods are broken - they reference non-existent Docker containers.
The StopContainer and StartContainer methods attempt to control Docker containers, but the API nodes now run in-process as goroutines, not as Docker containers. These methods will fail if called.
Either remove these methods entirely or reimplement them to work with in-process servers. For example, you could:
- Remove the methods if chaos testing is no longer needed:
-// StopContainer stops a specific API container (for chaos testing)
-func (h *Harness) StopContainer(index int) error {
- // ... entire method
-}
-
-// StartContainer starts a stopped API container (for chaos testing)
-func (h *Harness) StartContainer(index int) error {
- // ... entire method
-}- Or reimplement to control in-process servers (would require significant refactoring to track contexts/cancel functions for each server)
Would you like me to help implement a proper chaos testing mechanism for in-process servers, or should these methods be removed?
📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| // StopContainer stops a specific API container (for chaos testing) | |
| func (h *Harness) StopContainer(index int) error { | |
| if h.apiCluster == nil || index >= len(h.apiCluster.Resources) { | |
| return fmt.Errorf("invalid container index: %d", index) | |
| } | |
| pool, err := dockertest.NewPool("") | |
| if err != nil { | |
| return err | |
| } | |
| return pool.Client.StopContainer(h.apiCluster.Resources[index].Container.ID, 10) | |
| } | |
| // StartContainer starts a stopped API container (for chaos testing) | |
| func (h *Harness) StartContainer(index int) error { | |
| if h.apiCluster == nil || index >= len(h.apiCluster.Resources) { | |
| return fmt.Errorf("invalid container index: %d", index) | |
| } | |
| pool, err := dockertest.NewPool("") | |
| if err != nil { | |
| return err | |
| } | |
| return pool.Client.StartContainer(h.apiCluster.Resources[index].Container.ID, nil) | |
| } |
🤖 Prompt for AI Agents
In go/apps/api/integration/harness.go around lines 227 to 251, the StopContainer
and StartContainer methods are broken because they try to control Docker
containers that no longer exist; the API nodes now run as in-process goroutines.
To fix this, either remove these methods entirely if chaos testing is no longer
needed, or refactor the harness to track and manage the in-process server
instances with contexts and cancel functions to enable stopping and starting
them programmatically. Decide which approach fits the current testing strategy
and implement accordingly.
| // RunAPI creates a cluster of API containers for chaos testing | ||
| func (h *Harness) RunAPI(config ApiConfig) *ApiCluster { | ||
| cluster := &ApiCluster{ | ||
| Addrs: make([]string, config.Nodes), | ||
| Resources: make([]*dockertest.Resource, config.Nodes), // Not used but kept for compatibility | ||
| } |
There was a problem hiding this comment.
🛠️ Refactor suggestion
Remove Resources initialization if not used.
Following up on the previous comment about removing the Resources field.
cluster := &ApiCluster{
Addrs: make([]string, config.Nodes),
- Resources: make([]*dockertest.Resource, config.Nodes), // Not used but kept for compatibility
}📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| // RunAPI creates a cluster of API containers for chaos testing | |
| func (h *Harness) RunAPI(config ApiConfig) *ApiCluster { | |
| cluster := &ApiCluster{ | |
| Addrs: make([]string, config.Nodes), | |
| Resources: make([]*dockertest.Resource, config.Nodes), // Not used but kept for compatibility | |
| } | |
| // RunAPI creates a cluster of API containers for chaos testing | |
| func (h *Harness) RunAPI(config ApiConfig) *ApiCluster { | |
| cluster := &ApiCluster{ | |
| Addrs: make([]string, config.Nodes), | |
| } |
🤖 Prompt for AI Agents
In go/apps/api/integration/harness.go around lines 121 to 126, the Resources
field in ApiCluster is initialized but not used. Remove the initialization of
the Resources slice from the RunAPI function and also remove the Resources field
from the ApiCluster struct definition to clean up unused code.
* feat: add new expandable configs * feat: add form submit with conditionals * feat: add description for each section and disable form --------- Co-authored-by: James P <james@unkey.dev>
* refactor: add minimized load more * chore: fmt * refactor: get rid of useEffect animation * chore: fmt
* llm search moved with docs and replaced in dashboard * eng docs change * [autofix.ci] apply automated fixes * minor refactor from c-rabbit * rabbit * [autofix.ci] apply automated fixes * rabbit --------- Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com> Co-authored-by: James P <james@unkey.dev>
* fix: first time selection * fix: resetting to initial date of the month * fix: date validation issue * fix: day selection by bypassing react-day-picker
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
* feat: Initial implementation of Unkey Deploy - Introduce four core services: assetmanagerd, billaged, builderd, metald - Implement VM lifecycle management with Firecracker/Cloud Hypervisor support - Add SPIFFE/SPIRE integration for mTLS inter-service communication - Include systemd service files and CLI tools for each service - Set up observability with OpenTelemetry and Grafana LGTM stack - Implement tenant isolation, resource management, and usage billing Signed-off-by: Ian Meyer <k@imeyer.io> * [autofix.ci] apply automated fixes --------- Signed-off-by: Ian Meyer <k@imeyer.io> Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
|
yeah, I’ll add that back in |
Merge activity
|
* feat: get rid of testcontainers and just rawdog docker-compose * feat: onboarding key creation (#3459) * feat: add new expandable configs * feat: add form submit with conditionals * feat: add description for each section and disable form --------- Co-authored-by: James P <james@unkey.dev> * refactor: add minimized load more (#3399) * refactor: add minimized load more * chore: fmt * refactor: get rid of useEffect animation * chore: fmt * chore: llm search moved to ui (#3409) * llm search moved with docs and replaced in dashboard * eng docs change * [autofix.ci] apply automated fixes * minor refactor from c-rabbit * rabbit * [autofix.ci] apply automated fixes * rabbit --------- Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com> Co-authored-by: James P <james@unkey.dev> * fix: calendar bug (#3478) * fix: first time selection * fix: resetting to initial date of the month * fix: date validation issue * fix: day selection by bypassing react-day-picker * feat: return permission slugs (#3481) * chore(release): version packages (#3482) Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com> * feat: add listPermissions and listRoles (#3483) * chore(release): version packages (#3484) Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com> * feat: Initial implementation of Unkey Deploy (#3488) * feat: Initial implementation of Unkey Deploy - Introduce four core services: assetmanagerd, billaged, builderd, metald - Implement VM lifecycle management with Firecracker/Cloud Hypervisor support - Add SPIFFE/SPIRE integration for mTLS inter-service communication - Include systemd service files and CLI tools for each service - Set up observability with OpenTelemetry and Grafana LGTM stack - Implement tenant isolation, resource management, and usage billing Signed-off-by: Ian Meyer <k@imeyer.io> * [autofix.ci] apply automated fixes --------- Signed-off-by: Ian Meyer <k@imeyer.io> Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com> * fix: cast JSON for interpolate params (#3492) * refactor: use docker-compose with testcontainers (#3476) * refactor: use docker-compose with testcontainerrefactos * feat: get rid of testcontainers and just rawdog docker-compose * feat: onboarding key creation (#3459) * feat: add new expandable configs * feat: add form submit with conditionals * feat: add description for each section and disable form --------- Co-authored-by: James P <james@unkey.dev> * refactor: add minimized load more (#3399) * refactor: add minimized load more * chore: fmt * refactor: get rid of useEffect animation * chore: fmt * chore: llm search moved to ui (#3409) * llm search moved with docs and replaced in dashboard * eng docs change * [autofix.ci] apply automated fixes * minor refactor from c-rabbit * rabbit * [autofix.ci] apply automated fixes * rabbit --------- Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com> Co-authored-by: James P <james@unkey.dev> * fix: calendar bug (#3478) * fix: first time selection * fix: resetting to initial date of the month * fix: date validation issue * fix: day selection by bypassing react-day-picker * feat: return permission slugs (#3481) * chore(release): version packages (#3482) Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com> * feat: add listPermissions and listRoles (#3483) * chore(release): version packages (#3484) Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com> * feat: Initial implementation of Unkey Deploy (#3488) * feat: Initial implementation of Unkey Deploy - Introduce four core services: assetmanagerd, billaged, builderd, metald - Implement VM lifecycle management with Firecracker/Cloud Hypervisor support - Add SPIFFE/SPIRE integration for mTLS inter-service communication - Include systemd service files and CLI tools for each service - Set up observability with OpenTelemetry and Grafana LGTM stack - Implement tenant isolation, resource management, and usage billing Signed-off-by: Ian Meyer <k@imeyer.io> * [autofix.ci] apply automated fixes --------- Signed-off-by: Ian Meyer <k@imeyer.io> Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com> * fix: cast JSON for interpolate params (#3492) * refactor: use docker-compose with testcontainerrefactos * feat: get rid of testcontainers and just rawdog docker-compose --------- Signed-off-by: Ian Meyer <k@imeyer.io> Co-authored-by: Oğuzhan Olguncu <21091016+ogzhanolguncu@users.noreply.github.com> Co-authored-by: James P <james@unkey.dev> Co-authored-by: CodeReaper <148160799+MichaelUnkey@users.noreply.github.com> Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com> Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com> Co-authored-by: Ian Meyer <imeyer@users.noreply.github.com> Co-authored-by: Flo <53355483+Flo4604@users.noreply.github.com> * fix: clean up --------- Signed-off-by: Ian Meyer <k@imeyer.io> Co-authored-by: Oğuzhan Olguncu <21091016+ogzhanolguncu@users.noreply.github.com> Co-authored-by: James P <james@unkey.dev> Co-authored-by: CodeReaper <148160799+MichaelUnkey@users.noreply.github.com> Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com> Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com> Co-authored-by: Ian Meyer <imeyer@users.noreply.github.com> Co-authored-by: Flo <53355483+Flo4604@users.noreply.github.com>

This is a partial PR, I undid/changed most of it in the next one. sorry for the noise
What does this PR do?
Modernizes the testing infrastructure by replacing the custom container management with TestContainers, improving test reliability and maintainability. The changes include:
Type of change
How should this be tested?
make test-unitto verify the new container management works correctlymake test-fullto ensure integration tests pass with the new infrastructureChecklist
Required
pnpm buildpnpm fmtconsole.logsgit pull origin mainSummary by CodeRabbit
New Features
Documentation
Configuration
Bug Fixes
Style
Refactor
Chores
.gitignorefiles across new service directories to prevent accidental commits of sensitive or temporary files.