Production Deployment & Infrastructure Guide
This document details the containerization architecture, production hosting on Render, Cloudflare R2 / AWS S3 storage, and operational runbooks for Eniceberny Bakery and Culinary Hub.
1. Production Architecture Overview
The production infrastructure is orchestrated via Docker containers running on Render PaaS backed by managed PostgreSQL:
graph TD
subgraph Public Web Traffic
DNS[Cloudflare / Custom Domain enicebakerygh.com] -->|HTTPS 443| LB[Render Load Balancer]
end
subgraph Container Services
LB --> Web[eniceberny-web: Apache + PHP 8.4]
Web -->|Dispatch Async Jobs| Queue[(Redis / Database Queue)]
Queue --> Worker[eniceberny-worker: php artisan queue:work]
Cron[eniceberny-scheduler: php artisan schedule:run] --> Web
end
subgraph Data & Storage
Web --> DB[(Managed PostgreSQL 16)]
Worker --> DB
Web --> Storage[Cloudflare R2 / S3 Media Bucket]
end
2. Multi-Stage Dockerfile Architecture
The production image is built using a clean two-stage Dockerfile to minimize attack surface and image size:
Stage 1 — Node 20 Builder
- Base image:
node:20-alpine. - Copies
package.json,package-lock.json, and installs production dependencies. - Compiles frontend assets with Vite:
npm run build. - Outputs optimized bundles to
public/build/.
Stage 2 — PHP 8.4 Apache Runtime
- Base image:
php:8.4-apache. - Installs system libraries and compiled extensions:
pdo,pdo_pgsql,pgsql,mbstring,exif,pcntl,bcmath,gd(with FreeType and JPEG support),zip,opcache. - Configures Apache
mod_rewrite, sets document root to/var/www/html/public, and enforcesAllowOverride All. - Injects Composer, installs production PHP dependencies (
composer install --no-dev --optimize-autoloader). - Copies compiled assets from Stage 1.
- Implements healthcheck probe targeting
/up.
3. Infrastructure as Code (render.yaml)
The platform includes an automated Render blueprint (render.yaml) defining all components:
| Service Name | Type | Environment | Plan | Key Responsibilities |
|---|---|---|---|---|
eniceberny-web |
Web Service | Docker | Starter / Standard | Serves HTTP/HTTPS storefront, admin portal, POS counter, and API endpoints. Health check at /up. |
eniceberny-worker |
Background Worker | Docker | Starter | Processes asynchronous email dispatches (OrderPlacedReceiptMail, VerifyEmailOtpMail), PDF generation jobs. |
eniceberny-scheduler |
Cron Job | Docker | Free / Starter | Executes php artisan schedule:run every minute to process inventory alerts and cache purges. |
eniceberny-db |
Managed Database | PostgreSQL 16 | Starter | Relational storage with automated daily snapshots and encrypted storage. |
4. Environment Variables Directory
The following environment variables must be configured in production:
| Variable | Description | Recommended Setting |
|---|---|---|
APP_ENV |
Application environment mode | production |
APP_DEBUG |
Debug stack traces | false (Never set true in production) |
APP_KEY |
32-character AES encryption key | Auto-generated via php artisan key:generate |
APP_URL |
Canonical application domain | https://enicebakerygh.com |
DB_CONNECTION |
Database driver | pgsql |
DB_HOST, DB_DATABASE, DB_USERNAME, DB_PASSWORD |
PostgreSQL credentials | Injected automatically from eniceberny-db |
MEDIA_DISK |
Storage driver for user uploads | s3 (or public if using persistent disk) |
AWS_ENDPOINT |
Cloudflare R2 / S3 endpoint | https://<account-id>.r2.cloudflarestorage.com |
AWS_BUCKET |
Storage bucket name | eniceberny-media-prod |
PAYSTACK_PUBLIC_KEY |
Paystack public key | pk_live_... |
PAYSTACK_SECRET_KEY |
Paystack secret key | sk_live_... |
MAIL_MAILER |
Email driver | smtp |
MAIL_HOST, MAIL_PORT, MAIL_USERNAME, MAIL_PASSWORD |
SMTP credentials | Configured via SendGrid, Mailgun, or Postmark |
5. Post-Deployment Runbook
On initial launch or subsequent database schema updates:
- Execute Database Migrations:
php artisan migrate --force - Seed Default Catalog & Operational Sample Data:
php artisan db:seed --class=DatabaseSeeder --force - Verify Super Admin Access:
php artisan auth:ensure-admin - Optimize Caches:
php artisan config:cache php artisan route:cache php artisan view:cache - Verify Public Probes:
- Check
GET https://enicebakerygh.com/upreturns HTTP 200 OK. - Verify XML sitemap at
GET https://enicebakerygh.com/sitemap.xml. - Verify robots rules at
GET https://enicebakerygh.com/robots.txt.
- Check