Merge remote-tracking branch 'origin/main' into feat/journal-post-form
# Conflicts: # user
This commit is contained in:
@@ -6,11 +6,12 @@ Ideas and improvements not yet planned or scheduled.
|
||||
|
||||
## Production — remaining items
|
||||
|
||||
- [ ] Set `twig.cache: true` in `user/config/system.yaml` on the server (do not commit — breaks local dev)
|
||||
- [x] Prod Twig prod-mode (`cache: true`, `debug/auto_reload: false`) — applied as a per-environment override via `make remote-apply-env-prod` (source: `deploy/env/prod/system.yaml`); committed `system.yaml` stays dev
|
||||
- [ ] Smoke test: submit one post via `/post`, confirm entry appears in dailies immediately (verifies cache-on-save with twig cache on)
|
||||
- [ ] Confirm `/post` requires login — unauthenticated visitors must not be able to post
|
||||
- [x] Confirm `/post` requires login — verified on prod (returns the login gate to unauthenticated visitors)
|
||||
- [ ] Register at carto.com and review terms for production traffic
|
||||
- [ ] Japan & Korea 2026 trip page: set `date_start`, add `cover_image`, upload GPX route file(s)
|
||||
- [ ] Update `GRAV_VERSION` in `.env.prod` to `2.0.4` (was stale `2.0.0-rc.10`; fixed on the running server via self-upgrade, but a future fresh install would repeat the RC)
|
||||
- [ ] git-sync on prod: install, add encrypted token, apply `folders:` fix, enable after first content round-trip
|
||||
|
||||
---
|
||||
|
||||
|
||||
@@ -1,17 +1,41 @@
|
||||
# Git Sync Plugin — Setup Notes
|
||||
|
||||
## Folders YAML bug
|
||||
## ⚠️ Config lives in the ENVIRONMENT tree, not `user/config/` (IMPORTANT)
|
||||
|
||||
The plugin UI always saves the folders field as a single comma-string:
|
||||
Prod has a per-environment override directory `user/env/<hostname>/config/`
|
||||
(created for Twig prod-mode — see CLAUDE.md §1). **A crucial Grav side effect:
|
||||
once that env dir exists, the Admin panel saves ALL config changes — system and
|
||||
plugin — into the active environment's config tree**, not `user/config/`.
|
||||
|
||||
```yaml
|
||||
folders:
|
||||
- 'pages,config,themes'
|
||||
So on prod, `git-sync.yaml` (configured via Admin) lives at:
|
||||
|
||||
```
|
||||
user/env/intotheeast.com/config/plugins/git-sync.yaml ← here (env tree)
|
||||
user/config/plugins/git-sync.yaml ← NOT here
|
||||
```
|
||||
|
||||
But the plugin code iterates the array expecting separate items. This causes `git status pages,config,themes` to be passed as a single path, so git sees nothing to commit and sync silently does nothing.
|
||||
Why this matters:
|
||||
|
||||
**Fix:** Edit `user/config/plugins/git-sync.yaml` directly:
|
||||
- **Server-only, not synced, not committed.** `user/env/` is outside the
|
||||
content repo's tracked folders (`pages`/`config`/`accounts`/`themes`) and is
|
||||
not one of git-sync's synced folders (`pages`/`config`/`themes`). So config
|
||||
saved via Admin *on the server* never reaches Gitea or local. This is ideal
|
||||
for the git-sync token (it stays server-only) but means **prod Admin config
|
||||
edits silently diverge** — author durable config in the repo, not prod Admin.
|
||||
- **Look in both places.** When inspecting/toggling server config, check
|
||||
`user/config/plugins/<name>.yaml` **and**
|
||||
`user/env/<host>/config/plugins/<name>.yaml` (env wins).
|
||||
- **Tooling is env-path-aware.** `scripts/git-sync-toggle.sh` takes a `WEBROOT`
|
||||
and searches `user/env/*/config/plugins/git-sync.yaml` first, then
|
||||
`user/config/plugins/git-sync.yaml`. `make remote-git-sync-disable/enable-<env>`
|
||||
and `make remote-diag-<env>` use it.
|
||||
|
||||
## Folders format
|
||||
|
||||
Older plugin versions' UI saved the `folders` field as a single comma-string
|
||||
(`- 'pages,config,themes'`), which the plugin iterated as one path, so sync
|
||||
silently did nothing. **git-sync v3.4.4 (installed on prod 2026-07-04) saves it
|
||||
correctly** as separate list items:
|
||||
|
||||
```yaml
|
||||
folders:
|
||||
@@ -20,8 +44,33 @@ folders:
|
||||
- themes
|
||||
```
|
||||
|
||||
Never use the Admin UI to change folders — it will rewrite the broken format.
|
||||
If you see the comma-string form on an older version, fix it by editing
|
||||
`git-sync.yaml` directly (at whichever path it lives — see above); do not
|
||||
re-save folders via the Admin UI on the buggy version.
|
||||
|
||||
## Files to gitignore
|
||||
## Per-install / secret files — must be gitignored (never synced)
|
||||
|
||||
`user/config/plugins/git-sync.yaml` contains an encrypted token and is server-specific. `user/config/security.yaml` contains Grav nonces/salts, also server-specific. Both are in `.gitignore` and must never be committed.
|
||||
git-sync syncs the `config/` folder, so any per-install or secret file tracked
|
||||
there would get pushed to Gitea and pollute every environment. Keep these out
|
||||
of the content repo (all in `user/.gitignore`):
|
||||
|
||||
| File | Why |
|
||||
|---|---|
|
||||
| `config/plugins/git-sync.yaml` | encrypted token; server-specific (also lives at env path on prod) |
|
||||
| `config/plugins/api-private.php` | API JWT secret |
|
||||
| `config/security.yaml` | Grav nonces/salts (legacy location) |
|
||||
| `config/versions.yaml` | per-install Grav schema-migration state — differs per env (dev 2.0.4, prod 2.0.7); Grav regenerates it. Untracked 2026-07-04. |
|
||||
| `config/security-private.php` | **TODO:** committed salt secret; should be gitignored like `api-private.php` (deferred — untracking resets server sessions) |
|
||||
|
||||
## git-sync config summary (prod, 2026-07-04)
|
||||
|
||||
- `repository: https://git.gorinskat.nl/m038/intotheeast-com-content.git`,
|
||||
`branch: main`, HTTPS + token auth (SSH is Tailscale-only).
|
||||
- `sync.direction: both`, `on_save/on_delete/on_media: true` → prod Admin edits
|
||||
and `/post` push to Gitea; content-repo pushes pull to prod **via webhook**
|
||||
(`/_git-sync`). The webhook is configured in Gitea repo settings (same secret
|
||||
as the test instance).
|
||||
- **Before enabling on a fresh server**, reset the synced folders clean
|
||||
(`make remote-fetch-content-<env>`) so no install-time drift (e.g. a stale
|
||||
`versions.yaml`) gets pushed on the first sync. Toggle with
|
||||
`make remote-git-sync-disable/enable-<env>`.
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking.
|
||||
|
||||
**Status:** ✅ Complete (2026-07-04) — Phase 1 (local) and Phase 2 (remote test env) both validated and shipped; git-sync re-enabled on test. Phase 3 (prod) is documentation-only per design. See "Known issue" below re: Form 9.1.10 filepond.
|
||||
**Status:** ✅ Complete — Phase 1 (local), Phase 2 (test env), and **Phase 3 (production) all executed and shipped**. Phase 3 was run for real on 2026-07-05 (see the Phase 3 section for the execution outcome and the three `docs/solutions/` gotchas it produced). git-sync re-enabled on test and set up on prod. See "Known issue" below re: Form 9.1.10 filepond.
|
||||
|
||||
**Goal:** Upgrade Grav core `2.0.0-rc.10` → `2.0.4` stable and promote `admin2`/`api`/`flex-objects` to GPM management, validated on local then the remote test env (prod is documented-only).
|
||||
|
||||
@@ -539,11 +539,32 @@ Content, config, and accounts are in git, so no data restore is required — but
|
||||
|
||||
---
|
||||
|
||||
## Phase 3 — Production (fresh install, NOT executed)
|
||||
## Phase 3 — Production (fresh install) — EXECUTED 2026-07-05
|
||||
|
||||
Production is empty, so this is a **fresh install**, not an upgrade — and it is **documentation only**. Do not run it as part of this plan.
|
||||
> **Execution outcome (2026-07-05):** the fresh prod install was run for real
|
||||
> (`make remote-install-prod`) and the site is live at `https://intotheeast.com`.
|
||||
> The runbook below was followed, but three non-obvious gotchas surfaced — each
|
||||
> now has its own learning in `docs/solutions/`:
|
||||
> - **Stale `.env.prod GRAV_VERSION`** installed Grav rc.10, so GPM wouldn't
|
||||
> serve the `api` plugin (needs ≥2.0.4) → Admin2 login 404'd silently. Fixed
|
||||
> via `make remote-upgrade-grav-prod` (→ 2.0.7) + reinstall. See
|
||||
> `docs/solutions/integration-issues/stale-grav-version-blocks-api-plugin-install.md`.
|
||||
> **TODO: bump `.env.prod GRAV_VERSION` to `2.0.4`** so a future fresh install
|
||||
> doesn't repeat the RC.
|
||||
> - **Double `Content-Encoding` header** (non-FastCGI host + mod_deflate)
|
||||
> rendered a garbage page once prod switched to `twig.debug: false`. Fixed via
|
||||
> `debugger.shutdown.close_connection: false` in the prod env override. See
|
||||
> `docs/solutions/integration-issues/grav-double-content-encoding-garbage-page.md`.
|
||||
> - **Plugin config stranded in the untracked `user/plugins/`** doesn't deploy.
|
||||
> See `docs/solutions/conventions/grav-plugin-config-must-be-tracked-override.md`.
|
||||
>
|
||||
> Twig prod-mode is applied as a per-environment override (`deploy/env/prod/system.yaml`
|
||||
> via `make remote-apply-env-prod`); git-sync is installed, configured, and enabled
|
||||
> (see `docs/working/git-sync-notes.md`). Remaining minor follow-ups: gitignore
|
||||
> `config/security-private.php` (committed salt); optional `popularity.salt` strip.
|
||||
|
||||
When prod is provisioned:
|
||||
The original runbook (production was empty, so this was a **fresh install**, not
|
||||
an upgrade):
|
||||
|
||||
1. **Provision creds:** copy the REMOTE section of `.env.example` into `.env.prod` with production values (never commit it). Run `make remote-env-setup-prod`.
|
||||
2. **Fresh install at 2.0.4:** `make remote-install-prod` with `GRAV_VERSION=2.0.4` in `.env.prod`. `scripts/server-install.sh` installs core, then all of `plugins.txt` — `admin2`/`api`/`flex-objects` now install purely via `php bin/gpm install` (no zip-stash; that special-casing was removed in Task 4). The `gpm.releases: stable` channel arrives with the `user/` content clone.
|
||||
|
||||
Reference in New Issue
Block a user