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
3 changes: 2 additions & 1 deletion docker-compose.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -30,10 +30,11 @@
services:
openvpn:
# Pulls the published multi-arch image from GHCR - the five-minute path.
# Set CULVERT_IMAGE to pin a tag (e.g. ...culvert:v2.1.3) or point at a
# Risk accepted: the :latest default serves that path only. A deployment
# sets CULVERT_IMAGE to a digest pin (...culvert:vX.Y.Z@sha256:...) or a
# private mirror. To build locally instead, uncomment the build: block
# below and run `docker compose up --build`.
image: ${CULVERT_IMAGE:-ghcr.io/hyperi-io/culvert:latest}

Check warning on line 37 in docker-compose.yaml

View workflow job for this annotation

GitHub Actions / ci / Quality

hyperi-ci compose-pins: compose/unpinned-image

`${CULVERT_IMAGE:-ghcr.io/hyperi-io/culvert:latest}` resolves to `latest` with nothing set - pin it with a digest, or make the tag a mandatory `${VAR:?...}`
# build:
# context: .
# dockerfile: Dockerfile
Expand Down
13 changes: 5 additions & 8 deletions profiles/edge-fleet.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -36,11 +36,9 @@ routing_control_enabled: true
# reaches them). Isolation stays ON.
client_isolation: true

# Sharing is left at the shipped default deliberately. This preset runs 2-8
# replicas, and duplicate-cn is enforced per OpenVPN process, so opting out
# would give per-pod exclusivity while reading as a fleet-wide guarantee. Each
# appliance already holds its own certificate; a cloned one is caught by the
# connection log and revoked with revoke-client, not by duplicate-cn.
# Sharing is left at the shipped default deliberately. Each appliance holds
# its own certificate, and a cloned one is caught by the connection log and
# revoked with revoke-client, not by duplicate-cn.

# Outbound allow-list: appliances may only INITIATE to the receiver
# network. Set this to your receiver's service CIDR.
Expand All @@ -59,9 +57,8 @@ downstream_admin_cidrs: "10.10.0.0/16"
# allowed_destinations + downstream_admin_cidrs.
push_routes: "10.20.0.0/16,10.10.0.0/16"

# K8s behind a connection-based LB: log to stdout for the cluster log
# pipeline. The LB must be connection-sticky (a single UDP/TCP flow
# stays pinned to one culvert pod); see docs/use-case-edge-fleet.md.
# Log to stdout for the cluster log pipeline; see
# docs/use-case-kubernetes.md for the single-replica chart install.
log_mode: stdout

# External PKI is typical here (fleet CA in OpenBao / a mounted secret).
Expand Down
8 changes: 5 additions & 3 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -30,9 +30,11 @@ secrets-aws = ["scalo[secrets-aws]"]
secrets-gcp = ["scalo[secrets-gcp]"]
secrets-azure = ["scalo[secrets-azure]"]
otel = ["scalo[opentelemetry]"]
# Bounded, like the runtime deps. An unpinned dev dependency is not a loose
# constraint but an invisible one: nothing proposes an update, and the version
# moves silently on the next lock refresh.

# A group, not an extra: uv syncs it by default, so ty and pytest under
# `uv run` resolve the test imports. Bounded, like the runtime deps -- an
# unpinned dev dependency moves silently on the next lock refresh.
[dependency-groups]
dev = [
"ruff>=0.16.1,<0.17",
"pytest>=9.1,<10",
Expand Down
4 changes: 2 additions & 2 deletions tests/run-unit.sh
Original file line number Diff line number Diff line change
Expand Up @@ -40,9 +40,9 @@ main() {
cd "${SCRIPT_DIR}/.."

if [[ "${1:-}" == "--verbose" ]] || [[ "${1:-}" == "-v" ]]; then
uv run --frozen --extra dev pytest tests/unit -v
uv run --frozen --group dev pytest tests/unit -v
else
uv run --frozen --extra dev pytest tests/unit
uv run --frozen --group dev pytest tests/unit
fi
}

Expand Down
32 changes: 19 additions & 13 deletions uv.lock

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

Loading