Skip to content

Commit aef7d80

Browse files
authored
Merge pull request #186 from trydirect/dev
Dev
2 parents 9a4759d + 6b90df8 commit aef7d80

213 files changed

Lines changed: 29665 additions & 1379 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.claude/settings.local.json

Lines changed: 0 additions & 18 deletions
This file was deleted.

.github/copilot-instructions.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,3 +135,11 @@ Unit tests (lib) use `--test-threads=1` (see Makefile) because many share global
135135
### CLI commands
136136

137137
`stacker-cli` commands are implemented in `src/cli/`. `console` commands are in `src/console/commands/`. Both use `clap` with `#[derive(Parser, Subcommand)]`. Interactive prompts use `dialoguer`; progress bars use `indicatif`.
138+
139+
### Service deployment scope
140+
141+
`stacker service deploy <name>` is project-scoped by default for services declared in `stacker.yml`. Normal custom services must update `/home/trydirect/project/docker-compose.yml` and must not create `/home/trydirect/<service>/docker-compose.yml` unless the user explicitly chooses standalone mode, such as a future `--standalone` or `--scope standalone` flag.
142+
143+
Only platform-managed services live outside the project directory by default. Current examples are Status Panel (`/home/trydirect/statuspanel`) and Nginx Proxy Manager (`/home/trydirect/nginx_proxy_manager`). Add regression tests for any service/proxy deploy change that could duplicate a project-scoped service as a standalone compose project.
144+
145+
Stacker-managed compose services use stable runtime labels with the `my.stacker.*` prefix: `my.stacker.project_id`, `my.stacker.target`, `my.stacker.scope`, `my.stacker.service`, and `my.stacker.dns`. Keep logical service codes and Docker DNS names separate; for Nginx Proxy Manager use `my.stacker.service=nginx_proxy_manager` and `my.stacker.dns=nginx-proxy-manager`.

.gitignore

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,4 +10,5 @@ configuration.yaml.orig
1010
docker/local/
1111
docs/*.sql
1212
config-to-validate.yaml
13-
*.bak
13+
*.bak
14+
.claude/settings.local.json

CHANGELOG.md

Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,56 @@ All notable changes to this project will be documented in this file.
44

55
## [Unreleased]
66

7+
### Added — Onboarding setup helpers
8+
9+
- Added `stacker config setup ai` to enable and update `ai.*` settings from the
10+
CLI, including Ollama-friendly `--provider`, `--endpoint`, `--model`,
11+
`--timeout`, and repeatable `--task` options.
12+
- Cloud/server deploys now bootstrap missing `.env` files from adjacent
13+
`.env.example` files when compose or `stacker.yml` references them, using
14+
restrictive local permissions where supported.
15+
- Cloud deploy `--key` and `--key-id` overrides are resolved through the active
16+
logged-in Stacker API before prompt selection, and non-interactive shells now
17+
receive actionable cloud credential guidance instead of hanging.
18+
- Deploy validation now prints concise private registry credential guidance when
19+
images may require authentication and no registry auth is resolved.
20+
- `stacker config validate` now points users to `stacker config fix` when it
21+
finds empty structural path fields.
22+
- Cloud/server deploys now skip post-deploy server IP polling and local backup
23+
key installation after terminal paused/error statuses, avoiding repeated
24+
"server IP not yet assigned" retries after a failed installer run.
25+
- Hetzner cloud deploys now normalize user-facing location aliases such as
26+
`nbg1` to installer-compatible datacenter values such as `nbg1-dc3` before
27+
publishing install-service payloads.
28+
- `stacker config setup cloud` now suggests Hetzner `cx23` by default instead
29+
of older `cpx*` examples.
30+
- Remote config bundles now keep compose `env_file` and bind-mount references
31+
project-relative so Docker Compose sees copied files under
32+
`/home/trydirect/project`.
33+
- Cloud/server deploy output now lists config-bundle file mappings and rejects
34+
absolute config-bundle destinations before sending a deploy request.
35+
- Deploy-time config files are now mirrored into the installer runtime-file
36+
contract so non-compose files such as `.env` are materialized before Docker
37+
Compose starts.
38+
739
## [0.2.8] — 2026-05-15
40+
### Added — Configuration inventory, diff, check, and promotion planning
41+
42+
- Added `stacker config inventory --env <name>` to list effective configuration
43+
keys by app/service target and source without printing secret values.
44+
- Added `stacker config diff --from <env> --to <env>` to compare local
45+
environment/profile inventories and report missing, target-only, and changed
46+
keys.
47+
- Added optional `config_contract` support in `stacker.yml` and
48+
`stacker config check --env <name> --strict` to fail when required keys are
49+
missing from an environment.
50+
- Added `stacker config contract suggest --env <name>` to generate a
51+
reviewable `config_contract` snippet from the current inventory.
52+
- Added `--remote` support for `config inventory`, `config diff`, and
53+
`config check`, enriching target inventories with remote service secret
54+
metadata without fetching plaintext Vault values.
55+
- Added `stacker config promote --from <env> --to <env>` to generate safe
56+
target placeholders for missing keys; secret values are not copied.
857

958
### Added — App-only deploy environment selection
1059

@@ -14,6 +63,58 @@ All notable changes to this project will be documented in this file.
1463
`--env <environment>` / `--environment <environment>` for one-off environment
1564
selection during app-only updates.
1665

66+
### Fixed — App-local compose env files for deploy-app
67+
68+
- `stacker agent deploy-app <app>` now reads
69+
`<app>/docker/<env>/compose.yml` when that app-local compose file exists and
70+
merges that app's service definition into the full project-level compose,
71+
instead of replacing the remote stack compose with a single-service file.
72+
- App-local deploys now bundle only the target app-local config files while
73+
using the project-level compose as topology, so missing env/config files for
74+
unrelated services no longer block `deploy-app <app>`.
75+
- App-local `env_file` references are uploaded in the deploy-app config bundle,
76+
and Vault-rendered service secrets for the same target are merged into the
77+
matching remote `.env` file before the Status agent writes it.
78+
- Deploy-app command creation now fails if Stacker cannot render the target's
79+
runtime env, instead of silently falling back to a stale/raw `.env` that may
80+
omit Vault-backed service secrets.
81+
- `stacker agent deploy-app` and `stacker secrets push` now use the same
82+
server-side deploy-app enrichment path when enqueueing agent commands, so
83+
app-local `.env` files receive Vault-rendered service secrets during direct
84+
agent pushes as well as command-create flows.
85+
- Missing config-bundle file errors now include the resolved path instead of a
86+
bare `No such file or directory` message.
87+
- If an app-local `.env` exists but the selected compose service has no
88+
`env_file` entry, the CLI prints a warning explaining that Docker Compose will
89+
not inject local or remote-rendered env values into that container.
90+
91+
### Added — Canonical runtime environment rendering
92+
93+
- Remote runtime environment files now use the canonical host path
94+
`/home/trydirect/project/.env`; generated compose files reference it as
95+
`env_file: .env`.
96+
- `stacker config show --resolved` prints the local env source path, canonical
97+
remote env path, compose env reference, config hash/version metadata, and
98+
contributing layers without printing secret values.
99+
- Runtime env rendering now has deterministic precedence and hashing, rejects
100+
reserved `STACKER_*`, `DOCKER_*`, `VAULT_*`, and `AGENT_*` keys, and provides
101+
drift checks that require `--force` before overwriting changed remote env
102+
content.
103+
104+
### Fixed — Reuse private registry auth for agent-managed pulls
105+
106+
- Deploy-time `deploy.registry` credentials are now stored in trusted Stacker
107+
secret storage and reused for later Status-managed pulls such as
108+
`stacker agent deploy-app`.
109+
- The Status agent now performs private-image pulls with a temporary
110+
`DOCKER_CONFIG` auth context and cleans it up immediately after the pull,
111+
instead of relying on host Docker login state.
112+
- When no stored registry auth exists, pull behavior remains backward
113+
compatible: anonymous pull is attempted first and cached local images can
114+
still allow the redeploy to complete with warnings.
115+
116+
## [0.2.8] — 2026-05-12
117+
17118
### Added — Remote service/app target secrets
18119

19120
- `stacker secrets set --scope service --service <target>` now supports real

0 commit comments

Comments
 (0)