Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
29 commits
Select commit Hold shift + click to select a range
5608106
chore: add OSS license and security policy
cursoragent Feb 11, 2026
5e411cb
feat: add Bedrock application baseline
cursoragent Feb 11, 2026
0914631
feat: add Docker Compose and hardened container builds
cursoragent Feb 11, 2026
9d27028
feat: add Helm chart for Kubernetes deployment
cursoragent Feb 11, 2026
32d7da0
chore: add CI security gates and container publishing
cursoragent Feb 11, 2026
b0b3637
chore: scope Pint linting to project code
cursoragent Feb 11, 2026
e8565ac
chore: configure Pint and format project PHP
cursoragent Feb 11, 2026
a5c16e8
docs: expand quickstart and 12-factor configuration
cursoragent Feb 11, 2026
7b22e95
fix: deny PHP execution in uploads and cache
cursoragent Feb 11, 2026
ae70639
chore: tighten nginx defaults
cursoragent Feb 11, 2026
c2439b4
perf: speed up dev images by skipping composer build
cursoragent Feb 11, 2026
f5ad5ab
docs: add External Secrets and SealedSecrets Kubernetes examples
cursoragent Feb 11, 2026
5ad5fcb
fix: align non-root runtime permissions and health endpoints
cursoragent Feb 11, 2026
09de855
feat: add one-command local bootstrap and dev UID mapping
cursoragent Feb 11, 2026
2edf60d
chore(ci): add Helm lint and template checks
cursoragent Feb 11, 2026
92fe87c
chore(ci): sign published images with cosign
cursoragent Feb 11, 2026
6ec9ba9
docs: add S3 uploads offload guidance and templates
cursoragent Feb 11, 2026
523ea3e
feat: add optional local TLS via Caddy
cursoragent Feb 11, 2026
7aa19b2
feat: add optional php-fpm metrics exporter
cursoragent Feb 11, 2026
41bb3ef
chore(ci): validate Helm renders with kubeconform
cursoragent Feb 11, 2026
acc0675
docs: add cosign verification instructions
cursoragent Feb 11, 2026
21118b4
feat: add trusted local TLS flow with mkcert
cursoragent Feb 12, 2026
cadcfbe
feat: add local doctor preflight checks
cursoragent Feb 12, 2026
011acd1
chore(ci): add docker compose local smoke test
cursoragent Feb 12, 2026
567a44e
feat: add reusable local smoke test target
cursoragent Feb 12, 2026
fe2fcdb
chore(ci): use make smoke in local smoke job
cursoragent Feb 12, 2026
e3e855d
feat: add unified make qa workflow
cursoragent Feb 13, 2026
371c562
fix: address review feedback for portability and defaults
cursoragent Feb 13, 2026
f3f9b6f
chore: add SonarCloud configuration file
cursoragent Feb 13, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 18 additions & 0 deletions .dockerignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
.git
.github
helm

.env
.env.*

node_modules

# Local/IDE noise
.idea
.vscode
.DS_Store

# Composer install output (built inside Docker)
vendor
web/wp

16 changes: 16 additions & 0 deletions .editorconfig
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
root = true

[*]
indent_style = space
indent_size = 2
end_of_line = lf
charset = utf-8
trim_trailing_whitespace = true
insert_final_newline = true

[*.php]
indent_size = 4

[*.md]
trim_trailing_whitespace = false

67 changes: 67 additions & 0 deletions .env.example
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
# -----------------------------------------------------------------------------
# Bedrock / WordPress configuration (safe example)
# -----------------------------------------------------------------------------

WP_ENV=development
WP_HOME=http://localhost:8080
# Keep WP_SITEURL explicit for compatibility with tooling that does not
# interpolate variables inside env files.
WP_SITEURL=http://localhost:8080/wp

# Optional TLS dev endpoint:
# WP_HOME=https://wp.localhost:8443
# WP_SITEURL=https://wp.localhost:8443/wp

# -----------------------------------------------------------------------------
# Database (local dev defaults)
# -----------------------------------------------------------------------------

DB_NAME=wordpress
DB_USER=wordpress
DB_PASSWORD=wordpress
DB_HOST=db
DB_PREFIX=wp_
DB_ROOT_PASSWORD=root

# -----------------------------------------------------------------------------
# Authentication Keys and Salts
# Generate new values for real environments:
# https://roots.io/salts.html
# -----------------------------------------------------------------------------

AUTH_KEY='generateme'
SECURE_AUTH_KEY='generateme'
LOGGED_IN_KEY='generateme'
NONCE_KEY='generateme'
AUTH_SALT='generateme'
SECURE_AUTH_SALT='generateme'
LOGGED_IN_SALT='generateme'
NONCE_SALT='generateme'

# -----------------------------------------------------------------------------
# WordPress hardening / behavior
# -----------------------------------------------------------------------------

DISABLE_WP_CRON=false
WP_POST_REVISIONS=25

# -----------------------------------------------------------------------------
# Redis object cache (optional; requires a Redis cache plugin)
# -----------------------------------------------------------------------------

WP_CACHE=false
WP_REDIS_HOST=redis
WP_REDIS_PORT=6379

# Optional: set the default theme (committed placeholder theme is `starter-theme`)
WP_DEFAULT_THEME=starter-theme

# -----------------------------------------------------------------------------
# Docker dev ergonomics
# -----------------------------------------------------------------------------
#
# Used to build the php-dev image with a UID/GID matching your host user so
# bind-mounts and generated files are writable without manual chmod/chown.
APP_UID=1000
APP_GID=1000

4 changes: 4 additions & 0 deletions .gitattributes
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
/.editorconfig export-ignore
/.gitattributes export-ignore
/.github export-ignore

17 changes: 17 additions & 0 deletions .github/dependabot.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
version: 2
updates:
- package-ecosystem: "composer"
directory: "/"
schedule:
interval: "weekly"

- package-ecosystem: "github-actions"
directory: "/"
schedule:
interval: "weekly"

- package-ecosystem: "docker"
directory: "/"
schedule:
interval: "weekly"

120 changes: 120 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,120 @@
name: CI

on:
pull_request:
push:
branches: ["main"]

permissions:
contents: read

jobs:
php:
name: Composer validate / lint / audit
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4

- name: Setup PHP
uses: shivammathur/setup-php@v2
with:
php-version: "8.3"
tools: composer:v2
coverage: none
extensions: intl, mbstring, curl, zip
ini-values: memory_limit=512M

- name: Composer validate
run: composer validate --strict

- name: Composer install (dev)
run: composer install --no-interaction --no-progress

- name: Lint (Pint)
run: composer lint

- name: Composer audit
run: composer audit

local-smoke:
name: Local stack smoke (Docker Compose)
runs-on: ubuntu-latest
timeout-minutes: 30
steps:
- name: Checkout
uses: actions/checkout@v4

- name: Prepare local .env for CI
run: |
cp .env.example .env
echo "APP_UID=$(id -u)" >> .env
echo "APP_GID=$(id -g)" >> .env
echo "WP_ADMIN_PASSWORD=ci-smoke-password" >> .env

- name: Docker versions
run: |
docker version
docker compose version

- name: Doctor preflight
run: make doctor

- name: Bootstrap stack
run: make bootstrap

- name: Smoke checks
run: make smoke

- name: Compose status/logs on failure
if: failure()
run: |
docker compose ps
docker compose logs --no-color --tail=200

- name: Teardown
if: always()
run: docker compose down -v --remove-orphans

helm:
name: Helm lint / template
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4

- name: Setup Helm
uses: azure/setup-helm@v4

- name: Helm lint
run: >
helm lint helm/wp-boilerplate
--set image.php.tag=ci
--set image.web.tag=ci

- name: Helm template (render)
run: >
helm template wp helm/wp-boilerplate
--namespace wp
--set image.php.tag=ci
--set image.web.tag=ci
> /tmp/wp-boilerplate.rendered.yaml

- name: Install kubeconform
run: |
set -euo pipefail
KUBECONFORM_VERSION="v0.7.0"
curl -fsSLo kubeconform.tar.gz "https://github.com/yannh/kubeconform/releases/download/${KUBECONFORM_VERSION}/kubeconform-linux-amd64.tar.gz"
tar -xzf kubeconform.tar.gz kubeconform
sudo mv kubeconform /usr/local/bin/kubeconform

- name: Kubeconform validate rendered manifests
run: |
set -euo pipefail
kubeconform \
-strict \
-summary \
-ignore-missing-schemas \
-kubernetes-version 1.29.0 \
/tmp/wp-boilerplate.rendered.yaml

38 changes: 38 additions & 0 deletions .github/workflows/codeql.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
name: CodeQL

on:
push:
branches: ["main"]
pull_request:
schedule:
- cron: "23 3 * * 1"

permissions:
actions: read
contents: read
security-events: write

jobs:
analyze:
name: Analyze
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
language: ["php"]

steps:
- name: Checkout
uses: actions/checkout@v4

- name: Initialize CodeQL
uses: github/codeql-action/init@v3
with:
languages: ${{ matrix.language }}

- name: Autobuild
uses: github/codeql-action/autobuild@v3

- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@v3

Loading