|
21 | 21 | shellcheck --severity=warning \ |
22 | 22 | install.sh install_cert.sh setup-local-dns.sh aliases.bash \ |
23 | 23 | lib/menu.sh lib/compose.sh bin/forge \ |
| 24 | + docker-library/nginx/config_files/docker-entrypoint.sh \ |
24 | 25 | docker-library/php/config_files/docker-php-entrypoint \ |
25 | 26 | docker-library/php/config_files/xdebug \ |
26 | 27 | docker-library/httpd/config_files/docker-entrypoint.sh |
@@ -523,6 +524,67 @@ jobs: |
523 | 524 | forge profile off nginx |
524 | 525 | docker compose ps --services | grep -qx apachedev |
525 | 526 |
|
| 527 | + # Neither fallback had ever been exercised: CI runs install_cert.sh first, so |
| 528 | + # the certificate always existed. nginx died outright without one, and |
| 529 | + # Apache's safety net -- written in task 7 -- had never been proven to work. |
| 530 | + - name: a missing certificate degrades instead of killing the server |
| 531 | + run: | |
| 532 | + set -euo pipefail |
| 533 | + export PATH="$HOME/.local/bin:$PATH" |
| 534 | + mkdir -p /tmp/certs-aside |
| 535 | + mv certificates/php-devforge.pem certificates/php-devforge.key /tmp/certs-aside/ |
| 536 | + # Unconditional: a failure halfway through would otherwise leave the |
| 537 | + # certificates aside, and every later step -- including the log dump on |
| 538 | + # failure -- would be looking at a degraded stack. |
| 539 | + trap 'mv /tmp/certs-aside/* certificates/ 2>/dev/null || true' EXIT |
| 540 | +
|
| 541 | + # `curl -k` accepts any certificate, so it cannot tell a generated |
| 542 | + # fallback from a stale file. The issuer can: a self-signed one signs |
| 543 | + # itself, mkcert's does not. |
| 544 | + served_by() { |
| 545 | + echo | openssl s_client -connect 127.0.0.1:443 -servername "welcome.phpforge.dev" 2>/dev/null \ |
| 546 | + | openssl x509 -noout -issuer |
| 547 | + } |
| 548 | +
|
| 549 | + docker compose up -d --force-recreate apachedev |
| 550 | + for i in $(seq 1 30); do |
| 551 | + curl -fsS -k --max-time 5 --resolve welcome.phpforge.dev:443:127.0.0.1 \ |
| 552 | + https://welcome.phpforge.dev/ >/dev/null 2>&1 && break |
| 553 | + sleep 1 |
| 554 | + done |
| 555 | + curl -fsS -k --resolve welcome.phpforge.dev:443:127.0.0.1 \ |
| 556 | + https://welcome.phpforge.dev/ | grep -q "PHP DevForge is running" |
| 557 | + served_by | grep -q 'CN=phpforge.dev' || { |
| 558 | + echo "apache is not serving the generated fallback: $(served_by)"; exit 1; } |
| 559 | + docker compose logs apachedev | grep -qi 'self-signed' |
| 560 | + echo "apache degrades" |
| 561 | +
|
| 562 | + forge profile on nginx |
| 563 | + for i in $(seq 1 30); do |
| 564 | + curl -fsS -k --max-time 5 --resolve welcome.phpforge.dev:443:127.0.0.1 \ |
| 565 | + https://welcome.phpforge.dev/ >/dev/null 2>&1 && break |
| 566 | + sleep 1 |
| 567 | + done |
| 568 | + docker compose ps --services | grep -qx nginxdev || { |
| 569 | + echo "nginxdev is not running"; docker compose logs --tail=20 nginxdev; exit 1; } |
| 570 | + curl -fsS -k --resolve welcome.phpforge.dev:443:127.0.0.1 \ |
| 571 | + https://welcome.phpforge.dev/ | grep -q "PHP DevForge is running" |
| 572 | + served_by | grep -q 'CN=phpforge.dev' || { |
| 573 | + echo "nginx is not serving the generated fallback: $(served_by)"; exit 1; } |
| 574 | + echo "nginx degrades too" |
| 575 | +
|
| 576 | + # Put it back, or later steps would be testing the wrong certificate. |
| 577 | + forge profile off nginx |
| 578 | + mv /tmp/certs-aside/php-devforge.pem /tmp/certs-aside/php-devforge.key certificates/ |
| 579 | + docker compose up -d --force-recreate apachedev |
| 580 | + for i in $(seq 1 30); do |
| 581 | + curl -fsS --max-time 5 --resolve welcome.phpforge.dev:443:127.0.0.1 \ |
| 582 | + https://welcome.phpforge.dev/ >/dev/null 2>&1 && break |
| 583 | + sleep 1 |
| 584 | + done |
| 585 | + served_by | grep -q 'mkcert' || { echo "the real certificate did not come back"; exit 1; } |
| 586 | + echo "and the real one comes back" |
| 587 | +
|
526 | 588 | - name: container logs on failure |
527 | 589 | if: failure() |
528 | 590 | run: docker compose logs --tail=50 |
0 commit comments