- Add Apollo Client for Saleor GraphQL API - Create GraphQL fragments (Product, Variant, Checkout) - Create GraphQL queries (Products, Checkout) - Create GraphQL mutations (Checkout operations) - Add TypeScript types for Saleor entities - Add product helper functions - Install @apollo/client and graphql dependencies Part of WordPress/WooCommerce → Saleor migration
13 KiB
13 KiB
Infrastructure Overview: WordPress → Saleor Migration
System Architecture
┌─────────────────────────────────────────────────────────────────────────────┐
│ K3s Cluster │
│ │
│ ┌──────────────────────────┐ ┌─────────────────────────────────────────┐ │
│ │ manoonoils namespace │ │ saleor namespace │ │
│ │ (WordPress/WooCommerce)│ │ (Headless Commerce) │ │
│ │ │ │ │ │
│ │ ┌──────────────────┐ │ │ ┌──────────────────────────────────┐ │ │
│ │ │ WordPress │ │ │ │ Saleor API (Django) │ │ │
│ │ │ - WooCommerce │ │ │ │ - GraphQL endpoint │ │ │
│ │ │ - ADVMO Plugin │ │ │ │ - Product management │ │ │
│ │ └────────┬─────────┘ │ │ └────────┬─────────────────────────┘ │ │
│ │ │ │ │ │ │ │
│ │ ┌────────▼─────────┐ │ │ ┌────────▼──────────────────────────┐ │ │
│ │ │ Redis │ │ │ │ Redis │ │ │
│ │ │ (Object Cache) │ │ │ │ (Celery + Cache) │ │ │
│ │ └──────────────────┘ │ │ └───────────────────────────────────┘ │ │
│ │ │ │ │ │ │ │
│ │ ┌────────▼─────────┐ │ │ ┌────────▼──────────────────────────┐ │ │
│ │ │ MariaDB │ │ │ │ PostgreSQL │ │ │
│ │ │ (WP database) │ │ │ │ (Products, Orders, Users) │ │ │
│ │ └──────────────────┘ │ │ └───────────────────────────────────┘ │ │
│ │ │ │ │ │
│ └──────────────────────────┘ └─────────────────────────────────────────┘ │
│ │
│ ┌─────────────────────────────────────────────────────────────────────┐ │
│ │ Shared Services │ │
│ │ │ │
│ │ ┌──────────────────────────────────────────────────────────────┐ │ │
│ │ │ MinIO Object Storage │ │ │
│ │ │ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │ │ │
│ │ │ │ manoon-media │ │ saleor │ │ other │ │ │ │
│ │ │ │ (WP images) │ │ (Saleor │ │ buckets... │ │ │ │
│ │ │ │ │ │ images) │ │ │ │ │ │
│ │ │ └──────────────┘ └──────────────┘ └──────────────┘ │ │ │
│ │ └──────────────────────────────────────────────────────────────┘ │ │
│ │ │ │
│ │ ┌──────────────────────────────────────────────────────────────┐ │ │
│ │ │ Traefik Ingress │ │ │
│ │ │ │ │ │
│ │ │ manoonoils.com → WordPress │ │ │
│ │ │ dev.manoonoils.com → Next.js Storefront │ │ │
│ │ │ api.manoonoils.com → Saleor API │ │ │
│ │ │ dashboard.manoonoils.com → Saleor Dashboard │ │ │
│ │ │ minio-api.nodecrew.me → MinIO API │ │ │
│ │ └──────────────────────────────────────────────────────────────┘ │ │
│ │ │ │
│ └─────────────────────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────────────┘
Redis Usage
WordPress Redis (manoonoils namespace)
# WordPress uses Redis for:
# - Object caching (reduces DB queries)
# - Session storage
# - Transients cache
Service: redis.manoonoils.svc.cluster.local:6379
Purpose: WP Object Cache only
Data: Temporary cache (can be cleared)
Persistence: Not critical
wp-config.php:
define( 'WP_REDIS_HOST', 'redis' );
define( 'WP_REDIS_PORT', 6379 );
Saleor Redis (saleor namespace)
# Saleor uses Redis for:
# - Celery task queue (background jobs)
# - Django cache framework
# - WebSocket channel layer (if using subscriptions)
Service: saleor-redis.saleor.svc.cluster.local:6379
Purpose: Task queue + Cache
Data: Task queue messages, cached data
Persistence: Not critical (tasks re-created if lost)
Saleor environment:
CELERY_BROKER_URL=redis://saleor-redis.saleor:6379/0
REDIS_URL=redis://saleor-redis.saleor:6379/0
Key Point: Separate Redis Instances
| Component | Redis Instance | Purpose |
|---|---|---|
| WordPress | redis.manoonoils |
Object cache only |
| Saleor | saleor-redis.saleor |
Celery + cache |
| No sharing | - | Each has its own |
Media Storage Architecture
MinIO Configuration
Single MinIO instance serves both systems:
MinIO Server (minio.manoonoils:9000)
├── manoon-media/ ← WordPress uploads (existing)
│ ├── wp-content/
│ │ └── uploads/
│ │ ├── 2024/
│ │ │ └── 01/
│ │ │ └── product-image.jpg
│ │ └── 2023/
│ └── assets/
│ └── logo.png
│
└── saleor/ ← Saleor media (new)
├── products/ ← Product images
├── assets/ ← Logos, favicons
└── exports/ ← Data exports
WordPress Media Flow
1. User uploads image in WordPress
↓
2. ADVMO plugin intercepts upload
↓
3. Image saved to MinIO: manoon-media/wp-content/uploads/2024/01/image.jpg
↓
4. WordPress stores URL: https://minio-api.nodecrew.me/manoon-media/wp-content/uploads/2024/01/image.jpg
↓
5. Image served from MinIO
Saleor Media Flow
1. User uploads image in Saleor Dashboard
↓
2. Saleor API saves to MinIO: saleor/products/image.jpg
↓
3. Saleor generates thumbnails
↓
4. Image served via API: https://api.manoonoils.com/media/products/image.jpg
↓
5. Or direct from MinIO: https://minio-api.nodecrew.me/saleor/products/image.jpg
Image Migration Process
Option 1: Copy Images (Recommended)
# 1. Access MinIO
kubectl exec -it deployment/minio -n manoonoils -- /bin/sh
# 2. Set up alias
mc alias set local http://localhost:9000 $MINIO_ROOT_USER $MINIO_ROOT_PASSWORD
# 3. Create saleor bucket if not exists
mc mb local/saleor
# 4. Copy all WordPress images to Saleor bucket
mc cp --recursive local/manoon-media/wp-content/uploads/ local/saleor/products/
# 5. Copy assets
mc cp local/manoon-media/assets/logo.png local/saleor/assets/
Result:
- Original images stay in
manoon-media(WordPress keeps working) - Copies in
saleor(for Saleor use) - No downtime during migration
Option 2: Move Images (After Full Migration)
# Only after WordPress is fully retired:
# 1. Move instead of copy
mc mv local/manoon-media/wp-content/uploads/ local/saleor/products/
# 2. Update any remaining references
# 3. Delete manoon-media bucket when confirmed safe
Logo & Asset Strategy
During Migration Period
Keep logos in both places:
MinIO:
├── manoon-media/assets/logo.png ← Used by WordPress
└── saleor/assets/logo.png ← Used by Saleor
Next.js storefront:
// Use absolute URL to MinIO
const LOGO_URL = 'https://minio-api.nodecrew.me/saleor/assets/logo.png';
// Or use Next.js public folder
import logo from '@/public/logo.png';
Post-Migration
Option A: Keep in MinIO
- Serve from
saleor/assets/ - Update via MinIO console or API
- CDN-friendly
Option B: Move to Next.js
storefront/public/
├── logo.png
├── favicon.ico
└── assets/
└── hero-banner.jpg
Access: https://dev.manoonoils.com/logo.png
Data Flow During Migration
Phase 1: Parallel Running
Customer visits dev.manoonoils.com (Saleor storefront)
↓
Products fetched from Saleor API
↓
Product images loaded from:
- NEW products: saleor bucket
- OLD products: manoon-media bucket (mapped URL)
↓
Checkout via Saleor checkout API
Phase 2: Full Cutover
Customer visits dev.manoonoils.com
↓
All products in Saleor
↓
All images in saleor bucket
↓
WordPress fully retired
Backup Strategy
What to Back Up
| Component | Backup Method | Frequency | Location |
|---|---|---|---|
| WordPress DB | Kopia | Daily | StorageBox |
| WordPress files | Kopia | Daily | StorageBox |
| MinIO buckets | Kopia | Daily | StorageBox |
| Saleor DB | Kopia | Daily | StorageBox |
| Saleor PVC | Kopia | Daily | StorageBox |
MinIO Backup Commands
# Backup specific bucket
kopia snapshot create /mnt/storagebox/kopia-backups
# Or use MinIO client for bucket backup
mc mirror local/saleor /backup/saleor-$(date +%Y%m%d)
Summary
| Component | WordPress | Saleor | Relationship |
|---|---|---|---|
| Redis | Separate instance | Separate instance | No sharing |
| Database | MariaDB | PostgreSQL | Separate |
| Media | manoon-media bucket | saleor bucket | Same MinIO |
| Cache | WP Object Cache | Django Cache | Separate |
| Task Queue | None (WP-Cron) | Celery + Redis | Saleor only |
Key Takeaways:
- ✅ Saleor has its own Redis (no conflict with WordPress)
- ✅ Both use same MinIO (easy image copying)
- ✅ Copy images from
manoon-mediatosaleorbucket - ✅ Keep logos in both places during transition
- ✅ WordPress can stay running while Saleor is tested