89 lines
4.2 KiB
Markdown
89 lines
4.2 KiB
Markdown
# Umlaut Press
|
|
|
|
Static site plus legacy PHP archive (preservation), served by Nginx and PHP 7.4-FPM in a single Docker container.
|
|
|
|
---
|
|
|
|
## Architecture (refresher)
|
|
|
|
- **One container**: Nginx (port 80) + PHP 7.4-FPM (localhost:9000). The image is built from the root `Dockerfile` and used for production.
|
|
- **Web root**: Everything under `src/` is copied into the image at `/usr/share/nginx/html/`. Nginx serves static files and proxies `*.php` to PHP-FPM.
|
|
- **Static**: HTML, CSS, JS, images, fonts — served by Nginx with cache rules (short cache for HTML, long for assets).
|
|
- **PHP**: Used for the legacy archive under `src/site_archive/` (sites unchanged since ~2010). PHP runs in a compatibility-oriented mode (see below); apps that need a database (e.g. old WordPress/phpBB in the archive) will not work fully, but simple PHP pages do.
|
|
- **Production base**: `php:7.4-fpm-alpine` (Alpine, minimal). **Dev container**: `php:7.4-fpm` (Debian) so Cursor/VS Code have bash; see [.devcontainer/README.md](.devcontainer/README.md).
|
|
|
|
### Request flow
|
|
|
|
1. Request hits Nginx (port 80).
|
|
2. Static file (e.g. `.html`, `.css`, `.js`, images) → Nginx serves from `/usr/share/nginx/html/` with the appropriate cache headers.
|
|
3. `*.php` → Nginx passes to PHP-FPM on 127.0.0.1:9000; PHP runs the script and returns the response.
|
|
|
|
### Startup (inside container)
|
|
|
|
`entrypoint.sh` runs when the container starts:
|
|
|
|
1. Start PHP-FPM in the background (`php-fpm -D`).
|
|
2. Start Nginx in the foreground (`nginx -g 'daemon off;'`) so the container stays up.
|
|
|
|
---
|
|
|
|
## Directory layout
|
|
|
|
| Path | Purpose |
|
|
|------|--------|
|
|
| `src/` | Web root: static site + `site_archive/` (legacy PHP). Deploy = copy this into the image. |
|
|
| `nginx/conf.d/` | Nginx server config: `default.conf` (vhost, cache rules, PHP location). |
|
|
| `php/conf.d/` | PHP overrides: `99-legacy.ini` (error_reporting, short_open_tag, limits for old code). |
|
|
| `entrypoint.sh` | Starts PHP-FPM then Nginx. |
|
|
| `Dockerfile` | Production image: Alpine + Nginx + PHP 7.4-FPM, configs and `src/` copied in. |
|
|
| `.devcontainer/` | Dev container (Debian-based) for local testing; mounts `src/` for live edits. |
|
|
| `.woodpecker/` | CI (lint, etc.) and build/deploy (Docker build, push, Portainer). |
|
|
|
|
---
|
|
|
|
## Run locally
|
|
|
|
### Option A: Docker (no dev container)
|
|
|
|
```bash
|
|
docker build -t umlaut-press .
|
|
docker run -p 8080:80 umlaut-press
|
|
```
|
|
|
|
Then open **http://localhost:8080** (and e.g. `http://localhost:8080/site_archive/2004/` for the archive).
|
|
|
|
### Option B: Dev container (recommended for editing)
|
|
|
|
1. Open repo in Cursor/VS Code.
|
|
2. Command Palette → **“Dev Containers: Reopen in Container”**.
|
|
3. When the container is up, open **http://localhost** (port 80 is forwarded). Edits under `src/` are reflected on refresh.
|
|
|
|
Details and troubleshooting (e.g. “bash not found” / old container reuse): [.devcontainer/README.md](.devcontainer/README.md).
|
|
|
|
---
|
|
|
|
## Build and deploy
|
|
|
|
- **Scripts** (see `package.json`): `docker:build`, `docker:push` (image tag: `git.mifi.dev/mifi/umlaut-press:latest`).
|
|
- **CI**: `.woodpecker/ci.yml` (e.g. format/lint). **Build/deploy**: `.woodpecker/build.yml` and `.woodpecker/deploy.yml` — on push/tag to `main`, build the image, push to the registry, and trigger the Portainer stack redeploy.
|
|
|
|
---
|
|
|
|
## PHP legacy / compatibility
|
|
|
|
- **Version**: PHP 7.4 (EOL) chosen so pre-2010 archive code runs without changes.
|
|
- **Config**: `php/conf.d/99-legacy.ini` — suppresses deprecation/strict notices, enables `short_open_tag`, raises limits. Keeps the archive viewable; not for running DB-backed apps (WordPress, phpBB, etc.) unless you add a DB and config.
|
|
|
|
---
|
|
|
|
## Quick reference
|
|
|
|
| I want to… | Do this |
|
|
|------------|--------|
|
|
| Test the site locally | Use the dev container (Reopen in Container) and open http://localhost. |
|
|
| Change Nginx (cache, vhost) | Edit `nginx/conf.d/default.conf`, rebuild image. |
|
|
| Change PHP behavior | Edit `php/conf.d/99-legacy.ini`, rebuild image. |
|
|
| Add or change static/PHP content | Edit or add files under `src/`. In dev container, just refresh the browser. |
|
|
| Build the production image | `pnpm run docker:build` or `docker build -t umlaut-press .` |
|
|
| Deploy | Push to `main` (Woodpecker builds and deploys) or run `docker:push` and update the stack yourself. |
|