Files
dewemoji/deployment-live-walkthrough.md
2026-02-19 23:08:50 +07:00

4.3 KiB

Dewemoji Live Deployment Walkthrough

This is the production rollout checklist for the dewemoji app.

Use this in order:

  1. Prepare env
  2. Deploy code
  3. Run post-deploy commands
  4. Ensure admin access
  5. Verify billing/webhooks/search/auth

1) Pre-Deploy (Env + Infra)

Set these in live environment first:

APP_ENV=production
APP_DEBUG=false
APP_URL=https://your-live-domain.com

Core requirements:

  1. Database points to live DB (DB_*).
  2. APP_KEY is set and stable.
  3. SESSION_DRIVER, CACHE_STORE, QUEUE_CONNECTION configured.
  4. Billing provider secrets are set (PayPal/Pakasir).
  5. Allowed origins include live domain.

Recommended billing cooldown config:

DEWEMOJI_BILLING_PENDING_COOLDOWN_SECONDS=120

Webhook URLs:

  1. PayPal webhook: https://your-live-domain.com/v1/paypal/webhook
  2. Pakasir webhook: https://your-live-domain.com/webhooks/pakasir

2) Deploy Code

From your server app directory (example /var/www/html):

git fetch --all
git checkout main
git pull origin main

Install dependencies if needed:

composer install --no-dev --optimize-autoloader

3) Post-Deploy Commands (Required)

Run in this exact sequence:

php artisan optimize:clear
php artisan migrate --force
php artisan config:cache

Optional but recommended:

php artisan route:cache
php artisan view:cache

If you use queue workers:

php artisan queue:restart

Check migration status:

php artisan migrate:status

4) Ensure Admin User

Admin access is role-based (users.role = admin).

php artisan tinker --execute="\App\Models\User::where('email','dewemoji@gmail.com')->update(['role'=>'admin']);"

Option B: Create admin user if missing

php artisan tinker --execute="
\$u=\App\Models\User::firstOrCreate(
 ['email'=>'dewemoji@gmail.com'],
 ['name'=>'Dewemoji Admin','password'=>\Illuminate\Support\Facades\Hash::make('ChangeMeNow123!'),'tier'=>'free','email_verified_at'=>now()]
);
\$u->role='admin';
\$u->save();
"

Verify:

php artisan tinker --execute="dump(\App\Models\User::where('email','dewemoji@gmail.com')->first(['id','email','role','tier']));"

5) Smoke Test Checklist (Live)

A. Core App

  1. Login/register works over HTTPS with no insecure form warnings.
  2. Dashboard loads.
  3. Discover search returns emojis.
  4. Emoji detail page loads.

B. Skin Tone

  1. Discover: change skin tone selector and verify toneable emoji changes.
  2. Detail: tone chips update hero emoji and copy behavior.
  3. Refresh page: tone preference persists.

C. Account + Keywords

  1. Free account can create up to active limit.
  2. Active/inactive keyword behavior reflected in search.
  3. Private keyword search appears in Discover after creation.

D. Billing

  1. PayPal checkout starts and returns.
  2. Pakasir QRIS starts and modal polls.
  3. Pending payment can be resumed.
  4. Cooldown prevents immediate repeated checkout spam.

E. Webhooks

  1. PayPal event recorded and payment status updates.
  2. Pakasir event recorded and payment status updates.

Useful checks:

tail -n 200 storage/logs/laravel.log
php artisan tinker --execute="dump(\App\Models\WebhookEvent::latest()->take(10)->get(['id','provider','event_type','status','created_at'])->toArray());"
php artisan tinker --execute="dump(\App\Models\Payment::latest()->take(10)->get(['id','provider','plan_code','status','created_at'])->toArray());"

6) Optional: PayPal Plan Sync (Admin)

From admin dashboard:

  1. Open pricing admin page.
  2. Click sync PayPal plans.
  3. Confirm plan IDs are written and no 500.

If there is failure, check:

tail -n 300 storage/logs/laravel.log | grep -Ei "paypal|sync|webhook|error|exception"

7) Extension Release Order

Release order:

  1. Site/backend live first.
  2. Verify API/auth on live domain.
  3. Update extension default API base to live.
  4. Publish extension update.

This avoids extension users hitting endpoints that are not ready.


8) Rollback Strategy

If release is broken:

  1. Re-deploy previous known-good git commit.
  2. Run:
php artisan optimize:clear
php artisan config:cache
php artisan queue:restart
  1. If issue is emoji dataset, use snapshot activation in admin catalog.