TypeORM এর Deployment এবং Production Setup
TypeORM হল একটি Object-Relational Mapping (ORM) লাইব্রেরি যা Node.js বা TypeScript অ্যাপ্লিকেশনগুলির জন্য খুবই জনপ্রিয়। এটি ডেটাবেসের সাথে সহজভাবে কাজ করতে সাহায্য করে এবং ডেটাবেস ম্যানিপুলেশন, রিলেশন, কুয়েরি বিল্ডিং ইত্যাদি কাজ করে। যখন আপনার TypeORM অ্যাপ্লিকেশন প্রস্তুত হয় প্রোডাকশনে ডেপ্লয় করার জন্য, কিছু নির্দিষ্ট কনফিগারেশন এবং অপ্টিমাইজেশন প্রয়োজন হয় যাতে এটি দ্রুত এবং স্থিতিশীলভাবে কাজ করে।
নিচে TypeORM অ্যাপ্লিকেশন প্রোডাকশনে ডেপ্লয় করার জন্য প্রয়োজনীয় পদক্ষেপ এবং টিপস দেওয়া হয়েছে।
১. প্রোডাকশন পরিবেশের জন্য TypeORM কনফিগারেশন
প্রোডাকশনে TypeORM ব্যবহার করার জন্য আপনাকে একটি শক্তিশালী কনফিগারেশন সেটআপ করতে হবে। এটি সাধারণত ormconfig.json ফাইলে করা হয় অথবা কোডে সরাসরি কনফিগারেশন সেট করা যায়।
ormconfig.json ফাইল কনফিগারেশন (এটি ডেটাবেস সেটআপের জন্য প্রাথমিক কনফিগারেশন)
{
"type": "postgres",
"host": "localhost",
"port": 5432,
"username": "your-username",
"password": "your-password",
"database": "your-database",
"synchronize": false,
"logging": false,
"entities": [
"src/entity/**/*.ts"
],
"migrations": [
"src/migration/**/*.ts"
],
"subscribers": [
"src/subscriber/**/*.ts"
],
"cli": {
"migrationsDir": "src/migration"
}
}
কিছু গুরুত্বপূর্ণ কনফিগারেশন অপশন:
synchronize: প্রোডাকশন পরিবেশেfalseরাখা উচিত। এটি টেবিলের স্ট্রাকচার অটোমেটিক্যালি আপডেট করে, যা প্রোডাকশন পরিবেশে রিস্কি হতে পারে। তাইsynchronize: falseরাখা উচিত।logging: প্রোডাকশনে লগিং বন্ধ রাখুন যাতে এটি অতিরিক্ত তথ্য না জমায়।migrations: TypeORM মাইগ্রেশন ফাইলের লোকেশন এখানে নির্ধারণ করা হয়।
২. Migrations Setup
TypeORM এর মাইগ্রেশন সিস্টেম খুবই গুরুত্বপূর্ণ, কারণ এটি ডেটাবেস স্কিমা আপডেট এবং ডেপ্লয়মেন্ট সহজ করে তোলে। মাইগ্রেশন ব্যবহারে ডেটাবেসের সংস্করণ নিয়ন্ত্রণ করা যায় এবং কোডের সাথে ডেটাবেসের সিঙ্ক্রোনাইজেশন রাখা সহজ হয়।
Migrations তৈরি করা
npm run typeorm migration:generate -- -n MigrationName
এটি একটি নতুন মাইগ্রেশন ফাইল তৈরি করবে যা ডেটাবেস স্কিমা পরিবর্তন অন্তর্ভুক্ত করবে। এই কমান্ডটি আপনার ডেটাবেস এবং কোডের মধ্যে যে কোন স্কিমা পার্থক্য চিহ্নিত করবে এবং মাইগ্রেশন ফাইলে লিখে দিবে।
Migrations রান করা
npm run typeorm migration:run
প্রোডাকশনে, আপনাকে মাইগ্রেশন রান করার জন্য এই কমান্ডটি চালাতে হবে। এটি ডেটাবেসের সাথে স্কিমা সিঙ্ক্রোনাইজেশন করবে।
৩. Database Connection Pooling
প্রোডাকশন পরিবেশে ডেটাবেসের সাথে কার্যকরীভাবে যোগাযোগ করতে connection pooling ব্যবহার করা প্রয়োজন। এটি ডেটাবেসে অতিরিক্ত কানেকশন ওপেন হতে প্রতিরোধ করে এবং পারফরম্যান্স উন্নত করতে সাহায্য করে। TypeORM-এ আপনি extra কনফিগারেশন দিয়ে এই ফিচারটি সক্রিয় করতে পারেন।
Database Pooling কনফিগারেশন:
{
"type": "postgres",
"host": "localhost",
"port": 5432,
"username": "your-username",
"password": "your-password",
"database": "your-database",
"synchronize": false,
"logging": false,
"extra": {
"max": 20, // Max connections in pool
"idleTimeoutMillis": 30000, // Timeout settings
"connectionTimeoutMillis": 2000
},
"entities": [
"src/entity/**/*.ts"
],
"migrations": [
"src/migration/**/*.ts"
]
}
এখানে extra এর মধ্যে max ব্যবহার করে কানেকশন পুল সাইজ কনফিগার করা হয়েছে। এটি ডেটাবেসে একসাথে কতগুলো কানেকশন থাকবে তা নিয়ন্ত্রণ করে।
৪. Environment Variables ব্যবহার করা
প্রোডাকশনে environment variables ব্যবহার করা একটি ভালো অভ্যাস। এটি নিরাপত্তা বৃদ্ধি করে এবং ডিপ্লয়মেন্ট এবং স্কেলেবিলিটি সহজ করে তোলে।
এনভায়রনমেন্ট ভেরিয়েবল ব্যবহার:
.env ফাইলে আপনার ডেটাবেস কনফিগারেশন এবং অন্যান্য গোপন তথ্য রাখুন:
DB_HOST=localhost
DB_PORT=5432
DB_USERNAME=your-username
DB_PASSWORD=your-password
DB_NAME=your-database
এটি লোড করতে, আপনার কোডে dotenv প্যাকেজ ব্যবহার করতে পারেন:
npm install dotenv
এবং কোডে:
import { config } from "dotenv";
config();
এখন আপনি .env ফাইলের মাধ্যমে environment ভেরিয়েবল অ্যাক্সেস করতে পারবেন:
const connection = await createConnection({
type: "postgres",
host: process.env.DB_HOST,
port: parseInt(process.env.DB_PORT),
username: process.env.DB_USERNAME,
password: process.env.DB_PASSWORD,
database: process.env.DB_NAME,
entities: [
User,
Post,
// Add more entities here
],
synchronize: false, // For production, set to false
});
৫. Security Considerations
প্রোডাকশনে, ডেটাবেস কনফিগারেশনের নিরাপত্তা নিশ্চিত করতে হবে। কিছু গুরুত্বপূর্ণ নিরাপত্তা ব্যবস্থাপনা:
- Database Credentials: ডেটাবেস ক্রেডেনশিয়ালস
.envফাইলে রাখুন এবং কখনো কোডবেসে হার্ডকোড না করুন। - SSL/TLS: প্রোডাকশন ডেটাবেস কানেকশন প্রোটেক্ট করতে SSL বা TLS ব্যবহার করুন।
- Data Validation: ইউজারের ইনপুট সঠিকভাবে যাচাই করুন এবং SQL ইনজেকশন থেকে রক্ষা করার জন্য প্রস্তুত কুয়েরি ব্যবহার করুন।
৬. Logging and Monitoring
প্রোডাকশনে অ্যাপ্লিকেশন এবং ডেটাবেসের কার্যকারিতা মনিটর করতে logging এবং monitoring টুলস ব্যবহৃত হয়।
- Logging: TypeORM-এ logging কনফিগারেশন থেকে কুয়েরি লগিং চালু বা বন্ধ করতে পারেন। তবে, প্রোডাকশনে লগিং সচল রাখার সময় শুধুমাত্র প্রয়োজনীয় তথ্যই লগ করতে হবে।
{
"logging": ["query", "error"]
}
- Monitoring: আপনি PM2, New Relic, Datadog বা অন্যান্য মনিটরিং টুল ব্যবহার করতে পারেন যা অ্যাপ্লিকেশনের পারফরম্যান্স এবং ডেটাবেস অপারেশনের পর্যবেক্ষণ সরবরাহ করবে।
৭. Scaling the Application
যদি আপনার অ্যাপ্লিকেশন অনেক বেশি ট্রাফিক হ্যান্ডেল করতে সক্ষম হতে চায়, তবে horizontal scaling এবং load balancing ব্যবহার করা যেতে পারে। এতে সার্ভারগুলির সংখ্যা বাড়ানো হয় যাতে অ্যাপ্লিকেশন সহজে স্কেল হয়।
- Load Balancers: আপনার অ্যাপ্লিকেশন সার্ভারের মধ্যে ট্রাফিককে সুষমভাবে বিতরণ করার জন্য ব্যবহার করা হয়।
- Database Scaling: আপনার ডেটাবেসের জন্য read replicas এবং sharding ব্যবহার করতে পারেন।
সারাংশ
TypeORM অ্যাপ্লিকেশন প্রোডাকশনে ডেপ্লয় করার জন্য সঠিক কনফিগারেশন এবং সিকিউরিটি পদক্ষেপ নেওয়া খুবই গুরুত্বপূর্ণ। প্রোডাকশনের জন্য সঠিক configuration, migrations, connection pooling, এবং environment variables ব্যবহার করা উচিত। এছাড়াও, scaling, logging, এবং monitoring টুলস ব্যবহারের মাধ্যমে অ্যাপ্লিকেশনটি স্থিতিশীল এবং নিরাপদ রাখা সম্ভব। TypeORM ডেটাবেস ম্যানেজমেন্টকে সহজ এবং কার্যকরী করে তোলে, তবে প্রোডাকশন পরিবেশে এইসব টুলস এবং কৌশলগুলো সঠিকভাবে প্রয়োগ করা প্রয়োজন।
TypeORM ব্যবহার করে Production Ready অ্যাপ্লিকেশন তৈরি
TypeORM হল একটি শক্তিশালী ORM (Object-Relational Mapper) যা Node.js এবং TypeScript/JavaScript অ্যাপ্লিকেশন তৈরিতে ব্যবহৃত হয়। TypeORM ব্যবহারের মাধ্যমে আপনি ডেটাবেস ম্যানেজমেন্ট সিস্টেম (DBMS) এর সাথে সহজে যোগাযোগ করতে পারবেন এবং এতে Migration, Relations, Data Validation, এবং Transaction Management এর মত ফিচার অন্তর্ভুক্ত থাকে।
যখন আপনি একটি Production Ready TypeORM অ্যাপ্লিকেশন তৈরি করেন, তখন কয়েকটি গুরুত্বপূর্ণ বিষয়ের দিকে নজর দেওয়া জরুরি। এখানে কিছু ভালো পদ্ধতি এবং প্র্যাকটিসের মাধ্যমে আমরা আলোচনা করব কিভাবে TypeORM অ্যাপ্লিকেশনকে production ready করা যায়।
১. Proper Database Configuration
একটি production ready অ্যাপ্লিকেশন তৈরি করার জন্য প্রথম কাজ হল ডেটাবেস কনফিগারেশন সঠিকভাবে সেট করা। TypeORM ডেটাবেস কনফিগারেশন ফাইলটি .env ফাইলে রাখা হয়, যাতে প্রকল্পের পরিবেশ অনুযায়ী ডেটাবেস কনফিগারেশন সহজে পরিবর্তন করা যায়।
Configuration Example (ormconfig.json):
{
"type": "mysql",
"host": "localhost",
"port": 3306,
"username": "root",
"password": "your_password",
"database": "production_db",
"synchronize": false, // Don't use synchronize in production
"logging": false, // Avoid logging in production
"entities": [
"src/entity/**/*.ts"
],
"migrations": [
"src/migration/**/*.ts"
],
"subscribers": [
"src/subscriber/**/*.ts"
],
"cli": {
"migrationsDir": "src/migration"
}
}
Key Settings:
- synchronize: Prod-এ synchronize প্যারামিটারটি
falseরাখতে হবে, কারণ এটি ডেটাবেসের স্কিমা প্রতিবার অ্যাপ্লিকেশন চালানোর সময় অটোমেটিকভাবে আপডেট করে। এটি সাধারণত ডেভেলপমেন্ট পরিবেশে ব্যবহৃত হয়। - logging: লগিং প্রোডাকশনে নিষ্ক্রিয় রাখা উচিত, কারণ অতিরিক্ত লগিং পারফরম্যান্সে সমস্যা তৈরি করতে পারে।
- migrations: প্রোডাকশনে মাইগ্রেশন ব্যবহারের মাধ্যমে স্কিমা পরিবর্তন করতে হবে।
synchronizeবিকল্পটিfalseকরার ফলে আপনি মাইগ্রেশন দ্বারা ডেটাবেসে পরিবর্তন করতে পারবেন।
২. Migrations ব্যবহার করা
প্রোডাকশনে Migrations খুবই গুরুত্বপূর্ণ, কারণ এটি ডেটাবেসের স্কিমা পরিবর্তন এবং আপডেট সুরক্ষিতভাবে পরিচালনা করতে সাহায্য করে। TypeORM এর মাইগ্রেশন সিস্টেম আপনাকে আপনার ডেটাবেসের স্কিমা পরিবর্তন এবং সংস্করণ কন্ট্রোলের মাধ্যমে পরিচালনা করতে সহায়তা করে।
Migrations উদাহরণ:
Migration ফাইল তৈরি করা: TypeORM CLI ব্যবহার করে মাইগ্রেশন ফাইল তৈরি করতে পারেন:
npx typeorm migration:generate -n MigrationNameMigration রান করা: মাইগ্রেশন তৈরি হওয়ার পর, ডেটাবেসে পরিবর্তন প্রয়োগ করতে হবে:
npx typeorm migration:runRollback (Undo) করা: কোনো কারণে পূর্ববর্তী মাইগ্রেশন ফিরিয়ে নিতে চাইলে
migration:revertকমান্ড ব্যবহার করা যায়:npx typeorm migration:revert
Best Practice: প্রোডাকশনে মাইগ্রেশন চালানোর সময় পর্যাপ্ত ব্যাকআপ থাকা উচিত যাতে কোনো ডেটা হারানোর ঘটনা এড়ানো যায়।
৩. Environment Configuration
প্রোডাকশনে Environment Variables ব্যবহারের মাধ্যমে অ্যাপ্লিকেশনের কনফিগারেশন আরও নিরাপদ এবং অ্যাডজাস্টেবল করা যায়। .env ফাইল ব্যবহার করে ডেটাবেস কনফিগারেশন এবং অন্যান্য গুরুত্বপূর্ণ সেটিংস পরিবেশ অনুযায়ী কনফিগার করা যেতে পারে।
Example: .env file
DB_HOST=localhost
DB_PORT=3306
DB_USER=root
DB_PASSWORD=your_password
DB_NAME=production_db
এখন, TypeORM কনফিগারেশনে এই ভেরিয়েবলগুলি ব্যবহার করা যেতে পারে:
import { createConnection } from "typeorm";
import dotenv from "dotenv";
dotenv.config();
createConnection({
type: "mysql",
host: process.env.DB_HOST,
port: parseInt(process.env.DB_PORT || "3306"),
username: process.env.DB_USER,
password: process.env.DB_PASSWORD,
database: process.env.DB_NAME,
synchronize: false,
logging: false,
entities: [
// your entities
],
}).then(() => {
console.log("Connected to the database");
}).catch(error => console.log(error));
এভাবে, আপনার production এবং development কনফিগারেশন আলাদা রাখা যায় এবং অ্যাপ্লিকেশনটি আরো নিরাপদ হয়।
৪. Error Handling and Logging
প্রোডাকশনে Error Handling এবং Logging সিস্টেম অত্যন্ত গুরুত্বপূর্ণ। TypeORM দ্বারা ঘটে যাওয়া ত্রুটিগুলোর সঠিক লগিং এবং অ্যাপ্লিকেশন স্তরের ত্রুটিগুলোর জন্য কার্যকরী ব্যবস্থা থাকা উচিত।
Error Handling Example:
try {
const user = await userRepository.findOne({ where: { id: 1 } });
if (!user) throw new Error("User not found");
console.log(user);
} catch (error) {
console.error("Error:", error.message);
// Log the error to an external service (like Sentry or LogRocket)
}
Logging Best Practices:
- Use a centralized logging service like Winston, Log4js, or third-party services like Sentry for tracking and logging errors.
- Avoid excessive logging in production. Log only necessary information such as errors, critical events, and application status.
৫. Transaction Management
প্রোডাকশনে ডেটাবেসের সাথে কাজ করার সময় Transaction ব্যবস্থাপনা খুবই গুরুত্বপূর্ণ। TypeORM এর মাধ্যমে আপনি transaction management ব্যবহার করে একাধিক ডেটাবেস অপারেশন একটি একক ইউনিট হিসেবে কার্যকর করতে পারেন। এটি ডেটাবেসে সমস্যা এড়াতে সাহায্য করে যখন একাধিক অপারেশন একত্রে পরিচালিত হয়।
Transaction উদাহরণ:
import { getManager } from "typeorm";
import { User } from "./entity/User";
import { Post } from "./entity/Post";
async function createUserAndPost() {
const entityManager = getManager();
await entityManager.transaction(async transactionalEntityManager => {
const user = new User();
user.name = "John Doe";
await transactionalEntityManager.save(user);
const post = new Post();
post.title = "First Post";
post.user = user;
await transactionalEntityManager.save(post);
});
}
এখানে, transaction ব্যবহার করে একটি User এবং Post একযোগে তৈরি করা হচ্ছে। যদি কোনো এক অপারেশন ব্যর্থ হয়, তবে সম্পূর্ণ ট্রানজেকশন রোলব্যাক হবে।
৬. Security Considerations
প্রোডাকশনে Security সবচেয়ে গুরুত্বপূর্ণ বিষয়। TypeORM এ নিরাপত্তা নিশ্চিত করার জন্য কিছু গুরুত্বপূর্ণ পদ্ধতি অনুসরণ করা উচিত:
- SQL Injection থেকে বাঁচতে
query builderব্যবহার করুন, যেমনcreateQueryBuilder(), যা স্বয়ংক্রিয়ভাবে SQL ইনজেকশন প্রতিরোধ করে। - Data Validation করুন, বিশেষ করে ব্যবহারকারী থেকে আসা ইনপুট ডেটার ক্ষেত্রে।
- Encryption ব্যবহার করুন, যেমন পাসওয়ার্ড সুরক্ষিত রাখার জন্য bcrypt বা argon2 ব্যবহার করতে পারেন।
৭. Performance Optimization
প্রোডাকশনে অ্যাপ্লিকেশনের পারফরম্যান্স অপটিমাইজ করা খুবই গুরুত্বপূর্ণ। কিছু সাধারণ পারফরম্যান্স টিপস:
- Lazy Loading ব্যবহার করুন যেখানে শুধুমাত্র প্রয়োজনীয় ডেটা লোড করা হয়।
- Indexes তৈরি করুন, বিশেষ করে যেসব কলামগুলোর উপর বেশিরভাগ সময় কুয়েরি চালানো হয়।
- Query Optimization করুন যাতে unnecessary ডেটাবেস কুয়েরি এড়ানো যায়।
সারাংশ
Production Ready TypeORM অ্যাপ্লিকেশন তৈরি করার জন্য সঠিক কনফিগারেশন, মাইগ্রেশন, নিরাপত্তা ব্যবস্থা, এবং পারফরম্যান্স অপটিমাইজেশন গুরুত্বপূর্ণ। Transactions এবং cascade operations ব্যবহার করে ডেটাবেসের একাধিক অপারেশন কার্যকরীভাবে পরিচালনা করা যায়। TypeORM এর সাথে error handling, logging, এবং security best practices নিশ্চিত করে আপনার অ্যাপ্লিকেশনটি production-ready হতে পারে, যা আরও স্কেলেবল এবং নিরাপদ হবে।
TypeORM এর সাথে Database Configuration
TypeORM হল একটি ORM (Object-Relational Mapping) লাইব্রেরি যা TypeScript এবং JavaScript ডেভেলপমেন্টে ব্যবহৃত হয় এবং বিভিন্ন ডেটাবেসের সাথে কাজ করার জন্য একে ব্যবহার করা যায়। TypeORM এ ডেটাবেস কনফিগারেশন এমনভাবে করা হয় যাতে আপনি আপনার ডেটাবেস সংযোগ এবং সেটিংস এক জায়গায় সহজে কনফিগার করতে পারেন।
ডেটাবেস কনফিগারেশনের জন্য TypeORM প্রধানত ormconfig.json ফাইল বা কনফিগারেশন অবজেক্ট ব্যবহার করে কাজ করে। এই কনফিগারেশনটি entities, migrations, subscribers, host, port ইত্যাদি বিষয়গুলো অন্তর্ভুক্ত করে।
১. ormconfig.json ফাইল
TypeORM ব্যবহার করার জন্য সাধারণভাবে একটি ormconfig.json ফাইল তৈরি করা হয়, যেখানে ডেটাবেসের সমস্ত কনফিগারেশন নির্ধারণ করা থাকে।
ormconfig.json উদাহরণ:
{
"type": "mysql",
"host": "localhost",
"port": 3306,
"username": "root",
"password": "your_password",
"database": "test_db",
"synchronize": true,
"logging": false,
"entities": [
"src/entity/**/*.ts"
],
"migrations": [
"src/migration/**/*.ts"
],
"subscribers": [
"src/subscriber/**/*.ts"
],
"cli": {
"entitiesDir": "src/entity",
"migrationsDir": "src/migration",
"subscribersDir": "src/subscriber"
}
}
এখানে কিছু গুরুত্বপূর্ণ কনফিগারেশন প্যারামিটার:
- type: ডেটাবেসের প্রকার (যেমন,
mysql,postgres,sqlite, ইত্যাদি)। - host: ডেটাবেসের হোস্ট (অথবা IP ঠিকানা)।
- port: ডেটাবেসের পোর্ট নম্বর (যেমন MySQL-এর জন্য সাধারণত 3306)।
- username এবং password: ডেটাবেসের ইউজারনেম এবং পাসওয়ার্ড।
- database: ডেটাবেসের নাম।
- synchronize: যদি এটি
trueথাকে, TypeORM ডেটাবেসের স্কিমা (structure) স্বয়ংক্রিয়ভাবে আপডেট করবে (উত্পাদন পরিবেশে এটা সাধারণতfalseকরা হয়)। - logging: ডেটাবেস অপারেশন লগ করার জন্য।
- entities: আপনার সব entity ফাইলের অবস্থান।
- migrations: মাইগ্রেশন ফাইলের অবস্থান।
- subscribers: সাবস্ক্রাইবার ফাইলের অবস্থান।
২. TypeORM কনফিগারেশন কোড দ্বারা সেটআপ
TypeORM-এ ডেটাবেস কনফিগারেশন কোড দ্বারা কনফিগারও করা যায়। এটি বিশেষত প্রযোজ্য যখন আপনি ডাইনামিক কনফিগারেশন সেট করতে চান, যেমন বিভিন্ন পরিবেশের জন্য ভিন্ন কনফিগারেশন।
TypeORM কনফিগারেশন কোডের উদাহরণ:
import { createConnection } from "typeorm";
import { User } from "./entity/User";
createConnection({
type: "mysql",
host: process.env.DB_HOST || "localhost",
port: 3306,
username: process.env.DB_USER || "root",
password: process.env.DB_PASSWORD || "your_password",
database: process.env.DB_NAME || "test_db",
synchronize: true,
logging: false,
entities: [
User
]
}).then(connection => {
console.log("Connected to the database!");
}).catch(error => console.log(error));
এখানে, কনফিগারেশন ফাইলের পরিবর্তে process.env ব্যবহার করা হয়েছে, যা পরিবেশভিত্তিক ডেটাবেস কনফিগারেশন লোড করতে সাহায্য করে।
৩. Environment Management
ডেভেলপমেন্ট, স্টেজিং এবং প্রোডাকশন পরিবেশের জন্য আলাদা ডেটাবেস কনফিগারেশন থাকতে পারে। এই ক্ষেত্রে, Environment Variables ব্যবহারের মাধ্যমে আপনি ডাইনামিকভাবে কনফিগারেশন সেট করতে পারেন।
dotenv লাইব্রেরি ব্যবহার করে Environment Variables সেট করা:
প্রথমে
dotenvলাইব্রেরি ইনস্টল করুন:npm install dotenvএরপর
.envফাইল তৈরি করুন:DB_HOST=localhost DB_USER=root DB_PASSWORD=your_password DB_NAME=test_db.envফাইলটি লোড করতে dotenv ব্যবহার করুন:
import "dotenv/config"; // Automatically loads the .env file
import { createConnection } from "typeorm";
import { User } from "./entity/User";
createConnection({
type: "mysql",
host: process.env.DB_HOST,
port: 3306,
username: process.env.DB_USER,
password: process.env.DB_PASSWORD,
database: process.env.DB_NAME,
synchronize: true,
logging: false,
entities: [
User
]
}).then(connection => {
console.log("Connected to the database!");
}).catch(error => console.log(error));
এভাবে, ডেভেলপমেন্ট এবং প্রোডাকশন পরিবেশের জন্য আলাদা .env ফাইল তৈরি করে পরিবেশভিত্তিক কনফিগারেশন সেট করা সম্ভব হয়।
৪. Database Configuration with Docker
ডেটাবেস কনফিগারেশন TypeORM-এ Docker কনটেইনারের সাথে ব্যবহারের জন্যও সেট করা যায়। এটি ডেটাবেস সেটআপ এবং কনফিগারেশনকে আরও সহজ করে তোলে।
Docker Compose ব্যবহার করে MySQL কনফিগারেশন:
- একটি
docker-compose.ymlফাইল তৈরি করুন:
version: "3.8"
services:
db:
image: mysql:8
environment:
MYSQL_ROOT_PASSWORD: example
MYSQL_DATABASE: test_db
ports:
- "3306:3306"
volumes:
- db-data:/var/lib/mysql
volumes:
db-data:
- TypeORM কনফিগারেশনকে ডকার কনটেইনারের ডেটাবেসের সাথে সংযোগ করতে সেট করুন:
import { createConnection } from "typeorm";
import { User } from "./entity/User";
createConnection({
type: "mysql",
host: "localhost", // Docker container host
port: 3306,
username: "root",
password: "example",
database: "test_db",
synchronize: true,
logging: false,
entities: [
User
]
}).then(connection => {
console.log("Connected to the MySQL database in Docker!");
}).catch(error => console.log(error));
এখানে, docker-compose ডেটাবেস কনটেইনার চালু করবে এবং TypeORM সেটআপ এর মাধ্যমে আপনি ডেটাবেসের সাথে যোগাযোগ করতে পারবেন।
৫. ডেটাবেস মাইগ্রেশন
TypeORM এ ডেটাবেস স্কিমা পরিবর্তন করার জন্য মাইগ্রেশন ব্যবহৃত হয়। এটি ডেটাবেসের স্কিমা পরিবর্তনের সময় ডেটার স্বচ্ছতা এবং নিরাপত্তা নিশ্চিত করে। মাইগ্রেশন তৈরি এবং প্রয়োগ করতে TypeORM এর CLI (Command Line Interface) ব্যবহার করা হয়।
মাইগ্রেশন কমান্ড উদাহরণ:
মাইগ্রেশন ফাইল তৈরি করুন:
npx typeorm migration:generate -n MigrationNameমাইগ্রেশন চালানোর জন্য:
npx typeorm migration:runপূর্ববর্তী মাইগ্রেশনগুলি রিভার্স করার জন্য:
npx typeorm migration:revert
সারাংশ
TypeORM-এ Database Configuration এবং Environment Management অত্যন্ত গুরুত্বপূর্ণ। আপনি .env ফাইল, Docker, এবং কনফিগারেশন কোড ব্যবহার করে পরিবেশভিত্তিক ডেটাবেস কনফিগারেশন সেট করতে পারেন। TypeORM-এর মাধ্যমে ডেটাবেসের সাথে সহজে সংযোগ স্থাপন করা এবং স্কিমা ম্যানেজমেন্ট করা সম্ভব হয়, যা আপনার অ্যাপ্লিকেশন ডেভেলপমেন্ট প্রক্রিয়াকে আরো দ্রুত এবং কার্যকরী করে তোলে।
TypeORM Deployment Overview
TypeORM হল একটি ORM (Object-Relational Mapping) লাইব্রেরি যা JavaScript/TypeScript ডেভেলপমেন্টে ডেটাবেস অপারেশনগুলো সহজ এবং পরিচালনাযোগ্য করে তোলে। Deployment Strategy হল আপনার অ্যাপ্লিকেশন বা ওয়েব সার্ভিসটি উৎপাদন পরিবেশে (Production Environment) স্থাপন এবং পরিচালনার কৌশল। TypeORM ব্যবহার করা অ্যাপ্লিকেশনটি Docker এবং Kubernetes এর মতো আধুনিক টুলসের মাধ্যমে সহজেই ডিপ্লয় করা যায়।
এখানে, আমরা TypeORM সহ একটি Node.js অ্যাপ্লিকেশনকে Docker এবং Kubernetes ব্যবহার করে কিভাবে ডিপ্লয় করা যায়, তা নিয়ে আলোচনা করব।
১. Docker ব্যবহার করে TypeORM Deployment
Docker একটি ওপেন সোর্স প্ল্যাটফর্ম যা ডেভেলপারদের অ্যাপ্লিকেশন কনটেইনারের মধ্যে প্যাকেজ করতে এবং চালাতে সহায়তা করে। Docker ব্যবহার করে TypeORM অ্যাপ্লিকেশন ডিপ্লয় করা খুবই সুবিধাজনক, কারণ এটি অ্যাপ্লিকেশন এবং তার নির্ভরতাগুলিকে একক প্যাকেজে (কনটেইনারে) প্যাকেজ করতে সাহায্য করে, যা যেকোনো পরিবেশে সহজে রান করতে পারে।
Docker Setup for TypeORM
Dockerfile তৈরি করা: প্রথমে আপনাকে একটি Dockerfile তৈরি করতে হবে, যা Docker কনটেইনারে আপনার অ্যাপ্লিকেশন রান করার জন্য নির্দেশনা দেবে।
উদাহরণ:
Dockerfile:# Use official Node.js image as base image FROM node:16 # Set the working directory WORKDIR /app # Copy package.json and package-lock.json (or yarn.lock) COPY package*.json ./ # Install dependencies RUN npm install # Copy the rest of the application COPY . . # Expose the port the app runs on EXPOSE 3000 # Run the application CMD ["npm", "start"]এখানে, Node.js 16 ব্যবহার করা হয়েছে, তবে আপনি আপনার প্রয়োজন অনুযায়ী অন্যান্য ভার্সনও ব্যবহার করতে পারেন।
docker-compose.yml ফাইল তৈরি করা: docker-compose একটি টুল যা একাধিক কনটেইনারকে একসাথে পরিচালনা করতে সাহায্য করে। TypeORM অ্যাপ্লিকেশনের জন্য ডেটাবেস (যেমন MySQL বা PostgreSQL) সহ কনটেইনার চালানোর জন্য docker-compose.yml ফাইল তৈরি করা প্রয়োজন।
উদাহরণ:
docker-compose.yml:version: "3.8" services: app: build: . ports: - "3000:3000" depends_on: - db environment: - DATABASE_HOST=db - DATABASE_PORT=5432 - DATABASE_USERNAME=postgres - DATABASE_PASSWORD=password - DATABASE_NAME=mydb db: image: postgres:latest environment: - POSTGRES_USER=postgres - POSTGRES_PASSWORD=password - POSTGRES_DB=mydb ports: - "5432:5432"এখানে, app সার্ভিসটি TypeORM অ্যাপ্লিকেশন চালায় এবং db সার্ভিসটি PostgreSQL ডেটাবেস চালায়। আপনি যদি MySQL বা অন্য ডেটাবেস ব্যবহার করতে চান, সেক্ষেত্রে ডেটাবেস কনফিগারেশন পরিবর্তন করতে হবে।
ডিপ্লয়মেন্ট: এখন, আপনি নিম্নলিখিত কমান্ডের মাধ্যমে Docker কনটেইনার তৈরি এবং রান করতে পারেন:
docker-compose up --buildএই কমান্ডটি Dockerfile এবং docker-compose.yml অনুযায়ী কনটেইনার তৈরি এবং চালাবে।
২. Kubernetes ব্যবহার করে TypeORM Deployment
Kubernetes একটি কন্টেইনার অর্কেস্ট্রেশন প্ল্যাটফর্ম যা বৃহৎ স্কেল অ্যাপ্লিকেশন চালাতে ব্যবহৃত হয়। এটি কন্টেইনারগুলোকে ম্যানেজ, স্কেল এবং মনিটর করতে সহায়তা করে। TypeORM অ্যাপ্লিকেশনটি Kubernetes এ ডিপ্লয় করার জন্য আপনাকে Kubernetes কনফিগারেশন ফাইল তৈরি করতে হবে।
Kubernetes Deployment for TypeORM
Docker Image তৈরি করুন: প্রথমে, Docker ব্যবহার করে আপনার অ্যাপ্লিকেশনের একটি Docker image তৈরি করতে হবে, যা Kubernetes এ ব্যবহার করা হবে। Dockerfile এবং docker-compose.yml ফাইলের মতই, Docker image তৈরি করুন:
docker build -t my-app .Kubernetes Deployment YAML তৈরি করা: Kubernetes-এ অ্যাপ্লিকেশন ডিপ্লয় করতে একটি
deployment.yamlফাইল তৈরি করুন।উদাহরণ:
deployment.yaml:apiVersion: apps/v1 kind: Deployment metadata: name: my-app spec: replicas: 3 selector: matchLabels: app: my-app template: metadata: labels: app: my-app spec: containers: - name: my-app image: my-app:latest ports: - containerPort: 3000 env: - name: DATABASE_HOST value: db - name: DATABASE_PORT value: "5432" - name: DATABASE_USERNAME value: postgres - name: DATABASE_PASSWORD value: password - name: DATABASE_NAME value: mydbএখানে, replicas ৩টি কন্টেইনার তৈরি করবে, এবং এটি
my-appনামে একটি Docker image ব্যবহার করবে।Kubernetes Service YAML তৈরি করা: কনটেইনারগুলোর মধ্যে যোগাযোগ করার জন্য একটি
service.yamlফাইল তৈরি করুন।উদাহরণ:
service.yaml:apiVersion: v1 kind: Service metadata: name: my-app-service spec: selector: app: my-app ports: - protocol: TCP port: 80 targetPort: 3000 type: LoadBalancerKubernetes-এ ডিপ্লয়মেন্ট এবং সার্ভিস চালানো: Kubernetes কনফিগারেশন ফাইলগুলি আপলোড করতে নিম্নলিখিত কমান্ড ব্যবহার করুন:
kubectl apply -f deployment.yaml kubectl apply -f service.yamlএর মাধ্যমে আপনি Kubernetes-এ অ্যাপ্লিকেশনটি ডিপ্লয় করতে পারবেন।
৩. TypeORM এবং Kubernetes/Docker Best Practices
- Config Management:
- ডেটাবেস সংযোগের তথ্য এবং অন্যান্য কনফিগারেশন পরিবেশে নির্ভরশীল হওয়া উচিত (Environment Variables বা ConfigMap ব্যবহার করা যেতে পারে)।
- Database Migrations:
- TypeORM অ্যাপ্লিকেশনে migrations ব্যবহারের সময়, মাইগ্রেশন চলানোর জন্য কনটেইনারের শুরুতে একটি স্ক্রিপ্ট অন্তর্ভুক্ত করুন যা ডাটাবেসের স্কিমা আপডেট করবে।
- Persistent Storage:
- Docker বা Kubernetes ডিপ্লয়মেন্টে ডেটাবেসের জন্য Persistent Volumes ব্যবহার করুন, যাতে ডেটা কনটেইনার বা Pod পুনরায় তৈরি হওয়ার পরও সুরক্ষিত থাকে।
- Auto-scaling:
- Kubernetes-এ Horizontal Pod Autoscaler ব্যবহার করুন, যাতে অ্যাপ্লিকেশনের লোড বাড়লে স্বয়ংক্রিয়ভাবে আরও পড তৈরি হয়।
- Monitoring and Logging:
- Prometheus, Grafana এবং ELK Stack ব্যবহার করুন Kubernetes ক্লাস্টারের পারফরম্যান্স মনিটর এবং লগিংয়ের জন্য।
সারাংশ
Docker এবং Kubernetes ব্যবহারের মাধ্যমে TypeORM অ্যাপ্লিকেশনকে সহজে এবং দ্রুত স্কেল করতে পারা যায়। Docker কনটেইনার ব্যবহারের মাধ্যমে অ্যাপ্লিকেশন এবং এর নির্ভরতাগুলিকে একত্রিত করে সহজে ডিপ্লয় করা সম্ভব, এবং Kubernetes ব্যবহারের মাধ্যমে বৃহত্তর স্কেল অ্যাপ্লিকেশনগুলো ম্যানেজ এবং অর্কেস্ট্রেট করা যেতে পারে। এই কৌশলগুলি অ্যাপ্লিকেশনের ডিপ্লয়মেন্ট, স্কেলিং, এবং ম্যানেজমেন্টের প্রক্রিয়াকে আরও দক্ষ এবং স্থিতিশীল করে তোলে।
Continuous Integration (CI) এবং Continuous Deployment (CD) কি?
Continuous Integration (CI) এবং Continuous Deployment (CD) দুটি গুরুত্বপূর্ণ DevOps প্রক্রিয়া যা সফটওয়্যার ডেভেলপমেন্টে স্বয়ংক্রিয়তা এবং উন্নয়ন কার্যক্রমকে দ্রুত এবং নির্ভরযোগ্য করে তোলে।
- Continuous Integration (CI): এটি এমন একটি পদ্ধতি যেখানে কোডের পরিবর্তনগুলো স্বয়ংক্রিয়ভাবে একটি শেয়ারড রিপোজিটরিতে মর্জ করা হয়। প্রতিটি কমিট বা পুশের পর, একটি স্বয়ংক্রিয় বিল্ড এবং টেস্ট রান করা হয়, যার মাধ্যমে নতুন পরিবর্তনটি সিস্টেমের অন্য অংশের সাথে একত্রে কাজ করছে কি না তা যাচাই করা হয়।
- Continuous Deployment (CD): এটি এমন একটি পদ্ধতি যেখানে কোডের পরিবর্তনগুলি স্বয়ংক্রিয়ভাবে প্রোডাকশনে ডিপ্লয় করা হয়। এটি CI-এর পরের ধাপ, যেখানে টেস্টিং এবং বিল্ডিং প্রক্রিয়া সম্পন্ন হওয়ার পরে কোড সরাসরি প্রোডাকশনে চলে যায়।
TypeORM-এ CI এবং CD সেটআপ করার জন্য, আপনাকে GitHub Actions, Travis CI, CircleCI, Jenkins বা অন্য কোনো CI/CD টুল ব্যবহার করতে হবে।
এই গাইডে আমরা GitHub Actions ব্যবহার করে TypeORM প্রোজেক্টের জন্য CI এবং CD সেটআপ কিভাবে করা যায় তা দেখব।
CI এবং CD Setup এর জন্য GitHub Actions ব্যবহার করা
GitHub Actions একটি শক্তিশালী এবং সহজে কনফিগারযোগ্য CI/CD টুল, যা GitHub রিপোজিটরি থেকে সরাসরি কাজ করতে পারে। এটি আপনাকে স্বয়ংক্রিয় বিল্ড, টেস্টিং এবং ডিপ্লয়মেন্ট প্রক্রিয়া তৈরি করতে সহায়তা করে।
১. GitHub Actions সেটআপ
প্রথমে, আপনার প্রোজেক্টের রিপোজিটরিতে .github/workflows ফোল্ডারটি তৈরি করতে হবে। এই ফোল্ডারের মধ্যে YAML ফাইল থাকবে, যা CI/CD প্রক্রিয়াটি কনফিগার করবে।
২. GitHub Actions Workflow তৈরি করা
CI Workflow: কোড কমিট করার পর এটি টেস্ট এবং বিল্ড প্রক্রিয়া চালাবে।
name: CI Workflow
on:
push:
branches:
- main # যে শাখায় পুশ হবে, সেই শাখায় CI প্রক্রিয়া চলবে
jobs:
build:
runs-on: ubuntu-latest # Ubuntu এর উপর রান হবে
steps:
- name: Checkout code
uses: actions/checkout@v2
- name: Set up Node.js
uses: actions/setup-node@v2
with:
node-version: '14' # Node.js ভার্সন সেট করা
- name: Install dependencies
run: |
npm install # অথবা yarn install
- name: Run tests
run: |
npm test # অথবা yarn test
- name: Run migrations
run: |
npm run typeorm migration:run # TypeORM মাইগ্রেশন রান করা
- name: Build project
run: |
npm run build # প্রোজেক্ট বিল্ড করা
এই CI Workflow ফাইলটি প্রতিটি push কমান্ডে কোড চেকআউট করে, ডিপেনডেন্সি ইনস্টল করে, টেস্ট রান করে, মাইগ্রেশন চালায় এবং প্রোজেক্ট বিল্ড করে।
৩. CD Workflow: Production Deployment
CD Workflow: এটি কোড টেস্টিং ও বিল্ডিং পর সফলভাবে প্রোডাকশনে ডিপ্লয় করবে।
name: CD Workflow
on:
push:
branches:
- main # প্রোডাকশনে পুশ হলে ডিপ্লয় হবে
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v2
- name: Set up Node.js
uses: actions/setup-node@v2
with:
node-version: '14'
- name: Install dependencies
run: |
npm install
- name: Run migrations
run: |
npm run typeorm migration:run # মাইগ্রেশন রান করা
- name: Deploy to production
run: |
# আপনার প্রোডাকশন সার্ভারে ডিপ্লয় করার কমান্ড এখানে লিখুন
npm run deploy # প্রোডাকশন ডিপ্লয়মেন্ট স্ক্রিপ্ট
এটি নিশ্চিত করবে যে main শাখায় পুশ হলে কোড সফলভাবে প্রোডাকশনে ডিপ্লয় হয়।
৪. Deployment Script
আপনার package.json-এ deploy স্ক্রিপ্টটি যুক্ত করতে হবে, যা আপনার প্রোডাকশন সার্ভারে কোড ডিপ্লয় করবে। উদাহরণস্বরূপ, আপনি Heroku, AWS, বা DigitalOcean ব্যবহার করতে পারেন।
{
"scripts": {
"deploy": "heroku push" // উদাহরণ, আপনি আপনার প্রোডাকশন সার্ভারে ডিপ্লয়মেন্ট স্ক্রিপ্ট এখানে রাখবেন
}
}
৫. Secret Management
GitHub Actions এ প্রোডাকশনে ডিপ্লয় করার জন্য আপনাকে প্রোডাকশন কনফিগারেশন এবং সিক্রেট (যেমন API কীগুলি) সংরক্ষণ করতে হবে। আপনি GitHub এ Secrets ব্যবহার করতে পারেন।
- GitHub রিপোজিটরি তে যান।
- Settings -> Secrets এ যান।
- এখানে আপনি প্রোডাকশন API কীগুলি বা অন্যান্য সিক্রেট কনফিগারেশন যোগ করতে পারবেন, যেমন:
HEROKU_API_KEY=your-heroku-api-key
DATABASE_URL=your-database-url
এটি GitHub Actions এর মাধ্যমে CI/CD প্রক্রিয়ায় স্বয়ংক্রিয়ভাবে অ্যাক্সেস করা হবে।
৬. Continuous Integration and Continuous Deployment এর উন্নত কনফিগারেশন
CI/CD পদ্ধতি আরো জটিল হতে পারে যেমন:
- Multiple Environments: Staging এবং Production এর জন্য আলাদা workflow তৈরি করা।
- Branch Based Deployment: ডেভেলপ শাখায় পুশ হলে শুধুমাত্র staging এ ডিপ্লয়মেন্ট করা।
- Notification and Reporting: Slack বা ইমেইল নোটিফিকেশন সেটআপ করা।
Branch Based Deployment উদাহরণ:
name: CI Workflow
on:
push:
branches:
- develop # staging এর জন্য ডেভেলপ শাখায় CI প্রক্রিয়া চলবে
- main # main শাখায় CI এবং CD হবে
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v2
- name: Set up Node.js
uses: actions/setup-node@v2
with:
node-version: '14'
- name: Install dependencies
run: |
npm install
- name: Run tests
run: |
npm test
সারাংশ
Continuous Integration (CI) এবং Continuous Deployment (CD) TypeORM প্রোজেক্টে অত্যন্ত গুরুত্বপূর্ণ। GitHub Actions ব্যবহার করে আপনি সহজেই CI/CD প্রক্রিয়া সেটআপ করতে পারেন। GitHub Actions আপনার প্রোজেক্টের কোড চেকআউট, ডিপেনডেন্সি ইনস্টলেশন, টেস্টিং, মাইগ্রেশন, এবং ডিপ্লয়মেন্ট প্রক্রিয়াগুলো স্বয়ংক্রিয়ভাবে পরিচালনা করবে। এতে আপনার কোড একত্রে এবং নির্ভরযোগ্যভাবে বিভিন্ন এনভায়রনমেন্টে ডিপ্লয় করা সহজ হয়ে যাবে।
Read more