Skip to content
Saeed Ghofrani
ProjectsCase StudiesExperienceFor Recruiters
Let’s talk
ProjectsCase StudiesExperienceFor Recruiters
PlaygroundArchitectureSkillsWritingContactDownload resume
  1. Home
  2. /Architecture

Saeed Ghofrani Ivari

Backend engineer & engineering manager · Adana

sa.ghofraniivari@gmail.com
Hiring briefProjectsExperienceContactGitHub (opens in new tab)

Architecture

How I make backend decisions when a system already has users.

I start with what must stay true

Before choosing a database or queue, I write down the behavior we cannot accidentally change: who may see the data, how long a request may take, what happens after a retry, and how we recover a bad deploy. That list usually matters more than the diagram.

1. Bound the API contract, response shape, and pagination behavior before optimizing.

2. Choose persistence based on access patterns: relational, document, graph, cache, search, or stream.

3. Move slow work to queues only when retry, idempotency, and user expectations are clear.

4. Make failure modes visible through logs, health checks, metrics, and production-safe smoke checks.

Portfolio request flow

The platform you are using: cached public reads, a server-side contact proxy, and protected content administration.

  1. 1. Browser → Nginx → Next.js

    HTTPS terminates at the reverse proxy. Next serves the public routes and resume.

  2. 2. Public pages → NestJS snapshot

    Server-side reads are cached for 60 seconds; versioned fallback content keeps public pages available when the API cannot respond.

  3. 3. Contact form → Next route → NestJS

    Input is validated before the message is accepted. Errors retain the draft and offer direct email.

  4. 4. NestJS → Prisma → PostgreSQL

    Published content and contact messages are persisted here. Admin access requires authentication.

Delivery: GitHub Actions → Docker Compose → health verification. API/database traffic stays inside the deployment network.

Before implementation

Four questions I want answered before adding infrastructure.

Data

Shape before storage

I model read/write paths, ownership, indexes, and retention rules before picking PostgreSQL, MongoDB, Neo4j, Redis, or Elasticsearch.

Runtime

Separate request and async work

User-facing requests stay bounded; expensive jobs move behind queues only when retry and observability behavior is defined.

Delivery

Deployable systems

Docker, Nginx, CI/CD, health checks, environment boundaries, and rollback notes are part of the architecture, not afterthoughts.

Team

Architecture humans can change

Module boundaries, PR standards, docs, and ownership rules keep a backend team productive after the first implementation is done.

Decision notes

What usually pushes me toward one tool or runtime shape.

Concern

Decision rule

Typical tools

Transactional data

Use when correctness, relations, constraints, and predictable querying matter.

PostgreSQL, Prisma, TypeORM

Realtime delivery

Separate durable state from transport events and define what can be dropped.

Socket.IO, WebRTC, RabbitMQ

High-cost work

Move out of request path when the user can wait and retries are safe.

RabbitMQ, workers, Redis

Search and graph data

Use specialized stores when relational queries become the wrong model.

Elasticsearch, Neo4j, MongoDB

Production operations

Plan for deployment, monitoring, logs, backups, and rollback before release.

Docker, Nginx, Linux VPS, GitHub Actions

System maps

Redacted maps from private systems I worked on.

LicenseMarket: faster APIs while shipping features

Database and API performance work on a commerce and CRM platform, alongside backend team management.

40% lower average API latency and 99.9% platform uptime over approximately six months.

Open case study

Operator Platform Runtime

Support, automation, and real-time workflows coordinated through bounded NestJS modules and async processing.

Conceptual responsibilities, not a network topology or a complete deployment diagram.

Product surfaces

Admin UI
Ticketing
AI Chat

Service boundaries

NestJS API
Prisma Repositories
Auth and RBAC

Data & coordination

PostgreSQL
Redis Cache
RabbitMQ Jobs

Operations & integrations

Puppeteer Integrations
Nginx
Linux VPS

GBT Market: reliable wallet and trading flows

Ongoing freelance work on gold and cryptocurrency trading, with a focus on wallet consistency and live market data.

Atomic balance updates and idempotency safeguards protect against concurrent overdrafts and duplicate transaction logs.

Open case study

Trading and Payment Runtime

Gold and crypto trading flows coordinated through pricing, charting, wallet, gateway, and operations services.

Conceptual responsibilities, not a network topology or a complete deployment diagram.

Product surfaces

Trading UI
Admin Panel
Provider Workflows

Service boundaries

NestJS API
Socket.IO Gateway
Payment Gateway

Data & coordination

MongoDB Charts
Redis
Scheduled Jobs

Operations & integrations

TRON/BSC
External APIs
Docker/PM2

Mobasher: messaging and live consultation

NestJS microservices for consulting, learning, messaging, and voice/video sessions.

500+ concurrent users in production, with observed messaging latency of 100–150 ms.

Open case study

Real-Time Consulting Platform

Communication state, session orchestration, SQL persistence, and media flows kept in separate runtime concerns.

Conceptual responsibilities, not a network topology or a complete deployment diagram.

Product surfaces

Angular Client
Consultant App
Learning UI

Service boundaries

NestJS Gateway
Session Service
Call Orchestration

Data & coordination

RabbitMQ
SQL Persistence
Socket.IO

Operations & integrations

WebRTC Media
Notifications
Reporting

ExModule: verification and exchange integrations

Cryptocurrency backend services for identity checks, exchange integrations, commissions, and referrals.

Delivered identity-verification, exchange-integration, and financial workflow services.

Open case study

Exchange Backend and KYC Flow

Compliance-sensitive onboarding and exchange workflows backed by relational, document, graph, cache, and search stores.

Conceptual responsibilities, not a network topology or a complete deployment diagram.

Product surfaces

Client Apps
KYC Upload
Trading UI

Service boundaries

NestJS Services
Document Validation
Exchange Adapter

Data & coordination

PostgreSQL
MongoDB
Neo4j
Redis

Operations & integrations

Elasticsearch
Binance API
Blockchain Nodes