- Add required email input (with autocomplete="email") to the booking
details form in the homepage Preact widget (rpt-booking.js).
Update EMPTY_FORM, submit payload, confirmedAppointment, and success
summary to include it. The form now collects: first/last name, email,
phone, comments.
- Update ScheduleController::storeSlot to extract/pass email in the
booking_request mail params (and require it for the full-contact path).
Log failures with details; return a structured error with a user-friendly
message instead of bare "mail_failed".
- riverside_pt_mail hook now includes the user's email in the notification
body (when provided).
- Dev improvements for mail:
- In DEBUG mode (default on localhost), force php_mail interface in
settings.php so the mailer uses the sendmail_path override.
- Dockerfile + entrypoint.sh now provide/install a fake-sendmail.sh
that prints the full email (To, Subject, headers, body from the
hook) to stderr (visible in `docker compose logs`) and always
succeeds (exit 0). This prevents "sh: 1: /usr/sbin/sendmail: not
found" and guarantees booking submissions never return the
"unable to send confirmation email" error in dev.
- In non-DEBUG, still uses symfony_mailer + Postmark as before.
- The fake is also baked into the image for consistency.
- JS error handling now prefers the server-provided 'message' from
the JSON error response (better UX for real mail failures).
- Update CLAUDE.md with the new email field + dev mail mocking behavior.
- New file: docker/php/fake-sendmail.sh (the mock).
This addresses the recent "mail_failed" issues while keeping production
email via Postmark.
102 lines
3.9 KiB
Bash
102 lines
3.9 KiB
Bash
#!/bin/sh
|
|
|
|
DB_HOST="${DB_HOST:-postgres}"
|
|
DB_USER="${DB_USER:-drupal}"
|
|
DB_NAME="${DB_NAME:-drupal}"
|
|
|
|
for var in SITE_NAME ADMIN_PASS; do
|
|
eval val=\$$var
|
|
if [ -z "$val" ]; then
|
|
echo "[entrypoint] FATAL: $var is required."
|
|
exit 1
|
|
fi
|
|
done
|
|
|
|
echo "[entrypoint] Waiting for PostgreSQL at ${DB_HOST}..."
|
|
until pg_isready -h "$DB_HOST" -U "$DB_USER" -d "$DB_NAME" -q; do
|
|
sleep 1
|
|
done
|
|
echo "[entrypoint] PostgreSQL is ready."
|
|
|
|
cd /var/www/html
|
|
|
|
DRUSH="vendor/bin/drush --root=/var/www/html/web"
|
|
|
|
echo "[entrypoint] Preparing database..."
|
|
|
|
if [ "${DRUPAL_FAST:-}" = "1" ]; then
|
|
echo "[entrypoint] DRUPAL_FAST=1 — skipping database wipe and full site reinstall."
|
|
else
|
|
echo "[entrypoint] Full rebuild mode (default). Dropping database..."
|
|
$DRUSH sql:drop -y || true
|
|
|
|
echo "[entrypoint] Installing Drupal (standard profile)..."
|
|
$DRUSH site:install standard \
|
|
--site-name="$SITE_NAME" \
|
|
--account-name=admin \
|
|
--account-pass="$ADMIN_PASS" \
|
|
-y || { echo "[entrypoint] FATAL: site:install failed."; exit 1; }
|
|
echo "[entrypoint] Drupal installed."
|
|
fi
|
|
|
|
echo "[entrypoint] Enabling required modules..."
|
|
$DRUSH en -y views views_ui field_ui text options link datetime && \
|
|
echo "[entrypoint] Core modules enabled." || echo "[entrypoint] WARNING: core modules failed."
|
|
$DRUSH en -y webform webform_ui && \
|
|
echo "[entrypoint] Webform enabled." || echo "[entrypoint] WARNING: webform failed."
|
|
$DRUSH en -y symfony_mailer && \
|
|
echo "[entrypoint] Mailer enabled." || echo "[entrypoint] WARNING: symfony_mailer failed."
|
|
$DRUSH en -y riverside_pt && \
|
|
echo "[entrypoint] riverside_pt enabled." || echo "[entrypoint] WARNING: riverside_pt failed."
|
|
|
|
echo "[entrypoint] Rebuilding site structure from code (riverside:rebuild)..."
|
|
$DRUSH riverside:rebuild || echo "[entrypoint] WARNING: riverside:rebuild encountered an issue."
|
|
|
|
# Re-assert a few key pieces (cheap and safe).
|
|
$DRUSH theme:enable starterkit_theme claro_compact -y && \
|
|
$DRUSH config:set system.theme default starterkit_theme -y && \
|
|
$DRUSH config:set system.theme admin claro_compact -y && \
|
|
echo "[entrypoint] Themes set." || echo "[entrypoint] WARNING: theme enable failed."
|
|
|
|
$DRUSH config:set system.site page.front /home -y && \
|
|
echo "[entrypoint] Front page set." || echo "[entrypoint] WARNING: front page set failed."
|
|
|
|
npm run build --prefix /var/www/html >/dev/null 2>&1 && echo "[entrypoint] Tailwind built." || echo "[entrypoint] WARNING: Tailwind build failed."
|
|
|
|
$DRUSH cache:rebuild >/dev/null 2>&1 && echo "[entrypoint] Cache rebuilt."
|
|
|
|
# Mock sendmail on localhost/dev: prints full email to stderr (visible in docker logs)
|
|
# instead of erroring with "sh: 1: /usr/sbin/sendmail: not found".
|
|
# This catches any php_mail / legacy mail() calls (e.g. some webforms, fallbacks).
|
|
# Real emails should still go via symfony_mailer + Postmark when configured.
|
|
if [ ! -x /usr/local/bin/fake-sendmail.sh ]; then
|
|
cat > /usr/local/bin/fake-sendmail.sh << 'FAKE_SENDMAIL'
|
|
#!/bin/sh
|
|
echo "=== MOCK SENDMAIL (dev - email logged, not sent) ===" >&2
|
|
echo "Timestamp: $(date -Iseconds)" >&2
|
|
echo "Called as: $0 $*" >&2
|
|
echo "----- EMAIL CONTENT -----" >&2
|
|
cat >&2
|
|
echo "" >&2
|
|
echo "=== END MOCK SENDMAIL ===" >&2
|
|
exit 0
|
|
FAKE_SENDMAIL
|
|
chmod +x /usr/local/bin/fake-sendmail.sh
|
|
echo "[entrypoint] Installed fake sendmail for dev logging."
|
|
fi
|
|
# Override sendmail_path for PHP (affects php_mail interface and any direct mail()).
|
|
echo 'sendmail_path = /usr/local/bin/fake-sendmail.sh' > /usr/local/etc/php/conf.d/sendmail.ini 2>/dev/null || true
|
|
|
|
if [ "${DEBUG:-false}" = "true" ]; then
|
|
NGINX_CSS_CACHE='expires off; add_header Cache-Control "no-store";'
|
|
else
|
|
NGINX_CSS_CACHE='expires max;'
|
|
fi
|
|
export NGINX_CSS_CACHE
|
|
envsubst '${NGINX_CSS_CACHE}' \
|
|
< /etc/nginx/conf.d/default.conf.template \
|
|
> /etc/nginx/conf.d/default.conf
|
|
echo "[entrypoint] nginx cache mode: ${DEBUG:-false} = debug."
|
|
|
|
echo "[entrypoint] Starting services..."
|
|
exec supervisord -c /etc/supervisor/conf.d/supervisord.conf
|