Environments

ระบบแยกค่า configuration ที่สำคัญออกจาก code โดยเก็บไว้ในไฟล์ .env แทน เพื่อป้องกันข้อมูลสำคัญอย่าง connection string และ credentials หลุดเข้า Git repository

Setup

copy ไฟล์ .env.example เป็น .env แล้วแก้ค่าให้ตรงกับ environment ของตัวเอง โดยไฟล์ .env จะถูก ignore โดย .gitignore อัตโนมัติ

cp .env.example .env

IIS Setup

ใน IIS สามารถกำหนดค่า Environment Variables ได้จาก System Environment ของเครื่อง โดยในกรณีที่มีการ deploy หลายแอปพลิเคชันบนเครื่องเดียวกัน สามารถใช้แนวทางการกำหนด Prefix เพื่อแยกชุดค่าคอนฟิกของแต่ละแอปออกจากกันได้

ตัวอย่างเช่น จากเดิมที่ใช้งานค่า DataSource__Provider=ORACLE สามารถปรับให้รองรับหลายแอปพลิเคชันได้โดยเพิ่ม Prefix ของชื่อแอปเข้าไป เช่น App1__DataSource__Provider=ORACLE เพื่อให้สามารถแยก Environment ของแต่ละแอปได้อย่างชัดเจน

จากนั้นในฝั่ง .NET สามารถกำหนดค่าใน Program.cs โดยใช้ AddEnvironmentVariables พร้อมระบุ Prefix ที่ต้องการ ระบบจะทำการอ่านค่า Environment Variables และตัด Prefix ที่กำหนดออกโดยอัตโนมัติ ทำให้แอปพลิเคชันสามารถใช้งานค่า Configuration ได้เหมือนเดิม โดยไม่ต้องปรับแก้โค้ดส่วนอื่นเพิ่มเติม

ตัวอย่างการกำหนดค่า AddEnvironmentVariables

builder.Configuration.AddEnvironmentVariables(prefix: "App1__");

ตัวอย่างการกำหนด System Environment

Environment Variables

DataSource

กำหนด connection string สำหรับฐานข้อมูลหลักและรอง ดูรายละเอียดเพิ่มเติมได้ที่ Feature: Connect to Database

# ฐานข้อมูลหลัก
DataSource__Provider=ORACLE
DataSource__ConnectionString=Data Source=...

# ฐานข้อมูลรอง (Local)
DataSource__Local__Provider=MSSQL
DataSource__Local__ConnectionString=Data Source=...

Redis

กำหนด connection string สำหรับ Redis

Redis__ConnectionString=localhost:6379

LDAP

กำหนดค่าการเชื่อมต่อ LDAP server สำหรับ authenticate ผู้ใช้ผ่าน Active Directory หรือ LDAP ขององค์กร

App__LDAP__Host=<IP_OR_DOMAIN>
App__LDAP__Port=389
App__LDAP__SecureSocketLayer=false
App__LDAP__DistinguishedName=<OU>
App__LDAP__AdminUser=<EMAIL_LDAP>
App__LDAP__AdminPassword=<PASSWORD_LDAP>
App__LDAP__UserIdField=samaccountname
App__LDAP__UsernameField=samaccountname
App__LDAP__FirstNameField=givenname
App__LDAP__LastNameField=sn
App__LDAP__MailField=mail
FieldDescription
HostIP address หรือ domain ของ LDAP server
PortPort ของ LDAP server ค่าเริ่มต้น 389
SecureSocketLayerเปิดใช้ SSL สำหรับการเชื่อมต่อ LDAP
DistinguishedNameOU path สำหรับค้นหา user ใน LDAP
AdminUserอีเมลหรือ username สำหรับ authenticate กับ LDAP
AdminPasswordรหัสผ่านสำหรับ authenticate กับ LDAP
UserIdFieldชื่อ attribute ที่ใช้เป็น user ID
UsernameFieldชื่อ attribute ที่ใช้เป็น username
FirstNameFieldชื่อ attribute ที่ใช้เป็นชื่อจริง
LastNameFieldชื่อ attribute ที่ใช้เป็นนามสกุล
MailFieldชื่อ attribute ที่ใช้เป็นอีเมล

Email

กำหนดค่าการเชื่อมต่อ SMTP server สำหรับส่งอีเมล ดูรายละเอียดเพิ่มเติมได้ที่ Feature: Connect to Mail Server

App__Email__SERVER=10.254.7.15
App__Email__PORT=25
App__Email__ENABLESSL=false
App__Email__USERNAME=username@domain.com
App__Email__PASSWORD=password
App__Email__SENDERADDRESS=sender@domain.com|Sender Name
App__Email__FROMPARAMETER=FROM
App__Email__TOPARAMETER=TO
App__Email__CCPARAMETER=CC
App__Email__BCCPARAMETER=BCC
App__Email__SUBJECTPARAMETER=SUBJECT
App__Email__BODYPARAMETER=BODY
App__Email__PRIORITYPARAMETER=PRIORITY

Firebase

กำหนดค่าสำหรับส่ง push notification ผ่าน Firebase Cloud Messaging (FCM)

App__Firebase__ServerKey=<SERVER_KEY>
App__Firebase__FcmPushUrl=https://fcm.googleapis.com/fcm/send
FieldDescription
ServerKeyServer key สำหรับ authenticate กับ Firebase Cloud Messaging
FcmPushUrlURL endpoint สำหรับส่ง push notification ผ่าน FCM

AsymmetricKey

กำหนด RSA key pair สำหรับเข้ารหัสและถอดรหัส payload ที่รับมาจาก client ดูรายละเอียดเพิ่มเติมได้ที่ Decrypt Payload

App__AsymmetricKey__HttpPayloadKey__PrivateKey=-----BEGIN RSA PRIVATE KEY-----...-----END RSA PRIVATE KEY-----
App__AsymmetricKey__HttpPayloadKey__PublicKey=-----BEGIN PUBLIC KEY-----...-----END PUBLIC KEY-----

การดึงค่า Configuration

ค่าใน .env ถูก bind เข้า ASP.NET Core configuration อัตโนมัติ สามารถดึงค่าได้ผ่าน builder.Configuration โดยใช้ : แทน __ ในการระบุ path

// ดึงค่าเดี่ยว
var provider = builder.Configuration.GetSection("DataSource:Provider").Value;

// ดึงทั้ง section
var dataSource = builder.Configuration.GetSection("DataSource").Get<DataSourceConfig>();

// ดึงค่าจาก App section
var corsPolicy = builder.Configuration.GetSection("App:CorsPolicy").Get<string[]>();
รูปแบบใน .envรูปแบบใน Configuration
DataSource__ProviderDataSource:Provider
DataSource__Local__ProviderDataSource:Local:Provider
App__LDAP__HostApp:LDAP:Host