diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml
new file mode 100644
index 0000000..23ac51f
--- /dev/null
+++ b/.github/workflows/deploy.yml
@@ -0,0 +1,77 @@
+name: Build and deploy portfolio + intake API
+
+on:
+ push:
+ branches: [main]
+ pull_request:
+ branches: [main]
+ workflow_dispatch:
+
+permissions:
+ contents: read
+
+concurrency:
+ group: ohgeec-pages-${{ github.ref }}
+ cancel-in-progress: true
+
+jobs:
+ site:
+ runs-on: ubuntu-latest
+ permissions:
+ contents: read
+ steps:
+ - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4
+ - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4
+ with:
+ node-version: 22
+ - name: Generate guide pages
+ run: node build/generate.mjs
+ - name: Assemble public Pages artifact
+ run: |
+ set -eu
+ mkdir -p site
+ cp index.html support.html book.html thanks.html privacy.html tech-support.html \
+ ogc-network.js intake.js portfolio.css portfolio.js fonts.css og-image.png \
+ apple-touch-icon.png robots.txt sitemap.xml CNAME site/
+ cp -R assets fonts tech-support site/
+ - uses: actions/upload-pages-artifact@56afc609e74202658d3ffba0e8f6dda462b719fa # v3
+ if: github.ref == 'refs/heads/main' && github.event_name != 'pull_request'
+ with:
+ path: site
+
+ deploy-pages:
+ if: github.ref == 'refs/heads/main' && github.event_name != 'pull_request'
+ needs: site
+ runs-on: ubuntu-latest
+ permissions:
+ pages: write
+ id-token: write
+ environment:
+ name: github-pages
+ url: ${{ steps.deployment.outputs.page_url }}
+ steps:
+ - uses: actions/configure-pages@983d7736d9b0ae728b81ab479565c72886d7745b # v5
+ - id: deployment
+ uses: actions/deploy-pages@d6db90164ac5ed86f2b6aed7e0febac5b3c0c03e # v4
+
+ publish-intake:
+ if: github.ref == 'refs/heads/main' && github.event_name != 'pull_request'
+ runs-on: ubuntu-latest
+ permissions:
+ contents: read
+ packages: write
+ steps:
+ - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4
+ - uses: docker/setup-buildx-action@8d2750c68a42422c14e847fe6c8ac0403b4cbd6f # v3
+ - uses: docker/login-action@c94ce9fb468520275223c153574b00df6fe4bcc9 # v3
+ with:
+ registry: ghcr.io
+ username: ${{ github.actor }}
+ password: ${{ secrets.GITHUB_TOKEN }}
+ - uses: docker/build-push-action@10e90e3645eae34f1e60eeb005ba3a3d33f178e8 # v6
+ with:
+ context: ./services/intake
+ push: true
+ tags: |
+ ghcr.io/ohgeeceee/network-intake:stable
+ ghcr.io/ohgeeceee/network-intake:sha-${{ github.sha }}
diff --git a/.gitignore b/.gitignore
index c304e7f..8b59a66 100644
--- a/.gitignore
+++ b/.gitignore
@@ -6,3 +6,9 @@ verify2.js
hub.js
.DS_Store
Thumbs.db
+
+# Local site artifact, CRM secrets, and database backups
+/site/
+/ops/crm/.env
+/ops/crm/*.dump*
+/ops/crm/*.age
diff --git a/DEPLOY.md b/DEPLOY.md
index a30bd67..6543565 100644
--- a/DEPLOY.md
+++ b/DEPLOY.md
@@ -1,112 +1,37 @@
-# Deploying the ohgeeceee network hub (free)
+# Deploying ohgeec.com and the private CRM
-The hub is three static files — `index.html`, `support.html`, `ogc-network.js` (plus
-`CNAME`). No build step, no server. Any static host works; below is **GitHub Pages**
-(what you asked for) and one alternative worth knowing about.
+## Public portfolio
----
+The portfolio and support guides remain static on GitHub Pages. `.github/workflows/deploy.yml` builds the guide pages, assembles only public site files, deploys them to Pages, and builds/publishes the private intake service image to GHCR from commits to `main`. Pull requests run the static guide generator but do not publish images or deploy Pages.
-## Recommended: GitHub Pages
+To switch from the current branch-based Pages source to the workflow:
-Best fit here — it's free, gives you HTTPS on your own domain, and lives next to your
-existing `github.com/ohgeeceee` repos.
+1. In the repository, open **Settings → Pages** and change **Build and deployment → Source** to **GitHub Actions**.
+2. Check that the repository's custom domain is still `ohgeec.com` and HTTPS is enforced.
+3. Merge the workflow to `main`. Confirm the `Build and deploy portfolio + intake API` workflow succeeds and the live site loads `book.html`, `/privacy.html`, the guide hub, and `/tech-support/onsite-montana/`.
+4. The workflow excludes source content, service source, CRM operations files, and credentials from the Pages artifact. The guides and their generated HTML remain public as intended.
-### 1. Make the repo
+GitHub Actions uses GitHub-hosted runners only. It publishes `ghcr.io/ohgeeceee/network-intake:stable` and an immutable `sha-
` on each site so the network bar + Support button appear: - -```html - -``` - -Add `data-ogc-theme="dark"` on the dark sites (beemuu, Manners, GarageRoute): - -```html - -``` - -Because all sites load the registry from `ohgeec.com`, later changes (a new site, or -flipping Idaho Blotter from "soon" to "live") are a one-line edit in `ogc-network.js` -here — every site updates automatically, no redeploys elsewhere. - ---- - -### Quick sanity check once live -- `https://ohgeec.com` shows the hub with all six cards. -- `https://ohgeec.com/ogc-network.js` loads the script (not a 404). -- On any site with the snippet, the network bar appears at the bottom. - -Source for the DNS values: GitHub Docs — *Managing a custom domain for your GitHub Pages site*. +For a manual update on the host, run `ops/crm/deploy.sh`. Keep deployment credentials read-only for GHCR and do not run untrusted pull-request workflows on the home server. diff --git a/book.html b/book.html index bd29015..a4d17b3 100644 --- a/book.html +++ b/book.html @@ -3,8 +3,8 @@
-
- +
+