78 lines
2.4 KiB
Markdown
78 lines
2.4 KiB
Markdown
# Website Runtime
|
|
|
|
The portfolio website keeps Apache at the core while moving PHP execution to
|
|
PHP-FPM.
|
|
|
|
## Runtime Shape
|
|
|
|
- Base image: `php:8.5-fpm-alpine`
|
|
- Web server: Alpine Apache, listening on container port `8080`
|
|
- PHP runtime: PHP-FPM on `127.0.0.1:9000`
|
|
- PHP cache: OPcache enabled, with timestamp validation disabled for immutable
|
|
image deploys
|
|
- Dynamic storage: `/var/www/localhost/htdocs/db` mounted from the retained
|
|
`website-db` PVC
|
|
|
|
Apache routes `*.php` through `proxy_fcgi` to PHP-FPM. The startup script starts
|
|
PHP-FPM in the background and then runs Apache in the foreground.
|
|
|
|
## Static Render Path
|
|
|
|
`render-static-pages.sh` runs during the image build and renders static HTML
|
|
for the read-heavy pages:
|
|
|
|
- `/`
|
|
- `/cv.php`
|
|
- `/blog.php`
|
|
- `/demos.php`
|
|
- `/homelab-tree.php`
|
|
|
|
Static output is generated for the committed static languages under
|
|
`/static-pages/<lang>/`. Apache rewrites supported static-language requests to
|
|
those generated HTML files. Requests for runtime-generated languages still fall
|
|
through to PHP so the translation workflow continues to work.
|
|
|
|
`blog.php` no longer renders visitor ideas directly into the HTML. Recent ideas
|
|
are served by `visitor_ideas.php` and loaded by `visitor-ideas.js`, which keeps
|
|
the blog page cacheable while preserving the write path through `save_idea.php`.
|
|
|
|
## Cache Path
|
|
|
|
The website sets cache headers for pre-rendered HTML:
|
|
|
|
```text
|
|
Cache-Control: public, max-age=300, s-maxage=3600
|
|
```
|
|
|
|
Dynamic write and translation endpoints are marked `no-store`:
|
|
|
|
- `save_idea.php`
|
|
- `visitor_ideas.php`
|
|
- `translate.php`
|
|
- `save_lang.php`
|
|
|
|
The OCI edge nginx layer handles gzip, cache HITs, HTTP/2, TLS session reuse,
|
|
client keepalive, and upstream keepalive to the Traefik backend. CSS and
|
|
JavaScript keep the edge's longer immutable asset policy.
|
|
|
|
## Validation
|
|
|
|
Do not build images locally. The image is built and deployed by the Debian
|
|
homelab path and Gitea Actions.
|
|
|
|
Local source validation that does not build the image:
|
|
|
|
```bash
|
|
shellcheck apps/website/start-website.sh apps/website/render-static-pages.sh
|
|
find apps/website -name "*.php" -print0 | xargs -0 -n1 php -l
|
|
node --check apps/website/visitor-ideas.js
|
|
kubectl kustomize apps/website >/tmp/website-kustomize.yaml
|
|
```
|
|
|
|
Static rendering can be checked without Docker by copying the app to a temporary
|
|
directory and running:
|
|
|
|
```bash
|
|
sh render-static-pages.sh /path/to/copied/apps/website
|
|
```
|