ci: deploy docs website via smbcloud-deploy-action
Add a CI workflow that deploys the docs (the `docs` sub-project / website/) to smbCloud using smbcloudXYZ/smbcloud-deploy-action@v1. - sets up Node + pnpm so `smb deploy` can build the Next.js site (its prebuild generates content/developer from docs/) - materializes the gitignored .smb/config.toml from CI secrets/vars so the public repo carries no workspace/app IDs - triggers on docs changes pushed to main, plus workflow_dispatch Requires repo secrets/vars (documented in the workflow header) and a published CLI release that supports the `--ci` flag. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
keypair34 committed
Jun 28, 2026 at 12:03 UTC
26fa02f090ecf2c60b21e9445a44b6d3eae24e8a
1 file changed
+94
.github/workflows/deploy-docs.yml
new
+94
@@ -0,0 +1,94 @@
1
+name: Deploy docs
2
+
3
+# Deploys the docs website (website/, the `docs` sub-project in the monorepo's
4
+# .smb config) to smbCloud via the smbcloud-deploy-action.
5
+#
6
+# `smb deploy` builds the Next.js site on the runner before rsyncing it, so this
7
+# job sets up Node + pnpm first. The site's prebuild step generates
8
+# content/developer/ from the sibling docs/ tree, so the full repo must be
9
+# checked out (both website/ and docs/ are present here).
10
+#
11
+# Required repo configuration (Settings → Secrets and variables → Actions).
12
+# None of these live in the repo — the public source carries no IDs/credentials
13
+# (see CLAUDE.md, open-source boundary) and .smb/config.toml is gitignored, so
14
+# the deploy target is materialized below from CI config:
15
+#
16
+# Secrets
17
+# SMB_TOKEN smbCloud auth token contents (provision once; see docs/ci.md)
18
+# SMB_SSH_PRIVATE_KEY Private key for rsync/SSH deploy (the account-scoped deploy key)
19
+# SMB_SSH_KEY_NAME Key filename smb expects: id_<user-id>@smbcloud
20
+# SMB_SSH_KNOWN_HOSTS known_hosts entry for the deploy host
21
+# SMB_DOCS_FRONTEND_APP_ID The docs App's frontend_app_id
22
+# Variables
23
+# SMB_DOCS_PROJECT_ID The workspace (project) id
24
+#
25
+# Trigger: pushes to main that touch the docs, plus manual runs. Adjust the
26
+# branch to your release flow; workflow_dispatch lets you run it from any branch.
27
+#
28
+# NOTE: the action installs the latest published CLI release and runs it with
29
+# `--ci`. That flag must exist in the installed release, so this requires a
30
+# published smbcloud-cli release that includes `--ci` (pin a specific version
31
+# below if `latest` ever regresses).
32
+
33
+on:
34
+ push:
35
+ branches: [main]
36
+ paths:
37
+ - 'website/**'
38
+ - 'docs/**'
39
+ - '.github/workflows/deploy-docs.yml'
40
+ workflow_dispatch:
41
+
42
+permissions:
43
+ contents: read
44
+
45
+# One docs deploy at a time; don't cancel an in-flight rsync/restart.
46
+concurrency:
47
+ group: deploy-docs
48
+ cancel-in-progress: false
49
+
50
+jobs:
51
+ deploy:
52
+ runs-on: ubuntu-latest
53
+ steps:
54
+ - uses: actions/checkout@v6
55
+
56
+ - uses: pnpm/action-setup@v4
57
+ with:
58
+ version: 10
59
+
60
+ - uses: actions/setup-node@v6
61
+ with:
62
+ node-version-file: website/.nvmrc
63
+ cache: pnpm
64
+ cache-dependency-path: website/pnpm-lock.yaml
65
+
66
+ # .smb/config.toml is gitignored (operator-local by design). Recreate the
67
+ # minimal monorepo config for the `docs` sub-project; deploy fields (kind,
68
+ # port, remote path, pm2) come from the server App record at deploy time.
69
+ - name: Write .smb/config.toml
70
+ run: |
71
+ mkdir -p .smb
72
+ cat > .smb/config.toml <<EOF
73
+ name = "smbCloud Platform"
74
+
75
+ [project]
76
+ id = ${{ vars.SMB_DOCS_PROJECT_ID }}
77
+ runner = 255
78
+
79
+ [[projects]]
80
+ name = "docs"
81
+ id = ${{ vars.SMB_DOCS_PROJECT_ID }}
82
+ frontend_app_id = "${{ secrets.SMB_DOCS_FRONTEND_APP_ID }}"
83
+ source = "website"
84
+ EOF
85
+
86
+ - name: Deploy docs
87
+ uses: smbcloudXYZ/smbcloud-deploy-action@v1
88
+ with:
89
+ token: ${{ secrets.SMB_TOKEN }}
90
+ project: docs
91
+ working-directory: .
92
+ ssh-private-key: ${{ secrets.SMB_SSH_PRIVATE_KEY }}
93
+ ssh-key-name: ${{ secrets.SMB_SSH_KEY_NAME }}
94
+ ssh-known-hosts: ${{ secrets.SMB_SSH_KNOWN_HOSTS }}