shadowdaoandClaude Opus 5 61bfdcfaf9 test(cac-path-parity): run the .phpt suite as a build gate
Nothing executed ext/cac-path-parity/tests/ — not Dockerfile.lsphp, not
.gitea/workflows/build-push.yaml. The suite passed, but as shipped it was
documentation, not a gate.

`make test` now runs in the ext-build stage, against the same lsphp build the
.so ships next to. It costs ~1s per PHP version. The lsphp packages turn out to
include a real CLI binary (php-config --php-binary =>
/usr/local/lsws/lsphpNN/bin/phpN.N), so run-tests.php works with no extra
tooling.

Guarded twice, because `make test` fails silently by default:
  - if PHP_EXECUTABLE is missing, the Makefile prints "Cannot run tests without
    CLI sapi." and EXITS 0. Asserted rather than assumed.
  - a run that executes zero tests also exits 0, so the summary is checked
    against the number of .phpt files on disk, plus "Tests failed : 0".
    Same reasoning as the `lsphp -i` probe: an assertion that cannot fail is
    worse than no assertion.

Verified 8/8 on PHP 8.1/8.3/8.5. Mutation-tested both guards: breaking
001-rewrite.phpt's expectation fails the build ("FATAL: cac_path_parity .phpt
suite FAILED"); adding a test that always SKIPs makes run-tests.php still exit 0
but the build fails on "expected all 9 .phpt tests to run" (summary read
"Number of tests : 9  8").

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-05 13:06:23 -07:00
2025-07-28 07:29:03 -07:00

Cloud Apache Container

This is a base container for running PHP-based applications, supporting multiple PHP versions (7.4, 8.0, 8.1, 8.2, 8.3, 8.4). The default is PHP 8.3. The container is based on AlmaLinux 9 and uses Apache with mod_ssl. It is designed for both development and production use.

You must have Docker or compatible containerization software running.


What's New?

  • Optimized Image: The Dockerfile has been refactored for smaller size, faster builds, and improved security. Unnecessary files and caches are removed during build.
  • Pre-built Images for Each PHP Version: On every push, images for all supported PHP versions are built and pushed to the registry. You can pull the exact version you need (e.g., cac:php74, cac:php84, or cac:latest).
  • .dockerignore Added: The build context is now minimized, making builds faster and more secure.

Quick Start: Local Development with local-dev.sh

The easiest way to start a local development environment is with the provided local-dev.sh script. This script automates container setup, volume creation, log directories, and WordPress installation.

Usage Example

./local-dev.sh -n local-dev

Flags:

  • -n Name of the container (required)
  • -p HTTP port (default: 80)
  • -s HTTPS port (default: 443)
  • -r Root path for files and database (default: current directory)
  • -a PHP version (default: 8.3; options: 74, 80, 81, 82, 83, 84)
  • -v Enable verbose mode
  • -h Show help

The script will:

  • Create a user directory and log folders
  • Create a Docker volume for MySQL
  • Start the container with the correct environment variables
  • Generate helper scripts in your root path:
    • instance_start Start the container
    • instance_stop Stop the container
    • instance_logs Tail Apache logs
    • instance_db_info Show MySQL credentials
  • Install WordPress in your web root
  • Print MySQL credentials

Manual Docker Usage

You can also run the container manually:

mkdir -p local-development/domain.tld
cd local-development/domain.tld
mkdir user
mkdir -p user/logs/{apache,system}
docker run -d -it -p 80:80 -p 443:443 -e PHPVER=84 -e environment=DEV --mount type=bind,source="$(pwd)"/user,target=/home/myuser -v"$name-mysql":/var/lib/mysql -e uid=30001 -e user=myuser -e domain=localhost --name local-dev  repo.anhonesthost.net/cloud-hosting-platform/cac:latest

Accessing the Container

docker exec -it local-dev /bin/bash

WordPress Installation

If using local-dev.sh, WordPress is installed automatically. For manual setup:

cat /home/myuser/mysql_creds
su - myuser
cd ~/public_html
wp core download

Then visit https://localhost (accept the SSL warning) to complete setup.


Features

  • Multiple PHP Versions: 7.4, 8.0, 8.1, 8.2, 8.3, 8.4 (set with PHPVER or -a flag)
  • Pre-built Images: Pull the image for your desired PHP version directly from the registry. No need to build locally unless customizing.
  • Optimized Build: Smaller, faster, and more secure images thanks to the improved Dockerfile and .dockerignore.
  • Automatic Database Setup: MariaDB is started in DEV mode, credentials are auto-generated and stored in /home/$user/mysql_creds.
  • Database Backups: Cron job backs up the database every 15 minutes to /home/$user/_db_backups.
  • Log Management: Log rotation compresses logs older than 3 days and deletes those older than 7 days.
  • Memcached: Started automatically in DEV mode.
  • SSL: Self-signed certificate enabled by default.
  • Default Web Content: /home/$user/public_html is the web root. /ping endpoint and phpinfo.php are available for diagnostics.
  • Helper Scripts: instance_start, instance_stop, instance_logs, instance_db_info (created by local-dev.sh).

Environment Variables

Required:

  • uid User ID for file permissions
  • user Username for file permissions
  • domain Primary domain for configuration

Optional:

  • environment Set to DEV to start memcached and MySQL locally for development
  • serveralias Comma-separated list of alternative hostnames
  • PHPVER PHP version (see above)

Helpful Notes

  • To restart the instance: ./instance_start or docker start {container-name}
  • To stop: ./instance_stop or docker stop {container-name}
  • To view logs: ./instance_logs or docker logs -f {container-name}
  • To get DB credentials: ./instance_db_info or cat /home/$user/mysql_creds
  • To delete a container: docker rm {container-name} (does not delete user files or DB volume)
  • To view running containers: docker ps
  • To view all containers: docker ps --all
  • To view images: docker images

Troubleshooting

  • The first run may take several minutes as dependencies are installed.
  • If you need to change PHP version, stop and remove the container, then recreate with the desired version.
  • For advanced configuration, see the scripts in the scripts/ directory.
  • The image is optimized for size and speed, but local development in DEV mode may install additional packages (MariaDB, memcached) at runtime using microdnf.
  • The build context is minimized by the included .dockerignore file.
S
Description
No description provided
Readme
549 KiB
Languages
Shell 76.5%
C 8.6%
Go Template 8.2%
PHP 5.1%
Dockerfile 1.2%
Other 0.4%