mirror of
https://github.com/foomo/squadron.git
synced 2026-06-28 22:20:09 +00:00
Merge pull request #140 from foomo/feature/docs2
Some checks failed
Test Branch / test (push) Has been cancelled
Some checks failed
Test Branch / test (push) Has been cancelled
docs: add gh pages
This commit is contained in:
17
.github/workflows/closed.yml
vendored
17
.github/workflows/closed.yml
vendored
@@ -1,17 +0,0 @@
|
||||
name: Cleanup Branch
|
||||
|
||||
on:
|
||||
pull_request:
|
||||
types: [ closed ]
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
jobs:
|
||||
delete:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: snnaplab/delete-branch-cache-action@v1
|
||||
with:
|
||||
# Specify explicitly because the ref at the time of merging will be a branch name such as 'main', 'develop'
|
||||
ref: refs/pull/${{ github.event.number }}/merge
|
||||
41
.github/workflows/docs.yml
vendored
Normal file
41
.github/workflows/docs.yml
vendored
Normal file
@@ -0,0 +1,41 @@
|
||||
name: Publish docs
|
||||
|
||||
on:
|
||||
push:
|
||||
tags:
|
||||
- v*.*.*
|
||||
workflow_dispatch:
|
||||
|
||||
permissions:
|
||||
pages: write
|
||||
contents: write
|
||||
id-token: write
|
||||
|
||||
jobs:
|
||||
docs:
|
||||
runs-on: ubuntu-latest
|
||||
environment:
|
||||
name: github-pages
|
||||
url: ${{ steps.deployment.outputs.page_url }}
|
||||
steps:
|
||||
- uses: actions/checkout@v6
|
||||
|
||||
- uses: oven-sh/setup-bun@v2
|
||||
|
||||
- name: Install dependencies
|
||||
working-directory: docs
|
||||
run: bun install --frozen-lockfile
|
||||
|
||||
- name: Build docs
|
||||
working-directory: docs
|
||||
run: bun run build
|
||||
|
||||
- uses: actions/configure-pages@v6
|
||||
|
||||
- uses: actions/upload-pages-artifact@v5
|
||||
with:
|
||||
path: docs/.vitepress/dist
|
||||
|
||||
- name: Deploy to GitHub Pages
|
||||
id: deployment
|
||||
uses: actions/deploy-pages@v5
|
||||
3
.gitignore
vendored
3
.gitignore
vendored
@@ -42,6 +42,9 @@ tmp/
|
||||
|
||||
## Vitepress
|
||||
!docs/.vitepress
|
||||
docs/.vitepress/*
|
||||
!docs/.vitepress/theme/
|
||||
!docs/.vitepress/config.mts
|
||||
|
||||
## Golang
|
||||
go.work
|
||||
|
||||
@@ -4,7 +4,7 @@ project_name: squadron
|
||||
|
||||
builds:
|
||||
- binary: squadron
|
||||
main: ./cmd/main.go
|
||||
main: ./cmd/squadron
|
||||
env:
|
||||
- CGO_ENABLED=0
|
||||
flags:
|
||||
@@ -12,7 +12,7 @@ builds:
|
||||
- -tags=safe
|
||||
ldflags:
|
||||
- -s -w
|
||||
- -X github.com/foomo/squadron/cmd/actions.version={{.Version}}
|
||||
- -X github.com/foomo/squadron/internal/cli.version={{.Version}}
|
||||
goos:
|
||||
- windows
|
||||
- darwin
|
||||
|
||||
6
Makefile
6
Makefile
@@ -88,13 +88,13 @@ test.update:
|
||||
build:
|
||||
@mkdir -p bin
|
||||
@echo "〉building bin/squadron"
|
||||
@go build -tags=safe -o bin/squadron cmd/main.go
|
||||
@go build -tags=safe -o bin/squadron ./cmd/squadron
|
||||
|
||||
.PHONY: install
|
||||
## Install binary
|
||||
install:
|
||||
@echo "〉installing ${GOPATH}/bin/squadron"
|
||||
@go build -tags=safe -o ${GOPATH}/bin/squadron cmd/main.go
|
||||
@go build -tags=safe -o ${GOPATH}/bin/squadron ./cmd/squadron
|
||||
|
||||
### Security
|
||||
|
||||
@@ -140,7 +140,7 @@ docs: docs.cli
|
||||
## Generate cli
|
||||
docs.cli:
|
||||
@echo "〉generating cli reference"
|
||||
@go run scripts/cmd-reference/main.go
|
||||
@go run ./cmd/squadron-docs
|
||||
|
||||
.PHONY: godocs
|
||||
## Open go docs
|
||||
|
||||
166
README.md
166
README.md
@@ -1,9 +1,8 @@
|
||||
[](https://github.com/foomo/squadron/releases)
|
||||
[](https://github.com/foomo/squadron/releases)
|
||||
[](https://hub.docker.com/r/foomo/squadron)
|
||||
[](https://github.com/foomo/squadron)
|
||||
[](https://goreportcard.com/report/github.com/foomo/squadron)
|
||||
[](https://godoc.org/github.com/foomo/squadron)
|
||||
[](https://goreportcard.com/report/github.com/foomo/squadron)
|
||||
[](https://godoc.org/github.com/foomo/squadron)
|
||||
[](https://github.com/foomo/squadron/releases)
|
||||
[](https://hub.docker.com/r/foomo/squadron)
|
||||
[](https://github.com/foomo/squadron)
|
||||
|
||||
<p align="center">
|
||||
<img alt="foomo/squadron" src="docs/public/logo.png" width="400" height="400"/>
|
||||
@@ -11,125 +10,56 @@
|
||||
|
||||
# Squadron
|
||||
|
||||
Application for managing kubernetes microservice environments.
|
||||
**Docker Compose for Kubernetes.**
|
||||
|
||||
Use it, if a helm chart is not enough in order to organize multiple services into an effective squadron.
|
||||
Squadron is a CLI that orchestrates multiple Helm charts and Docker image builds
|
||||
as one cohesive deployment, driven by a single declarative `squadron.yaml`. It
|
||||
brings the familiar `docker-compose` workflow — define your services once, bring
|
||||
the whole stack up with one command — to Kubernetes, where each service is a real
|
||||
Helm release. In production, a squadron is just another set of Helm charts.
|
||||
|
||||
Another way to think of it would be `helm-compose`, because it makes k8s and helm way more approachable, not matter if it is development or production (where it just becomes another helm chart)
|
||||
📖 **[Read the documentation →](https://foomo.github.io/squadron)**
|
||||
|
||||
## Configuration `squadron.yaml`
|
||||
|
||||
Configure your squadron
|
||||
|
||||
```yaml
|
||||
# https://raw.githubusercontent.com/foomo/squadron/refs/heads/main/squadron.schema.json
|
||||
version: '2.3'
|
||||
|
||||
# squadron template vars
|
||||
vars: {}
|
||||
|
||||
# helm global vars
|
||||
global: {}
|
||||
|
||||
# squadron definitions
|
||||
squadron:
|
||||
# squadron units
|
||||
site:
|
||||
# squadron unit
|
||||
frontend:
|
||||
# optional release name override
|
||||
name: my-frontend
|
||||
# optional release namespace override
|
||||
namespace: my-namespace
|
||||
# helm chart definition
|
||||
chart:
|
||||
name: mychart
|
||||
version: 0.1.0
|
||||
repository: http://helm.mycompany.com/repository
|
||||
# container bakes
|
||||
bakes:
|
||||
service:
|
||||
tags:
|
||||
- docker.mycompany.com/mycomapny/frontend:latest
|
||||
dockerfile: Dockerfile
|
||||
args:
|
||||
foo: foo
|
||||
bar: bar
|
||||
# container builds
|
||||
builds:
|
||||
service:
|
||||
tag: latest
|
||||
file: Dockerfile
|
||||
image: docker.mycompany.com/mycomapny/frontend
|
||||
build_arg:
|
||||
- "foo=foo"
|
||||
- "bar=bar"
|
||||
# helm chart values
|
||||
values:
|
||||
image: docker.mycompany.com/mycomapny/frontend:latest
|
||||
# squadron unit
|
||||
backend:
|
||||
# helm chart definition
|
||||
chart: <% env "PROJECT_ROOT" %>/path/to/chart
|
||||
# kustomize path
|
||||
kustomize: <% env "PROJECT_ROOT" %>/path/to/kustomize
|
||||
# container bakes
|
||||
bakes:
|
||||
service:
|
||||
tags:
|
||||
- docker.mycompany.com/mycomapny/backend:latest
|
||||
dockerfile: Dockerfile
|
||||
args:
|
||||
foo: foo
|
||||
bar: bar
|
||||
# container builds
|
||||
builds:
|
||||
service:
|
||||
tag: latest
|
||||
file: Dockerfile
|
||||
image: docker.mycompany.com/mycomapny/backend
|
||||
build_arg:
|
||||
- "foo=foo"
|
||||
- "bar=bar"
|
||||
# helm chart values
|
||||
values:
|
||||
image: docker.mycompany.com/mycomapny/backend:latest
|
||||
```
|
||||
|
||||
## Usage
|
||||
## Install
|
||||
|
||||
```shell
|
||||
$ squadron help
|
||||
Docker compose for kubernetes
|
||||
|
||||
Usage:
|
||||
squadron [command]
|
||||
|
||||
Available Commands:
|
||||
bake bake or rebake squadron units
|
||||
build build or rebuild squadron units
|
||||
completion Generate completion script
|
||||
config generate and view the squadron config
|
||||
diff shows the diff between the installed and local chart
|
||||
down uninstalls the squadron or given units
|
||||
help Help about any command
|
||||
list list squadron units
|
||||
push pushes the squadron or given units
|
||||
rollback rolls back the squadron or given units
|
||||
schema generate squadron json schema
|
||||
status installs the squadron or given units
|
||||
template render chart templates locally and display the output
|
||||
up installs the squadron or given units
|
||||
version show version information
|
||||
|
||||
Flags:
|
||||
-d, --debug show all output
|
||||
-f, --file strings specify alternative squadron files (default [squadron.yaml])
|
||||
-h, --help help for squadron
|
||||
|
||||
Use "squadron [command] --help" for more information about a command.
|
||||
go install github.com/foomo/squadron/cmd/squadron@latest
|
||||
```
|
||||
|
||||
See the [installation guide](https://foomo.github.io/squadron/guide/installation)
|
||||
for release binaries and the Docker image.
|
||||
|
||||
## Example
|
||||
|
||||
```yaml
|
||||
# squadron.yaml
|
||||
version: '2.3'
|
||||
squadron:
|
||||
storefinder:
|
||||
backend:
|
||||
chart: <% env "PROJECT_ROOT" %>/charts/backend
|
||||
builds:
|
||||
default:
|
||||
image: docker.mycompany.com/storefinder/backend
|
||||
tag: latest
|
||||
context: ./app
|
||||
values:
|
||||
image:
|
||||
repository: <% .Squadron.storefinder.backend.builds.default.image %>
|
||||
tag: <% .Squadron.storefinder.backend.builds.default.tag | quote %>
|
||||
```
|
||||
|
||||
```shell
|
||||
squadron build # build the images
|
||||
squadron up # install / upgrade the releases
|
||||
squadron status # check release status
|
||||
squadron down # tear it down
|
||||
```
|
||||
|
||||
See the [Quick Start](https://foomo.github.io/squadron/guide/quickstart) and the
|
||||
[configuration reference](https://foomo.github.io/squadron/guide/configuration)
|
||||
for the full picture.
|
||||
|
||||
## How to Contribute
|
||||
|
||||
Contributions are welcome! Please read the [contributing guide](docs/CONTRIBUTING.md).
|
||||
|
||||
@@ -7,22 +7,22 @@ export PROJECT_ROOT=$(PWD)
|
||||
.PHONY: list
|
||||
## Show config
|
||||
list:
|
||||
@go run ../../cmd/main.go list
|
||||
@go run ../../cmd/squadron list
|
||||
|
||||
.PHONY: config
|
||||
## Show config
|
||||
config:
|
||||
@go run ../../cmd/main.go config
|
||||
@go run ../../cmd/squadron config
|
||||
|
||||
.PHONY: build
|
||||
## Show config
|
||||
build:
|
||||
@go run ../../cmd/main.go build
|
||||
@go run ../../cmd/squadron build
|
||||
|
||||
.PHONY: template
|
||||
## Show config
|
||||
template:
|
||||
@go run ../../cmd/main.go template
|
||||
@go run ../../cmd/squadron template
|
||||
|
||||
## === Utils ===
|
||||
|
||||
|
||||
@@ -7,22 +7,22 @@ export PROJECT_ROOT=$(PWD)
|
||||
.PHONY: list
|
||||
## Show config
|
||||
list:
|
||||
@go run ../../cmd/main.go list
|
||||
@go run ../../cmd/squadron list
|
||||
|
||||
.PHONY: config
|
||||
## Show config
|
||||
config:
|
||||
@go run ../../cmd/main.go config
|
||||
@go run ../../cmd/squadron config
|
||||
|
||||
.PHONY: build
|
||||
## Show config
|
||||
build:
|
||||
@go run ../../cmd/main.go build
|
||||
@go run ../../cmd/squadron build
|
||||
|
||||
.PHONY: template
|
||||
## Show config
|
||||
template:
|
||||
@go run ../../cmd/main.go template
|
||||
@go run ../../cmd/squadron template
|
||||
|
||||
## === Utils ===
|
||||
|
||||
|
||||
@@ -9,22 +9,22 @@ files=$(shell find . -name 'squadron.yaml' | tail -r | xargs echo -n | tr " ", "
|
||||
.PHONY: list
|
||||
## Show config
|
||||
list:
|
||||
@go run ../../cmd/main.go -f ${files} list --builds --charts
|
||||
@go run ../../cmd/squadron -f ${files} list --builds --charts
|
||||
|
||||
.PHONY: config
|
||||
## Show config
|
||||
config:
|
||||
@go run ../../cmd/main.go -f ${files} config
|
||||
@go run ../../cmd/squadron -f ${files} config
|
||||
|
||||
.PHONY: build
|
||||
## Show config
|
||||
build:
|
||||
@go run ../../cmd/main.go -f ${files} build
|
||||
@go run ../../cmd/squadron -f ${files} build
|
||||
|
||||
.PHONY: template
|
||||
## Show config
|
||||
template:
|
||||
@go run ../../cmd/main.go -f ${files} template
|
||||
@go run ../../cmd/squadron -f ${files} template
|
||||
|
||||
## === Utils ===
|
||||
|
||||
|
||||
@@ -18,7 +18,10 @@
|
||||
"linter": {
|
||||
"enabled": true,
|
||||
"rules": {
|
||||
"recommended": true
|
||||
"recommended": true,
|
||||
"complexity": {
|
||||
"noImportantStyles": "off"
|
||||
}
|
||||
}
|
||||
},
|
||||
"json": {
|
||||
|
||||
@@ -1,9 +0,0 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"github.com/foomo/squadron/cmd/actions"
|
||||
)
|
||||
|
||||
func main() {
|
||||
actions.Execute()
|
||||
}
|
||||
@@ -8,7 +8,7 @@ import (
|
||||
"path/filepath"
|
||||
"strings"
|
||||
|
||||
"github.com/foomo/squadron/cmd/actions"
|
||||
"github.com/foomo/squadron/internal/cli"
|
||||
"github.com/spf13/cobra/doc"
|
||||
)
|
||||
|
||||
@@ -28,7 +28,7 @@ func main() {
|
||||
log.Fatal(err)
|
||||
}
|
||||
|
||||
c := actions.NewRoot()
|
||||
c := cli.NewRoot()
|
||||
c.DisableAutoGenTag = true
|
||||
|
||||
filePrepender := func(filename string) string {
|
||||
9
cmd/squadron/main.go
Normal file
9
cmd/squadron/main.go
Normal file
@@ -0,0 +1,9 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"github.com/foomo/squadron/internal/cli"
|
||||
)
|
||||
|
||||
func main() {
|
||||
cli.Execute()
|
||||
}
|
||||
@@ -1,59 +1,111 @@
|
||||
import { defineConfig } from "vitepress";
|
||||
import {
|
||||
groupIconMdPlugin,
|
||||
groupIconVitePlugin,
|
||||
} from "vitepress-plugin-group-icons";
|
||||
import llmstxt, {
|
||||
copyOrDownloadAsMarkdownButtons,
|
||||
} from "vitepress-plugin-llms";
|
||||
import { withSidebar } from "vitepress-sidebar";
|
||||
|
||||
const version = "latest";
|
||||
|
||||
const vitepressConfig = {
|
||||
export default defineConfig({
|
||||
title: "Squadron",
|
||||
description: "Docker Compose for Kubernetes",
|
||||
lang: "en-US",
|
||||
cleanUrls: true,
|
||||
lastUpdated: true,
|
||||
appearance: "dark",
|
||||
ignoreDeadLinks: false,
|
||||
base: "/squadron/",
|
||||
sitemap: {
|
||||
hostname: "https://foomo.github.io/squadron",
|
||||
},
|
||||
themeConfig: {
|
||||
logo: "/logo.png",
|
||||
outline: [2, 4],
|
||||
nav: [
|
||||
{ text: "Guide", link: "/guide/introduction" },
|
||||
{ text: "Reference", link: "/reference/" },
|
||||
],
|
||||
sidebar: [
|
||||
{
|
||||
text: "Guide",
|
||||
link: "/guide/",
|
||||
items: [
|
||||
{ text: "Introduction", link: "/guide/introduction" },
|
||||
{ text: "Installation", link: "/guide/installation" },
|
||||
{ text: "Quick Start", link: "/guide/quickstart" },
|
||||
{ text: "Core Concepts", link: "/guide/concepts" },
|
||||
{ text: "Configuration", link: "/guide/configuration" },
|
||||
],
|
||||
},
|
||||
{
|
||||
text: `${version}`,
|
||||
text: "Reference",
|
||||
items: [
|
||||
{ text: "Overview", link: "/reference/" },
|
||||
{
|
||||
text: "CLI",
|
||||
link: "/reference/cli/squadron",
|
||||
collapsed: true,
|
||||
items: [
|
||||
{ text: "squadron", link: "/reference/cli/squadron" },
|
||||
{ text: "up", link: "/reference/cli/squadron_up" },
|
||||
{ text: "down", link: "/reference/cli/squadron_down" },
|
||||
{ text: "diff", link: "/reference/cli/squadron_diff" },
|
||||
{ text: "status", link: "/reference/cli/squadron_status" },
|
||||
{ text: "rollback", link: "/reference/cli/squadron_rollback" },
|
||||
{ text: "bake", link: "/reference/cli/squadron_bake" },
|
||||
{ text: "build", link: "/reference/cli/squadron_build" },
|
||||
{ text: "push", link: "/reference/cli/squadron_push" },
|
||||
{ text: "list", link: "/reference/cli/squadron_list" },
|
||||
{ text: "config", link: "/reference/cli/squadron_config" },
|
||||
{ text: "template", link: "/reference/cli/squadron_template" },
|
||||
{ text: "schema", link: "/reference/cli/squadron_schema" },
|
||||
{
|
||||
text: "completion",
|
||||
link: "/reference/cli/squadron_completion",
|
||||
},
|
||||
{ text: "version", link: "/reference/cli/squadron_version" },
|
||||
],
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
text: "Contributing",
|
||||
collapsed: true,
|
||||
items: [
|
||||
{
|
||||
text: "Release Notes",
|
||||
link: "https://github.com/foomo/squadron/releases",
|
||||
text: "Guideline",
|
||||
link: "/CONTRIBUTING.md",
|
||||
},
|
||||
{
|
||||
text: "Code of conduct",
|
||||
link: "/CODE_OF_CONDUCT.md",
|
||||
},
|
||||
{
|
||||
text: "Security guidelines",
|
||||
link: "/SECURITY.md",
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
outline: {
|
||||
level: [2, 3],
|
||||
},
|
||||
socialLinks: [
|
||||
{ icon: "github", link: "https://github.com/foomo/squadron" },
|
||||
],
|
||||
editLink: {
|
||||
pattern: "https://github.com/foomo/squadron/edit/main/docs/:path",
|
||||
text: "Suggest changes to this page",
|
||||
},
|
||||
search: {
|
||||
provider: "local",
|
||||
},
|
||||
footer: {
|
||||
message: "Released under the MIT License.",
|
||||
message:
|
||||
'Made with ♥ <a href="https://www.foomo.org">foomo</a> by <a href="https://www.bestbytes.com">bestbytes</a>',
|
||||
},
|
||||
},
|
||||
markdown: {
|
||||
// https://github.com/vuejs/vitepress/discussions/3724
|
||||
theme: {
|
||||
light: "catppuccin-latte",
|
||||
dark: "catppuccin-frappe",
|
||||
},
|
||||
socialLinks: [
|
||||
{
|
||||
icon: "github",
|
||||
link: "https://github.com/foomo/squadron",
|
||||
},
|
||||
],
|
||||
},
|
||||
head: [
|
||||
["meta", { name: "theme-color", content: "#ffffff" }],
|
||||
["link", { rel: "icon", href: "/logo.png" }],
|
||||
["meta", { name: "author", content: "foomo by bestbytes" }],
|
||||
// OpenGraph
|
||||
["meta", { property: "og:title", content: "foomo/squadron" }],
|
||||
[
|
||||
"meta",
|
||||
@@ -87,35 +139,4 @@ const vitepressConfig = {
|
||||
},
|
||||
],
|
||||
],
|
||||
markdown: {
|
||||
theme: {
|
||||
dark: "one-dark-pro",
|
||||
light: "github-light",
|
||||
},
|
||||
config(md) {
|
||||
md.use(groupIconMdPlugin);
|
||||
md.use(copyOrDownloadAsMarkdownButtons);
|
||||
},
|
||||
},
|
||||
vite: {
|
||||
plugins: [
|
||||
groupIconVitePlugin(),
|
||||
llmstxt({
|
||||
excludeIndexPage: false,
|
||||
}),
|
||||
],
|
||||
},
|
||||
sitemap: {
|
||||
hostname: "https://foomo.github.io/squadron",
|
||||
},
|
||||
ignoreDeadLinks: true,
|
||||
};
|
||||
|
||||
export default defineConfig(
|
||||
withSidebar(vitepressConfig, {
|
||||
useTitleFromFrontmatter: true,
|
||||
frontmatterOrderDefaultValue: 10,
|
||||
useFolderTitleFromIndexFile: true,
|
||||
sortMenusByFrontmatterOrder: true,
|
||||
}),
|
||||
);
|
||||
});
|
||||
|
||||
91
docs/.vitepress/theme/custom.css
Normal file
91
docs/.vitepress/theme/custom.css
Normal file
@@ -0,0 +1,91 @@
|
||||
@font-face {
|
||||
font-family: "Bebas Neue";
|
||||
src: url("/fonts/BebasNeue-Regular.ttf") format("truetype");
|
||||
font-weight: 400;
|
||||
font-style: normal;
|
||||
font-display: swap;
|
||||
}
|
||||
|
||||
/* Inter variable (normal) */
|
||||
@font-face {
|
||||
font-family: "Inter";
|
||||
src: url("/fonts/Inter-VariableFont_opsz,wght.ttf") format("truetype");
|
||||
font-weight: 100 900;
|
||||
font-optical-sizing: auto;
|
||||
font-style: normal;
|
||||
font-display: swap;
|
||||
}
|
||||
|
||||
/* Inter variable (italic) */
|
||||
@font-face {
|
||||
font-family: "Inter";
|
||||
src: url("/fonts/Inter-Italic-VariableFont_opsz,wght.ttf") format("truetype");
|
||||
font-weight: 100 900;
|
||||
font-optical-sizing: auto;
|
||||
font-style: italic;
|
||||
font-display: swap;
|
||||
}
|
||||
|
||||
/* JetBrains Mono variable (normal) */
|
||||
@font-face {
|
||||
font-family: "JetBrains Mono";
|
||||
src: url("/fonts/JetBrainsMono-VariableFont_wght.ttf") format("truetype");
|
||||
font-weight: 100 900;
|
||||
font-stretch: 100%;
|
||||
font-style: normal;
|
||||
font-display: swap;
|
||||
}
|
||||
|
||||
/* JetBrains Mono variable (italic) */
|
||||
@font-face {
|
||||
font-family: "JetBrains Mono";
|
||||
src: url("/fonts/JetBrainsMono-Italic-VariableFont_wght.ttf")
|
||||
format("truetype");
|
||||
font-weight: 100 900;
|
||||
font-stretch: 100%;
|
||||
font-style: italic;
|
||||
font-display: swap;
|
||||
}
|
||||
|
||||
:root {
|
||||
--vp-font-family-base:
|
||||
"Inter", ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont,
|
||||
"Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
|
||||
--vp-font-family-mono:
|
||||
"JetBrains Mono", ui-monospace, SFMono-Regular, "SF Mono", Monaco, Consolas,
|
||||
"Liberation Mono", "Courier New", monospace;
|
||||
--vp-font-family-display:
|
||||
"Bebas Neue", "Inter", ui-sans-serif, system-ui, -apple-system,
|
||||
BlinkMacSystemFont, sans-serif;
|
||||
}
|
||||
|
||||
.VPNavBarTitle .logo {
|
||||
height: 36px !important;
|
||||
width: auto !important;
|
||||
}
|
||||
|
||||
h1,
|
||||
.vp-doc h1 {
|
||||
font-family: var(--vp-font-family-display);
|
||||
font-weight: 400;
|
||||
letter-spacing: 2px;
|
||||
text-transform: uppercase;
|
||||
}
|
||||
|
||||
.home-page .section-title {
|
||||
font-family: var(--vp-font-family-display);
|
||||
font-weight: 400 !important;
|
||||
letter-spacing: 2px !important;
|
||||
text-transform: uppercase !important;
|
||||
-webkit-font-smoothing: antialiased;
|
||||
-moz-osx-font-smoothing: grayscale;
|
||||
text-rendering: optimizeLegibility;
|
||||
}
|
||||
|
||||
.hero-title,
|
||||
.title-main {
|
||||
font-family: var(--vp-font-family-display);
|
||||
font-weight: 400;
|
||||
letter-spacing: 4px;
|
||||
text-transform: uppercase;
|
||||
}
|
||||
9
docs/.vitepress/theme/index.ts
Normal file
9
docs/.vitepress/theme/index.ts
Normal file
@@ -0,0 +1,9 @@
|
||||
import type { Theme } from "vitepress";
|
||||
import DefaultTheme from "vitepress/theme";
|
||||
import "@catppuccin/vitepress/theme/frappe/blue.css";
|
||||
|
||||
import "./custom.css";
|
||||
|
||||
export default {
|
||||
extends: DefaultTheme,
|
||||
} satisfies Theme;
|
||||
@@ -5,11 +5,11 @@
|
||||
"": {
|
||||
"name": "docs",
|
||||
"devDependencies": {
|
||||
"@catppuccin/vitepress": "^0.1.2",
|
||||
"micromark-util-decode-string": "2.0.1",
|
||||
"vitepress": "1.6.4",
|
||||
"vitepress-plugin-group-icons": "1.6.5",
|
||||
"vitepress-plugin-llms": "1.9.3",
|
||||
"vitepress-sidebar": "1.33.1",
|
||||
},
|
||||
},
|
||||
},
|
||||
@@ -60,6 +60,8 @@
|
||||
|
||||
"@babel/types": ["@babel/types@7.28.5", "", { "dependencies": { "@babel/helper-string-parser": "^7.27.1", "@babel/helper-validator-identifier": "^7.28.5" } }, "sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA=="],
|
||||
|
||||
"@catppuccin/vitepress": ["@catppuccin/vitepress@0.1.2", "", { "peerDependencies": { "typescript": "^5.0.0" } }, "sha512-dqhgo6U6GWbgh3McAgwemUC8Y2Aj48rRcQx/9iuPzBPAgo7NA3yi7ZcR0wolAENMmoOMAHBV+rz/5DfiGxtZLA=="],
|
||||
|
||||
"@docsearch/css": ["@docsearch/css@3.8.2", "", {}, "sha512-y05ayQFyUmCXze79+56v/4HpycYF3uFqB78pLPrSV5ZKAlDuIAAJNhaRi8tTdRNXh05yxX/TyNnzD6LwSM89vQ=="],
|
||||
|
||||
"@docsearch/js": ["@docsearch/js@3.8.2", "", { "dependencies": { "@docsearch/react": "3.8.2", "preact": "^10.0.0" } }, "sha512-Q5wY66qHn0SwA7Taa0aDbHiJvaFJLOJyHmooQ7y8hlwwQLQ/5WwCcoX0g7ii04Qi2DJlHsd0XXzJ8Ypw9+9YmQ=="],
|
||||
@@ -126,8 +128,6 @@
|
||||
|
||||
"@isaacs/brace-expansion": ["@isaacs/brace-expansion@5.0.0", "", { "dependencies": { "@isaacs/balanced-match": "^4.0.1" } }, "sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA=="],
|
||||
|
||||
"@isaacs/cliui": ["@isaacs/cliui@8.0.2", "", { "dependencies": { "string-width": "^5.1.2", "string-width-cjs": "npm:string-width@^4.2.0", "strip-ansi": "^7.0.1", "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", "wrap-ansi": "^8.1.0", "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" } }, "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA=="],
|
||||
|
||||
"@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.5.5", "", {}, "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og=="],
|
||||
|
||||
"@rollup/rollup-android-arm-eabi": ["@rollup/rollup-android-arm-eabi@4.53.3", "", { "os": "android", "cpu": "arm" }, "sha512-mRSi+4cBjrRLoaal2PnqH82Wqyb+d3HsPUN/W+WslCXsZsyHa9ZeQQX/pQsZaVIWDkPcpV6jJ+3KLbTbgnwv8w=="],
|
||||
@@ -280,8 +280,6 @@
|
||||
|
||||
"copy-anything": ["copy-anything@4.0.5", "", { "dependencies": { "is-what": "^5.2.0" } }, "sha512-7Vv6asjS4gMOuILabD3l739tsaxFQmC+a7pLZm02zyvs8p977bL3zEgq3yDk5rn9B0PbYgIv++jmHcuUab4RhA=="],
|
||||
|
||||
"cross-spawn": ["cross-spawn@7.0.6", "", { "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA=="],
|
||||
|
||||
"csstype": ["csstype@3.2.3", "", {}, "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ=="],
|
||||
|
||||
"debug": ["debug@4.4.3", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="],
|
||||
@@ -292,8 +290,6 @@
|
||||
|
||||
"devlop": ["devlop@1.1.0", "", { "dependencies": { "dequal": "^2.0.0" } }, "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA=="],
|
||||
|
||||
"eastasianwidth": ["eastasianwidth@0.2.0", "", {}, "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA=="],
|
||||
|
||||
"emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="],
|
||||
|
||||
"emoji-regex-xs": ["emoji-regex-xs@1.0.0", "", {}, "sha512-LRlerrMYoIDrT6jgpeZ2YYl/L8EulRTt5hQcYjy5AInh7HWXKimpqx68aknBFpGL2+/IcogTcaydJEgaTmOpDg=="],
|
||||
@@ -318,16 +314,12 @@
|
||||
|
||||
"focus-trap": ["focus-trap@7.6.6", "", { "dependencies": { "tabbable": "^6.3.0" } }, "sha512-v/Z8bvMCajtx4mEXmOo7QEsIzlIOqRXTIwgUfsFOF9gEsespdbD0AkPIka1bSXZ8Y8oZ+2IVDQZePkTfEHZl7Q=="],
|
||||
|
||||
"foreground-child": ["foreground-child@3.3.1", "", { "dependencies": { "cross-spawn": "^7.0.6", "signal-exit": "^4.0.1" } }, "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw=="],
|
||||
|
||||
"format": ["format@0.2.2", "", {}, "sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww=="],
|
||||
|
||||
"fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="],
|
||||
|
||||
"get-caller-file": ["get-caller-file@2.0.5", "", {}, "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg=="],
|
||||
|
||||
"glob": ["glob@11.1.0", "", { "dependencies": { "foreground-child": "^3.3.1", "jackspeak": "^4.1.1", "minimatch": "^10.1.1", "minipass": "^7.1.2", "package-json-from-dist": "^1.0.0", "path-scurry": "^2.0.0" }, "bin": { "glob": "dist/esm/bin.mjs" } }, "sha512-vuNwKSaKiqm7g0THUBu2x7ckSs3XJLXE+2ssL7/MfTGPLLcrJQ/4Uq1CjPTtO5cCIiRxqvN6Twy1qOwhL0Xjcw=="],
|
||||
|
||||
"gray-matter": ["gray-matter@4.0.3", "", { "dependencies": { "js-yaml": "^3.13.1", "kind-of": "^6.0.2", "section-matter": "^1.0.0", "strip-bom-string": "^1.0.0" } }, "sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q=="],
|
||||
|
||||
"hast-util-to-html": ["hast-util-to-html@9.0.5", "", { "dependencies": { "@types/hast": "^3.0.0", "@types/unist": "^3.0.0", "ccount": "^2.0.0", "comma-separated-tokens": "^2.0.0", "hast-util-whitespace": "^3.0.0", "html-void-elements": "^3.0.0", "mdast-util-to-hast": "^13.0.0", "property-information": "^7.0.0", "space-separated-tokens": "^2.0.0", "stringify-entities": "^4.0.0", "zwitch": "^2.0.4" } }, "sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw=="],
|
||||
@@ -346,10 +338,6 @@
|
||||
|
||||
"is-what": ["is-what@5.5.0", "", {}, "sha512-oG7cgbmg5kLYae2N5IVd3jm2s+vldjxJzK1pcu9LfpGuQ93MQSzo0okvRna+7y5ifrD+20FE8FvjusyGaz14fw=="],
|
||||
|
||||
"isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="],
|
||||
|
||||
"jackspeak": ["jackspeak@4.1.1", "", { "dependencies": { "@isaacs/cliui": "^8.0.2" } }, "sha512-zptv57P3GpL+O0I7VdMJNBZCu+BPHVQUk55Ft8/QCJjTVxrnJHuVuX/0Bl2A6/+2oyR/ZMEuFKwmzqqZ/U5nPQ=="],
|
||||
|
||||
"js-yaml": ["js-yaml@3.14.2", "", { "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg=="],
|
||||
|
||||
"kind-of": ["kind-of@6.0.3", "", {}, "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw=="],
|
||||
@@ -358,8 +346,6 @@
|
||||
|
||||
"longest-streak": ["longest-streak@3.1.0", "", {}, "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g=="],
|
||||
|
||||
"lru-cache": ["lru-cache@11.2.4", "", {}, "sha512-B5Y16Jr9LB9dHVkh6ZevG+vAbOsNOYCX+sXvFWFu7B3Iz5mijW3zdbMyhsh8ANd2mSWBYdJgnqi+mL7/LrOPYg=="],
|
||||
|
||||
"magic-string": ["magic-string@0.30.21", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.5" } }, "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ=="],
|
||||
|
||||
"mark.js": ["mark.js@8.11.1", "", {}, "sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ=="],
|
||||
@@ -430,8 +416,6 @@
|
||||
|
||||
"minimatch": ["minimatch@10.1.1", "", { "dependencies": { "@isaacs/brace-expansion": "^5.0.0" } }, "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ=="],
|
||||
|
||||
"minipass": ["minipass@7.1.2", "", {}, "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw=="],
|
||||
|
||||
"minisearch": ["minisearch@7.2.0", "", {}, "sha512-dqT2XBYUOZOiC5t2HRnwADjhNS2cecp9u+TJRiJ1Qp/f5qjkeT5APcGPjHw+bz89Ms8Jp+cG4AlE+QZ/QnDglg=="],
|
||||
|
||||
"mitt": ["mitt@3.0.1", "", {}, "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw=="],
|
||||
@@ -444,14 +428,8 @@
|
||||
|
||||
"oniguruma-to-es": ["oniguruma-to-es@3.1.1", "", { "dependencies": { "emoji-regex-xs": "^1.0.0", "regex": "^6.0.1", "regex-recursion": "^6.0.2" } }, "sha512-bUH8SDvPkH3ho3dvwJwfonjlQ4R80vjyvrU8YpxuROddv55vAEJrTuCuCVUhhsHbtlD9tGGbaNApGQckXhS8iQ=="],
|
||||
|
||||
"package-json-from-dist": ["package-json-from-dist@1.0.1", "", {}, "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw=="],
|
||||
|
||||
"package-manager-detector": ["package-manager-detector@1.6.0", "", {}, "sha512-61A5ThoTiDG/C8s8UMZwSorAGwMJ0ERVGj2OjoW5pAalsNOg15+iQiPzrLJ4jhZ1HJzmC2PIHT2oEiH3R5fzNA=="],
|
||||
|
||||
"path-key": ["path-key@3.1.1", "", {}, "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="],
|
||||
|
||||
"path-scurry": ["path-scurry@2.0.1", "", { "dependencies": { "lru-cache": "^11.0.0", "minipass": "^7.1.2" } }, "sha512-oWyT4gICAu+kaA7QWk/jvCHWarMKNs6pXOGWKDTr7cw4IGcUbW+PeTfbaQiLGheFRpjo6O9J0PmyMfQPjH71oA=="],
|
||||
|
||||
"path-to-regexp": ["path-to-regexp@8.3.0", "", {}, "sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA=="],
|
||||
|
||||
"pathe": ["pathe@2.0.3", "", {}, "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w=="],
|
||||
@@ -472,8 +450,6 @@
|
||||
|
||||
"punycode.js": ["punycode.js@2.3.1", "", {}, "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA=="],
|
||||
|
||||
"qsu": ["qsu@1.10.4", "", {}, "sha512-v5RhwvHMkDdbXEaAxQh5re8q7DiG6EE70+CNwYVA6wZsa4gUrpur+D8lIO3PrzeCj3azc/S79X5v3BH8ILfr9A=="],
|
||||
|
||||
"regex": ["regex@6.1.0", "", { "dependencies": { "regex-utilities": "^2.3.0" } }, "sha512-6VwtthbV4o/7+OaAF9I5L5V3llLEsoPyq9P1JVXkedTP33c7MfCG0/5NOPcSJn0TzXcG9YUrR0gQSWioew3LDg=="],
|
||||
|
||||
"regex-recursion": ["regex-recursion@6.0.2", "", { "dependencies": { "regex-utilities": "^2.3.0" } }, "sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg=="],
|
||||
@@ -498,14 +474,8 @@
|
||||
|
||||
"section-matter": ["section-matter@1.0.0", "", { "dependencies": { "extend-shallow": "^2.0.1", "kind-of": "^6.0.0" } }, "sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA=="],
|
||||
|
||||
"shebang-command": ["shebang-command@2.0.0", "", { "dependencies": { "shebang-regex": "^3.0.0" } }, "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA=="],
|
||||
|
||||
"shebang-regex": ["shebang-regex@3.0.0", "", {}, "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="],
|
||||
|
||||
"shiki": ["shiki@2.5.0", "", { "dependencies": { "@shikijs/core": "2.5.0", "@shikijs/engine-javascript": "2.5.0", "@shikijs/engine-oniguruma": "2.5.0", "@shikijs/langs": "2.5.0", "@shikijs/themes": "2.5.0", "@shikijs/types": "2.5.0", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4" } }, "sha512-mI//trrsaiCIPsja5CNfsyNOqgAZUb6VpJA+340toL42UpzQlXpwRV9nch69X6gaUxrr9kaOOa6e3y3uAkGFxQ=="],
|
||||
|
||||
"signal-exit": ["signal-exit@4.1.0", "", {}, "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw=="],
|
||||
|
||||
"source-map-js": ["source-map-js@1.2.1", "", {}, "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA=="],
|
||||
|
||||
"space-separated-tokens": ["space-separated-tokens@2.0.2", "", {}, "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q=="],
|
||||
@@ -516,14 +486,10 @@
|
||||
|
||||
"string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="],
|
||||
|
||||
"string-width-cjs": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="],
|
||||
|
||||
"stringify-entities": ["stringify-entities@4.0.4", "", { "dependencies": { "character-entities-html4": "^2.0.0", "character-entities-legacy": "^3.0.0" } }, "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg=="],
|
||||
|
||||
"strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="],
|
||||
|
||||
"strip-ansi-cjs": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="],
|
||||
|
||||
"strip-bom-string": ["strip-bom-string@1.0.0", "", {}, "sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g=="],
|
||||
|
||||
"superjson": ["superjson@2.2.6", "", { "dependencies": { "copy-anything": "^4" } }, "sha512-H+ue8Zo4vJmV2nRjpx86P35lzwDT3nItnIsocgumgr0hHMQ+ZGq5vrERg9kJBo5AWGmxZDhzDo+WVIJqkB0cGA=="],
|
||||
@@ -538,6 +504,8 @@
|
||||
|
||||
"trough": ["trough@2.2.0", "", {}, "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw=="],
|
||||
|
||||
"typescript": ["typescript@5.9.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw=="],
|
||||
|
||||
"uc.micro": ["uc.micro@2.1.0", "", {}, "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A=="],
|
||||
|
||||
"ufo": ["ufo@1.6.1", "", {}, "sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA=="],
|
||||
@@ -568,16 +536,10 @@
|
||||
|
||||
"vitepress-plugin-llms": ["vitepress-plugin-llms@1.9.3", "", { "dependencies": { "gray-matter": "^4.0.3", "markdown-it": "^14.1.0", "markdown-title": "^1.0.2", "mdast-util-from-markdown": "^2.0.2", "millify": "^6.1.0", "minimatch": "^10.0.3", "path-to-regexp": "^8.3.0", "picocolors": "^1.1.1", "pretty-bytes": "^7.0.1", "remark": "^15.0.1", "remark-frontmatter": "^5.0.0", "tokenx": "^1.1.0", "unist-util-remove": "^4.0.0", "unist-util-visit": "^5.0.0" } }, "sha512-iU6LQVGS35urNGW/RXHTtt9gj6kprV9ptJDX7ZiC+kgFtqiBMDo2bdXh2YG+KUGU3geKZWkWZcurhnrNCmofsA=="],
|
||||
|
||||
"vitepress-sidebar": ["vitepress-sidebar@1.33.1", "", { "dependencies": { "glob": "11.1.0", "gray-matter": "4.0.3", "qsu": "^1.10.4" } }, "sha512-wPUbXezGakVldawixeRW5tKQTLKoMj2t4nWoThKfCltBM/9a38IE+wCXmmRNW22ZKC32SD/X/sG6NyCTK8QBRg=="],
|
||||
|
||||
"vue": ["vue@3.5.25", "", { "dependencies": { "@vue/compiler-dom": "3.5.25", "@vue/compiler-sfc": "3.5.25", "@vue/runtime-dom": "3.5.25", "@vue/server-renderer": "3.5.25", "@vue/shared": "3.5.25" }, "peerDependencies": { "typescript": "*" }, "optionalPeers": ["typescript"] }, "sha512-YLVdgv2K13WJ6n+kD5owehKtEXwdwXuj2TTyJMsO7pSeKw2bfRNZGjhB7YzrpbMYj5b5QsUebHpOqR3R3ziy/g=="],
|
||||
|
||||
"which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "./bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="],
|
||||
|
||||
"wrap-ansi": ["wrap-ansi@7.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="],
|
||||
|
||||
"wrap-ansi-cjs": ["wrap-ansi@7.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="],
|
||||
|
||||
"y18n": ["y18n@5.0.8", "", {}, "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA=="],
|
||||
|
||||
"yargs": ["yargs@17.7.2", "", { "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", "string-width": "^4.2.3", "y18n": "^5.0.5", "yargs-parser": "^21.1.1" } }, "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w=="],
|
||||
@@ -586,18 +548,6 @@
|
||||
|
||||
"zwitch": ["zwitch@2.0.4", "", {}, "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A=="],
|
||||
|
||||
"@isaacs/cliui/string-width": ["string-width@5.1.2", "", { "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", "strip-ansi": "^7.0.1" } }, "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA=="],
|
||||
|
||||
"@isaacs/cliui/strip-ansi": ["strip-ansi@7.1.2", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA=="],
|
||||
|
||||
"@isaacs/cliui/wrap-ansi": ["wrap-ansi@8.1.0", "", { "dependencies": { "ansi-styles": "^6.1.0", "string-width": "^5.0.1", "strip-ansi": "^7.0.1" } }, "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ=="],
|
||||
|
||||
"js-yaml/argparse": ["argparse@1.0.10", "", { "dependencies": { "sprintf-js": "~1.0.2" } }, "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg=="],
|
||||
|
||||
"@isaacs/cliui/string-width/emoji-regex": ["emoji-regex@9.2.2", "", {}, "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg=="],
|
||||
|
||||
"@isaacs/cliui/strip-ansi/ansi-regex": ["ansi-regex@6.2.2", "", {}, "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="],
|
||||
|
||||
"@isaacs/cliui/wrap-ansi/ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="],
|
||||
}
|
||||
}
|
||||
|
||||
95
docs/guide/concepts.md
Normal file
95
docs/guide/concepts.md
Normal file
@@ -0,0 +1,95 @@
|
||||
---
|
||||
title: Core Concepts
|
||||
---
|
||||
|
||||
# Core Concepts
|
||||
|
||||
## Squadrons and units
|
||||
|
||||
A `squadron.yaml` describes one or more **squadrons**, and each squadron
|
||||
contains one or more **units**:
|
||||
|
||||
```yaml
|
||||
squadron:
|
||||
<squadron>: # a named group, e.g. "storefinder"
|
||||
<unit>: # a deployable service, e.g. "backend"
|
||||
chart: ...
|
||||
builds: ...
|
||||
values: ...
|
||||
```
|
||||
|
||||
A **unit** is the core building block. It maps to a single Helm release and,
|
||||
optionally, the Docker image(s) that release runs. A **squadron** is just a
|
||||
named group of units you want to manage together.
|
||||
|
||||
## What a unit contains
|
||||
|
||||
| Field | Purpose |
|
||||
| ----------- | ----------------------------------------------------------------------- |
|
||||
| `chart` | The Helm chart to deploy (inline path, or `name`/`version`/`repository`). |
|
||||
| `values` | Helm values passed to the chart. |
|
||||
| `builds` | Docker images to build with `docker build`. |
|
||||
| `bakes` | Docker images to build with `docker buildx bake`. |
|
||||
| `tags` | Labels used to filter which units a command acts on. |
|
||||
| `priority` | Install ordering — higher priority is applied first. |
|
||||
| `name` | Override the Helm release name (defaults to the unit name). |
|
||||
| `namespace` | Override the target namespace. |
|
||||
| `extends` | Merge values from an external file. |
|
||||
| `kustomize` | Path to Kustomize resources to include. |
|
||||
|
||||
See [Configuration](/guide/configuration) for the full field reference.
|
||||
|
||||
## Builds vs. bakes
|
||||
|
||||
Both produce the container images your charts run; they differ in the engine:
|
||||
|
||||
- **`builds`** invoke `docker build` directly — one image per build entry, with
|
||||
the familiar build options (`context`, `dockerfile`, `buildArg`, `platform`,
|
||||
`target`, `secret`, `cacheFrom`/`cacheTo`, …).
|
||||
- **`bakes`** generate a `docker buildx bake` HCL file and build through Buildx,
|
||||
which is better for building many targets together, advanced caching, and
|
||||
multi-platform output. Bake targets can `inherit` from one another.
|
||||
|
||||
Use `builds` for straightforward single-image units; reach for `bakes` when you
|
||||
want Buildx orchestration across multiple targets.
|
||||
|
||||
## The lifecycle
|
||||
|
||||
When you run a command, Squadron processes your configuration in stages:
|
||||
|
||||
1. **Merge** — multiple `-f` config files are conflated into one (later files
|
||||
override earlier ones).
|
||||
2. **Filter** — narrow to the requested squadron, units, or `--tags`.
|
||||
3. **Render** — execute Go templates in the configuration values.
|
||||
4. **Build / Bake** — build and (optionally) push images.
|
||||
5. **Deploy** — run the Helm operation (`up`, `diff`, `down`, `rollback`, …).
|
||||
|
||||
The build and deploy stages run concurrently across units where possible, and
|
||||
`priority` controls install ordering.
|
||||
|
||||
## Templating
|
||||
|
||||
Configuration values are rendered as Go templates **before** they reach Helm.
|
||||
Squadron uses `<% %>` delimiters (so they don't clash with Helm's `{{ }}`) and
|
||||
includes the full [Sprig](https://masterminds.github.io/sprig/) function set
|
||||
plus Squadron-specific helpers:
|
||||
|
||||
| Helper | Description |
|
||||
| ----------------- | -------------------------------------------------------- |
|
||||
| `env "NAME"` | Read an environment variable (errors if missing). |
|
||||
| `envDefault` | Read an environment variable with a fallback. |
|
||||
| `file` | Read and render a file from disk. |
|
||||
| `git` | Read git metadata (e.g. commit, branch). |
|
||||
| `op` / `opDoc` | Fetch secrets / documents from 1Password. |
|
||||
| `kubeseal` | Encrypt a value with Sealed Secrets. |
|
||||
| `quote`/`quoteAll`| Quote a value / all values in a list. |
|
||||
| `toYaml`/`fromYaml`, `toJson`/`fromJson`, `toToml`/`fromToml` | Convert between formats. |
|
||||
|
||||
Within templates you can also reference the rendered configuration itself —
|
||||
for example `.Squadron.<squadron>.<unit>.builds.<name>.tag` — to keep values in
|
||||
sync with builds, as the [Quick Start](/guide/quickstart) shows.
|
||||
|
||||
::: warning Deprecated helpers
|
||||
`indent`, `base64`, and `defaultIndex` still work but are deprecated; prefer the
|
||||
Sprig equivalents.
|
||||
:::
|
||||
144
docs/guide/configuration.md
Normal file
144
docs/guide/configuration.md
Normal file
@@ -0,0 +1,144 @@
|
||||
---
|
||||
title: Configuration
|
||||
---
|
||||
|
||||
# Configuration
|
||||
|
||||
Squadron is configured with one or more YAML files (default: `squadron.yaml`),
|
||||
schema version `2.3`. Values support Go templating with `<% %>` delimiters — see
|
||||
[Core Concepts](/guide/concepts#templating).
|
||||
|
||||
You can pass several files with repeated `-f` flags; they are merged in order,
|
||||
with later files overriding earlier ones.
|
||||
|
||||
## Top-level structure
|
||||
|
||||
```yaml
|
||||
# yaml-language-server: $schema=https://raw.githubusercontent.com/foomo/squadron/refs/heads/main/squadron.schema.json
|
||||
version: '2.3' # required, schema version
|
||||
|
||||
vars: {} # template variables, available as <% .Vars.* %>
|
||||
global: {} # Helm global values shared across units
|
||||
|
||||
builds: {} # reusable top-level builds, referenced by units
|
||||
bake: '' # path/override for the generated buildx bake file
|
||||
|
||||
squadron: # the squadrons → units tree
|
||||
<squadron>:
|
||||
<unit>:
|
||||
...
|
||||
```
|
||||
|
||||
| Field | Type | Description |
|
||||
| ---------- | ------ | -------------------------------------------------------- |
|
||||
| `version` | string | Schema version. Required. Currently `2.3`. |
|
||||
| `vars` | map | Template variables, referenced as `<% .Vars.x %>`. |
|
||||
| `global` | map | Helm global values merged into every unit. |
|
||||
| `builds` | map | Shared build definitions units can reference. |
|
||||
| `bake` | string | Override for the generated `buildx bake` file. |
|
||||
| `squadron` | map | The squadrons, each containing units. |
|
||||
|
||||
## Unit
|
||||
|
||||
```yaml
|
||||
squadron:
|
||||
storefinder:
|
||||
backend:
|
||||
name: my-backend # optional release name (default: unit name)
|
||||
namespace: my-namespace # optional target namespace
|
||||
priority: 0 # higher is installed first
|
||||
tags: [web, api] # filter labels for --tags
|
||||
extends: ./defaults.yaml # merge values from an external file
|
||||
kustomize: ./kustomize # path to Kustomize resources
|
||||
chart: ... # Helm chart (see below)
|
||||
builds: ... # docker build targets (see below)
|
||||
bakes: ... # docker buildx bake targets (see below)
|
||||
values: {} # Helm values for the chart
|
||||
```
|
||||
|
||||
| Field | Type | Description |
|
||||
| ----------- | ----------- | ------------------------------------------------------ |
|
||||
| `chart` | string/map | Chart to deploy. Inline path string, or a chart map. |
|
||||
| `values` | map | Helm values passed to the chart. |
|
||||
| `builds` | map | Named `docker build` targets. |
|
||||
| `bakes` | map | Named `docker buildx bake` targets. |
|
||||
| `tags` | list | Labels used by `--tags` filtering. |
|
||||
| `priority` | int | Install ordering; higher comes first. |
|
||||
| `name` | string | Override the Helm release name. |
|
||||
| `namespace` | string | Override the target namespace. |
|
||||
| `extends` | string | File whose values are merged into this unit. |
|
||||
| `kustomize` | string | Path to Kustomize resources. |
|
||||
|
||||
## Chart
|
||||
|
||||
`chart` can be an inline path string:
|
||||
|
||||
```yaml
|
||||
chart: <% env "PROJECT_ROOT" %>/path/to/chart
|
||||
```
|
||||
|
||||
…or a structured reference to a packaged chart:
|
||||
|
||||
```yaml
|
||||
chart:
|
||||
name: mychart
|
||||
version: 0.1.0
|
||||
repository: https://helm.mycompany.com/repository
|
||||
alias: my-alias # optional
|
||||
schema: ./values.schema.json # optional values schema
|
||||
```
|
||||
|
||||
## Builds
|
||||
|
||||
Each entry under `builds` is a `docker build` target. Common fields:
|
||||
|
||||
```yaml
|
||||
builds:
|
||||
default:
|
||||
image: docker.mycompany.com/mycompany/backend
|
||||
tag: latest
|
||||
context: <% env "PROJECT_ROOT" %>/app
|
||||
dockerfile: <% env "PROJECT_ROOT" %>/Dockerfile
|
||||
buildArg:
|
||||
- "FOO=foo"
|
||||
platform:
|
||||
- linux/amd64
|
||||
target: production
|
||||
```
|
||||
|
||||
Builds expose the full `docker build` / Buildx option surface — including
|
||||
`platform`, `target`, `secret`, `ssh`, `cacheFrom`/`cacheTo`, `provenance`,
|
||||
`sbom`, `output`, and `push`. See [`squadron build`](/reference/cli/squadron_build).
|
||||
|
||||
## Bakes
|
||||
|
||||
Each entry under `bakes` is a `docker buildx bake` target, mapping to the HCL
|
||||
bake schema:
|
||||
|
||||
```yaml
|
||||
bakes:
|
||||
service:
|
||||
tags:
|
||||
- docker.mycompany.com/mycompany/frontend:latest
|
||||
dockerfile: Dockerfile
|
||||
context: .
|
||||
args:
|
||||
FOO: foo
|
||||
platforms:
|
||||
- linux/amd64
|
||||
- linux/arm64
|
||||
inherits:
|
||||
- base
|
||||
```
|
||||
|
||||
Bake targets support `inherits`, `contexts`, `cacheFrom`/`cacheTo`, `secret`,
|
||||
`ssh`, `outputs`, and the other Buildx bake attributes. See
|
||||
[`squadron bake`](/reference/cli/squadron_bake).
|
||||
|
||||
## JSON schema
|
||||
|
||||
The full machine-readable schema lives at
|
||||
[`squadron.schema.json`](https://github.com/foomo/squadron/blob/main/squadron.schema.json)
|
||||
and can be regenerated with [`squadron schema`](/reference/cli/squadron_schema).
|
||||
Add the language-server hint shown above to get autocompletion and validation in
|
||||
your editor.
|
||||
@@ -1,4 +1,13 @@
|
||||
---
|
||||
title: Guide
|
||||
order: 1
|
||||
---
|
||||
|
||||
# Guide
|
||||
|
||||
Get started with Squadron:
|
||||
|
||||
- [Introduction](/guide/introduction) — why Squadron exists and what it does.
|
||||
- [Installation](/guide/installation) — install the CLI.
|
||||
- [Quick Start](/guide/quickstart) — deploy the `helloworld` example.
|
||||
- [Core Concepts](/guide/concepts) — squadrons, units, builds, bakes, templating.
|
||||
- [Configuration](/guide/configuration) — the `squadron.yaml` reference.
|
||||
|
||||
65
docs/guide/installation.md
Normal file
65
docs/guide/installation.md
Normal file
@@ -0,0 +1,65 @@
|
||||
---
|
||||
title: Installation
|
||||
---
|
||||
|
||||
# Installation
|
||||
|
||||
Squadron is a single Go binary. Pick whichever method fits your workflow.
|
||||
|
||||
## Prerequisites
|
||||
|
||||
Squadron shells out to the standard toolchain, so make sure these are available
|
||||
on your `PATH`:
|
||||
|
||||
- [`helm`](https://helm.sh) — chart install / upgrade / diff / rollback
|
||||
- [`docker`](https://docs.docker.com/get-docker/) (with `buildx`) — image builds and bakes
|
||||
- [`kubectl`](https://kubernetes.io/docs/tasks/tools/) — access to your cluster
|
||||
|
||||
## Install with `go install`
|
||||
|
||||
```shell
|
||||
go install github.com/foomo/squadron/cmd/squadron@latest
|
||||
```
|
||||
|
||||
This installs the `squadron` binary into `$GOPATH/bin`.
|
||||
|
||||
## Download a release binary
|
||||
|
||||
Pre-built binaries for Linux, macOS, and Windows are attached to every
|
||||
[GitHub release](https://github.com/foomo/squadron/releases). Download the
|
||||
archive for your platform, extract it, and move `squadron` onto your `PATH`.
|
||||
|
||||
## Docker image
|
||||
|
||||
```shell
|
||||
docker run --rm foomo/squadron version
|
||||
```
|
||||
|
||||
Images are published to [Docker Hub](https://hub.docker.com/r/foomo/squadron).
|
||||
|
||||
## From source
|
||||
|
||||
```shell
|
||||
git clone https://github.com/foomo/squadron.git
|
||||
cd squadron
|
||||
make install # builds and installs to $GOPATH/bin
|
||||
```
|
||||
|
||||
This repository uses [mise](https://mise.jdx.dev) to pin tool versions (Go,
|
||||
golangci-lint, lefthook, bun, biome); run `mise install` once to match them.
|
||||
|
||||
## Verify
|
||||
|
||||
```shell
|
||||
squadron version
|
||||
```
|
||||
|
||||
## Shell completion
|
||||
|
||||
Squadron can generate completion scripts for bash, zsh, fish, and PowerShell:
|
||||
|
||||
```shell
|
||||
squadron completion zsh > "${fpath[1]}/_squadron"
|
||||
```
|
||||
|
||||
See [`squadron completion`](/reference/cli/squadron_completion) for the other shells.
|
||||
@@ -1,33 +1,59 @@
|
||||
---
|
||||
title: Introduction
|
||||
order: 1
|
||||
---
|
||||
|
||||
# Introduction
|
||||
|
||||
Welcome to **Squadron** — Docker Compose for Kubernetes.
|
||||
|
||||
Squadron is a tool that brings Docker Compose paradigms to Kubernetes, enabling developers to keep working with the same familiar patterns they already know. Instead of learning new deployment models, you define your infrastructure once using Docker Compose concepts and deploy it to Kubernetes without friction.
|
||||
**Squadron** is _Docker Compose for Kubernetes_: a single CLI that orchestrates
|
||||
multiple Helm charts and Docker image builds as one cohesive deployment, driven
|
||||
by one declarative file — `squadron.yaml`.
|
||||
|
||||
## Why Squadron?
|
||||
|
||||
Docker Compose is intuitive and powerful for local development. Kubernetes is the industry standard for production. Squadron lets you use the same thinking and workflows for both—no paradigm shift required.
|
||||
`docker-compose` made multi-service local development easy: one file lists every
|
||||
service, and one command brings the whole stack up. Kubernetes and Helm are the
|
||||
production standard, but the developer experience is different — every service
|
||||
becomes its own Helm chart and release, each with its own values, lifecycle, and
|
||||
`helm` invocation. Coordinating a dozen of those by hand is tedious and
|
||||
error-prone.
|
||||
|
||||
With Squadron, you:
|
||||
Squadron closes that gap. You describe your services once, grouped into
|
||||
**squadrons** of **units**, and Squadron handles the rest:
|
||||
|
||||
- **Use familiar Docker Compose patterns** — define services, networks, and volumes the way you already do
|
||||
- **Deploy to Kubernetes seamlessly** — same definitions work in production without rewrites
|
||||
- **Keep your workflow consistent** — think in the same mental model across all environments
|
||||
- **Focus on your application** — not on learning Kubernetes-specific abstractions
|
||||
- **One file, many charts** — group related releases and manage them together.
|
||||
- **Build and deploy in one workflow** — define Docker builds (or `buildx bake`
|
||||
targets) alongside the chart that consumes them.
|
||||
- **Templated configuration** — share and compute values across units with Go
|
||||
templates and helpers like `env`, `file`, and `git`.
|
||||
- **The full Helm lifecycle** — `up`, `down`, `diff`, `status`, `rollback`, and
|
||||
`template`, scoped to the whole squadron, individual units, or by tag.
|
||||
|
||||
## Production-Ready
|
||||
In production a squadron is just another set of Helm releases, so you keep all
|
||||
the tooling and guarantees you already rely on.
|
||||
|
||||
Squadron is battle-tested and used in production by BestBytes. It's designed for real-world workloads and proven to scale reliably.
|
||||
## Coming from docker-compose
|
||||
|
||||
## Connect with Us
|
||||
| docker-compose | Squadron |
|
||||
| ------------------------- | ----------------------------------------------------- |
|
||||
| `docker-compose.yml` | `squadron.yaml` |
|
||||
| a `service` | a **unit** (a Helm release + optional image build) |
|
||||
| the whole compose project | a **squadron** (a named group of units) |
|
||||
| `build:` | `builds:` / `bakes:` (Docker build / `buildx bake`) |
|
||||
| `docker compose up` | `squadron up` |
|
||||
| `docker compose down` | `squadron down` |
|
||||
| environment interpolation | Go templates with `env`, `file`, `git`, and more |
|
||||
|
||||
- **GitHub**: [foomo/squadron](https://github.com/foomo/squadron)
|
||||
- **Learn More**: Visit [foomo.org](https://www.foomo.org) to discover our other open source projects
|
||||
The big difference: each unit is backed by a **Helm chart**, so you get real
|
||||
Kubernetes deployments instead of local containers — without writing a `helm`
|
||||
command per service.
|
||||
|
||||
---
|
||||
## Production-ready
|
||||
|
||||
Questions? Ideas? We'd love to hear from you. Check out our [Contributing Guidelines](../CONTRIBUTING.md) and join the community!
|
||||
Squadron is battle-tested and used in production at BestBytes.
|
||||
|
||||
## Next steps
|
||||
|
||||
- [Installation](/guide/installation) — install the CLI.
|
||||
- [Quick Start](/guide/quickstart) — deploy the `helloworld` example.
|
||||
- [Core Concepts](/guide/concepts) — squadrons, units, builds, bakes, templating.
|
||||
- [Configuration](/guide/configuration) — the `squadron.yaml` reference.
|
||||
|
||||
@@ -1,8 +1,96 @@
|
||||
---
|
||||
title: Quick Start
|
||||
order: 2
|
||||
---
|
||||
|
||||
# Quick Start
|
||||
|
||||
Get up and running with Squadron in minutes using the helloworld example.
|
||||
This walkthrough uses the [`helloworld`
|
||||
example](https://github.com/foomo/squadron/tree/main/_examples/helloworld) from
|
||||
the repository. It defines a single squadron (`storefinder`) with one unit
|
||||
(`backend`) that builds a small Go HTTP server and deploys it with a Helm chart.
|
||||
|
||||
## The configuration
|
||||
|
||||
`_examples/helloworld/squadron.yaml`:
|
||||
|
||||
```yaml
|
||||
version: '2.3'
|
||||
|
||||
squadron:
|
||||
storefinder:
|
||||
backend:
|
||||
chart: <% env "PROJECT_ROOT" %>/../common/charts/backend
|
||||
builds:
|
||||
default:
|
||||
tag: latest
|
||||
context: <% env "PROJECT_ROOT" %>/app
|
||||
dockerfile: <% env "PROJECT_ROOT" %>/../common/docker/backend.Dockerfile
|
||||
image: helloworld/app
|
||||
values:
|
||||
image:
|
||||
tag: <% .Squadron.storefinder.backend.builds.default.tag | quote %>
|
||||
repository: <% .Squadron.storefinder.backend.builds.default.image %>
|
||||
service:
|
||||
ports:
|
||||
- 80
|
||||
```
|
||||
|
||||
A few things to notice:
|
||||
|
||||
- `<% ... %>` are Go template expressions — Squadron uses `<% %>` delimiters, not
|
||||
the `{{ }}` Helm uses.
|
||||
- `env "PROJECT_ROOT"` reads an environment variable, so paths resolve relative
|
||||
to the example directory.
|
||||
- The `values` reference the build's own fields
|
||||
(`.Squadron.storefinder.backend.builds.default...`), so the image tag and
|
||||
repository stay in sync with the build definition automatically.
|
||||
|
||||
## Run it
|
||||
|
||||
From `_examples/helloworld` (which exports `PROJECT_ROOT`):
|
||||
|
||||
```shell
|
||||
# 1. Inspect the fully merged & rendered config
|
||||
squadron config
|
||||
|
||||
# 2. List the squadrons and units
|
||||
squadron list
|
||||
|
||||
# 3. Build the Docker image for the unit
|
||||
squadron build
|
||||
|
||||
# 4. Render the Helm templates locally (no cluster needed)
|
||||
squadron template
|
||||
|
||||
# 5. Install / upgrade the releases on your current kube-context
|
||||
squadron up
|
||||
|
||||
# 6. Check release status
|
||||
squadron status
|
||||
|
||||
# 7. Tear it down
|
||||
squadron down
|
||||
```
|
||||
|
||||
::: tip
|
||||
`squadron template` and `squadron config` don't touch your cluster, so they're a
|
||||
safe way to explore what Squadron will do before running `up`.
|
||||
:::
|
||||
|
||||
## Scope your commands
|
||||
|
||||
Every lifecycle command accepts squadron and unit selectors, so you can act on
|
||||
part of the fleet:
|
||||
|
||||
```shell
|
||||
squadron up storefinder # everything in the storefinder squadron
|
||||
squadron up storefinder backend # just the backend unit
|
||||
squadron up --tags web # only units tagged "web"
|
||||
squadron up --tags web,-legacy # include "web", exclude "legacy"
|
||||
```
|
||||
|
||||
## Next steps
|
||||
|
||||
- [Core Concepts](/guide/concepts) — how squadrons, units, builds, and bakes fit together.
|
||||
- [Configuration](/guide/configuration) — the full `squadron.yaml` reference.
|
||||
- [CLI Reference](/reference/cli/squadron) — every command and flag.
|
||||
|
||||
@@ -9,19 +9,23 @@ hero:
|
||||
tagline: Docker Compose for Kubernetes
|
||||
actions:
|
||||
- theme: brand
|
||||
text: Guide
|
||||
text: Get Started
|
||||
link: /guide/introduction
|
||||
- theme: alt
|
||||
text: Quick Start
|
||||
link: /guide/quickstart
|
||||
- theme: alt
|
||||
text: GitHub
|
||||
link: https://github.com/foomo/squadron
|
||||
|
||||
features:
|
||||
- title: One file, many charts
|
||||
details: Orchestrate multiple Helm charts and Docker builds from a single squadron.yaml.
|
||||
link: /guide/concepts
|
||||
- title: Familiar workflow
|
||||
details: An easy transition from docker-compose — define services once, deploy to Kubernetes.
|
||||
link: /guide/introduction
|
||||
- title: Production ready
|
||||
details: Squadron is used in production by BestBytes
|
||||
- title: foomo
|
||||
details: Our combined open source efforts, general guides for programmers and project managers
|
||||
link: https://www.foomo.org
|
||||
- title: Handbook
|
||||
details: Guides for our employees
|
||||
link: /handbook/introduction
|
||||
details: Battle-tested and used in production by BestBytes. In prod it's just another Helm chart.
|
||||
link: /guide/quickstart
|
||||
---
|
||||
|
||||
@@ -3,11 +3,11 @@
|
||||
"name": "docs",
|
||||
"version": "0.1.0",
|
||||
"devDependencies": {
|
||||
"@catppuccin/vitepress": "^0.1.2",
|
||||
"micromark-util-decode-string": "2.0.1",
|
||||
"vitepress": "1.6.4",
|
||||
"vitepress-plugin-group-icons": "1.6.5",
|
||||
"vitepress-plugin-llms": "1.9.3",
|
||||
"vitepress-sidebar": "1.33.1"
|
||||
"vitepress-plugin-llms": "1.9.3"
|
||||
},
|
||||
"scripts": {
|
||||
"dev": "vitepress dev",
|
||||
|
||||
BIN
docs/public/fonts/BebasNeue-Regular.ttf
Normal file
BIN
docs/public/fonts/BebasNeue-Regular.ttf
Normal file
Binary file not shown.
BIN
docs/public/fonts/Inter-Italic-VariableFont_opsz,wght.ttf
Normal file
BIN
docs/public/fonts/Inter-Italic-VariableFont_opsz,wght.ttf
Normal file
Binary file not shown.
BIN
docs/public/fonts/Inter-VariableFont_opsz,wght.ttf
Normal file
BIN
docs/public/fonts/Inter-VariableFont_opsz,wght.ttf
Normal file
Binary file not shown.
BIN
docs/public/fonts/JetBrainsMono-Italic-VariableFont_wght.ttf
Normal file
BIN
docs/public/fonts/JetBrainsMono-Italic-VariableFont_wght.ttf
Normal file
Binary file not shown.
BIN
docs/public/fonts/JetBrainsMono-VariableFont_wght.ttf
Normal file
BIN
docs/public/fonts/JetBrainsMono-VariableFont_wght.ttf
Normal file
Binary file not shown.
@@ -1,4 +1,21 @@
|
||||
---
|
||||
title: Reference
|
||||
order: 2
|
||||
---
|
||||
|
||||
# Reference
|
||||
|
||||
Technical reference for Squadron.
|
||||
|
||||
## CLI
|
||||
|
||||
Every command and flag, generated from the Squadron binary:
|
||||
|
||||
- [`squadron`](/reference/cli/squadron) — root command and global flags
|
||||
|
||||
The CLI reference is generated from source with `make docs.cli`, so it stays in
|
||||
sync with the binary.
|
||||
|
||||
## Configuration
|
||||
|
||||
- [Configuration guide](/guide/configuration) — annotated `squadron.yaml` reference
|
||||
- [`squadron.schema.json`](https://github.com/foomo/squadron/blob/main/squadron.schema.json) — machine-readable JSON schema
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
package actions
|
||||
package cli
|
||||
|
||||
import (
|
||||
"os"
|
||||
@@ -1,4 +1,4 @@
|
||||
package actions
|
||||
package cli
|
||||
|
||||
import (
|
||||
"github.com/foomo/squadron"
|
||||
@@ -1,4 +1,4 @@
|
||||
package actions
|
||||
package cli
|
||||
|
||||
import (
|
||||
"os"
|
||||
@@ -1,4 +1,4 @@
|
||||
package actions
|
||||
package cli
|
||||
|
||||
import (
|
||||
"os"
|
||||
@@ -1,4 +1,4 @@
|
||||
package actions
|
||||
package cli
|
||||
|
||||
import (
|
||||
"github.com/foomo/squadron"
|
||||
@@ -1,4 +1,4 @@
|
||||
package actions
|
||||
package cli
|
||||
|
||||
import (
|
||||
"github.com/pkg/errors"
|
||||
@@ -1,4 +1,4 @@
|
||||
package actions
|
||||
package cli
|
||||
|
||||
import (
|
||||
"context"
|
||||
@@ -1,4 +1,4 @@
|
||||
package actions
|
||||
package cli
|
||||
|
||||
import (
|
||||
"io"
|
||||
@@ -1,4 +1,4 @@
|
||||
package actions
|
||||
package cli
|
||||
|
||||
import (
|
||||
"github.com/foomo/squadron"
|
||||
@@ -1,4 +1,4 @@
|
||||
package actions
|
||||
package cli
|
||||
|
||||
import (
|
||||
"github.com/pkg/errors"
|
||||
@@ -1,4 +1,4 @@
|
||||
package actions
|
||||
package cli
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
@@ -1,4 +1,4 @@
|
||||
package actions
|
||||
package cli
|
||||
|
||||
import (
|
||||
"os"
|
||||
@@ -1,4 +1,4 @@
|
||||
package actions
|
||||
package cli
|
||||
|
||||
import (
|
||||
"github.com/pkg/errors"
|
||||
@@ -1,4 +1,4 @@
|
||||
package actions
|
||||
package cli
|
||||
|
||||
import (
|
||||
"os"
|
||||
@@ -1,4 +1,4 @@
|
||||
package actions
|
||||
package cli
|
||||
|
||||
import (
|
||||
"os"
|
||||
@@ -1,4 +1,4 @@
|
||||
package actions
|
||||
package cli
|
||||
|
||||
import (
|
||||
"github.com/pterm/pterm"
|
||||
Reference in New Issue
Block a user