ข้ามไปยังเนื้อหาหลัก
cutty.dev
All posts

Stack เทคโนโลยีของ cutty.dev — ทางเลือกที่ผ่านการคิดมาอย่างดี

อะไรอยู่เบื้องหลัง cutty.dev และเพราะอะไร โดยไม่มีการโฆษณาชวนเชื่อ — ปรัชญาคือ: stack ที่เรียบง่ายและเสถียร, โฮสติ้งในสหภาพยุโรป และความเป็นส่วนตัวที่ถูกออกแบบมาตั้งแต่โครงสร้าง ซึ่งคนเพียงคนเดียวก็สามารถดูแลรักษาได้

โพสต์ "my tech stack" ส่วนใหญ่มักจะเป็นรายการของใหม่ๆ ที่น่าภาคภูมิใจ ดูสิ ฉันมีอันนี้ มีอันนั้น และนี่ก็ยังมีไลบรารีใหม่เอี่ยมจากสัปดาห์ที่แล้วด้วย ส่วนอันนี้จะแตกต่างออกไป

ความจริงก็คือ เมื่อคุณบริหารโครงการด้วยตัวคนเดียว คุณไม่ได้มองหาสิ่งที่ล้ำสมัยที่สุด แต่คุณกำลังมองหาสิ่งที่จะไม่ทำให้คุณต้องตื่นขึ้นมาตอนตีสาม และนี่คือหัวใจสำคัญของเทคโนโลยี stack ทั้งหมดของ cutty.dev: เน้นความเรียบง่ายแทนความหวือหวา, เน้นความเป็นยุโรปแทนอเมริกา, เน้นความเป็นส่วนตัวตั้งแต่รากฐาน, และเรียบง่ายพอที่คนเพียงคู่เดียวจะจัดการได้ทั้งหมด

ฉันจะอธิบายไปทีละขั้นตอน เหมือนกับว่าเรากำลังนั่งคุยกันเรื่องนี้ระหว่างดื่มกาแฟ

Astro ที่ถูกเรนเดอร์บนเซิร์ฟเวอร์ (และทำไมถึงไม่ใช้สิ่งที่ "เจ๋งกว่านี้")

cutty.dev คือ Astro ที่มีการเรนเดอร์จากฝั่งเซิร์ฟเวอร์ (server-side rendering) ทุกคำขอจะผ่านเซิร์ฟเวอร์ เพื่อประกอบหน้าเว็บและส่ง HTML ที่เสร็จสมบูรณ์กลับไป น่าเบื่อไหม? ก็นั่นแหละคือประเด็น

ฉันต้องการสามสิ่ง: การเรนเดอร์บนเซิร์ฟเวอร์โดยไม่ต้องใช้เครื่องจักรหนัก, การรองรับหลายภาษาที่สมบูรณ์แบบพร้อมใช้งานทันที, และความเร็วโดยไม่มีภาระส่วนเกิน Astro ให้ทุกอย่างนั้น และโค้ดยังคงอ่านง่าย เมื่อฉันกลับมาหามันหลังจากหยุดพักไปสองเดือน ฉันก็รู้ว่าเกิดอะไรขึ้นที่นั่น สำหรับการทำโปรเจกต์เดี่ยว สิ่งนี้มีค่ามากกว่าปลั๊กอินยอดนิยมใดๆ ที่ไม่มีใครสนับสนุนอีกต่อไปหลังจากผ่านไปหนึ่งปี

ไฟล์เดียวแทนที่จะเป็นฐานข้อมูลพร้อมพลุไฟ

SQLite. หนึ่งฐานข้อมูล, หนึ่งไฟล์บนดิสก์ พร้อมด้วยเลเยอร์การคิวรีที่สื่อสารกับ TypeScript ดังนั้นเมื่อฉันเปลี่ยนโครงสร้างข้อมูล ข้อผิดพลาดจะปรากฏขึ้นในเอดิเตอร์ แทนที่จะไปโผล่บนโปรดักชันตอนเที่ยงคืน

ทำไมต้องเป็นอันนี้? cutty เป็นแบบ "read-heavy" ใครบางคนคลิกลิงก์ที่ย่อแล้ว เราก็ทำการอ่านข้อมูลและเพิ่มตัวนับ แค่นั้นเลย SQLite สามารถรองรับปริมาณการใช้งานแบบนี้ได้อย่างสบายๆ จนถึงจำนวนที่เยอะมากต่อวัน แล้วการสำรองข้อมูลล่ะ? ก็แค่คัดลอกไฟล์ จบ ไม่ต้องมีพิธีรีตองในการทำ replication ไม่ต้องมีสคริปต์ที่ไม่มีใครจำได้ว่ามันทำงานยังไง

ระวังเรื่องหนึ่งตรงนี้ เพราะมันเป็นกับดักที่พบบ่อย: ผู้คนได้ยินคำว่า "SQLite" แล้วคิดว่าเป็นแค่ "ของเล่นสำหรับโปรเจกต์ส่งอาจารย์" แต่มันไม่ใช่อย่างนั้น การมีส่วนประกอบที่เคลื่อนไหว (moving parts) น้อยลง หมายถึงการมีสิ่งที่จะพังน้อยลงด้วย นี่ไม่ใช่การประหยัดเพื่อลดคุณภาพ แต่เป็นการตัดสินใจอย่างรอบคอบ

เซิร์ฟเวอร์ตั้งอยู่ในยุโรปและนี่ไม่ใช่เรื่องบังเอิญ

เซิร์ฟเวอร์ส่วนตัวใน EU มี TLS ของตัวเอง, reverse proxy พร้อม HTTPS อัตโนมัติ, แอปพลิเคชันในรูปแบบคอนเทนเนอร์

นี่คือรากฐานของวิธีที่ cutty จัดการกับข้อมูล ฉันรู้แน่ชัดว่าข้อมูลเหล่านั้นถูกเก็บไว้ที่ไหนในทางกายภาพ (สำหรับลูกค้าใน EU และ GDPR นี่ไม่ใช่เรื่องน่าสนใจ แต่เป็นเงื่อนไขสำคัญ) ฉันไม่ได้ยึดติดกับผู้ให้บริการเพียงรายเดียว ไม่มีข้อมูลใดรั่วไหลไปยังต่างแดนโดยอัตโนมัติ และค่าใช้จ่ายก็สามารถคาดการณ์ได้แทนที่จะผันผวนตามปริมาณการใช้งาน

ใช่ แพลตฟอร์มที่สะดวกสบายจากตะวันตกจะช่วยให้เริ่มต้นได้เร็วขึ้น แค่คลิก deploy แล้วก็ใช้งานได้เลย เพียงแต่คุณต้องจ่ายค่าตอบแทนด้วยการยอมให้ข้อมูลของผู้ใช้ของคุณไปจัดเก็บไว้ที่นั่น สำหรับฉันแล้ว มันเป็นการแลกเปลี่ยนที่ไม่คุ้มค่า

การแปลทำโมเดลของตัวเอง, ที่บ้านของตนเอง

cutty พูดได้ 25 ภาษา นี่คือการแปลโดยใช้โมเดล AI แบบเปิดที่เป็นแบบ local ซึ่งทำงานบนโครงสร้างพื้นฐานของฉัน ฉันไม่ได้ส่งข้อความจากอินเทอร์เฟซไปยังผู้ให้บริการภายนอกรายใดเลย

ประโยชน์นั้นใช้งานได้จริง การแปลเพียงครั้งเดียวไม่มีค่าใช้จ่าย ฉันสามารถควบคุมคุณภาพได้อย่างเต็มที่และสามารถปรับปรุงข้อมูลใหม่เมื่อไหร่ก็ได้ และแน่นอนว่าเครื่องจักรยังคงต้องการสายตามนุษย์เสมอ ดังนั้นทั้ง 25 ภาษาเหล่านี้จึงผ่านการตรวจสอบแล้ว แต่ข้อเท็จจริงที่ว่าฉันทำด้วยตัวเอง หมายความว่าความเป็นส่วนตัวไม่ใช่รายการในใบเสนอราคา แต่มันคือคุณสมบัติของการออกแบบระบบทั้งหมดนี้

Tailwind, คอนเทนเนอร์ และการตัดสินใจเล็กน้อยอีกสองสามอย่าง

สไตล์? แบบ Utility-first หรือก็คือ Tailwind ไม่ต้องใช้ CSS-in-JS ไม่ต้องมีไฟล์สไตล์แยกต่างหาก ทุกอย่างอยู่ในเทมเพลตโดยตรง ผมไม่ต้องเสียเวลาคิดชื่อคลาส สไตล์ที่ไม่ได้ใช้งานก็จะไม่ถูกนำไปใช้ในหน้าเว็บสุดท้าย และดีไซน์ก็ยังดูเป็นอันหนึ่งอันเดียวกันเพราะตัวระบบบังคับไว้ สำหรับคนทำงานคนเดียว ทุกนาทีที่ไม่ต้องเสียไปกับเรื่องจุกจิกนั้นมีความหมาย

การปรับใช้คือ Docker มันคือสภาพแวดล้อมเดียวกันทั้งในเครื่อง local และบน production บอกลาคำว่า "เครื่องฉันก็ใช้งานได้นะ" ไปได้เลย และถ้าหากวันหนึ่งจำเป็นต้องย้าย ทั้งหมดนี้สามารถย้ายไปยังเซิร์ฟเวอร์อื่นได้ภายในเวลาประมาณครึ่งชั่วโมง ความสามารถในการพกพา (Portability) คือรูปแบบหนึ่งของอิสรภาพที่เกิดขึ้นอย่างเงียบๆ

สิ่งที่ฉันได้รับจากเรื่องนี้

Stack ที่น่าเบื่อคือผู้ชนะ Astro, SQLite, Tailwind, containers ทุกอย่างมีความเสถียร ผ่านการพิสูจน์มาแล้ว และมีคำอธิบายครบถ้วน ไม่มีอะไรพังในเวลาที่คุณต้องการมันน้อยที่สุด

Hosting ใน EU พร้อมสำหรับการใช้งานจริงแล้ว จริงๆ นะ เรื่องที่บอกว่า "คุณต้องไปใช้คลาวด์ยักษ์ใหญ่ของอเมริกาเพื่อให้ดูเป็นมืออาชีพ" นั้นเป็นแค่เรื่องเพ้อฝัน AI แบบ Local ก็เป็นไปได้จริง ไม่จำเป็นต้องส่งข้อมูลไปให้ API ภายนอกเพื่อให้ได้ผลลัพธ์การแปลที่ดี และสิ่งสุดท้าย: คนเพียงคนเดียวสามารถปล่อยผลงานที่ดูเหมือนออกมาจากทีมทั้งทีมได้ เพียงแค่ต้องจำไว้ว่าเวลาแพงกว่าเงิน และควรเลือกทุกองค์ประกอบในแง่นี้

เมื่อคุณกำลังสร้างบางอย่างที่เป็นของคุณเอง ให้ถามตัวเองด้วยคำถามเดียวสำหรับทุกๆ เทคโนโลยี: ในอีกหนึ่งปีข้างหน้า ฉันจะสามารถดูแลรักษามันได้ด้วยตัวเองหรือไม่? ถ้าไม่ใช่ ก็คงเป็นคำตอบที่คุณรู้อยู่แล้ว

ทุกอย่างทำงานได้ที่นี่: cutty.dev และหากคุณต้องการพูดคุยเกี่ยวกับตัดสินใจใดๆ เหล่านี้ เขียนมาที่ [email protected] ผมจะตอบกลับภายในวันเดียวกัน