···991010## [0.1.0] - 2026-04-02
11111212-Initial release of the spindle-docker stack.
1212+First working release. Tested on Ubuntu Linux.
13131414### Added
1515- Docker Compose stack with OpenBao (vault), OpenBao proxy (AppRole sidecar), and Spindle (CI runner)
1616- One-time vault bootstrap script (`init-openbao.sh`) with interactive AppRole Secret ID TTL prompt
1717- `.env`-based configuration with documented variables and defaults; Compose loads it automatically
1818-- All images pinned to versioned SHA256 digests (OpenBao `2.5.2`, Go `1.23.12-alpine3.22`, Alpine `3.23.3`)
1919-- Spindle source pinned to `v1.13.0-alpha` with commit SHA verification at build time (`go mod verify` included)
1818+- All images pinned to versioned SHA256 digests (OpenBao `2.5.2`, Go `1.25.8-alpine3.23`, Alpine `3.23.3`)
1919+- Spindle source pinned to `v1.13.0-alpha` (commit `c3f60dc1`) with SHA verification at build time
2020+- CGO enabled in builder with `gcc`/`musl-dev` for go-sqlite3 support
2021- OpenBao port bound to `127.0.0.1` only — not reachable from the network
2122- `IPC_LOCK` capability on both OpenBao and OpenBao proxy to prevent secrets from swapping to disk
2222-- AppRole token file permissions hardened to `0600`
2323-- Pinned versions table in README
2424-- Early development warning in README
2323+- AppRole credentials owned by OpenBao user (uid 100) with `640` permissions; volume mounted `:ro`
2424+- AppRole credential handling documented in README (`:ro` tradeoff and alternative setup)
25252626[Unreleased]: https://tangled.org/daniel.gay/spindle-docker/compare/v0.1.0...HEAD
2727[0.1.0]: https://tangled.org/daniel.gay/spindle-docker/releases/tag/v0.1.0
+16-9
README.md
···11# spindle-docker
2233-> **Early development / personal project** — This stack was built for personal use and has not been tested across a wide range of environments. It may have rough edges or undocumented assumptions. Use it at your own risk.
33+> **Early development / personal project** — This stack was built for personal use and tested on Ubuntu Linux. It has not been tested across a wide range of environments and may have rough edges or undocumented assumptions. Use it at your own risk.
4455Docker Compose stack for self-hosting a [Tangled](https://tangled.org) spindle (CI runner) with [OpenBao](https://openbao.org) for secrets management.
66···5757docker compose up -d openbao
5858```
59596060+Wait until you see the following line in the logs before continuing (`docker compose logs -f openbao`):
6161+6262+```
6363+core: seal configuration missing, not initialized
6464+```
6565+6066**3. Initialize the vault** (once only)
61676268```bash
···6470./init-openbao.sh
6571```
66726767-The script fixes permissions, initialises the vault, and configures AppRole automatically. When prompted, choose a Secret ID TTL or press enter for no expiry.
7373+The script fixes permissions, initialises the vault, and configures AppRole automatically. It will print an **unseal key** and **root token** — save both somewhere safe, they are not stored anywhere and cannot be recovered. You will also be prompted to choose a Secret ID TTL (press enter for no expiry).
68746969-Save the **unseal key** and **root token** printed to stdout — they are not stored anywhere.
7575+**4. Start the full stack**
70767171-**4. Start the full stack**
7777+Once the init script completes successfully:
72787379```bash
7480docker compose up -d
···76827783## After a restart
78847979-OpenBao seals itself on every restart. Unseal it before the proxy and spindle can start:
8585+OpenBao seals itself on every restart. Run the unseal command once OpenBao is running (you can confirm it's ready when `docker compose logs openbao` shows `core: seal configuration missing, not initialized` or the container is healthy):
80868187```bash
8288docker compose exec openbao bao operator unseal <unseal_key>
8389```
84909191+The proxy and Spindle will start automatically once OpenBao is unsealed and healthy.
9292+8593## Verify
86948795```bash
8888-curl http://localhost:8201/v1/sys/health # OpenBao proxy
8989-curl http://localhost:6555/ # Spindle
9696+curl http://localhost:6555/ # Spindle (should return the spindle welcome page)
9097```
91989299## Architecture
···107114| Component | Version | Where |
108115|-----------|---------|--------|
109116| OpenBao | `2.5.2` | `docker-compose.yml` |
110110-| Go (builder) | `1.23.12-alpine3.22` | `Dockerfile` |
117117+| Go (builder) | `1.25.8-alpine3.23` | `Dockerfile` |
111118| Alpine (runtime) | `3.23.3` | `Dockerfile` |
112112-| Spindle source | `v1.13.0-alpha` (`3572988`) | `Dockerfile` |
119119+| Spindle source | `v1.13.0-alpha` (`c3f60dc1`) | `Dockerfile` |
113120114121To upgrade any component, update the tag/version and its corresponding `@sha256:...` digest (or commit SHA for Spindle). All versions are currently alpha — there are no stable Spindle releases yet.
115122