Files
bookstore/.env.example
T
twooeyandClaude Sonnet 5 a733ba4bfd Week 4 (scoped): BooksRun live price/stock check + daily FTP sync stub
Adds a live per-ISBN BooksRun API check to the checkout-time price
recheck (Order\PriceRecheck) so a booksrun-sourced offer is verified
fresh, not trusted from a potentially day-stale local cache -- fails
closed on any problem (API error, no stock), matching Appendix B's
"stale supplier cost must never be trusted as final." Live values are
written back to the same offer_id row so SupplierOrderJob's later
fulfillment-time read sees them too.

Also wires a real daily Action Scheduler job (scheduling/dedup/batch-write
infrastructure) for BooksRun's FTP inventory feed, but leaves the actual
connect+parse step (Import\BooksRunOfferSync::connect_and_parse_feed())
as a deliberate stub -- no FTP access or sample feed exists yet, and
guessing at a file format would silently write wrong data once real
access arrives. The stub fails loud on the manual CLI trigger, quiet on
the scheduled job (no point alarming on an expected, known state).

Ingram, BooksRun AutoBuy, production email, and tax/legal/monitoring are
explicitly out of scope for this pass -- narrowed by user request.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01D2gmgaDVXcRGCwLfdXQajD
2026-08-27 21:29:37 -04:00

64 lines
2.2 KiB
Bash

# Copy this to .env.dev / .env.staging / .env.production and fill in real
# values for that environment, then `chmod 600` it — it holds every API key
# and both DB passwords in plaintext, same as the secrets/<env>/ files
# deploy.sh derives from it. The filled-in files are gitignored — never
# commit them. Same code everywhere; only these values differ (see
# design doc §01, Environments & deployment).
#
# CAVEAT for the API keys below (DB_PASSWORD/DB_ROOT_PASSWORD are exempt —
# deploy.sh writes those into secrets/<env>/ files that bypass this
# entirely): docker compose passes these into containers via ${VAR}
# interpolation, which will silently mangle a value containing `$` followed
# by a letter (it tries to resolve it as another variable and blanks it out
# if unset). Avoid `$` in these specific values, or double it ($$) if you
# must use one — this bit us for real with a generated password once.
# --- Site ---
# (WP_ENVIRONMENT_TYPE is NOT set here — it's hardcoded per environment in
# docker-compose.{dev,staging,production}.yml so it can't go stale.)
SITE_DOMAIN=staging.example.com
SITE_URL=https://staging.example.com
SITE_TITLE="Bookstore (staging)"
# --- WordPress admin bootstrap (used only on first install) ---
WP_ADMIN_USER=admin
WP_ADMIN_PASSWORD=changeme
WP_ADMIN_EMAIL=admin@example.com
# --- Database ---
DB_NAME=bookstore
DB_USER=bookstore
DB_PASSWORD=changeme
DB_ROOT_PASSWORD=changeme
WP_TABLE_PREFIX=wp_
# --- Backups (deploy/backup.sh) ---
BACKUP_DIR=./backups
BACKUP_REMOTE=
BACKUP_RETENTION_DAYS=14
# --- Supplier adapters (design doc §04) ---
# staging: gutenberg_test production: booksrun,ingram
ACTIVE_SUPPLIER_ADAPTERS=gutenberg_test
BOOKSRUN_API_KEY=
# Week 4: bulk FTP inventory feed — placeholders, not yet consumed by any
# code beyond Import\BooksRunOfferSync::is_ftp_configured()'s empty check.
BOOKSRUN_FTP_HOST=
BOOKSRUN_FTP_PORT=
BOOKSRUN_FTP_USER=
BOOKSRUN_FTP_PASSWORD=
BOOKSRUN_FTP_REMOTE_PATH=
INGRAM_API_KEY=
INGRAM_ACCOUNT_ID=
# --- Payments (Helcim) ---
HELCIM_API_TOKEN=
HELCIM_ACCOUNT_ID=
# --- Marketing ---
MAILERLITE_API_KEY=
# --- Hardcover (AO3-style tag browsing — genre/mood/content-warning/tag sync) ---
# Get a token: hardcover.app account settings -> Hardcover API -> New API Key
HARDCOVER_API_TOKEN=