<?xml version="1.0" encoding="UTF-8" standalone="no"?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><rss xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" version="2.0"><channel><title>WeB LoG'S JuUiER</title><description>I&amp;#39;m IT worker kik kok leave in Maha Sarakham &amp;amp; Bangkok some time.</description><managingEditor>noreply@blogger.com (juuier)</managingEditor><pubDate>Tue, 10 Nov 2026 11:43:55 +0700</pubDate><generator>Blogger http://www.blogger.com</generator><openSearch:totalResults xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/">1904</openSearch:totalResults><openSearch:startIndex xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/">1</openSearch:startIndex><openSearch:itemsPerPage xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/">25</openSearch:itemsPerPage><link>http://juuier.blogspot.com/</link><language>en-us</language><itunes:explicit>no</itunes:explicit><itunes:subtitle>I&amp;#39;m IT worker kik kok leave in Maha Sarakham &amp;amp; Bangkok some time.</itunes:subtitle><itunes:owner><itunes:email>noreply@blogger.com</itunes:email></itunes:owner><item><title>Create private key authen on Windows 11</title><link>http://juuier.blogspot.com/2026/11/create-private-key-authen-on-windows-11.html</link><author>noreply@blogger.com (juuier)</author><pubDate>Sat, 7 Nov 2026 18:47:27 +0700</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-34115975.post-565344495943856341</guid><description>&lt;p&gt;&lt;/p&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;Client Windows 11&lt;/li&gt;&lt;li&gt;Server Ubuntu, macOS&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;Step&lt;/b&gt;&lt;/p&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt; เปิด power shell แล้วพิมพ์คำสั่งดังนี้สร้าง key&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;span face="Arial, Tahoma, Helvetica, FreeSans, sans-serif" style="background-color: white; color: red; font-size: 13.2px;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;span face="Arial, Tahoma, Helvetica, FreeSans, sans-serif" style="background-color: white; color: red; font-size: 13.2px;"&gt;&amp;gt; ssh-keygen -t &lt;/span&gt;&lt;span face="Arial, Tahoma, Helvetica, FreeSans, sans-serif" style="background-color: white; font-size: 13.2px;"&gt;&lt;span style="color: #2b00fe;"&gt;ed25519&lt;/span&gt;&lt;/span&gt;&lt;span face="Arial, Tahoma, Helvetica, FreeSans, sans-serif" style="background-color: white; color: red; font-size: 13.2px;"&gt; -C "your_email@example.com"&lt;/span&gt;&lt;/blockquote&gt;&lt;span face="Arial, Tahoma, Helvetica, FreeSans, sans-serif" style="background-color: white; color: red; font-size: 13.2px;"&gt;&lt;/span&gt;&lt;p&gt;&lt;/p&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;คัดลอก key ไปยัง server ให้พร้อมใช้กับ client ของเรา&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;span style="background-color: white; font-size: 13.2px;"&gt;&lt;span face="Arial, Tahoma, Helvetica, FreeSans, sans-serif" style="color: red;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;span face="Arial, Tahoma, Helvetica, FreeSans, sans-serif" style="color: red;"&gt;&amp;gt; Get-Content &lt;/span&gt;&lt;span face="Arial, Tahoma, Helvetica, FreeSans, sans-serif" style="color: #2b00fe;"&gt;C:\Users\myname\.ssh\id_ed25519.pub&lt;/span&gt;&lt;span face="Arial, Tahoma, Helvetica, FreeSans, sans-serif" style="color: red;"&gt; | ssh &lt;/span&gt;&lt;span face="Arial, Tahoma, Helvetica, FreeSans, sans-serif" style="color: #2b00fe;"&gt;remote_user&lt;/span&gt;&lt;span face="Arial, Tahoma, Helvetica, FreeSans, sans-serif" style="color: red;"&gt;@&lt;/span&gt;&lt;span face="Arial, Tahoma, Helvetica, FreeSans, sans-serif" style="color: #2b00fe;"&gt;server_ip&lt;/span&gt;&lt;span face="Arial, Tahoma, Helvetica, FreeSans, sans-serif" style="color: red;"&gt; "mkdir -p ~/.ssh &amp;amp;&amp;amp; chmod 700 ~/.ssh &amp;amp;&amp;amp; cat &amp;gt;&amp;gt; ~/.ssh/authorized_keys &amp;amp;&amp;amp; chmod 600 ~/.ssh/authorized_keys"&lt;/span&gt;&lt;/blockquote&gt;&lt;p&gt;Related:&amp;nbsp;https://juuier.blogspot.com/2026/02/private-key-for-remote-ssh-server.html&lt;/p&gt;&lt;p&gt;Ref: gemini&amp;nbsp;&lt;/p&gt;&lt;span face="Arial, Tahoma, Helvetica, FreeSans, sans-serif" style="color: red;"&gt;&lt;/span&gt;&lt;p&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;Are u sure?&lt;/div&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></item><item><title>ตรวจสอบและ upgrade linux kernel Ubuntu 24.04 เพื่อ patch security</title><link>http://juuier.blogspot.com/2026/11/upgrade-linux-kernel-ubuntu-2404-patch.html</link><author>noreply@blogger.com (juuier)</author><pubDate>Fri, 6 Nov 2026 20:16:48 +0700</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-34115975.post-1019373565459034456</guid><description>&lt;p&gt;Ref: gemini&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;ตรวจสอบ CVE กรณี enabled pro support extend&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;span style="color: red;"&gt;$ pro fix CVE-2026-98432&lt;/span&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;ดู kernel ปัจจุบัน&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: red;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;span style="color: red;"&gt;$ uname -r&lt;/span&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;อัพเดทและอัพเกรด kernel&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: red;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;span style="color: red;"&gt;$&amp;nbsp;sudo apt update&lt;/span&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;span style="color: red;"&gt;$ sudo apt --only-upgrade install linux-image-generic linux-headers-generic -y&lt;/span&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;เมื่อผู้ใช้เบาบาง reboot เครื่องเพื่อใช้ kernel ที่พึ่ง download มาใหม่ได้เลย&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: red;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;span style="color: red;"&gt;$ sudo reboot&lt;/span&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;หรือ จะตั้งเวลา reboot ตอนคนใช้น้อยๆ ตอนตีสอง&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;span style="color: red;"&gt;$ sudo shutdown -r 02:00 "&lt;/span&gt;&lt;span style="color: #2b00fe;"&gt;Rebooting to switch to kernel 6.8.0-149&lt;/span&gt;&lt;span style="color: red;"&gt;"&lt;/span&gt;&lt;/blockquote&gt;&lt;p&gt;เพิ่มเติม&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;ดูสถานะ ว่าต่อ pro extension หรือยัง&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;span style="color: red;"&gt;$ pro status&amp;nbsp;&lt;/span&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;/p&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;ดูสถานะว่า token ถูกใช้ไปกี่เครื่องแล้ว&lt;/li&gt;&lt;li&gt;https://ubuntu.com/pro/dashboard&amp;nbsp;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;Are u sure?&lt;/div&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></item><item><title>คำสั่งสำหรับตรวจสอบ จำนวน client ที่เชื่อมต่อผ่าน port ที่ระบุอยู่ Ubuntu</title><link>http://juuier.blogspot.com/2026/11/client-port-ubuntu.html</link><author>noreply@blogger.com (juuier)</author><pubDate>Fri, 6 Nov 2026 11:37:40 +0700</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-34115975.post-3987306735479721731</guid><description>&lt;p&gt;Ref: gemini&amp;nbsp;&lt;/p&gt;&lt;p&gt;$ &lt;span style="color: red;"&gt;ss -ant | grep &lt;span class="hljs-string"&gt;':80\|:443'&lt;/span&gt; | grep ESTAB | wc -l&lt;/span&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;Are u sure?&lt;/div&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></item><item><title>เปิดใช้งาน Color picker ที่ build-in ใน Visual code สำหรับ PHP (macOS)</title><link>http://juuier.blogspot.com/2026/11/color-picker-build-in-visual-code-php.html</link><author>noreply@blogger.com (juuier)</author><pubDate>Wed, 4 Nov 2026 10:38:36 +0700</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-34115975.post-7881153179088185366</guid><description>&lt;p&gt;&lt;/p&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;&lt;span style="color: #2b00fe;"&gt;Shift + Command + P&lt;/span&gt;&lt;/li&gt;&lt;li&gt;มันจะเปิด command palete&lt;/li&gt;&lt;li&gt;พิมพ์ &lt;span style="color: #2b00fe;"&gt;Preferences: Open User Settings&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjMGcZ5vy2JXPRaAnuoWcO2YKjIVYvpfZhMYfCN9dnaGFsudji8Wf03YAXAjTCbsWn2xnDh5Q9QSBtB_tpaOq9ajwSbLk75ZgRrQXrFmZ1IvyBO2UFgIGAhzh0gwn4QfDnUQ9HSO78hyphenhyphenBSroXEpCXGm6a7Q7LhkDC7KsWDeNGUW4TZFwql15xeO/s1600/image.png" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img alt="" data-original-height="130" data-original-width="611" height="68" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjMGcZ5vy2JXPRaAnuoWcO2YKjIVYvpfZhMYfCN9dnaGFsudji8Wf03YAXAjTCbsWn2xnDh5Q9QSBtB_tpaOq9ajwSbLk75ZgRrQXrFmZ1IvyBO2UFgIGAhzh0gwn4QfDnUQ9HSO78hyphenhyphenBSroXEpCXGm6a7Q7LhkDC7KsWDeNGUW4TZFwql15xeO/s1600/image.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;ช่องค้นหา setting พิมพ์ color picker&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiuyPehu_m9KxKQ6Qn2nenD2KGAf_vsCeLy9hJ8-pYNhCFWMvo-qW623YCZ6Q6k8KNULvxypG1iutNSjA-59dl3B0An7pKw3k66eaq83dmElfm4GS7ioFPDZmQxwG7-DvubMDFFjcdZx8lZz5JslB2xakC2jGbDNdZ5uA2s1OcFO9zc1jl5Nyj4/s1600/image.png" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img alt="" data-original-height="223" data-original-width="1139" height="63" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiuyPehu_m9KxKQ6Qn2nenD2KGAf_vsCeLy9hJ8-pYNhCFWMvo-qW623YCZ6Q6k8KNULvxypG1iutNSjA-59dl3B0An7pKw3k66eaq83dmElfm4GS7ioFPDZmQxwG7-DvubMDFFjcdZx8lZz5JslB2xakC2jGbDNdZ5uA2s1OcFO9zc1jl5Nyj4/s1600/image.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;เลือก Edit in settings.json&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiV_WTsfta_AdHGsPm5hhPBkv2X0lyux6sYA9WUBKVwPEzUg6Eaggv87tGA-uFNMkhBCo_dr5tvcsutxaj7K5LQRYhmb_agEHNxaAj0NHSbapZ5ZR4FUVzbEHW3V5FhNniTQ81BJBmUFge3eR4_B8ryPdSv9C73q8O6Ae4JhntQcLb_ppMdOPLr/s1600/image.png" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img alt="" data-original-height="623" data-original-width="729" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiV_WTsfta_AdHGsPm5hhPBkv2X0lyux6sYA9WUBKVwPEzUg6Eaggv87tGA-uFNMkhBCo_dr5tvcsutxaj7K5LQRYhmb_agEHNxaAj0NHSbapZ5ZR4FUVzbEHW3V5FhNniTQ81BJBmUFge3eR4_B8ryPdSv9C73q8O6Ae4JhntQcLb_ppMdOPLr/s1600/image.png" width="281" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;เพิ่ม php เข้าไป หรือ ภาษาอื่นๆ เข้าไปเพื่อให้สามารถใช้ color picker&amp;nbsp;&lt;/li&gt;&lt;li&gt;บันทึกให้เรียบร้อย ปิดและเปิด vscode ใหม่คับ&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;Are u sure?&lt;/div&gt;</description><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjMGcZ5vy2JXPRaAnuoWcO2YKjIVYvpfZhMYfCN9dnaGFsudji8Wf03YAXAjTCbsWn2xnDh5Q9QSBtB_tpaOq9ajwSbLk75ZgRrQXrFmZ1IvyBO2UFgIGAhzh0gwn4QfDnUQ9HSO78hyphenhyphenBSroXEpCXGm6a7Q7LhkDC7KsWDeNGUW4TZFwql15xeO/s72-c/image.png" width="72"/><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></item><item><title>Build and push docker image to docker repository</title><link>http://juuier.blogspot.com/2026/10/build-and-push-docker-image-to-docker.html</link><author>noreply@blogger.com (juuier)</author><pubDate>Sun, 25 Oct 2026 16:22:04 +0700</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-34115975.post-5340191675511780051</guid><description>&lt;p&gt;&lt;b&gt;&amp;nbsp;Ref:&amp;nbsp;https://gemini.google.com/app/4a431e338a0c26c2&lt;/b&gt;&lt;/p&gt;&lt;div _ngcontent-ng-c3219552501="" aria-busy="false" aria-live="polite" class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color stronger tutor-markdown-rendering" dir="ltr" id="model-response-message-contentr_fa4d90a8af2635a5" inline-copy-host="" style="--animation-duration: 400ms; --fade-animation-function: ease-out; animation: auto ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px rgb(31, 31, 31); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; gap: normal; hyphens: manual; inset: auto; interactivity: auto; isolation: auto; line-height: 1.15; margin-bottom: 0px; margin-left: 0px !important; margin-right: 0px !important; margin-top: 0px !important; margin: 0px; marker: none; mask-clip: border-box; mask-composite: add; mask-image: none; mask-mode: match-source; mask-origin: border-box; mask-repeat: repeat; mask-size: auto; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(31, 31, 31) none 2.4px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rule: 2.4px rgb(31, 31, 31); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;"&gt;&lt;div style="animation: auto ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px rgb(31, 31, 31); clear: none; clip: auto; color: #1f1f1f; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; font-family: &amp;quot;Google Sans Text&amp;quot;, sans-serif; gap: normal; hyphens: manual; inset: auto; interactivity: auto; isolation: auto; line-height: 1.15; margin-bottom: 0px; margin-left: 0px !important; margin-right: 0px !important; margin-top: 0px !important; margin: 0px; marker: none; mask-clip: border-box; mask-composite: add; mask-image: none; mask-mode: match-source; mask-origin: border-box; mask-repeat: repeat; mask-size: auto; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(31, 31, 31) none 2.4px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rule: 2.4px rgb(31, 31, 31); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;"&gt;การนำ Docker Image ที่ build เรียบร้อยแล้วไปเก็บไว้ใน Docker Registry (เช่น Docker Hub) เพื่อดึงกลับมาใช้ในอนาคต มีขั้นตอนหลัก 4 ขั้นตอน ดังนี้ครับ:&lt;/div&gt;&lt;br /&gt;&lt;h3 data-path-to-node="2" style="animation: auto ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px rgb(31, 31, 31); clear: none; clip: auto; color: #1f1f1f; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; font-family: &amp;quot;Google Sans&amp;quot;, sans-serif; gap: normal; hyphens: manual; inset: auto; interactivity: auto; isolation: auto; line-height: 1.15; margin-bottom: 0px; margin-left: 0px !important; margin-right: 0px !important; margin-top: 0px !important; margin: 0px; marker: none; mask-clip: border-box; mask-composite: add; mask-image: none; mask-mode: match-source; mask-origin: border-box; mask-repeat: repeat; mask-size: auto; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(31, 31, 31) none 2.4px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rule: 2.4px rgb(31, 31, 31); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;"&gt;1. เข้าสู่ระบบ Docker Hub ผ่าน Terminal&lt;/h3&gt;&lt;div style="animation: auto ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px rgb(31, 31, 31); clear: none; clip: auto; color: #1f1f1f; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; font-family: &amp;quot;Google Sans Text&amp;quot;, sans-serif; gap: normal; hyphens: manual; inset: auto; interactivity: auto; isolation: auto; line-height: 1.15; margin-bottom: 0px; margin-left: 0px !important; margin-right: 0px !important; margin-top: 0px !important; margin: 0px; marker: none; mask-clip: border-box; mask-composite: add; mask-image: none; mask-mode: match-source; mask-origin: border-box; mask-repeat: repeat; mask-size: auto; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(31, 31, 31) none 2.4px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rule: 2.4px rgb(31, 31, 31); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;"&gt;ก่อนอัปโหลด ต้องล็อกอินเข้าบัญชี Docker Hub ของคุณก่อน:&lt;/div&gt;&lt;br /&gt;&lt;span style="color: red;"&gt;docker login&lt;/span&gt;&lt;/div&gt;&lt;div _ngcontent-ng-c3219552501="" aria-busy="false" aria-live="polite" class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color stronger tutor-markdown-rendering" dir="ltr" id="model-response-message-contentr_fa4d90a8af2635a5" inline-copy-host="" style="--animation-duration: 400ms; --fade-animation-function: ease-out; animation: auto ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px rgb(31, 31, 31); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; gap: normal; hyphens: manual; inset: auto; interactivity: auto; isolation: auto; line-height: 1.15; margin-bottom: 0px; margin-left: 0px !important; margin-right: 0px !important; margin-top: 0px !important; margin: 0px; marker: none; mask-clip: border-box; mask-composite: add; mask-image: none; mask-mode: match-source; mask-origin: border-box; mask-repeat: repeat; mask-size: auto; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(31, 31, 31) none 2.4px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rule: 2.4px rgb(31, 31, 31); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;"&gt;&lt;span style="color: red;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;div style="animation: auto ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px rgb(31, 31, 31); clear: none; clip: auto; color: #1f1f1f; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; font-family: &amp;quot;Google Sans Text&amp;quot;, sans-serif; gap: normal; hyphens: manual; inset: auto; interactivity: auto; isolation: auto; line-height: 1.15; margin-bottom: 0px; margin-left: 0px !important; margin-right: 0px !important; margin-top: 0px !important; margin: 0px; marker: none; mask-clip: border-box; mask-composite: add; mask-image: none; mask-mode: match-source; mask-origin: border-box; mask-repeat: repeat; mask-size: auto; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(31, 31, 31) none 2.4px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rule: 2.4px rgb(31, 31, 31); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;"&gt;&lt;i data-index-in-node="0" data-path-to-node="5" style="animation: auto ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px rgb(31, 31, 31); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; display: inline; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; gap: normal; hyphens: manual; inset: auto; interactivity: auto; isolation: auto; line-height: 1.15; margin-bottom: 0px; margin-left: 0px !important; margin-right: 0px !important; margin-top: 0px !important; margin: 0px; marker: none; mask-clip: border-box; mask-composite: add; mask-image: none; mask-mode: match-source; mask-origin: border-box; mask-repeat: repeat; mask-size: auto; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(31, 31, 31) none 2.4px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rule: 2.4px rgb(31, 31, 31); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;"&gt;ระบบจะให้กรอก &lt;b data-index-in-node="14" data-path-to-node="5" style="animation: auto ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px rgb(31, 31, 31); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; display: inline; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; gap: normal; hyphens: manual; inset: auto; interactivity: auto; isolation: auto; line-height: 1.15; margin-bottom: 0px; margin-left: 0px !important; margin-right: 0px !important; margin-top: 0px !important; margin: 0px; marker: none; mask-clip: border-box; mask-composite: add; mask-image: none; mask-mode: match-source; mask-origin: border-box; mask-repeat: repeat; mask-size: auto; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(31, 31, 31) none 2.4px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rule: 2.4px rgb(31, 31, 31); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;"&gt;Username&lt;/b&gt; และ &lt;b data-index-in-node="27" data-path-to-node="5" style="animation: auto ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px rgb(31, 31, 31); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; display: inline; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; gap: normal; hyphens: manual; inset: auto; interactivity: auto; isolation: auto; line-height: 1.15; margin-bottom: 0px; margin-left: 0px !important; margin-right: 0px !important; margin-top: 0px !important; margin: 0px; marker: none; mask-clip: border-box; mask-composite: add; mask-image: none; mask-mode: match-source; mask-origin: border-box; mask-repeat: repeat; mask-size: auto; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(31, 31, 31) none 2.4px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rule: 2.4px rgb(31, 31, 31); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;"&gt;Password&lt;/b&gt; (หรือ Personal Access Token ของ Docker Hub)&lt;/i&gt;&lt;/div&gt;&lt;br /&gt;&lt;h3 data-path-to-node="7" style="animation: auto ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px rgb(31, 31, 31); clear: none; clip: auto; color: #1f1f1f; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; font-family: &amp;quot;Google Sans&amp;quot;, sans-serif; gap: normal; hyphens: manual; inset: auto; interactivity: auto; isolation: auto; line-height: 1.15; margin-bottom: 0px; margin-left: 0px !important; margin-right: 0px !important; margin-top: 0px !important; margin: 0px; marker: none; mask-clip: border-box; mask-composite: add; mask-image: none; mask-mode: match-source; mask-origin: border-box; mask-repeat: repeat; mask-size: auto; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(31, 31, 31) none 2.4px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rule: 2.4px rgb(31, 31, 31); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;"&gt;2. ตั้งชื่อ Tag ให้ตรงกับ Repository บน Docker Hub&lt;/h3&gt;&lt;div style="animation: auto ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px rgb(31, 31, 31); clear: none; clip: auto; color: #1f1f1f; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; font-family: &amp;quot;Google Sans Text&amp;quot;, sans-serif; gap: normal; hyphens: manual; inset: auto; interactivity: auto; isolation: auto; line-height: 1.15; margin-bottom: 0px; margin-left: 0px !important; margin-right: 0px !important; margin-top: 0px !important; margin: 0px; marker: none; mask-clip: border-box; mask-composite: add; mask-image: none; mask-mode: match-source; mask-origin: border-box; mask-repeat: repeat; mask-size: auto; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(31, 31, 31) none 2.4px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rule: 2.4px rgb(31, 31, 31); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;"&gt;Docker กำหนดว่า Image ที่จะ push ขึ้น Docker Hub ได้ ชื่อ Image ต้องขึ้นต้นด้วย &lt;b data-index-in-node="80" data-path-to-node="8" style="animation: auto ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px rgb(31, 31, 31); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; display: inline; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; gap: normal; hyphens: manual; inset: auto; interactivity: auto; isolation: auto; line-height: 1.15; margin-bottom: 0px; margin-left: 0px !important; margin-right: 0px !important; margin-top: 0px !important; margin: 0px; marker: none; mask-clip: border-box; mask-composite: add; mask-image: none; mask-mode: match-source; mask-origin: border-box; mask-repeat: repeat; mask-size: auto; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(31, 31, 31) none 2.4px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rule: 2.4px rgb(31, 31, 31); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;"&gt;Username ของคุณบน Docker Hub&lt;/b&gt; เสมอ&lt;/div&gt;&lt;br /&gt;&lt;div style="animation: auto ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px rgb(31, 31, 31); clear: none; clip: auto; color: #1f1f1f; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; font-family: &amp;quot;Google Sans Text&amp;quot;, sans-serif; gap: normal; hyphens: manual; inset: auto; interactivity: auto; isolation: auto; line-height: 1.15; margin-bottom: 0px; margin-left: 0px !important; margin-right: 0px !important; margin-top: 0px !important; margin: 0px; marker: none; mask-clip: border-box; mask-composite: add; mask-image: none; mask-mode: match-source; mask-origin: border-box; mask-repeat: repeat; mask-size: auto; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(31, 31, 31) none 2.4px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rule: 2.4px rgb(31, 31, 31); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;"&gt;สมมติว่า:&lt;/div&gt;&lt;br /&gt;&lt;ul data-path-to-node="10" style="animation: auto ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px rgb(31, 31, 31); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; font-family: &amp;quot;Google Sans Text&amp;quot;, sans-serif; gap: normal; hyphens: manual; inset: auto; interactivity: auto; isolation: auto; line-height: 1.15; margin-bottom: 0px; margin-left: 0px !important; margin-right: 0px !important; margin-top: 0px !important; margin: 0px; marker: none; mask-clip: border-box; mask-composite: add; mask-image: none; mask-mode: match-source; mask-origin: border-box; mask-repeat: repeat; mask-size: auto; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(31, 31, 31) none 2.4px; overlay: none; padding-inline-start: 32px; padding: 0px 0px 0px 3.36px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rule: 2.4px rgb(31, 31, 31); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;"&gt;&lt;li style="animation: auto ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px rgb(31, 31, 31); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; gap: normal; hyphens: manual; inset: 0px; interactivity: auto; isolation: auto; line-height: 1.15; margin-bottom: 0px; margin-left: 0px !important; margin-right: 0px !important; margin-top: 0px !important; margin: 0px; marker: none; mask-clip: border-box; mask-composite: add; mask-image: none; mask-mode: match-source; mask-origin: border-box; mask-repeat: repeat; mask-size: auto; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(31, 31, 31) none 2.4px; overlay: none; padding: 0px 0px 0px 36px; page: auto; perspective: none; position: relative; quotes: auto; r: 0px; resize: none; rotate: none; rule: 2.4px rgb(31, 31, 31); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;"&gt;&lt;div style="animation: auto ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px rgb(31, 31, 31); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; gap: normal; hyphens: manual; inset: auto; interactivity: auto; isolation: auto; line-height: 1.15; margin-bottom: 0px; margin-left: 0px !important; margin-right: 0px !important; margin-top: 0px !important; margin: 0px; marker: none; mask-clip: border-box; mask-composite: add; mask-image: none; mask-mode: match-source; mask-origin: border-box; mask-repeat: repeat; mask-size: auto; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(31, 31, 31) none 2.4px; overlay: none; padding: 0px 0px 0px 4px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rule: 2.4px rgb(31, 31, 31); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;"&gt;&lt;span style="color: #1f1f1f;"&gt;Image ที่เพิ่ง build ไว้ ตรวจสอบโดย &lt;/span&gt;&lt;span style="color: red;"&gt;docker image ls&lt;/span&gt;&lt;span style="color: #1f1f1f;"&gt; ชื่อ: &lt;/span&gt;&lt;code data-index-in-node="30" data-path-to-node="10,0,0" style="animation: auto ease 0s 1 normal none running none; appearance: none; background: none 0% 0% / auto repeat scroll padding-box border-box rgb(242, 240, 240); border: 0px rgba(0, 0, 0, 0.55); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; display: inline-block; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; font-family: &amp;quot;Google Sans Text&amp;quot;, sans-serif; font-feature-settings: normal; font-kerning: auto; font-language-override: normal; font-optical-sizing: auto; font-size-adjust: none; font-size: 15px; font-stretch: normal; font-variant: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; interactivity: auto; isolation: auto; line-height: 1.15; margin-bottom: 0px; margin-left: 0px !important; margin-right: 0px !important; margin-top: 0px !important; margin: 0px; marker: none; mask-clip: border-box; mask-composite: add; mask-image: none; mask-mode: match-source; mask-origin: border-box; mask-repeat: repeat; mask-size: auto; mask: none; offset: normal; opacity: 1; order: 0; outline: rgba(0, 0, 0, 0.55) none 2.4px; overlay: none; padding: 4px 6px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rule: 2.4px rgba(0, 0, 0, 0.55); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;"&gt;&lt;span style="color: #2b00fe;"&gt;my-php-image:latest&lt;/span&gt;&lt;/code&gt;&lt;/div&gt;&lt;br /&gt;&lt;/li&gt;&lt;li style="animation: auto ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px rgb(31, 31, 31); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; gap: normal; hyphens: manual; inset: 0px; interactivity: auto; isolation: auto; line-height: 1.15; margin-bottom: 0px; margin-left: 0px !important; margin-right: 0px !important; margin-top: 0px !important; margin: 0px; marker: none; mask-clip: border-box; mask-composite: add; mask-image: none; mask-mode: match-source; mask-origin: border-box; mask-repeat: repeat; mask-size: auto; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(31, 31, 31) none 2.4px; overlay: none; padding: 0px 0px 0px 36px; page: auto; perspective: none; position: relative; quotes: auto; r: 0px; resize: none; rotate: none; rule: 2.4px rgb(31, 31, 31); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;"&gt;&lt;div style="animation: auto ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px rgb(31, 31, 31); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; gap: normal; hyphens: manual; inset: auto; interactivity: auto; isolation: auto; line-height: 1.15; margin-bottom: 0px; margin-left: 0px !important; margin-right: 0px !important; margin-top: 0px !important; margin: 0px; marker: none; mask-clip: border-box; mask-composite: add; mask-image: none; mask-mode: match-source; mask-origin: border-box; mask-repeat: repeat; mask-size: auto; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(31, 31, 31) none 2.4px; overlay: none; padding: 0px 0px 0px 4px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rule: 2.4px rgb(31, 31, 31); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;"&gt;&lt;span style="color: #1f1f1f;"&gt;Docker Hub Username ของคุณคือ: &lt;/span&gt;&lt;code data-index-in-node="31" data-path-to-node="10,1,0" style="animation: auto ease 0s 1 normal none running none; appearance: none; background: none 0% 0% / auto repeat scroll padding-box border-box rgb(242, 240, 240); border: 0px rgba(0, 0, 0, 0.55); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; display: inline-block; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; font-family: &amp;quot;Google Sans Text&amp;quot;, sans-serif; font-feature-settings: normal; font-kerning: auto; font-language-override: normal; font-optical-sizing: auto; font-size-adjust: none; font-size: 15px; font-stretch: normal; font-variant: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; interactivity: auto; isolation: auto; line-height: 1.15; margin-bottom: 0px; margin-left: 0px !important; margin-right: 0px !important; margin-top: 0px !important; margin: 0px; marker: none; mask-clip: border-box; mask-composite: add; mask-image: none; mask-mode: match-source; mask-origin: border-box; mask-repeat: repeat; mask-size: auto; mask: none; offset: normal; opacity: 1; order: 0; outline: rgba(0, 0, 0, 0.55) none 2.4px; overlay: none; padding: 4px 6px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rule: 2.4px rgba(0, 0, 0, 0.55); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;"&gt;&lt;span style="color: #2b00fe;"&gt;yourusername&lt;/span&gt;&lt;/code&gt;&lt;/div&gt;&lt;br /&gt;&lt;/li&gt;&lt;li style="animation: auto ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px rgb(31, 31, 31); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; gap: normal; hyphens: manual; inset: 0px; interactivity: auto; isolation: auto; line-height: 1.15; margin-bottom: 0px; margin-left: 0px !important; margin-right: 0px !important; margin-top: 0px !important; margin: 0px; marker: none; mask-clip: border-box; mask-composite: add; mask-image: none; mask-mode: match-source; mask-origin: border-box; mask-repeat: repeat; mask-size: auto; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(31, 31, 31) none 2.4px; overlay: none; padding: 0px 0px 0px 36px; page: auto; perspective: none; position: relative; quotes: auto; r: 0px; resize: none; rotate: none; rule: 2.4px rgb(31, 31, 31); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;"&gt;&lt;div style="animation: auto ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px rgb(31, 31, 31); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; gap: normal; hyphens: manual; inset: auto; interactivity: auto; isolation: auto; line-height: 1.15; margin-bottom: 0px; margin-left: 0px !important; margin-right: 0px !important; margin-top: 0px !important; margin: 0px; marker: none; mask-clip: border-box; mask-composite: add; mask-image: none; mask-mode: match-source; mask-origin: border-box; mask-repeat: repeat; mask-size: auto; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(31, 31, 31) none 2.4px; overlay: none; padding: 0px 0px 0px 4px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rule: 2.4px rgb(31, 31, 31); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;"&gt;&lt;span style="color: #1f1f1f;"&gt;ต้องการตั้งชื่อ repository ว่า: &lt;/span&gt;&lt;code data-index-in-node="32" data-path-to-node="10,2,0" style="animation: auto ease 0s 1 normal none running none; appearance: none; background: none 0% 0% / auto repeat scroll padding-box border-box rgb(242, 240, 240); border: 0px rgba(0, 0, 0, 0.55); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; display: inline-block; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; font-family: &amp;quot;Google Sans Text&amp;quot;, sans-serif; font-feature-settings: normal; font-kerning: auto; font-language-override: normal; font-optical-sizing: auto; font-size-adjust: none; font-size: 15px; font-stretch: normal; font-variant: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; interactivity: auto; isolation: auto; line-height: 1.15; margin-bottom: 0px; margin-left: 0px !important; margin-right: 0px !important; margin-top: 0px !important; margin: 0px; marker: none; mask-clip: border-box; mask-composite: add; mask-image: none; mask-mode: match-source; mask-origin: border-box; mask-repeat: repeat; mask-size: auto; mask: none; offset: normal; opacity: 1; order: 0; outline: rgba(0, 0, 0, 0.55) none 2.4px; overlay: none; padding: 4px 6px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rule: 2.4px rgba(0, 0, 0, 0.55); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;"&gt;&lt;span style="color: #2b00fe;"&gt;php7.4-apache-custom&lt;/span&gt;&lt;/code&gt;&lt;span style="color: #1f1f1f;"&gt; และแท็ก &lt;/span&gt;&lt;code data-index-in-node="61" data-path-to-node="10,2,0" style="animation: auto ease 0s 1 normal none running none; appearance: none; background: none 0% 0% / auto repeat scroll padding-box border-box rgb(242, 240, 240); border: 0px rgba(0, 0, 0, 0.55); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; display: inline-block; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; font-family: &amp;quot;Google Sans Text&amp;quot;, sans-serif; font-feature-settings: normal; font-kerning: auto; font-language-override: normal; font-optical-sizing: auto; font-size-adjust: none; font-size: 15px; font-stretch: normal; font-variant: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; interactivity: auto; isolation: auto; line-height: 1.15; margin-bottom: 0px; margin-left: 0px !important; margin-right: 0px !important; margin-top: 0px !important; margin: 0px; marker: none; mask-clip: border-box; mask-composite: add; mask-image: none; mask-mode: match-source; mask-origin: border-box; mask-repeat: repeat; mask-size: auto; mask: none; offset: normal; opacity: 1; order: 0; outline: rgba(0, 0, 0, 0.55) none 2.4px; overlay: none; padding: 4px 6px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rule: 2.4px rgba(0, 0, 0, 0.55); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;"&gt;&lt;span style="color: #2b00fe;"&gt;v1&lt;/span&gt;&lt;/code&gt;&lt;/div&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div style="animation: auto ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px rgb(31, 31, 31); clear: none; clip: auto; color: #1f1f1f; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; font-family: &amp;quot;Google Sans Text&amp;quot;, sans-serif; gap: normal; hyphens: manual; inset: auto; interactivity: auto; isolation: auto; line-height: 1.15; margin-bottom: 0px; margin-left: 0px !important; margin-right: 0px !important; margin-top: 0px !important; margin: 0px; marker: none; mask-clip: border-box; mask-composite: add; mask-image: none; mask-mode: match-source; mask-origin: border-box; mask-repeat: repeat; mask-size: auto; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(31, 31, 31) none 2.4px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rule: 2.4px rgb(31, 31, 31); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;"&gt;ให้ใช้คำสั่ง &lt;code data-index-in-node="13" data-path-to-node="11" style="animation: auto ease 0s 1 normal none running none; appearance: none; background: none 0% 0% / auto repeat scroll padding-box border-box rgb(242, 240, 240); border: 0px rgba(0, 0, 0, 0.55); clear: none; clip: auto; color: rgba(0, 0, 0, 0.55); columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; display: inline-block; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; font-family: &amp;quot;Google Sans Text&amp;quot;, sans-serif; font-feature-settings: normal; font-kerning: auto; font-language-override: normal; font-optical-sizing: auto; font-size-adjust: none; font-size: 15px; font-stretch: normal; font-variant: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; interactivity: auto; isolation: auto; line-height: 1.15; margin-bottom: 0px; margin-left: 0px !important; margin-right: 0px !important; margin-top: 0px !important; margin: 0px; marker: none; mask-clip: border-box; mask-composite: add; mask-image: none; mask-mode: match-source; mask-origin: border-box; mask-repeat: repeat; mask-size: auto; mask: none; offset: normal; opacity: 1; order: 0; outline: rgba(0, 0, 0, 0.55) none 2.4px; overlay: none; padding: 4px 6px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rule: 2.4px rgba(0, 0, 0, 0.55); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;"&gt;docker tag&lt;/code&gt;:&lt;/div&gt;&lt;br /&gt;&lt;span style="color: red;"&gt;docker tag&lt;/span&gt;&lt;span style="color: #2b00fe;"&gt; my-php-image:latest yourusername/php7.4-apache-custom:v1&lt;/span&gt;&lt;/div&gt;&lt;div _ngcontent-ng-c3219552501="" aria-busy="false" aria-live="polite" class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color stronger tutor-markdown-rendering" dir="ltr" id="model-response-message-contentr_fa4d90a8af2635a5" inline-copy-host="" style="--animation-duration: 400ms; --fade-animation-function: ease-out; animation: auto ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px rgb(31, 31, 31); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; gap: normal; hyphens: manual; inset: auto; interactivity: auto; isolation: auto; line-height: 1.15; margin-bottom: 0px; margin-left: 0px !important; margin-right: 0px !important; margin-top: 0px !important; margin: 0px; marker: none; mask-clip: border-box; mask-composite: add; mask-image: none; mask-mode: match-source; mask-origin: border-box; mask-repeat: repeat; mask-size: auto; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(31, 31, 31) none 2.4px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rule: 2.4px rgb(31, 31, 31); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;"&gt;&lt;br /&gt;&lt;div style="animation: auto ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px rgb(31, 31, 31); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; font-family: &amp;quot;Google Sans Text&amp;quot;, sans-serif; gap: normal; hyphens: manual; inset: auto; interactivity: auto; isolation: auto; line-height: 1.15; margin-bottom: 0px; margin-left: 0px !important; margin-right: 0px !important; margin-top: 0px !important; margin: 0px; marker: none; mask-clip: border-box; mask-composite: add; mask-image: none; mask-mode: match-source; mask-origin: border-box; mask-repeat: repeat; mask-size: auto; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(31, 31, 31) none 2.4px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rule: 2.4px rgb(31, 31, 31); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;"&gt;&lt;i data-index-in-node="0" data-path-to-node="13" style="animation: auto ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px rgb(31, 31, 31); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; display: inline; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; gap: normal; hyphens: manual; inset: auto; interactivity: auto; isolation: auto; line-height: 1.15; margin-bottom: 0px; margin-left: 0px !important; margin-right: 0px !important; margin-top: 0px !important; margin: 0px; marker: none; mask-clip: border-box; mask-composite: add; mask-image: none; mask-mode: match-source; mask-origin: border-box; mask-repeat: repeat; mask-size: auto; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(31, 31, 31) none 2.4px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rule: 2.4px rgb(31, 31, 31); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;"&gt;&lt;span style="color: #1f1f1f;"&gt;(หากต้องการแท็กเป็น &lt;/span&gt;&lt;code data-index-in-node="20" data-path-to-node="13" style="animation: auto ease 0s 1 normal none running none; appearance: none; background: none 0% 0% / auto repeat scroll padding-box border-box rgb(242, 240, 240); border: 0px rgba(0, 0, 0, 0.55); clear: none; clip: auto; color: rgba(0, 0, 0, 0.55); columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; display: inline-block; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; font-family: &amp;quot;Google Sans Text&amp;quot;, sans-serif; font-feature-settings: normal; font-kerning: auto; font-language-override: normal; font-optical-sizing: auto; font-size-adjust: none; font-size: 15px; font-stretch: normal; font-style: normal; font-variant: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; interactivity: auto; isolation: auto; line-height: 1.15; margin-bottom: 0px; margin-left: 0px !important; margin-right: 0px !important; margin-top: 0px !important; margin: 0px; marker: none; mask-clip: border-box; mask-composite: add; mask-image: none; mask-mode: match-source; mask-origin: border-box; mask-repeat: repeat; mask-size: auto; mask: none; offset: normal; opacity: 1; order: 0; outline: rgba(0, 0, 0, 0.55) none 2.4px; overlay: none; padding: 4px 6px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rule: 2.4px rgba(0, 0, 0, 0.55); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;"&gt;latest&lt;/code&gt;&lt;span style="color: #1f1f1f;"&gt; เพิ่มด้วย สามารถรัน: &lt;/span&gt;&lt;code data-index-in-node="48" data-path-to-node="13" style="animation: auto ease 0s 1 normal none running none; appearance: none; background: none 0% 0% / auto repeat scroll padding-box border-box rgb(242, 240, 240); border: 0px rgba(0, 0, 0, 0.55); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; display: inline-block; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; font-family: &amp;quot;Google Sans Text&amp;quot;, sans-serif; font-feature-settings: normal; font-kerning: auto; font-language-override: normal; font-optical-sizing: auto; font-size-adjust: none; font-size: 15px; font-stretch: normal; font-style: normal; font-variant: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; interactivity: auto; isolation: auto; line-height: 1.15; margin-bottom: 0px; margin-left: 0px !important; margin-right: 0px !important; margin-top: 0px !important; margin: 0px; marker: none; mask-clip: border-box; mask-composite: add; mask-image: none; mask-mode: match-source; mask-origin: border-box; mask-repeat: repeat; mask-size: auto; mask: none; offset: normal; opacity: 1; order: 0; outline: rgba(0, 0, 0, 0.55) none 2.4px; overlay: none; padding: 4px 6px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rule: 2.4px rgba(0, 0, 0, 0.55); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;"&gt;&lt;span style="color: red;"&gt;docker tag&lt;/span&gt;&lt;span style="color: #2b00fe;"&gt; my-php-image:latest yourusername/php7.4-apache-custom:latest&lt;/span&gt;&lt;/code&gt;&lt;span style="color: #1f1f1f;"&gt;)&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;br /&gt;&lt;h3 data-path-to-node="15" style="animation: auto ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px rgb(31, 31, 31); clear: none; clip: auto; color: #1f1f1f; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; font-family: &amp;quot;Google Sans&amp;quot;, sans-serif; gap: normal; hyphens: manual; inset: auto; interactivity: auto; isolation: auto; line-height: 1.15; margin-bottom: 0px; margin-left: 0px !important; margin-right: 0px !important; margin-top: 0px !important; margin: 0px; marker: none; mask-clip: border-box; mask-composite: add; mask-image: none; mask-mode: match-source; mask-origin: border-box; mask-repeat: repeat; mask-size: auto; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(31, 31, 31) none 2.4px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rule: 2.4px rgb(31, 31, 31); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;"&gt;3. Push Image ขึ้น Docker Hub&lt;/h3&gt;&lt;div style="animation: auto ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px rgb(31, 31, 31); clear: none; clip: auto; color: #1f1f1f; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; font-family: &amp;quot;Google Sans Text&amp;quot;, sans-serif; gap: normal; hyphens: manual; inset: auto; interactivity: auto; isolation: auto; line-height: 1.15; margin-bottom: 0px; margin-left: 0px !important; margin-right: 0px !important; margin-top: 0px !important; margin: 0px; marker: none; mask-clip: border-box; mask-composite: add; mask-image: none; mask-mode: match-source; mask-origin: border-box; mask-repeat: repeat; mask-size: auto; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(31, 31, 31) none 2.4px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rule: 2.4px rgb(31, 31, 31); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;"&gt;ส่ง Image ขึ้นไปยัง Repository ของคุณ:&lt;/div&gt;&lt;br /&gt;&lt;span style="color: red;"&gt;docker push &lt;/span&gt;&lt;span style="color: #2b00fe;"&gt;yourusername/php7.4-apache-custom:v1&lt;/span&gt;&lt;/div&gt;&lt;div _ngcontent-ng-c3219552501="" aria-busy="false" aria-live="polite" class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color stronger tutor-markdown-rendering" dir="ltr" id="model-response-message-contentr_fa4d90a8af2635a5" inline-copy-host="" style="--animation-duration: 400ms; --fade-animation-function: ease-out; animation: auto ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px rgb(31, 31, 31); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; gap: normal; hyphens: manual; inset: auto; interactivity: auto; isolation: auto; line-height: 1.15; margin-bottom: 0px; margin-left: 0px !important; margin-right: 0px !important; margin-top: 0px !important; margin: 0px; marker: none; mask-clip: border-box; mask-composite: add; mask-image: none; mask-mode: match-source; mask-origin: border-box; mask-repeat: repeat; mask-size: auto; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(31, 31, 31) none 2.4px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rule: 2.4px rgb(31, 31, 31); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;"&gt;&lt;br /&gt;&lt;div style="animation: auto ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px rgb(31, 31, 31); clear: none; clip: auto; color: #1f1f1f; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; font-family: &amp;quot;Google Sans Text&amp;quot;, sans-serif; gap: normal; hyphens: manual; inset: auto; interactivity: auto; isolation: auto; line-height: 1.15; margin-bottom: 0px; margin-left: 0px !important; margin-right: 0px !important; margin-top: 0px !important; margin: 0px; marker: none; mask-clip: border-box; mask-composite: add; mask-image: none; mask-mode: match-source; mask-origin: border-box; mask-repeat: repeat; mask-size: auto; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(31, 31, 31) none 2.4px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rule: 2.4px rgb(31, 31, 31); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;"&gt;&lt;i data-index-in-node="0" data-path-to-node="18" style="animation: auto ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px rgb(31, 31, 31); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; display: inline; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; gap: normal; hyphens: manual; inset: auto; interactivity: auto; isolation: auto; line-height: 1.15; margin-bottom: 0px; margin-left: 0px !important; margin-right: 0px !important; margin-top: 0px !important; margin: 0px; marker: none; mask-clip: border-box; mask-composite: add; mask-image: none; mask-mode: match-source; mask-origin: border-box; mask-repeat: repeat; mask-size: auto; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(31, 31, 31) none 2.4px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rule: 2.4px rgb(31, 31, 31); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;"&gt;เมื่ออัปโหลดเสร็จ คุณสามารถเข้าไปตรวจสอบในหน้าเว็บ &lt;response-element class="no-md" ng-version="0.0.0-PLACEHOLDER" style="animation: auto ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px rgb(31, 31, 31); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; display: inline; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; gap: normal; hyphens: manual; inset: auto; interactivity: auto; isolation: auto; line-height: 1.15; margin-bottom: 0px; margin-left: 0px !important; margin-right: 0px !important; margin-top: 0px !important; margin: 0px; marker: none; mask-clip: border-box; mask-composite: add; mask-image: none; mask-mode: match-source; mask-origin: border-box; mask-repeat: repeat; mask-size: auto; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(31, 31, 31) none 2.4px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rule: 2.4px rgb(31, 31, 31); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;"&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;link-block _nghost-ng-c3556840608="" class="ng-star-inserted" style="animation: auto ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px rgb(31, 31, 31); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; display: inline; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; gap: normal; hyphens: manual; inset: auto; interactivity: auto; isolation: auto; line-height: 1.15; margin-bottom: 0px; margin-left: 0px !important; margin-right: 0px !important; margin-top: 0px !important; margin: 0px; marker: none; mask-clip: border-box; mask-composite: add; mask-image: none; mask-mode: match-source; mask-origin: border-box; mask-repeat: repeat; mask-size: auto; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(31, 31, 31) none 2.4px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rule: 2.4px rgb(31, 31, 31); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;"&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;a _ngcontent-ng-c3556840608="" _nghost-ng-c1889581432="" class="ng-star-inserted" data-hveid="0" data-ved="0CAAQ_4QMahcKEwjP0bj36NSXAxUAAAAAHQAAAAAQVg" decode-data-ved="1" externallink="" href="https://hub.docker.com/" jslog="197247;track:generic_click,impression,attention;BardVeMetadataKey:W1sicl9mYTRkOTBhOGFmMjYzNWE1IiwiY180YTQzMWUzMzhhMGMyNmMyIixudWxsLCJyY18zMGU4MjdhOTlkYjc4YzVmIixudWxsLG51bGwsInRoIixudWxsLDEsbnVsbCxudWxsLDEsMV1d" rel="noopener" style="animation: auto ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px rgb(0, 0, 0); clear: none; clip: auto; color: black; columns: auto; contain: none; container: none; content: normal; cursor: pointer; cx: 0px; cy: 0px; d: none; direction: ltr; display: inline; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; gap: normal; hyphens: manual; inset: auto; interactivity: auto; isolation: auto; line-height: 1.15; margin-bottom: 0px; margin-left: 0px !important; margin-right: 0px !important; margin-top: 0px !important; margin: 0px; marker: none; mask-clip: border-box; mask-composite: add; mask-image: none; mask-mode: match-source; mask-origin: border-box; mask-repeat: repeat; mask-size: auto; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(0, 0, 0) none 2.4px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rule: 2.4px rgb(0, 0, 0); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;" target="_blank"&gt;hub.docker.com&lt;/a&gt;&lt;!----&gt;&lt;/link-block&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;/response-element&gt; ในโปรไฟล์ของคุณ จะพบ Image ปรากฏอยู่&lt;/i&gt;&lt;/div&gt;&lt;br /&gt;&lt;h3 data-path-to-node="20" style="animation: auto ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px rgb(31, 31, 31); clear: none; clip: auto; color: #1f1f1f; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; font-family: &amp;quot;Google Sans&amp;quot;, sans-serif; gap: normal; hyphens: manual; inset: auto; interactivity: auto; isolation: auto; line-height: 1.15; margin-bottom: 0px; margin-left: 0px !important; margin-right: 0px !important; margin-top: 0px !important; margin: 0px; marker: none; mask-clip: border-box; mask-composite: add; mask-image: none; mask-mode: match-source; mask-origin: border-box; mask-repeat: repeat; mask-size: auto; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(31, 31, 31) none 2.4px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rule: 2.4px rgb(31, 31, 31); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;"&gt;4. การดึง (Pull) และเรียกใช้งานในเครื่องอื่นหรือครั้งถัดไป&lt;/h3&gt;&lt;div style="animation: auto ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px rgb(31, 31, 31); clear: none; clip: auto; color: #1f1f1f; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; font-family: &amp;quot;Google Sans Text&amp;quot;, sans-serif; gap: normal; hyphens: manual; inset: auto; interactivity: auto; isolation: auto; line-height: 1.15; margin-bottom: 0px; margin-left: 0px !important; margin-right: 0px !important; margin-top: 0px !important; margin: 0px; marker: none; mask-clip: border-box; mask-composite: add; mask-image: none; mask-mode: match-source; mask-origin: border-box; mask-repeat: repeat; mask-size: auto; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(31, 31, 31) none 2.4px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rule: 2.4px rgb(31, 31, 31); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;"&gt;เมื่อย้ายไปเครื่องอื่น หรือต้องการนำมาใช้งานใหม่:&lt;/div&gt;&lt;br /&gt;&lt;div style="animation: auto ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px rgb(31, 31, 31); clear: none; clip: auto; color: #1f1f1f; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; font-family: &amp;quot;Google Sans Text&amp;quot;, sans-serif; gap: normal; hyphens: manual; inset: auto; interactivity: auto; isolation: auto; line-height: 1.15; margin-bottom: 0px; margin-left: 0px !important; margin-right: 0px !important; margin-top: 0px !important; margin: 0px; marker: none; mask-clip: border-box; mask-composite: add; mask-image: none; mask-mode: match-source; mask-origin: border-box; mask-repeat: repeat; mask-size: auto; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(31, 31, 31) none 2.4px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rule: 2.4px rgb(31, 31, 31); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;"&gt;&lt;b data-index-in-node="0" data-path-to-node="22" style="animation: auto ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px rgb(31, 31, 31); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; display: inline; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; gap: normal; hyphens: manual; inset: auto; interactivity: auto; isolation: auto; line-height: 1.15; margin-bottom: 0px; margin-left: 0px !important; margin-right: 0px !important; margin-top: 0px !important; margin: 0px; marker: none; mask-clip: border-box; mask-composite: add; mask-image: none; mask-mode: match-source; mask-origin: border-box; mask-repeat: repeat; mask-size: auto; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(31, 31, 31) none 2.4px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rule: 2.4px rgb(31, 31, 31); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;"&gt;ดึง Image ลงมาเก็บในเครื่อง:&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="color: red;"&gt;docker pull &lt;/span&gt;&lt;span style="color: #2b00fe;"&gt;yourusername/php7.4-apache-custom:v1&lt;/span&gt;&lt;/div&gt;&lt;div _ngcontent-ng-c3219552501="" aria-busy="false" aria-live="polite" class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color stronger tutor-markdown-rendering" dir="ltr" id="model-response-message-contentr_fa4d90a8af2635a5" inline-copy-host="" style="--animation-duration: 400ms; --fade-animation-function: ease-out; animation: auto ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px rgb(31, 31, 31); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; gap: normal; hyphens: manual; inset: auto; interactivity: auto; isolation: auto; line-height: 1.15; margin-bottom: 0px; margin-left: 0px !important; margin-right: 0px !important; margin-top: 0px !important; margin: 0px; marker: none; mask-clip: border-box; mask-composite: add; mask-image: none; mask-mode: match-source; mask-origin: border-box; mask-repeat: repeat; mask-size: auto; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(31, 31, 31) none 2.4px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rule: 2.4px rgb(31, 31, 31); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;"&gt;&lt;br /&gt;&lt;div style="animation: auto ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px rgb(31, 31, 31); clear: none; clip: auto; color: #1f1f1f; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; font-family: &amp;quot;Google Sans Text&amp;quot;, sans-serif; gap: normal; hyphens: manual; inset: auto; interactivity: auto; isolation: auto; line-height: 1.15; margin-bottom: 0px; margin-left: 0px !important; margin-right: 0px !important; margin-top: 0px !important; margin: 0px; marker: none; mask-clip: border-box; mask-composite: add; mask-image: none; mask-mode: match-source; mask-origin: border-box; mask-repeat: repeat; mask-size: auto; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(31, 31, 31) none 2.4px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rule: 2.4px rgb(31, 31, 31); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;"&gt;&lt;b data-index-in-node="0" data-path-to-node="24" style="animation: auto ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px rgb(31, 31, 31); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; display: inline; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; gap: normal; hyphens: manual; inset: auto; interactivity: auto; isolation: auto; line-height: 1.15; margin-bottom: 0px; margin-left: 0px !important; margin-right: 0px !important; margin-top: 0px !important; margin: 0px; marker: none; mask-clip: border-box; mask-composite: add; mask-image: none; mask-mode: match-source; mask-origin: border-box; mask-repeat: repeat; mask-size: auto; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(31, 31, 31) none 2.4px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rule: 2.4px rgb(31, 31, 31); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;"&gt;รัน Container จาก Image ที่ดึงมา:&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="color: red;"&gt;docker run -d -p &lt;/span&gt;&lt;span style="color: #2b00fe;"&gt;80:80&lt;/span&gt;&lt;span style="color: red;"&gt; --name&lt;/span&gt;&lt;span style="color: #ffa400;"&gt; my-web-app&lt;/span&gt;&lt;span style="color: #2b00fe;"&gt; yourusername/php7.4-apache-custom:v1&lt;/span&gt;&lt;/div&gt;&lt;div _ngcontent-ng-c3219552501="" aria-busy="false" aria-live="polite" class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color stronger tutor-markdown-rendering" dir="ltr" id="model-response-message-contentr_fa4d90a8af2635a5" inline-copy-host="" style="--animation-duration: 400ms; --fade-animation-function: ease-out; animation: auto ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px rgb(31, 31, 31); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; gap: normal; hyphens: manual; inset: auto; interactivity: auto; isolation: auto; line-height: 1.15; margin-bottom: 0px; margin-left: 0px !important; margin-right: 0px !important; margin-top: 0px !important; margin: 0px; marker: none; mask-clip: border-box; mask-composite: add; mask-image: none; mask-mode: match-source; mask-origin: border-box; mask-repeat: repeat; mask-size: auto; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(31, 31, 31) none 2.4px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rule: 2.4px rgb(31, 31, 31); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;"&gt;&lt;br /&gt;&lt;div style="animation: auto ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px rgb(31, 31, 31); clear: none; clip: auto; color: #1f1f1f; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; font-family: &amp;quot;Google Sans Text&amp;quot;, sans-serif; gap: normal; hyphens: manual; inset: auto; interactivity: auto; isolation: auto; line-height: 1.15; margin-bottom: 0px; margin-left: 0px !important; margin-right: 0px !important; margin-top: 0px !important; margin: 0px; marker: none; mask-clip: border-box; mask-composite: add; mask-image: none; mask-mode: match-source; mask-origin: border-box; mask-repeat: repeat; mask-size: auto; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(31, 31, 31) none 2.4px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rule: 2.4px rgb(31, 31, 31); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;"&gt;&lt;b data-index-in-node="0" data-path-to-node="26" style="animation: auto ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px rgb(31, 31, 31); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; display: inline; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; gap: normal; hyphens: manual; inset: auto; interactivity: auto; isolation: auto; line-height: 1.15; margin-bottom: 0px; margin-left: 0px !important; margin-right: 0px !important; margin-top: 0px !important; margin: 0px; marker: none; mask-clip: border-box; mask-composite: add; mask-image: none; mask-mode: match-source; mask-origin: border-box; mask-repeat: repeat; mask-size: auto; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(31, 31, 31) none 2.4px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rule: 2.4px rgb(31, 31, 31); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;"&gt;หรือใช้ในไฟล์ &lt;code data-index-in-node="14" data-path-to-node="26" style="animation: auto ease 0s 1 normal none running none; appearance: none; background: none 0% 0% / auto repeat scroll padding-box border-box rgb(242, 240, 240); border: 0px rgba(0, 0, 0, 0.55); clear: none; clip: auto; color: rgba(0, 0, 0, 0.55); columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; display: inline-block; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; font-family: &amp;quot;Google Sans Text&amp;quot;, sans-serif; font-feature-settings: normal; font-kerning: auto; font-language-override: normal; font-optical-sizing: auto; font-size-adjust: none; font-size: 15px; font-stretch: normal; font-variant: normal; font-variation-settings: normal; font-weight: normal; gap: normal; hyphens: manual; inset: auto; interactivity: auto; isolation: auto; line-height: 1.15; margin-bottom: 0px; margin-left: 0px !important; margin-right: 0px !important; margin-top: 0px !important; margin: 0px; marker: none; mask-clip: border-box; mask-composite: add; mask-image: none; mask-mode: match-source; mask-origin: border-box; mask-repeat: repeat; mask-size: auto; mask: none; offset: normal; opacity: 1; order: 0; outline: rgba(0, 0, 0, 0.55) none 2.4px; overlay: none; padding: 4px 6px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rule: 2.4px rgba(0, 0, 0, 0.55); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;"&gt;docker-compose.yml&lt;/code&gt;:&lt;/b&gt;&lt;/div&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;span style="color: #800180;"&gt;version: '3.8' &lt;br /&gt;services: &lt;br /&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;web:&lt;br /&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;container_name: my-web-app&lt;br /&gt;    &lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;image: yourusername/php7.4-apache-custom:v1 &lt;br /&gt;    &lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;ports:&amp;nbsp;&lt;/span&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;span style="color: #800180;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;- "80:80"&lt;/span&gt;&lt;/blockquote&gt;&lt;blockquote&gt;    &lt;span style="color: #800180;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;volumes: &lt;/span&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;span style="color: #800180;"&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/span&gt;- ./src:/var/www/html&lt;/span&gt;&lt;/p&gt;&lt;blockquote&gt;    &lt;span style="color: #800180;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;restart: unless-stopped&lt;/span&gt;&lt;/blockquote&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;ข้อควรระวังเรื่องความปลอดภัย:&lt;/b&gt;&lt;br /&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;&lt;span style="color: red;"&gt;หาก Image ดังกล่าวมีโค้ดส่วนตัว, ซอร์สโค้ดที่มีช่องโหว่สำหรับการทดสอบ หรือมี credentials/ไฟล์คอนฟิกลับอยู่ข้างใน ให้ตั้งค่า Repository บน Docker Hub เป็น Private&lt;/span&gt; เสมอ (หรือใช้บริการ Container Registry ภายใน เช่น Harbor, GitHub Packages (GHCR), หรือ AWS ECR) เพื่อป้องกันไม่ให้บุคคลภายนอกเข้าถึงได้&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div id="gtx-trans" style="left: -75px; position: absolute; top: -20px;"&gt;&lt;div class="gtx-trans-icon"&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;Are u sure?&lt;/div&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></item><item><title>Copy large folder in Linux Server  (แนะนำ rsync มี progress และสามารถ resume ได้)</title><link>http://juuier.blogspot.com/2026/10/copy-large-folder-in-linux-server-rsync.html</link><author>noreply@blogger.com (juuier)</author><pubDate>Fri, 23 Oct 2026 20:38:37 +0700</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-34115975.post-866587877531384915</guid><description>&lt;p&gt;Ref: Gemini&lt;/p&gt;&lt;p&gt;ถ้าโฟลเดอร์ใน Linux Server มีขนาดประมาณ 28 GB และต้องการคัดลอกเป็นโฟลเดอร์ใหม่ ผมแนะนำใช้ &lt;code&gt;rsync&lt;/code&gt; ครับ เพราะเหมาะกับข้อมูลขนาดใหญ่ สามารถแสดงความคืบหน้า และสั่งต่อได้หากการคัดลอกหยุดกลางคัน&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;h2&gt;&lt;span style="color: #ff00fe;"&gt;วิธีที่ 1: ใช้ rsync (แนะนำ)&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;สมมติว่าต้องการคัดลอกโฟลเดอร์ &lt;code&gt;/home/user/myfolder&lt;/code&gt; ไปเป็น &lt;code&gt;/home/user/myfolder_backup&lt;/code&gt;&lt;/p&gt;&lt;div&gt;&lt;pre dir="ltr"&gt;&lt;code&gt;&lt;span style="color: red;"&gt;rsync -a --info=progress2 /home/user/myfolder/ /home/user/myfolder_backup/&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ความหมายของคำสั่ง&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;code&gt;rsync&lt;/code&gt; ใช้คัดลอกและซิงก์ข้อมูล&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;code&gt;-a&lt;/code&gt; รักษาสิทธิ์ไฟล์ เวลา และโครงสร้างโฟลเดอร์&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;code&gt;--info=progress2&lt;/code&gt; แสดงความคืบหน้ารวมของการคัดลอก&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;code&gt;/home/user/myfolder/&lt;/code&gt; คือโฟลเดอร์ต้นทาง&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;code&gt;/home/user/myfolder_backup/&lt;/code&gt; คือโฟลเดอร์ปลายทาง&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;ข้อควรระวัง: เครื่องหมาย &lt;code&gt;/&lt;/code&gt; หลังชื่อโฟลเดอร์ต้นทาง หมายถึงคัดลอก ข้อมูลภายในโฟลเดอร์ ไปยังปลายทาง&lt;/p&gt;&lt;p&gt;หากต้องการคัดลอกทั้งโฟลเดอร์โดยให้มีโฟลเดอร์ต้นทางอยู่ข้างใน ใช้:&lt;/p&gt;&lt;div&gt;&lt;pre dir="ltr"&gt;&lt;code&gt;rsync -a --info=progress2 /home/user/myfolder /home/user/myfolder_backup/&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ผลลัพธ์จะเป็น &lt;code&gt;/home/user/myfolder_backup/myfolder/&lt;/code&gt;&lt;/p&gt;&lt;h2&gt;วิธีที่ 2: ใช้ cp แบบง่าย (ไม่มีสถานะบอกว่าถึงใหนแล้ว)&lt;/h2&gt;&lt;div&gt;&lt;pre dir="ltr"&gt;&lt;code&gt;cp -a /home/user/myfolder /home/user/myfolder_backup&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;code&gt;-a&lt;/code&gt; รักษาคุณสมบัติไฟล์และโฟลเดอร์&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;ไม่มีแถบแสดงความคืบหน้าโดยค่าเริ่มต้น&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;หากข้อมูลหยุดคัดลอก จะไม่มีระบบ resume ที่สะดวกเหมือน &lt;code&gt;rsync&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h2&gt;วิธีที่ 3: ใช้ rsync ผ่าน SSH ระหว่าง Server&lt;/h2&gt;&lt;p&gt;หากต้นทางอยู่ Server 1 และต้องการคัดลอกไป Server 2:&lt;/p&gt;&lt;div&gt;&lt;pre dir="ltr"&gt;&lt;code&gt;rsync -a --info=progress2 --partial \
  /home/user/myfolder/ \
  user@192.168.1.1:/home/user/myfolder_backup/&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;--partial&lt;/code&gt; ช่วยเก็บไฟล์ที่คัดลอกไม่เสร็จไว้ เพื่อให้สั่ง &lt;code&gt;rsync&lt;/code&gt; ซ้ำและทำงานต่อได้สะดวกขึ้น&lt;/p&gt;&lt;h2&gt;ก่อนคัดลอกข้อมูล 28 GB ควรตรวจสอบพื้นที่ก่อน&lt;/h2&gt;&lt;div&gt;&lt;pre dir="ltr"&gt;&lt;code&gt;df -h&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ดูพื้นที่ว่างของดิสก์ปลายทาง และตรวจสอบขนาดโฟลเดอร์ต้นทาง:&lt;/p&gt;&lt;div&gt;&lt;pre dir="ltr"&gt;&lt;code&gt;du -sh /home/user/myfolder&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;คำแนะนำของผม: ถ้าคัดลอกภายในเครื่องเดียวกัน ใช้ &lt;code&gt;rsync -a --info=progress2&lt;/code&gt; ครับ แต่ถ้าต้องคัดลอกระหว่าง Server ผ่าน SSH ก็ใช้ &lt;code&gt;rsync&lt;/code&gt; ได้เช่นกัน&lt;/p&gt;&lt;p&gt;ขอถามเพิ่มเติมนิดหนึ่งครับ: คุณจะคัดลอกโฟลเดอร์ 28 GB ภายใน Server เครื่องเดียวกัน หรือ จาก Server เครื่องหนึ่งไปอีก Server หนึ่งผ่านเครือข่าย ครับ? ผมจะได้แนะนำคำสั่งที่เหมาะสมที่สุดให้ครับ&lt;/p&gt;&lt;p&gt;&lt;b&gt;เพิ่มเติม&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;กรณี rsync แต่ลืม sudo ให้ทำการยกเลิก process โดยหา process id ก่อนแล้วค่อย kill process&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;span style="color: red;"&gt;ps aux | grep '[r]sync'&lt;/span&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;ผลลัพธ์&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;span style="color: #800180;"&gt;user&amp;nbsp; &amp;nbsp; &amp;nbsp;3722318&amp;nbsp; 4.1&amp;nbsp; 0.0&amp;nbsp; 74652 31044 pts/3&amp;nbsp; &amp;nbsp; D+&amp;nbsp; &amp;nbsp;20:33&amp;nbsp; &amp;nbsp;1:14 rsync -a --info=progress2 ./folder/ ./folder_bak/&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #800180;"&gt;user&amp;nbsp; &amp;nbsp; &amp;nbsp; 3722320&amp;nbsp; 0.1&amp;nbsp; 0.0&amp;nbsp; 49636&amp;nbsp; 9764 pts/3&amp;nbsp; &amp;nbsp; S+&amp;nbsp; &amp;nbsp;20:33&amp;nbsp; &amp;nbsp;0:01 rsync -a --info=progress2 ./folder/ ./folder_bak/&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #800180;"&gt;user&amp;nbsp; &amp;nbsp; &amp;nbsp; 3722321&amp;nbsp; 4.2&amp;nbsp; 0.0&amp;nbsp; 47380 10076 pts/3&amp;nbsp; &amp;nbsp; S+&amp;nbsp; &amp;nbsp;20:33&amp;nbsp; &amp;nbsp;1:16 rsync -a --info=progress2 ./folder/ ./folder_bak&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;สั่งหยุดทำงาน&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;span style="color: red;"&gt;kill -INT 3722318 3722320 3722321&lt;/span&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;ตรวจสอบ&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;span style="color: red;"&gt;ps -o pid,stat,cmd -p 3722318,3722320,3722321&lt;/span&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;ถ้ายังไม่หยุด&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;span style="color: red;"&gt;kill -TERM 3722318 3722320 3722321&lt;/span&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;div id="gtx-trans" style="left: -1px; position: absolute; top: 1707.3px;"&gt;&lt;div class="gtx-trans-icon"&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;Are u sure?&lt;/div&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></item><item><title>Delete docker image ที่ไม่ใช้แล้ว</title><link>http://juuier.blogspot.com/2026/10/delete-docker-image.html</link><author>noreply@blogger.com (juuier)</author><pubDate>Fri, 23 Oct 2026 18:47:15 +0700</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-34115975.post-8991142885463106699</guid><description>&lt;div&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;จะลบได้คือ ต้องไม่มี container ตัวใหนใช้งานอยู่ ไม่งั้นจะไม่สามารถลบได้ ถ้าต้องการลบต้อง stop และ delete container นั้นก่อนลบ&lt;/li&gt;&lt;li&gt;แสดง image ที่ถูกสร้างไว้&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;span style="color: red;"&gt;docker image ls&lt;/span&gt;&lt;/blockquote&gt;&lt;div&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;ลบ image แบบระบุ id&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;span style="color: red;"&gt;&lt;/span&gt;&lt;blockquote&gt;&lt;span style="color: red;"&gt;docker image rm &amp;lt;id/image name&amp;gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;div&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;ลบ image ทั้งหมดที่ไม่มี container ตัวใหนใช้งาน&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: red;"&gt;&lt;/span&gt;&lt;blockquote&gt;&lt;span style="color: red;"&gt;docker image prune -a&lt;/span&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Ref&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;Gemini&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div id="gtx-trans" style="left: 36px; position: absolute; top: 196.8px;"&gt;&lt;div class="gtx-trans-icon"&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;Are u sure?&lt;/div&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></item><item><title>ทบทวน Install SNMP on Ubuntu 24.04</title><link>http://juuier.blogspot.com/2026/10/install-snmp-on-ubuntu-2404.html</link><author>noreply@blogger.com (juuier)</author><pubDate>Thu, 22 Oct 2026 10:39:56 +0700</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-34115975.post-4855471065242709803</guid><description>&lt;b&gt;Ref: gemini &amp;amp; me style&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;ติดตั่งตัว snmp service และ client&lt;/li&gt;&lt;/ul&gt;&lt;blockquote&gt;&lt;span style="color: red;"&gt;sudo apt update&lt;br /&gt;&lt;br /&gt;sudo apt install snmpd snmp&lt;/span&gt;&lt;/blockquote&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;สำรองไฟล์และแก้ไข&lt;/li&gt;&lt;/ul&gt;&lt;blockquote&gt;&lt;span style="color: red;"&gt;sudo cp -a /etc/snmp/snmpd.conf /etc/nsnmp/snmpd.conf.bak&lt;br /&gt;&lt;br /&gt;sudo nano /etc/snmp/snmpd.conf&lt;/span&gt;&lt;/blockquote&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;หา agentAddress  ประมาณบรรทัดที 49 เดิมแล้วแก้เป็นบรรทัดนี้ โดยให้เหลือบรรทัดที่ใช้งานเพียงบรรทัดเดียว: (ใช้จริงผม ไม่ใส่ แต่แค่คอมเม้น &lt;span style="color: #38761d;"&gt;#&amp;nbsp;agentaddress 127.0.0.1,[::1]&lt;/span&gt;&amp;nbsp;ไว้พอคับ)&lt;/li&gt;&lt;/ul&gt;&lt;blockquote&gt;&lt;span style="color: #800180;"&gt;# agentaddress  127.0.0.1,[::1]&lt;/span&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;/p&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;คอมเม้นแล้ว จะใส่ udp:161 ใส่หรือไม่ใส่ก็ได้คับ client สามารถ snmpwalk ได้&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;span style="color: #2b00fe;"&gt; agentAddress udp:161&lt;/span&gt;&lt;/blockquote&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;มองหา view systemonly ประมาณบรรทัดที่ 63-64&lt;/li&gt;&lt;li&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;เพิ่มการดึงค่าให้ได้เยอะสุดโดยเติม .1 เข้ากลุ่ม systemonly  หรือจะสร้าง กลุ่มอื่นก็ได้&lt;/li&gt;&lt;/ul&gt;&lt;blockquote&gt;&lt;span style="color: red;"&gt;view      systemonly included .&lt;/span&gt;&lt;span style="color: #2b00fe;"&gt;1&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #800180;"&gt;view   systemonly  included   .1.3.6.1.2.1.1&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #800180;"&gt;view   systemonly  included   .1.3.6.1.2.1.25.1&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: red;"&gt;view &lt;/span&gt;&lt;span style="color: #2b00fe;"&gt;mygroup&lt;/span&gt;&lt;span style="color: red;"&gt; included &lt;/span&gt;&lt;span style="color: #2b00fe;"&gt;.1&lt;/span&gt;&lt;/blockquote&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;จากนั้นเพิ่ม สิทธิ์เครื่องเข้าถึง ค่าเริ่มต้นเป็น public default น่าจะ read ได้ทุกเครื่อง ประมาณบรรทัด 71-72&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;blockquote&gt;&lt;span style="color: #800180;"&gt;rocommunity  public default -V systemonly&lt;br /&gt;rocommunity6 public default -V systemonly&lt;/span&gt;&lt;/blockquote&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;ควรคอมเม้นไม่ให้ใช้ค่าเริ่มต้น&lt;/li&gt;&lt;/ul&gt;&lt;blockquote&gt;&lt;span style="color: #38761d;"&gt;# rocommunity public default -V systemonly&lt;br /&gt;# rocommunity6 public default -V systemonly&lt;/span&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;div&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;เลือกตั้งค่าเลยจะใช้แบบใหน&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;div&gt;# อนุญาตเฉพาะ ip โดย oid กลุ่ม systemonly&amp;nbsp;&lt;br /&gt;&lt;span style="color: #800180;"&gt;rocommunity &lt;/span&gt;&lt;span style="color: red;"&gt;mycms 192.1.1.1&lt;/span&gt;&lt;span style="color: #800180;"&gt; -V &lt;/span&gt;&lt;span style="color: #2b00fe;"&gt;systemonly&lt;/span&gt;&amp;nbsp;&lt;/div&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;div&gt;# อนุญาตทุก ip แต่ใช้ได้แค่ oid mygroup&lt;br /&gt;&lt;span style="color: #2b00fe;"&gt;rocommunity &lt;/span&gt;&lt;span style="color: red;"&gt;mycms default &lt;/span&gt;&lt;span style="color: #2b00fe;"&gt;-V &lt;/span&gt;&lt;span style="color: red;"&gt;mygroup&lt;/span&gt;&amp;nbsp;&lt;/div&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;div&gt;# allow subnet&lt;br /&gt;&lt;span style="color: #800180;"&gt;rocommunity &lt;/span&gt;&lt;span style="color: red;"&gt;mySecretKey 10.10.20.0/24&lt;/span&gt;&lt;span style="color: #800180;"&gt; -V systemonly&lt;/span&gt;&amp;nbsp;&lt;/div&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;div&gt;# allow เฉพาะ localhost&lt;br /&gt;&lt;span style="color: #800180;"&gt;rocommunity &lt;/span&gt;&lt;span style="color: red;"&gt;mySecretKey 127.0.0.1&lt;/span&gt;&lt;span style="color: #800180;"&gt; -V systemonly&lt;/span&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;div&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;ตั้ง service ให้เปิด ตอนบูตเครื่องใหม่ทุกครั้ง (ปกติติดตั้งเสร็จมัน enable ให้อัตโนมัติอยู่แล้ว)&lt;/li&gt;&lt;/ul&gt;&lt;blockquote&gt;&lt;span style="color: red;"&gt;sudo systemctl enable —now snmpd&lt;br /&gt;&lt;br /&gt;sudo systemctl restart snmpd&lt;br /&gt;&lt;br /&gt;sudo systemctl status snmpd —no-pager&lt;/span&gt;&lt;/blockquote&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;ตรวจสอบ firewall port 161, snmp service ที่ฝั่ง server ให้อนุญาตด้วย&lt;/li&gt;&lt;li&gt;ทดสอบ snmpwalk ฝั่ง client&lt;/li&gt;&lt;/ul&gt;&lt;blockquote&gt;&lt;span style="color: red;"&gt; snmpwalk -v2c -c 'MySnmpSecret123' UBUNTU_IP .1.3.6.1.2.1.1&lt;/span&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;span style="color: red;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;span style="color: red;"&gt;snmpwalk -v2c -c 'MySnmpSecret123' UBUNTU_IP .1&lt;/span&gt;&amp;nbsp;&lt;/blockquote&gt;&lt;p&gt;&lt;b&gt;เพิ่มเติม&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;ตรวจสอบ firewal open centos 7&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;span style="color: red;"&gt;sudo firewall-cmd --list-all&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: red;"&gt;sudo iptables -L -n -v | grep 161&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;เพิ่ม อนุญาต service&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;span style="color: red;"&gt;sudo firewall-cmd --permanent --add-service=snmp&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: red;"&gt;sudo firewall-cmd --reload&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;div id="gtx-trans" style="left: 32px; position: absolute; top: 1562.5px;"&gt;&lt;div class="gtx-trans-icon"&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;Are u sure?&lt;/div&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></item><item><title>ตั้งค่า macOS ให้เป็น server mode</title><link>http://juuier.blogspot.com/2026/10/macos-server-mode.html</link><author>noreply@blogger.com (juuier)</author><pubDate>Wed, 21 Oct 2026 10:02:40 +0700</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-34115975.post-2745258724381892867</guid><description>&lt;p&gt;&lt;b&gt;Ref: Gemini&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;ประเด็นคือ ใช้ macos รัน web, db&lt;/li&gt;&lt;li&gt;แต่เข้าใช้งานบางครั้ง เข้าไม่ได้ คล้าย mac เข้า standby / sleep mode&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;Solved&amp;nbsp;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;เปิดโหมด server โดยปิด โหมดต่างๆ&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;h3 data-path-to-node="3"&gt;วิธีแก้ไขให้ macOS ทำงานตลอดเวลา ไม่ตัดการเชื่อมต่อ&lt;/h3&gt;&lt;p data-path-to-node="4"&gt;&lt;/p&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;รันชุดคำสั่งด้านล่างนี้ใน Terminal ครั้งเดียว เพื่อปิดระบบ Sleep และ Standby ทั้งหมด:&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;p data-path-to-node="4"&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;p data-path-to-node="4"&gt;&lt;span style="color: red;"&gt;sudo pmset -a sleep 0&lt;/span&gt;&lt;/p&gt;&lt;p data-path-to-node="4"&gt;&lt;span style="color: red;"&gt;sudo pmset -a standby 0&lt;/span&gt;&lt;/p&gt;&lt;p data-path-to-node="4"&gt;&lt;span style="color: red;"&gt;sudo pmset -a autopoweroff 0&lt;/span&gt;&lt;/p&gt;&lt;p data-path-to-node="4"&gt;&lt;span style="color: red;"&gt;sudo pmset -a powernap 0&lt;/span&gt;&lt;/p&gt;&lt;p data-path-to-node="4"&gt;&lt;span style="color: red;"&gt;sudo pmset -a disksleep 0&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p data-path-to-node="4"&gt;&lt;/p&gt;&lt;p data-path-to-node="6"&gt;&lt;i data-index-in-node="0" data-path-to-node="6"&gt;&lt;b&gt;คำอธิบายการตั้งค่า:&lt;/b&gt;&lt;/i&gt;&lt;/p&gt;&lt;p data-path-to-node="4"&gt;&lt;/p&gt;&lt;h3 data-path-to-node="9"&gt;&lt;/h3&gt;&lt;p&gt;&lt;/p&gt;&lt;ul data-path-to-node="7"&gt;&lt;li&gt;&lt;p data-path-to-node="7,0,0"&gt;&lt;code data-index-in-node="0" data-path-to-node="7,0,0"&gt;sleep 0&lt;/code&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; ปิด System Sleep ถาวร (เครื่องไม่หลับแม้ไม่ได้แตะต้อง)&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p data-path-to-node="7,1,0"&gt;&lt;code data-index-in-node="0" data-path-to-node="7,1,0"&gt;standby 0&lt;/code&gt;&lt;span&gt; และ &lt;/span&gt;&lt;code data-index-in-node="14" data-path-to-node="7,1,0"&gt;autopoweroff 0&lt;/code&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; ปิดการตัดไฟเข้าโหมด Deep Sleep&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p data-path-to-node="7,2,0"&gt;&lt;code data-index-in-node="0" data-path-to-node="7,2,0"&gt;powernap 0&lt;/code&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; ปิด Power Nap เพื่อไม่ให้ระบบตัดสลับสถานะไปมา&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p data-path-to-node="7,3,0"&gt;&lt;code data-index-in-node="0" data-path-to-node="7,3,0"&gt;disksleep 0&lt;/code&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; ให้ไดรฟ์พร้อมตอบสนองคำขอของเว็บเซิร์ฟเวอร์ตลอดเวลา&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p data-path-to-node="7,4,0"&gt;&lt;span&gt;ธง &lt;/span&gt;&lt;code data-index-in-node="3" data-path-to-node="7,4,0"&gt;-a&lt;/code&gt;&lt;span&gt; (All) จะบังคับใช้ทั้งตอนเสียบสายชาร์จ (AC Power) และแบตเตอรี่&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;h3 data-path-to-node="9"&gt;ขั้นตอนการตรวจสอบหลังแก้ไข&lt;/h3&gt;&lt;ol class="md-has-block-component" data-path-to-node="10" start="1"&gt;&lt;li&gt;&lt;p data-path-to-node="10,0,0"&gt;รันคำสั่งตรวจสอบค่าใหม่อีกครั้ง: &lt;span style="color: red;"&gt;pmset -g&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;&lt;h3 data-path-to-node="3"&gt;ข้อควรระวังเพิ่มเติมสำหรับ MacBook&lt;/h3&gt;&lt;p data-path-to-node="4"&gt;เนื่องจากเครื่องเป็น MacBook Pro หากต้องการให้เครื่องเปิดให้บริการตลอดเวลาโดยไม่หลุด ต้องตรวจสอบอีก 2 จุดสำคัญ:&lt;/p&gt;&lt;ol class="md-has-block-component" data-path-to-node="5" start="1"&gt;&lt;li&gt;&lt;p data-path-to-node="5,0,0"&gt;&lt;b data-index-in-node="0" data-path-to-node="5,0,0"&gt;กรณีมีการพับฝาจอ (Clamshell Mode):&lt;/b&gt;&lt;/p&gt;&lt;ul data-path-to-node="5,0,1"&gt;&lt;li&gt;&lt;p data-path-to-node="5,0,1,0,0"&gt;ระบบของ MacBook จะบังคับ Sleep ทันทีที่พับฝาจอ เว้นแต่ว่าจะ &lt;b data-index-in-node="60" data-path-to-node="5,0,1,0,0"&gt;เสียบสายชาร์จ (Power Adapter)&lt;/b&gt; และ &lt;b data-index-in-node="94" data-path-to-node="5,0,1,0,0"&gt;ต่อหน้าจอนอก&lt;/b&gt; ไว้&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p data-path-to-node="5,0,1,1,0"&gt;หากต้องการพับฝาจอทิ้งไว้โดย&lt;b data-index-in-node="27" data-path-to-node="5,0,1,1,0"&gt;ไม่ต่อจอนอก&lt;/b&gt;และไม่ให้เครื่องดับ ให้รันคำสั่งนี้เพิ่ม:&lt;/p&gt;&lt;response-element class="no-md" ng-version="0.0.0-PLACEHOLDER"&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;code-block _nghost-ng-c1404798789="" class="ng-tns-c1404798789-27 enable-luminous-code-block ng-star-inserted"&gt;&lt;!----&gt;&lt;!----&gt;&lt;div _ngcontent-ng-c1404798789="" class="code-block ng-tns-c1404798789-27 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" data-hveid="0" data-ved="0CAAQhtANahgKEwj3iY3jjMqXAxUAAAAAHQAAAAAQugE" decode-data-ved="1" jslog="223238;track:impression,attention;BardVeMetadataKey:W1sicl81ODVlNzAwZGYxNDU0MGY1IiwiY19kZGQ5NjJlOTc4ODkxOTI4IixudWxsLCJyY19jMTU3ZWI5NzEzYmMyYTMxIixudWxsLG51bGwsInRoIixudWxsLDEsbnVsbCxudWxsLDAsMF1d"&gt;&lt;!----&gt;&lt;div _ngcontent-ng-c1404798789="" class="formatted-code-block-internal-container ng-tns-c1404798789-27"&gt;&lt;div _ngcontent-ng-c1404798789="" class="animated-opacity ng-tns-c1404798789-27"&gt;&lt;div _ngcontent-ng-c1404798789="" class="code-block-decoration header-formatted gds-emphasized-body-m ng-tns-c1404798789-27 ng-star-inserted"&gt;&lt;span style="color: red;"&gt;sudo pmset -a disablesleep 1&lt;/span&gt;&lt;/div&gt;&lt;!----&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;/code-block&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;/response-element&gt;&lt;p data-path-to-node="5,0,1,1,2"&gt;&lt;i data-index-in-node="0" data-path-to-node="5,0,1,1,2"&gt;(คำสั่งนี้จะสั่งห้ามไม่ให้ระบบ Sleep ในทุกกรณี แม้กระทั่งตอนพับจอ)&lt;/i&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;p data-path-to-node="5,1,0"&gt;&lt;b data-index-in-node="0" data-path-to-node="5,1,0"&gt;ระบบ Wi-Fi ตัดการทำงานเมื่อไม่ได้ใช้งาน:&lt;/b&gt;&lt;/p&gt;&lt;ul data-path-to-node="5,1,1"&gt;&lt;li&gt;&lt;p data-path-to-node="5,1,1,0,0"&gt;หาก MacBook เชื่อมต่อผ่าน Wi-Fi ตัวชิปไร้สายอาจเข้าโหมดประหยัดพลังงานเมื่อไม่มีทราฟฟิกวิ่ง แนะนำให้ใช้สาย &lt;b data-index-in-node="106" data-path-to-node="5,1,1,0,0"&gt;LAN (USB-C to Ethernet)&lt;/b&gt; หรือตั้ง background ping เพื่อให้ interface ตื่นตัวอยู่เสมอ:&lt;/p&gt;&lt;response-element class="no-md" ng-version="0.0.0-PLACEHOLDER"&gt;&lt;code-block _nghost-ng-c1404798789="" class="ng-tns-c1404798789-28 enable-luminous-code-block ng-star-inserted"&gt;&lt;div _ngcontent-ng-c1404798789="" class="code-block ng-tns-c1404798789-28 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" data-hveid="0" data-ved="0CAAQhtANahgKEwj3iY3jjMqXAxUAAAAAHQAAAAAQuwE" decode-data-ved="1" jslog="223238;track:impression,attention;BardVeMetadataKey:W1sicl81ODVlNzAwZGYxNDU0MGY1IiwiY19kZGQ5NjJlOTc4ODkxOTI4IixudWxsLCJyY19jMTU3ZWI5NzEzYmMyYTMxIixudWxsLG51bGwsInRoIixudWxsLDEsbnVsbCxudWxsLDAsMF1d"&gt;&lt;div _ngcontent-ng-c1404798789="" class="formatted-code-block-internal-container ng-tns-c1404798789-28"&gt;&lt;div _ngcontent-ng-c1404798789="" class="animated-opacity ng-tns-c1404798789-28"&gt;&lt;!----&gt;&lt;pre _ngcontent-ng-c1404798789="" class="ng-tns-c1404798789-28"&gt;&lt;code _ngcontent-ng-c1404798789="" class="code-container formatted ng-tns-c1404798789-28" data-test-id="code-content" role="text"&gt;&lt;span style="color: red;"&gt;ping -i 60 1.1.1.1 &amp;gt; /dev/null 2&amp;gt;&amp;amp;1 &amp;amp;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code-block&gt;&lt;/response-element&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;/div&gt;&lt;div id="gtx-trans" style="left: -33px; position: absolute; top: 1184.03px;"&gt;&lt;div class="gtx-trans-icon"&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;Are u sure?&lt;/div&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></item><item><title>Check port state on macOS</title><link>http://juuier.blogspot.com/2026/10/check-port-state-on-macos.html</link><author>noreply@blogger.com (juuier)</author><pubDate>Wed, 21 Oct 2026 08:46:05 +0700</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-34115975.post-5077455881461183701</guid><description>&lt;p&gt;&lt;/p&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&amp;nbsp;ใน linux ส่วนตัวใช้&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: red;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;span style="color: red;"&gt;netstat -na | grep ":&lt;/span&gt;&lt;span style="color: #2b00fe;"&gt;&amp;lt;port_number&amp;gt;&lt;/span&gt;&lt;span style="color: red;"&gt;"&lt;/span&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;ใน macos gemini แนะนำแบบนี้&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;Method 1: lsof (recommened)&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: red;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;span style="color: red;"&gt;lsof -i :&lt;/span&gt;&lt;span style="color: #2b00fe;"&gt;&amp;lt;port_number&amp;gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;หรือ&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;span style="color: red;"&gt;lsof -i :3000 -sTCP:LISTEN&lt;/span&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;ผลลัพธ์จะประมาณ&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #800180;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;span style="color: #800180;"&gt;COMMAND&amp;nbsp; &amp;nbsp;PID USER&amp;nbsp; &amp;nbsp;FD&amp;nbsp; &amp;nbsp;TYPE&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;DEVICE SIZE/OFF NODE NAME&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #800180;"&gt;node&amp;nbsp; &amp;nbsp; 12345 user&amp;nbsp; &amp;nbsp;23u&amp;nbsp; IPv6 0x1234567890abcdef&amp;nbsp; &amp;nbsp; &amp;nbsp; 0t0&amp;nbsp; TCP *:3000 (LISTEN)&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;span style="color: #800180;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;Method 2: netstat&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;คำสั่ง &lt;code data-index-in-node="7" data-path-to-node="12"&gt;netstat&lt;/code&gt; บน macOS จะใช้ไวยากรณ์ของฝั่ง BSD ไม่เหมือน Linux หากต้องการดูพอร์ต TCP ที่กำลัง LISTEN ให้ปรับคำสั่งเป็น:&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;span style="color: red;"&gt;netstat -anv -p tcp | grep &lt;/span&gt;&lt;span style="color: #2b00fe;"&gt;3000&lt;/span&gt;&amp;nbsp;&lt;/blockquote&gt;&lt;blockquote&gt;-a: แสดง socket ทั้งหมด&lt;br /&gt;-n: แสดงเป็นตัวเลข IP และ Port (ไม่แปลงเป็นชื่อโฮสต์/ชื่อบริการ)&lt;br /&gt;-v: แสดงข้อมูลแบบละเอียดขึ้น (รวมถึง PID ในคอลัมน์ขวาสุด)&lt;br /&gt;-p tcp: กรองเฉพาะโปรโตคอล TCP&lt;/blockquote&gt;&lt;b&gt;Method 3 : nc (netcat)&lt;/b&gt;&lt;br /&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;หากต้องการเพียงแค่เช็กสถานะว่าพอร์ตเปิดอยู่และเชื่อมต่อได้หรือไม่ โดยไม่จำเป็นต้องดู Process ID:&lt;/li&gt;&lt;/ul&gt;&lt;blockquote&gt;&lt;span style="color: red;"&gt;nc -zv 127.0.0.1 &lt;/span&gt;&lt;span style="color: #2b00fe;"&gt;3000&lt;/span&gt;&lt;/blockquote&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;ผลลัพธ์หากพอร์ตเปิด: Connection to 127.0.0.1 port 3000 [tcp/*] succeeded! &lt;/li&gt;&lt;li&gt;ผลลัพธ์หากพอร์ตปิด: Connection to 127.0.0.1 port 3000 [tcp/*] failed: Connection refused&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;Are u sure?&lt;/div&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></item><item><title>ติดตั้ง PM2 เพื่อรัน Node project ใช้งานบน macOS</title><link>http://juuier.blogspot.com/2026/10/pm2-node-project-macos.html</link><author>noreply@blogger.com (juuier)</author><pubDate>Wed, 21 Oct 2026 08:27:39 +0700</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-34115975.post-3357190000057152016</guid><description>&lt;p&gt;&lt;b&gt;&amp;nbsp;Ref:&amp;nbsp;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;&lt;b&gt;Gemini&lt;/b&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;https://thankzaki.medium.com/run-nodejs-with-pm2-5d88add93b25&lt;/b&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;div class="n6owBd awi2gc" data-complete="true" data-hveid="CAIIAAgACAUQAA" data-sfc-cp="" data-sfc-root="c" jsaction="" jscontroller="TDBkbc#Ml18Xb" jsuid="Mvhwcf_p" style="border-bottom: 0px rgb(230, 232, 240); font-family: &amp;quot;Google Sans&amp;quot;, sans-serif; font-size: 16px; margin: 0px 0px 16px;"&gt;&lt;span data-subtree="aimfl,mfl" style="border-bottom: 0px rgb(230, 232, 240); margin: 0px;"&gt;การใช้ &lt;/span&gt;&lt;span class="rQesXe MPyX" data-complete="true" data-sfc-cp="" data-sfc-root="c" jsaction="" jscontroller="tP2kf#s32ZS" jsuid="Mvhwcf_q" style="border-bottom: 0px rgb(230, 232, 240); font-weight: 700; margin: 0px;"&gt;PM2&lt;!--TgQPHd|||[]--&gt;&lt;/span&gt; เพื่อรันโปรเจกต์ Node.js บน macOS &lt;mark class="b6AQX" data-complete="true" data-sfc-root="c" data-ved="2ahUKEwjOsYKe-MmXAxWcR2wGHasiPMYQuJAPegoIAggACAAIBRAB" data-wiz-attrbind="class=Mvhwcf_r/cFwyDc" jsaction="click:&amp;amp;Mvhwcf_r|ZUljYd;" jscontroller="l6hPId#Mt0KKb" jsuid="Mvhwcf_r" style="border-bottom: 0px rgb(238, 240, 255); margin: 0px;"&gt;สามารถทำได้ง่าย ๆ ใน &lt;span class="rQesXe MPyX" data-complete="true" data-sfc-cp="" data-sfc-root="c" jsaction="" jscontroller="tP2kf#s32ZS" jsuid="Mvhwcf_s" style="border-bottom: 0px rgb(238, 240, 255); margin: 0px;"&gt;4 ขั้นตอนหลัก&lt;!--TgQPHd|||[]--&gt;&lt;/span&gt;&lt;!--TgQPHd|||[[[null,null,null,null,null,null,null,null,null,null,null,null,[247864,null,0]]]]--&gt;&lt;/mark&gt; ดังนี้ครับ&lt;!--TgQPHd|||[]--&gt;&lt;/div&gt;&lt;div class="yhAwj" data-complete="true" data-sfc-cp="" data-sfc-inited="2" data-sfc-root="c" jsaction="rcuQ6b:&amp;amp;Mvhwcf_y|npT2md" jscontroller="UTzWVc#U8DOt" jsuid="Mvhwcf_y" style="border-bottom: 0px rgb(230, 232, 240); font-family: &amp;quot;Google Sans&amp;quot;, sans-serif; font-size: 16px; margin: 0px;"&gt;&lt;!--TgQPHd|||[]--&gt;&lt;/div&gt;&lt;div aria-level="3" class="ZLzG0d ncoeY E8xBUb" data-animation-nesting="" data-complete="true" data-sfc-cp="" data-sfc-root="c" data-wiz-attrbind="aria-level=Mvhwcf_z/fLk2Md" jsaction="" jscontroller="zg1ZQe#TswZNc" jsuid="Mvhwcf_z" role="heading" style="border-bottom: 0px rgb(232, 234, 242); font-family: &amp;quot;Google Sans&amp;quot;, sans-serif; font-size: 20px; font-weight: 600; margin: 24px 0px 12px;"&gt;1. ติดตั้ง PM2 แบบ Global&lt;!--TgQPHd|||[[2,[null,null,null,null,null,null,null,null,null,null,null,null,[351768,null,0]],[],null,1]]--&gt;&lt;/div&gt;&lt;div data-bfc="" data-complete="true" data-hveid="CAIIAAgACAcQAA" data-sfc-cp="" data-sfc-root="c" data-ved="2ahUKEwjOsYKe-MmXAxWcR2wGHasiPMYQi4wTegoIAggACAAIBxAA" jsaction="" jscontroller="eHDDzf#DtOdcb" jsuid="Mvhwcf_10" style="border-bottom: 0px rgb(230, 232, 240); font-family: &amp;quot;Google Sans&amp;quot;, sans-serif; font-size: 16px; margin: 0px;"&gt;&lt;div class="n6owBd awi2gc" data-complete="true" data-hveid="CAIIAAgACAcQAQ" data-sfc-cp="" data-sfc-root="c" jsaction="" jscontroller="TDBkbc#Ml18Xb" jsuid="Mvhwcf_11" style="border-bottom: 0px rgb(230, 232, 240); margin: 12px 0px 16px;"&gt;เปิด Terminal ของ macOS ขึ้นมา จากนั้นใช้คำสั่ง &lt;code class="KDcb0c" data-complete="true" data-sfc-root="c" dir="ltr" jsaction="" jscontroller="hNviFe#redMub" jsuid="Mvhwcf_12" style="border-bottom: 1px solid rgb(44, 46, 53); font-size: 14px; margin: 0px;"&gt;npm&lt;!--TgQPHd|||[]--&gt;&lt;/code&gt; เพื่อติดตั้ง PM2 ลงในเครื่องแบบ Global:&lt;/div&gt;&lt;/div&gt;&lt;div data-bfc="" data-complete="true" data-hveid="CAIIAAgACAgQAA" data-sfc-cp="" data-sfc-root="c" data-ved="2ahUKEwjOsYKe-MmXAxWcR2wGHasiPMYQi4wTegoIAggACAAICBAA" jsaction="" jscontroller="eHDDzf#DtOdcb" jsuid="Mvhwcf_19" style="border-bottom: 0px rgb(230, 232, 240); font-family: &amp;quot;Google Sans&amp;quot;, sans-serif; font-size: 16px; margin: 0px;"&gt;&lt;div class="BpxUDf aiModeUiCodeBlock__Container" data-complete="true" data-hveid="CAIIAAgACAgQAQ" data-sfc-cp="" data-sfc-root="c" data-wiz-uids="Mvhwcf_1c,Mvhwcf_1b" jsaction="" jscontroller="Liu6s#lcO7sb" jsuid="Mvhwcf_1a" style="border-bottom: 0px rgb(238, 240, 255); margin: 4px 0px 0px;"&gt;&lt;div style="border-bottom: 0px rgb(238, 240, 255); margin: 0px;"&gt;&lt;div class="rq1a2" data-animation-atomic="" style="border-bottom: 1px solid rgb(44, 46, 53); margin: 0px;"&gt;&lt;div class="PGvq2d" dir="ltr" style="border-bottom: 0px rgb(238, 240, 255); font-size: 14px; margin: 0px;"&gt;&lt;pre style="border-bottom: 0px rgb(238, 240, 255); margin: 14px 0px;"&gt;&lt;code jsuid="Mvhwcf_1c" style="border-bottom: 0px rgb(238, 240, 255); margin: 0px;"&gt;&lt;span style="color: red;"&gt;npm install pm2@latest -g&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="iMHp6c" data-animation-atomic="" style="border-bottom: 1px solid rgb(44, 46, 53); margin: 3px 0px 0px;"&gt;&lt;div class="ZIumpf" style="border-bottom: 0px rgb(189, 193, 198); font-size: 12px; margin: 0px;"&gt;&lt;em class="zhvwWe" data-complete="true" data-sfc-cp="" data-sfc-root="c" jsaction="" jscontroller="LFsGHb#ycPkjf" jsuid="Mvhwcf_1j" style="border-bottom: 0px rgb(230, 232, 240); font-size: 16px; margin: 0px;"&gt;(หากติดสิทธิ์ Permission ให้ใส่ &lt;code class="KDcb0c" data-complete="true" data-sfc-root="c" dir="ltr" jsaction="" jscontroller="hNviFe#redMub" jsuid="Mvhwcf_1k" style="border-bottom: 1px solid rgb(44, 46, 53); font-size: 14px; margin: 0px;"&gt;sudo&lt;/code&gt; ข้างหน้า เช่น &lt;code class="KDcb0c" data-complete="true" data-sfc-root="c" dir="ltr" jsaction="" jscontroller="hNviFe#redMub" jsuid="Mvhwcf_1l" style="border-bottom: 1px solid rgb(44, 46, 53); font-size: 14px; margin: 0px;"&gt;sudo npm install pm2@latest -g&lt;/code&gt;)&lt;/em&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="yhAwj" data-complete="true" data-sfc-cp="" data-sfc-inited="2" data-sfc-root="c" jsaction="rcuQ6b:&amp;amp;Mvhwcf_1r|npT2md" jscontroller="UTzWVc#U8DOt" jsuid="Mvhwcf_1r" style="border-bottom: 0px rgb(230, 232, 240); font-family: &amp;quot;Google Sans&amp;quot;, sans-serif; font-size: 16px; margin: 0px;"&gt;&lt;!--TgQPHd|||[]--&gt;&lt;/div&gt;&lt;div data-bfc="" data-complete="true" data-hveid="CAIIAAgACAoQAA" data-sfc-cp="" data-sfc-root="c" data-ved="2ahUKEwjOsYKe-MmXAxWcR2wGHasiPMYQi4wTegoIAggACAAIChAA" jsaction="" jscontroller="eHDDzf#DtOdcb" jsuid="Mvhwcf_1s" style="border-bottom: 0px rgb(230, 232, 240); font-family: &amp;quot;Google Sans&amp;quot;, sans-serif; font-size: 16px; margin: 0px;"&gt;&lt;div aria-level="3" class="ZLzG0d ncoeY E8xBUb" data-animation-nesting="" data-complete="true" data-sfc-cp="" data-sfc-root="c" data-wiz-attrbind="aria-level=Mvhwcf_1t/fLk2Md" jsaction="" jscontroller="zg1ZQe#TswZNc" jsuid="Mvhwcf_1t" role="heading" style="border-bottom: 0px rgb(232, 234, 242); font-size: 20px; font-weight: 600; margin: 24px 0px 12px;"&gt;2. สั่งรันโปรเจกต์ของคุณ&lt;!--TgQPHd|||[[2,[null,null,null,null,null,null,null,null,null,null,null,null,[351768,null,0]],[],null,1]]--&gt;&lt;/div&gt;&lt;!--TgQPHd|||[]--&gt;&lt;/div&gt;&lt;div data-bfc="" data-complete="true" data-hveid="CAIIAAgACAsQAA" data-sfc-cp="" data-sfc-root="c" data-ved="2ahUKEwjOsYKe-MmXAxWcR2wGHasiPMYQi4wTegoIAggACAAICxAA" jsaction="" jscontroller="eHDDzf#DtOdcb" jsuid="Mvhwcf_1u" style="border-bottom: 0px rgb(230, 232, 240); font-family: &amp;quot;Google Sans&amp;quot;, sans-serif; font-size: 16px; margin: 0px;"&gt;&lt;div class="n6owBd awi2gc" data-complete="true" data-hveid="CAIIAAgACAsQAQ" data-sfc-cp="" data-sfc-root="c" jsaction="" jscontroller="TDBkbc#Ml18Xb" jsuid="Mvhwcf_1v" style="border-bottom: 0px rgb(230, 232, 240); margin: 12px 0px 16px;"&gt;ให้ &lt;code class="KDcb0c" data-complete="true" data-sfc-root="c" dir="ltr" jsaction="" jscontroller="hNviFe#redMub" jsuid="Mvhwcf_1w" style="border-bottom: 1px solid rgb(44, 46, 53); font-size: 14px; margin: 0px;"&gt;cd&lt;!--TgQPHd|||[]--&gt;&lt;/code&gt; เข้าไปที่โฟลเดอร์โปรเจกต์ Node.js ของคุณ จากนั้นเลือกสั่งรันตามประเภทของโปรเจกต์:&lt;!--TgQPHd|||[]--&gt;&lt;/div&gt;&lt;!--TgQPHd|||[]--&gt;&lt;/div&gt;&lt;div data-bfc="" data-complete="true" data-hveid="CAIIAAgACAwQAA" data-sfc-cp="" data-sfc-root="c" data-ved="2ahUKEwjOsYKe-MmXAxWcR2wGHasiPMYQi4wTegoIAggACAAIDBAA" jsaction="" jscontroller="eHDDzf#DtOdcb" jsuid="Mvhwcf_22" style="border-bottom: 0px rgb(230, 232, 240); font-family: &amp;quot;Google Sans&amp;quot;, sans-serif; font-size: 16px; margin: 0px;"&gt;&lt;ul class="XSq4R KI3fJ" data-complete="true" data-hveid="CAIIAAgACAwQAQ" data-sfc-cp="" data-sfc-root="c" jsaction="" jscontroller="wiLEJc#NS0kde" jsuid="Mvhwcf_23" style="border-bottom: 0px rgb(230, 232, 240); margin: 12px 0px 16px;"&gt;&lt;li class="Z1qcYe" data-complete="true" data-hveid="CAIIAAgACAwQAg" data-sfc-cp="" data-sfc-root="c" jsaction="" jscontroller="oSLmPe#HokZ0d" jsuid="Mvhwcf_24" style="border-bottom: 0px rgb(230, 232, 240); margin: 0px 0px 12px;"&gt;&lt;span class="iNqyIf" data-complete="true" data-sfc-cp="" data-sfc-root="c" jsaction="" jscontroller="KdQfFc#d5Qebf" jsuid="Mvhwcf_25" style="border-bottom: 0px rgb(230, 232, 240); margin: 0px;"&gt;&lt;span class="rQesXe MPyX" data-complete="true" data-sfc-cp="" data-sfc-root="c" jsaction="" jscontroller="tP2kf#s32ZS" jsuid="Mvhwcf_26" style="border-bottom: 0px rgb(230, 232, 240); font-weight: 700; margin: 0px;"&gt;โปรเจกต์ทั่วไป (มีไฟล์หลักเช่น app.js หรือ index.js):&lt;/span&gt;&lt;/span&gt;&lt;div class="BpxUDf aiModeUiCodeBlock__Container" data-complete="true" data-hveid="CAIIAAgACAwQAw" data-sfc-cp="" data-sfc-root="c" data-wiz-uids="Mvhwcf_29,Mvhwcf_28" jsaction="" jscontroller="Liu6s#lcO7sb" jsuid="Mvhwcf_27" style="border-bottom: 0px rgb(238, 240, 255); margin: 4px 0px 0px;"&gt;&lt;div style="border-bottom: 0px rgb(238, 240, 255); margin: 0px;"&gt;&lt;div class="rq1a2" data-animation-atomic="" style="border-bottom: 1px solid rgb(44, 46, 53); margin: 0px;"&gt;&lt;div class="PGvq2d" dir="ltr" style="border-bottom: 0px rgb(238, 240, 255); font-size: 14px; margin: 0px;"&gt;&lt;pre style="border-bottom: 0px rgb(238, 240, 255); margin: 14px 0px;"&gt;&lt;code jsuid="Mvhwcf_29" style="border-bottom: 0px rgb(238, 240, 255); margin: 0px;"&gt;&lt;span style="color: red;"&gt;&lt;span class="undefined" style="border-bottom: 0px rgb(238, 240, 255); margin: 0px;"&gt;pm2 start app.js --name &lt;/span&gt;&lt;span class="dk3nFb" style="border-bottom: 0px rgb(129, 201, 149); margin: 0px;"&gt;"my-app"&lt;/span&gt;&lt;/span&gt;&lt;span class="undefined" style="border-bottom: 0px rgb(238, 240, 255); margin: 0px;"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="iMHp6c" data-animation-atomic="" style="border-bottom: 1px solid rgb(44, 46, 53); margin: 3px 0px 0px;"&gt;&lt;div class="ZIumpf" style="border-bottom: 0px rgb(189, 193, 198); font-size: 12px; margin: 0px;"&gt;&lt;span style="font-size: 16px; font-weight: 700;"&gt;โปรเจกต์ที่รันผ่าน npm script (เช่น Next.js, Nuxt หรือ NestJS):&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="Z1qcYe" data-complete="true" data-hveid="CAIIAAgACAwQBg" data-sfc-cp="" data-sfc-root="c" jsaction="" jscontroller="oSLmPe#HokZ0d" jsuid="Mvhwcf_2e" style="border-bottom: 0px rgb(230, 232, 240); margin: 0px;"&gt;&lt;div class="BpxUDf aiModeUiCodeBlock__Container" data-complete="true" data-hveid="CAIIAAgACAwQCQ" data-sfc-cp="" data-sfc-root="c" data-wiz-uids="Mvhwcf_2o,Mvhwcf_2n" jsaction="" jscontroller="Liu6s#lcO7sb" jsuid="Mvhwcf_2m" style="border-bottom: 0px rgb(238, 240, 255); margin: 4px 0px 0px;"&gt;&lt;div style="border-bottom: 0px rgb(238, 240, 255); margin: 0px;"&gt;&lt;div class="rq1a2" data-animation-atomic="" style="border-bottom: 1px solid rgb(44, 46, 53); margin: 0px;"&gt;&lt;div class="PGvq2d" dir="ltr" style="border-bottom: 0px rgb(238, 240, 255); font-size: 14px; margin: 0px;"&gt;&lt;pre style="border-bottom: 0px rgb(238, 240, 255); margin: 14px 0px;"&gt;&lt;code jsuid="Mvhwcf_2o" style="border-bottom: 0px rgb(238, 240, 255); margin: 0px;"&gt;&lt;span style="color: red;"&gt;&lt;span class="undefined" style="border-bottom: 0px rgb(238, 240, 255); margin: 0px;"&gt;pm2 start npm --name &lt;/span&gt;&lt;span class="dk3nFb" style="border-bottom: 0px rgb(129, 201, 149); margin: 0px;"&gt;"my-app"&lt;/span&gt;&lt;/span&gt;&lt;span class="undefined" style="border-bottom: 0px rgb(238, 240, 255); margin: 0px;"&gt;&lt;span style="color: red;"&gt; -- run start&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="iMHp6c" data-animation-atomic="" style="border-bottom: 1px solid rgb(44, 46, 53); margin: 3px 0px 0px;"&gt;&lt;div class="ZIumpf" style="border-bottom: 0px rgb(189, 193, 198); font-size: 12px; margin: 0px;"&gt;&lt;em class="zhvwWe" data-complete="true" data-sfc-cp="" data-sfc-root="c" jsaction="" jscontroller="LFsGHb#ycPkjf" jsuid="Mvhwcf_2v" style="border-bottom: 0px rgb(230, 232, 240); font-size: 16px; margin: 0px;"&gt;(คุณสามารถเปลี่ยน &lt;code class="KDcb0c" data-complete="true" data-sfc-root="c" dir="ltr" jsaction="" jscontroller="hNviFe#redMub" jsuid="Mvhwcf_2w" style="border-bottom: 1px solid rgb(44, 46, 53); font-size: 14px; margin: 0px;"&gt;"my-app"&lt;/code&gt; เป็นชื่อโปรเจกต์ที่คุณต้องการได้เอาไว้สำหรับดูสถานะ)&lt;/em&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div class="yhAwj" data-complete="true" data-sfc-cp="" data-sfc-inited="2" data-sfc-root="c" jsaction="rcuQ6b:&amp;amp;Mvhwcf_32|npT2md" jscontroller="UTzWVc#U8DOt" jsuid="Mvhwcf_32" style="border-bottom: 0px rgb(230, 232, 240); font-family: &amp;quot;Google Sans&amp;quot;, sans-serif; font-size: 16px; margin: 0px;"&gt;&lt;!--TgQPHd|||[]--&gt;&lt;/div&gt;&lt;div data-bfc="" data-complete="true" data-hveid="CAIIAAgACA4QAA" data-sfc-cp="" data-sfc-root="c" data-ved="2ahUKEwjOsYKe-MmXAxWcR2wGHasiPMYQi4wTegoIAggACAAIDhAA" jsaction="" jscontroller="eHDDzf#DtOdcb" jsuid="Mvhwcf_33" style="border-bottom: 0px rgb(230, 232, 240); font-family: &amp;quot;Google Sans&amp;quot;, sans-serif; font-size: 16px; margin: 0px;"&gt;&lt;div aria-level="3" class="ZLzG0d ncoeY E8xBUb" data-animation-nesting="" data-complete="true" data-sfc-cp="" data-sfc-root="c" data-wiz-attrbind="aria-level=Mvhwcf_34/fLk2Md" jsaction="" jscontroller="zg1ZQe#TswZNc" jsuid="Mvhwcf_34" role="heading" style="border-bottom: 0px rgb(232, 234, 242); font-size: 20px; font-weight: 600; margin: 24px 0px 12px;"&gt;3. คำสั่งจัดการที่จำเป็น (Cheat Sheet)&lt;!--TgQPHd|||[[2,[null,null,null,null,null,null,null,null,null,null,null,null,[351768,null,0]],[],null,1]]--&gt;&lt;/div&gt;&lt;!--TgQPHd|||[]--&gt;&lt;/div&gt;&lt;div data-bfc="" data-complete="true" data-hveid="CAIIAAgACA8QAA" data-sfc-cp="" data-sfc-root="c" data-ved="2ahUKEwjOsYKe-MmXAxWcR2wGHasiPMYQi4wTegoIAggACAAIDxAA" jsaction="" jscontroller="eHDDzf#DtOdcb" jsuid="Mvhwcf_35" style="border-bottom: 0px rgb(230, 232, 240); font-family: &amp;quot;Google Sans&amp;quot;, sans-serif; font-size: 16px; margin: 0px;"&gt;&lt;div class="n6owBd awi2gc" data-complete="true" data-hveid="CAIIAAgACA8QAQ" data-sfc-cp="" data-sfc-root="c" jsaction="" jscontroller="TDBkbc#Ml18Xb" jsuid="Mvhwcf_36" style="border-bottom: 0px rgb(230, 232, 240); margin: 12px 0px 16px;"&gt;หลังจากสั่งรันแล้ว คุณสามารถจัดการโปรเจกต์ผ่านคำสั่งเหล่านี้:&lt;!--TgQPHd|||[]--&gt;&lt;/div&gt;&lt;!--TgQPHd|||[]--&gt;&lt;/div&gt;&lt;div data-bfc="" data-complete="true" data-hveid="CAIIAAgACBAQAA" data-sfc-cp="" data-sfc-root="c" data-ved="2ahUKEwjOsYKe-MmXAxWcR2wGHasiPMYQi4wTegoIAggACAAIEBAA" jsaction="" jscontroller="eHDDzf#DtOdcb" jsuid="Mvhwcf_3c" style="border-bottom: 0px rgb(230, 232, 240); margin: 0px;"&gt;&lt;ul class="XSq4R KI3fJ" data-complete="true" data-hveid="CAIIAAgACBAQAQ" data-sfc-cp="" data-sfc-root="c" jsaction="" jscontroller="wiLEJc#NS0kde" jsuid="Mvhwcf_3d" style="border-bottom: 0px rgb(230, 232, 240); margin: 12px 0px 16px;"&gt;&lt;li class="Z1qcYe" data-complete="true" data-hveid="CAIIAAgACBAQAg" data-sfc-cp="" data-sfc-root="c" jsaction="" jscontroller="oSLmPe#HokZ0d" jsuid="Mvhwcf_3e" style="border-bottom: 0px rgb(230, 232, 240); font-family: &amp;quot;Google Sans&amp;quot;, sans-serif; font-size: 16px; margin: 0px 0px 12px;"&gt;&lt;span class="iNqyIf" data-complete="true" data-sfc-cp="" data-sfc-root="c" jsaction="" jscontroller="KdQfFc#d5Qebf" jsuid="Mvhwcf_3f" style="border-bottom: 0px rgb(230, 232, 240); margin: 0px;"&gt;&lt;span class="rQesXe MPyX" data-complete="true" data-sfc-cp="" data-sfc-root="c" jsaction="" jscontroller="tP2kf#s32ZS" jsuid="Mvhwcf_3g" style="border-bottom: 0px rgb(230, 232, 240); font-weight: 700; margin: 0px;"&gt;ดูรายการที่รันอยู่:&lt;!--TgQPHd|||[]--&gt;&lt;/span&gt; &lt;code class="KDcb0c" data-complete="true" data-sfc-root="c" dir="ltr" jsaction="" jscontroller="hNviFe#redMub" jsuid="Mvhwcf_3h" style="border-bottom: 1px solid rgb(44, 46, 53); font-size: 14px; margin: 0px;"&gt;&lt;span style="color: red;"&gt;pm2 list&lt;/span&gt;&lt;!--TgQPHd|||[]--&gt;&lt;/code&gt; หรือ &lt;code class="KDcb0c" data-complete="true" data-sfc-root="c" dir="ltr" jsaction="" jscontroller="hNviFe#redMub" jsuid="Mvhwcf_3i" style="border-bottom: 1px solid rgb(44, 46, 53); font-size: 14px; margin: 0px;"&gt;&lt;span style="color: red;"&gt;pm2 status&lt;/span&gt;&lt;!--TgQPHd|||[]--&gt;&lt;/code&gt;&lt;!--TgQPHd|||[]--&gt;&lt;/span&gt;&lt;!--TgQPHd|||[]--&gt;&lt;/li&gt;&lt;li class="Z1qcYe" data-complete="true" data-hveid="CAIIAAgACBAQAw" data-sfc-cp="" data-sfc-root="c" jsaction="" jscontroller="oSLmPe#HokZ0d" jsuid="Mvhwcf_3j" style="border-bottom: 0px rgb(230, 232, 240); font-family: &amp;quot;Google Sans&amp;quot;, sans-serif; font-size: 16px; margin: 0px 0px 12px;"&gt;&lt;span class="iNqyIf" data-complete="true" data-sfc-cp="" data-sfc-root="c" jsaction="" jscontroller="KdQfFc#d5Qebf" jsuid="Mvhwcf_3k" style="border-bottom: 0px rgb(230, 232, 240); margin: 0px;"&gt;&lt;span class="rQesXe MPyX" data-complete="true" data-sfc-cp="" data-sfc-root="c" jsaction="" jscontroller="tP2kf#s32ZS" jsuid="Mvhwcf_3l" style="border-bottom: 0px rgb(230, 232, 240); font-weight: 700; margin: 0px;"&gt;ดู Log/หน้าจอ Console:&lt;!--TgQPHd|||[]--&gt;&lt;/span&gt; &lt;code class="KDcb0c" data-complete="true" data-sfc-root="c" dir="ltr" jsaction="" jscontroller="hNviFe#redMub" jsuid="Mvhwcf_3m" style="border-bottom: 1px solid rgb(44, 46, 53); font-size: 14px; margin: 0px;"&gt;&lt;span style="color: red;"&gt;pm2 logs&lt;/span&gt;&lt;!--TgQPHd|||[]--&gt;&lt;/code&gt;&lt;!--TgQPHd|||[]--&gt;&lt;/span&gt;&lt;!--TgQPHd|||[]--&gt;&lt;/li&gt;&lt;li class="Z1qcYe" data-complete="true" data-hveid="CAIIAAgACBAQBA" data-sfc-cp="" data-sfc-root="c" jsaction="" jscontroller="oSLmPe#HokZ0d" jsuid="Mvhwcf_3n" style="border-bottom: 0px rgb(230, 232, 240); font-family: &amp;quot;Google Sans&amp;quot;, sans-serif; font-size: 16px; margin: 0px 0px 12px;"&gt;&lt;span class="iNqyIf" data-complete="true" data-sfc-cp="" data-sfc-root="c" jsaction="" jscontroller="KdQfFc#d5Qebf" jsuid="Mvhwcf_3o" style="border-bottom: 0px rgb(230, 232, 240); margin: 0px;"&gt;&lt;span class="rQesXe MPyX" data-complete="true" data-sfc-cp="" data-sfc-root="c" jsaction="" jscontroller="tP2kf#s32ZS" jsuid="Mvhwcf_3p" style="border-bottom: 0px rgb(230, 232, 240); font-weight: 700; margin: 0px;"&gt;หยุดการทำงาน:&lt;!--TgQPHd|||[]--&gt;&lt;/span&gt; &lt;code class="KDcb0c" data-complete="true" data-sfc-root="c" dir="ltr" jsaction="" jscontroller="hNviFe#redMub" jsuid="Mvhwcf_3q" style="border-bottom: 1px solid rgb(44, 46, 53); font-size: 14px; margin: 0px;"&gt;&lt;span style="color: red;"&gt;pm2 stop my-app&lt;/span&gt;&lt;!--TgQPHd|||[]--&gt;&lt;/code&gt;&lt;!--TgQPHd|||[]--&gt;&lt;/span&gt;&lt;!--TgQPHd|||[]--&gt;&lt;/li&gt;&lt;li class="Z1qcYe" data-complete="true" data-hveid="CAIIAAgACBAQBQ" data-sfc-cp="" data-sfc-root="c" jsaction="" jscontroller="oSLmPe#HokZ0d" jsuid="Mvhwcf_3r" style="border-bottom: 0px rgb(230, 232, 240); font-family: &amp;quot;Google Sans&amp;quot;, sans-serif; font-size: 16px; margin: 0px 0px 12px;"&gt;&lt;span class="iNqyIf" data-complete="true" data-sfc-cp="" data-sfc-root="c" jsaction="" jscontroller="KdQfFc#d5Qebf" jsuid="Mvhwcf_3s" style="border-bottom: 0px rgb(230, 232, 240); margin: 0px;"&gt;&lt;span class="rQesXe MPyX" data-complete="true" data-sfc-cp="" data-sfc-root="c" jsaction="" jscontroller="tP2kf#s32ZS" jsuid="Mvhwcf_3t" style="border-bottom: 0px rgb(230, 232, 240); font-weight: 700; margin: 0px;"&gt;เริ่มทำงานใหม่ (Restart):&lt;!--TgQPHd|||[]--&gt;&lt;/span&gt; &lt;code class="KDcb0c" data-complete="true" data-sfc-root="c" dir="ltr" jsaction="" jscontroller="hNviFe#redMub" jsuid="Mvhwcf_3u" style="border-bottom: 1px solid rgb(44, 46, 53); font-size: 14px; margin: 0px;"&gt;&lt;span style="color: red;"&gt;pm2 restart my-app หรือ&amp;nbsp;&lt;/span&gt;&lt;/code&gt;&lt;/span&gt;&lt;!--TgQPHd|||[]--&gt;&lt;span style="color: red; font-family: monospace; font-size: 14px;"&gt;pm2 restart my-app --update-env&lt;/span&gt;&lt;/li&gt;&lt;li class="Z1qcYe" data-complete="true" data-hveid="CAIIAAgACBAQBQ" data-sfc-cp="" data-sfc-root="c" jsaction="" jscontroller="oSLmPe#HokZ0d" jsuid="Mvhwcf_3r" style="border-bottom: 0px rgb(230, 232, 240); margin: 0px 0px 12px;"&gt;&lt;span style="font-family: monospace;"&gt;&lt;span style="font-size: 14px;"&gt;เริ่มทำงานใหม่ทุก node process:&lt;span style="color: red;"&gt; pm2 restart all&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="Z1qcYe" data-complete="true" data-hveid="CAIIAAgACBAQBg" data-sfc-cp="" data-sfc-root="c" jsaction="" jscontroller="oSLmPe#HokZ0d" jsuid="Mvhwcf_3v" style="border-bottom: 0px rgb(230, 232, 240); font-family: &amp;quot;Google Sans&amp;quot;, sans-serif; font-size: 16px; margin: 0px;"&gt;&lt;span class="iNqyIf" data-complete="true" data-sfc-cp="" data-sfc-root="c" jsaction="" jscontroller="KdQfFc#d5Qebf" jsuid="Mvhwcf_3w" style="border-bottom: 0px rgb(230, 232, 240); margin: 0px;"&gt;&lt;span class="rQesXe MPyX" data-complete="true" data-sfc-cp="" data-sfc-root="c" jsaction="" jscontroller="tP2kf#s32ZS" jsuid="Mvhwcf_3x" style="border-bottom: 0px rgb(230, 232, 240); font-weight: 700; margin: 0px;"&gt;ลบโปรเจกต์ออกจาก PM2:&lt;!--TgQPHd|||[]--&gt;&lt;/span&gt; &lt;code class="KDcb0c" data-complete="true" data-sfc-root="c" dir="ltr" jsaction="" jscontroller="hNviFe#redMub" jsuid="Mvhwcf_3y" style="border-bottom: 1px solid rgb(44, 46, 53); font-size: 14px; margin: 0px;"&gt;&lt;span style="color: red;"&gt;pm2 delete my-app&lt;/span&gt;&lt;!--TgQPHd|||[]--&gt;&lt;/code&gt;&lt;!--TgQPHd|||[]--&gt;&lt;/span&gt;&lt;!--TgQPHd|||[]--&gt;&lt;/li&gt;&lt;span face="Google Sans, sans-serif"&gt;&lt;!--TgQPHd|||[]--&gt;&lt;/span&gt;&lt;/ul&gt;&lt;span face="Google Sans, sans-serif"&gt;&lt;!--TgQPHd|||[]--&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="yhAwj" data-complete="true" data-sfc-cp="" data-sfc-inited="2" data-sfc-root="c" jsaction="rcuQ6b:&amp;amp;Mvhwcf_44|npT2md" jscontroller="UTzWVc#U8DOt" jsuid="Mvhwcf_44" style="border-bottom: 0px rgb(230, 232, 240); font-family: &amp;quot;Google Sans&amp;quot;, sans-serif; font-size: 16px; margin: 0px;"&gt;&lt;!--TgQPHd|||[]--&gt;&lt;/div&gt;&lt;div data-bfc="" data-complete="true" data-hveid="CAIIAAgACBEQAA" data-sfc-cp="" data-sfc-root="c" data-ved="2ahUKEwjOsYKe-MmXAxWcR2wGHasiPMYQi4wTegoIAggACAAIERAA" jsaction="" jscontroller="eHDDzf#DtOdcb" jsuid="Mvhwcf_45" style="border-bottom: 0px rgb(230, 232, 240); font-family: &amp;quot;Google Sans&amp;quot;, sans-serif; font-size: 16px; margin: 0px;"&gt;&lt;div aria-level="3" class="ZLzG0d ncoeY E8xBUb" data-animation-nesting="" data-complete="true" data-sfc-cp="" data-sfc-root="c" data-wiz-attrbind="aria-level=Mvhwcf_46/fLk2Md" jsaction="" jscontroller="zg1ZQe#TswZNc" jsuid="Mvhwcf_46" role="heading" style="border-bottom: 0px rgb(232, 234, 242); font-size: 20px; font-weight: 600; margin: 24px 0px 12px;"&gt;4. ตั้งค่าให้ PM2 เปิดใช้งานอัตโนมัติเมื่อเปิดเครื่อง (Startup)&lt;!--TgQPHd|||[[2,[null,null,null,null,null,null,null,null,null,null,null,null,[351768,null,0]],[],null,1]]--&gt;&lt;/div&gt;&lt;!--TgQPHd|||[]--&gt;&lt;/div&gt;&lt;div data-bfc="" data-complete="true" data-hveid="CAIIAAgACBIQAA" data-sfc-cp="" data-sfc-root="c" data-ved="2ahUKEwjOsYKe-MmXAxWcR2wGHasiPMYQi4wTegoIAggACAAIEhAA" jsaction="" jscontroller="eHDDzf#DtOdcb" jsuid="Mvhwcf_47" style="border-bottom: 0px rgb(230, 232, 240); font-family: &amp;quot;Google Sans&amp;quot;, sans-serif; font-size: 16px; margin: 0px;"&gt;&lt;div class="n6owBd awi2gc" data-complete="true" data-hveid="CAIIAAgACBIQAQ" data-sfc-cp="" data-sfc-root="c" jsaction="" jscontroller="TDBkbc#Ml18Xb" jsuid="Mvhwcf_48" style="border-bottom: 0px rgb(230, 232, 240); margin: 12px 0px 16px;"&gt;หากต้องการให้โปรเจกต์รันขึ้นมาเองโดยอัตโนมัติหลังจากที่คุณรีสตาร์ทเครื่อง Mac ให้ใช้คำสั่ง:&lt;/div&gt;&lt;/div&gt;&lt;div data-bfc="" data-complete="true" data-hveid="CAIIAAgACBMQAA" data-sfc-cp="" data-sfc-root="c" data-ved="2ahUKEwjOsYKe-MmXAxWcR2wGHasiPMYQi4wTegoIAggACAAIExAA" jsaction="" jscontroller="eHDDzf#DtOdcb" jsuid="Mvhwcf_4f" style="border-bottom: 0px rgb(230, 232, 240); font-family: &amp;quot;Google Sans&amp;quot;, sans-serif; font-size: 16px; margin: 0px;"&gt;&lt;div class="BpxUDf aiModeUiCodeBlock__Container" data-complete="true" data-hveid="CAIIAAgACBMQAQ" data-sfc-cp="" data-sfc-root="c" data-wiz-uids="Mvhwcf_4i,Mvhwcf_4h" jsaction="" jscontroller="Liu6s#lcO7sb" jsuid="Mvhwcf_4g" style="border-bottom: 0px rgb(238, 240, 255); margin: 4px 0px 0px;"&gt;&lt;div style="border-bottom: 0px rgb(238, 240, 255); margin: 0px;"&gt;&lt;div class="rq1a2" data-animation-atomic="" style="border-bottom: 1px solid rgb(44, 46, 53); margin: 0px;"&gt;&lt;div class="PGvq2d" dir="ltr" style="border-bottom: 0px rgb(238, 240, 255); font-size: 14px; margin: 0px;"&gt;&lt;pre style="border-bottom: 0px rgb(238, 240, 255); margin: 14px 0px;"&gt;&lt;code jsuid="Mvhwcf_4i" style="border-bottom: 0px rgb(238, 240, 255); margin: 0px;"&gt;&lt;span style="color: red;"&gt;pm2 startup&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="iMHp6c" data-animation-atomic="" style="border-bottom: 1px solid rgb(44, 46, 53); margin: 3px 0px 0px;"&gt;&lt;div class="ZIumpf" style="border-bottom: 0px rgb(189, 193, 198); font-size: 12px; margin: 0px;"&gt;&lt;span style="font-size: 16px;"&gt;จากนั้น PM2 จะแสดงคำสั่งยาว ๆ มาให้คุณ &lt;/span&gt;&lt;span class="rQesXe MPyX" data-complete="true" data-sfc-cp="" data-sfc-root="c" jsaction="" jscontroller="tP2kf#s32ZS" jsuid="Mvhwcf_4p" style="border-bottom: 0px rgb(230, 232, 240); font-size: 16px; font-weight: 700; margin: 0px;"&gt;ก๊อปปี้คำสั่งนั้นไปวางใน Terminal แล้วกด Enter&lt;/span&gt;&lt;span style="font-size: 16px;"&gt; อีกครั้งเพื่อยืนยันสิทธิ์ เมื่อเสร็จแล้วให้พิมพ์คำสั่งนี้เพื่อบันทึกสถานะปัจจุบันไว้:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div data-bfc="" data-complete="true" data-hveid="CAIIAAgACBUQAA" data-sfc-cp="" data-sfc-root="c" data-ved="2ahUKEwjOsYKe-MmXAxWcR2wGHasiPMYQi4wTegoIAggACAAIFRAA" jsaction="" jscontroller="eHDDzf#DtOdcb" jsuid="Mvhwcf_4w" style="border-bottom: 0px rgb(230, 232, 240); font-family: &amp;quot;Google Sans&amp;quot;, sans-serif; font-size: 16px; margin: 0px;"&gt;&lt;div class="BpxUDf aiModeUiCodeBlock__Container" data-complete="true" data-hveid="CAIIAAgACBUQAQ" data-sfc-cp="" data-sfc-root="c" data-wiz-uids="Mvhwcf_4z,Mvhwcf_4y" jsaction="" jscontroller="Liu6s#lcO7sb" jsuid="Mvhwcf_4x" style="border-bottom: 0px rgb(238, 240, 255); margin: 4px 0px 0px;"&gt;&lt;div style="border-bottom: 0px rgb(238, 240, 255); margin: 0px;"&gt;&lt;div class="rq1a2" data-animation-atomic="" style="border-bottom: 1px solid rgb(44, 46, 53); margin: 0px;"&gt;&lt;div class="PGvq2d" dir="ltr" style="border-bottom: 0px rgb(238, 240, 255); font-size: 14px; margin: 0px;"&gt;&lt;pre style="border-bottom: 0px rgb(238, 240, 255); margin: 14px 0px;"&gt;&lt;code jsuid="Mvhwcf_4z" style="border-bottom: 0px rgb(238, 240, 255); margin: 0px;"&gt;&lt;span style="color: red;"&gt;pm2 save&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="iMHp6c" data-animation-atomic="" style="border-bottom: 1px solid rgb(44, 46, 53); margin: 3px 0px 0px;"&gt;&lt;div class="ZIumpf" style="border-bottom: 0px rgb(189, 193, 198); font-size: 12px; margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;Are u sure?&lt;/div&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></item><item><title>Install PostgreSQL on macOS Tahoe 26.6.2</title><link>http://juuier.blogspot.com/2026/10/install-postgresql-on-macos-tahoe-2662.html</link><author>noreply@blogger.com (juuier)</author><pubDate>Tue, 20 Oct 2026 10:12:55 +0700</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-34115975.post-5850203512607083801</guid><description>&lt;p&gt;Ref: gemini&lt;/p&gt;&lt;div _ngcontent-ng-c2933112568="" aria-busy="false" aria-live="polite" class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color stronger tutor-markdown-rendering" dir="ltr" id="model-response-message-contentr_53b659f0ba7e59d1" inline-copy-host="" style="--animation-duration: 400ms; --fade-animation-function: ease-out; animation: auto ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px rgb(31, 31, 31); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; gap: normal; hyphens: manual; inset: auto; interactivity: auto; isolation: auto; line-height: 1.15; margin-bottom: 0px; margin-left: 0px !important; margin-right: 0px !important; margin-top: 0px !important; margin: 0px; marker: none; mask-clip: border-box; mask-composite: add; mask-image: none; mask-mode: match-source; mask-origin: border-box; mask-repeat: repeat; mask-size: auto; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(31, 31, 31) none 3px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rule: 3px rgb(31, 31, 31); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;"&gt;&lt;div style="animation: auto ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px rgb(31, 31, 31); clear: none; clip: auto; color: #1f1f1f; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; font-family: &amp;quot;Google Sans Text&amp;quot;, sans-serif; gap: normal; hyphens: manual; inset: auto; interactivity: auto; isolation: auto; line-height: 1.15; margin-bottom: 0px; margin-left: 0px !important; margin-right: 0px !important; margin-top: 0px !important; margin: 0px; marker: none; mask-clip: border-box; mask-composite: add; mask-image: none; mask-mode: match-source; mask-origin: border-box; mask-repeat: repeat; mask-size: auto; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(31, 31, 31) none 3px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rule: 3px rgb(31, 31, 31); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;"&gt;การติดตั้ง &lt;b data-index-in-node="11" data-path-to-node="0" style="animation: auto ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px rgb(31, 31, 31); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; display: inline; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; gap: normal; hyphens: manual; inset: auto; interactivity: auto; isolation: auto; line-height: 1.15; margin-bottom: 0px; margin-left: 0px !important; margin-right: 0px !important; margin-top: 0px !important; margin: 0px; marker: none; mask-clip: border-box; mask-composite: add; mask-image: none; mask-mode: match-source; mask-origin: border-box; mask-repeat: repeat; mask-size: auto; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(31, 31, 31) none 3px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rule: 3px rgb(31, 31, 31); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;"&gt;PostgreSQL&lt;/b&gt; บน macOS วิธีที่สะดวกและเป็นมาตรฐานที่สุดคือการใช้ &lt;b data-index-in-node="73" data-path-to-node="0" style="animation: auto ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px rgb(31, 31, 31); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; display: inline; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; gap: normal; hyphens: manual; inset: auto; interactivity: auto; isolation: auto; line-height: 1.15; margin-bottom: 0px; margin-left: 0px !important; margin-right: 0px !important; margin-top: 0px !important; margin: 0px; marker: none; mask-clip: border-box; mask-composite: add; mask-image: none; mask-mode: match-source; mask-origin: border-box; mask-repeat: repeat; mask-size: auto; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(31, 31, 31) none 3px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rule: 3px rgb(31, 31, 31); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;"&gt;Homebrew&lt;/b&gt; ผ่าน Terminal (หรือหากไม่ถนัดคำสั่ง Command Line สามารถใช้ตัวติดตั้งแบบ Graphic Application ได้เช่นกัน)&lt;/div&gt;&lt;br /&gt;&lt;h3 data-path-to-node="2" style="animation: auto ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px rgb(31, 31, 31); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; font-family: &amp;quot;Google Sans&amp;quot;, sans-serif; gap: normal; hyphens: manual; inset: auto; interactivity: auto; isolation: auto; line-height: 1.15; margin-bottom: 0px; margin-left: 0px !important; margin-right: 0px !important; margin-top: 0px !important; margin: 0px; marker: none; mask-clip: border-box; mask-composite: add; mask-image: none; mask-mode: match-source; mask-origin: border-box; mask-repeat: repeat; mask-size: auto; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(31, 31, 31) none 3px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rule: 3px rgb(31, 31, 31); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;"&gt;&lt;span style="color: #ff00fe;"&gt;วิธีที่ 1: ติดตั้งผ่าน Homebrew (แนะนำสำหรับนักพัฒนา)&lt;/span&gt;&lt;/h3&gt;&lt;ol class="md-has-block-component" data-path-to-node="3" start="1" style="animation: auto ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px rgb(31, 31, 31); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; gap: normal; hyphens: manual; inset: auto; interactivity: auto; isolation: auto; line-height: 1.15; margin-bottom: 0px; margin-left: 0px !important; margin-right: 0px !important; margin-top: 0px !important; margin: 0px; marker: none; mask-clip: border-box; mask-composite: add; mask-image: none; mask-mode: match-source; mask-origin: border-box; mask-repeat: repeat; mask-size: auto; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(31, 31, 31) none 3px; overlay: none; padding-inline-start: 32px; padding: 0px 0px 0px 4px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rule: 3px rgb(31, 31, 31); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;"&gt;&lt;li style="animation: auto ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px rgb(31, 31, 31); clear: none; clip: auto; color: #1f1f1f; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; font-family: &amp;quot;Google Sans Text&amp;quot;, sans-serif; gap: normal; hyphens: manual; inset: 0px; interactivity: auto; isolation: auto; line-height: 1.15; margin-bottom: 0px; margin-left: 0px !important; margin-right: 0px !important; margin-top: 0px !important; margin: 0px; marker: none; mask-clip: border-box; mask-composite: add; mask-image: none; mask-mode: match-source; mask-origin: border-box; mask-repeat: repeat; mask-size: auto; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(31, 31, 31) none 3px; overlay: none; padding: 0px 0px 0px 36px; page: auto; perspective: none; position: relative; quotes: auto; r: 0px; resize: none; rotate: none; rule: 3px rgb(31, 31, 31); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;"&gt;&lt;div style="animation: auto ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px rgb(31, 31, 31); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; gap: normal; hyphens: manual; inset: auto; interactivity: auto; isolation: auto; line-height: 1.15; margin-bottom: 0px; margin-left: 0px !important; margin-right: 0px !important; margin-top: 0px !important; margin: 0px; marker: none; mask-clip: border-box; mask-composite: add; mask-image: none; mask-mode: match-source; mask-origin: border-box; mask-repeat: repeat; mask-size: auto; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(31, 31, 31) none 3px; overlay: none; padding: 0px 0px 0px 4px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rule: 3px rgb(31, 31, 31); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;"&gt;&lt;b data-index-in-node="0" data-path-to-node="3,0,0" style="animation: auto ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px rgb(31, 31, 31); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; display: inline; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; gap: normal; hyphens: manual; inset: auto; interactivity: auto; isolation: auto; line-height: 1.15; margin-bottom: 0px; margin-left: 0px !important; margin-right: 0px !important; margin-top: 0px !important; margin: 0px; marker: none; mask-clip: border-box; mask-composite: add; mask-image: none; mask-mode: match-source; mask-origin: border-box; mask-repeat: repeat; mask-size: auto; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(31, 31, 31) none 3px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rule: 3px rgb(31, 31, 31); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;"&gt;เปิดแอป Terminal&lt;/b&gt; (กด &lt;code data-index-in-node="21" data-path-to-node="3,0,0" style="animation: auto ease 0s 1 normal none running none; appearance: none; background: none 0% 0% / auto repeat scroll padding-box border-box rgb(242, 240, 240); border: 0px rgba(0, 0, 0, 0.55); clear: none; clip: auto; color: rgba(0, 0, 0, 0.55); columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; display: inline-block; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; font-family: &amp;quot;Google Sans Text&amp;quot;, sans-serif; font-feature-settings: normal; font-kerning: auto; font-language-override: normal; font-optical-sizing: auto; font-size-adjust: none; font-size: 15px; font-stretch: normal; font-variant: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; interactivity: auto; isolation: auto; line-height: 1.15; margin-bottom: 0px; margin-left: 0px !important; margin-right: 0px !important; margin-top: 0px !important; margin: 0px; marker: none; mask-clip: border-box; mask-composite: add; mask-image: none; mask-mode: match-source; mask-origin: border-box; mask-repeat: repeat; mask-size: auto; mask: none; offset: normal; opacity: 1; order: 0; outline: rgba(0, 0, 0, 0.55) none 3px; overlay: none; padding: 4px 6px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rule: 3px rgba(0, 0, 0, 0.55); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;"&gt;Command + Space&lt;/code&gt; พิมพ์ค้นหา &lt;code data-index-in-node="48" data-path-to-node="3,0,0" style="animation: auto ease 0s 1 normal none running none; appearance: none; background: none 0% 0% / auto repeat scroll padding-box border-box rgb(242, 240, 240); border: 0px rgba(0, 0, 0, 0.55); clear: none; clip: auto; color: rgba(0, 0, 0, 0.55); columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; display: inline-block; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; font-family: &amp;quot;Google Sans Text&amp;quot;, sans-serif; font-feature-settings: normal; font-kerning: auto; font-language-override: normal; font-optical-sizing: auto; font-size-adjust: none; font-size: 15px; font-stretch: normal; font-variant: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; interactivity: auto; isolation: auto; line-height: 1.15; margin-bottom: 0px; margin-left: 0px !important; margin-right: 0px !important; margin-top: 0px !important; margin: 0px; marker: none; mask-clip: border-box; mask-composite: add; mask-image: none; mask-mode: match-source; mask-origin: border-box; mask-repeat: repeat; mask-size: auto; mask: none; offset: normal; opacity: 1; order: 0; outline: rgba(0, 0, 0, 0.55) none 3px; overlay: none; padding: 4px 6px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rule: 3px rgba(0, 0, 0, 0.55); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;"&gt;Terminal&lt;/code&gt; แล้วกด Enter)&lt;/div&gt;&lt;br /&gt;&lt;/li&gt;&lt;li style="animation: auto ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px rgb(31, 31, 31); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; gap: normal; hyphens: manual; inset: 0px; interactivity: auto; isolation: auto; line-height: 1.15; margin-bottom: 0px; margin-left: 0px !important; margin-right: 0px !important; margin-top: 0px !important; margin: 0px; marker: none; mask-clip: border-box; mask-composite: add; mask-image: none; mask-mode: match-source; mask-origin: border-box; mask-repeat: repeat; mask-size: auto; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(31, 31, 31) none 3px; overlay: none; padding: 0px 0px 0px 36px; page: auto; perspective: none; position: relative; quotes: auto; r: 0px; resize: none; rotate: none; rule: 3px rgb(31, 31, 31); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;"&gt;&lt;div style="animation: auto ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px rgb(31, 31, 31); clear: none; clip: auto; color: #1f1f1f; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; font-family: &amp;quot;Google Sans Text&amp;quot;, sans-serif; gap: normal; hyphens: manual; inset: auto; interactivity: auto; isolation: auto; line-height: 1.15; margin-bottom: 0px; margin-left: 0px !important; margin-right: 0px !important; margin-top: 0px !important; margin: 0px; marker: none; mask-clip: border-box; mask-composite: add; mask-image: none; mask-mode: match-source; mask-origin: border-box; mask-repeat: repeat; mask-size: auto; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(31, 31, 31) none 3px; overlay: none; padding: 0px 0px 0px 4px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rule: 3px rgb(31, 31, 31); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;"&gt;&lt;b data-index-in-node="0" data-path-to-node="3,1,0" style="animation: auto ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px rgb(31, 31, 31); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; display: inline; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; gap: normal; hyphens: manual; inset: auto; interactivity: auto; isolation: auto; line-height: 1.15; margin-bottom: 0px; margin-left: 0px !important; margin-right: 0px !important; margin-top: 0px !important; margin: 0px; marker: none; mask-clip: border-box; mask-composite: add; mask-image: none; mask-mode: match-source; mask-origin: border-box; mask-repeat: repeat; mask-size: auto; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(31, 31, 31) none 3px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rule: 3px rgb(31, 31, 31); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;"&gt;ตรวจสอบ/ติดตั้ง Homebrew&lt;/b&gt; (หากมีอยู่แล้ว ข้ามขั้นตอนนี้ได้เลย)&lt;/div&gt;&lt;br /&gt;&lt;span style="color: red;"&gt;/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"&lt;/span&gt;&lt;br /&gt;&lt;/li&gt;&lt;li style="animation: auto ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px rgb(31, 31, 31); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; gap: normal; hyphens: manual; inset: 0px; interactivity: auto; isolation: auto; line-height: 1.15; margin-bottom: 0px; margin-left: 0px !important; margin-right: 0px !important; margin-top: 0px !important; margin: 0px; marker: none; mask-clip: border-box; mask-composite: add; mask-image: none; mask-mode: match-source; mask-origin: border-box; mask-repeat: repeat; mask-size: auto; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(31, 31, 31) none 3px; overlay: none; padding: 0px 0px 0px 36px; page: auto; perspective: none; position: relative; quotes: auto; r: 0px; resize: none; rotate: none; rule: 3px rgb(31, 31, 31); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;"&gt;&lt;div style="animation: auto ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px rgb(31, 31, 31); clear: none; clip: auto; color: #1f1f1f; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; font-family: &amp;quot;Google Sans Text&amp;quot;, sans-serif; gap: normal; hyphens: manual; inset: auto; interactivity: auto; isolation: auto; line-height: 1.15; margin-bottom: 0px; margin-left: 0px !important; margin-right: 0px !important; margin-top: 0px !important; margin: 0px; marker: none; mask-clip: border-box; mask-composite: add; mask-image: none; mask-mode: match-source; mask-origin: border-box; mask-repeat: repeat; mask-size: auto; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(31, 31, 31) none 3px; overlay: none; padding: 0px 0px 0px 4px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rule: 3px rgb(31, 31, 31); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;"&gt;&lt;b data-index-in-node="0" data-path-to-node="3,2,0" style="animation: auto ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px rgb(31, 31, 31); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; display: inline; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; gap: normal; hyphens: manual; inset: auto; interactivity: auto; isolation: auto; line-height: 1.15; margin-bottom: 0px; margin-left: 0px !important; margin-right: 0px !important; margin-top: 0px !important; margin: 0px; marker: none; mask-clip: border-box; mask-composite: add; mask-image: none; mask-mode: match-source; mask-origin: border-box; mask-repeat: repeat; mask-size: auto; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(31, 31, 31) none 3px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rule: 3px rgb(31, 31, 31); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;"&gt;อัปเดต Homebrew และติดตั้ง PostgreSQL&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="color: red;"&gt;brew update
brew install postgresql@16&lt;/span&gt;&lt;br /&gt;&lt;div style="animation: auto ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px rgb(31, 31, 31); clear: none; clip: auto; color: #1f1f1f; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; font-family: &amp;quot;Google Sans Text&amp;quot;, sans-serif; gap: normal; hyphens: manual; inset: auto; interactivity: auto; isolation: auto; line-height: 1.15; margin-bottom: 0px; margin-left: 0px !important; margin-right: 0px !important; margin-top: 0px !important; margin: 0px; marker: none; mask-clip: border-box; mask-composite: add; mask-image: none; mask-mode: match-source; mask-origin: border-box; mask-repeat: repeat; mask-size: auto; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(31, 31, 31) none 3px; overlay: none; padding: 0px 0px 0px 4px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rule: 3px rgb(31, 31, 31); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;"&gt;&lt;i data-index-in-node="0" data-path-to-node="3,2,2" style="animation: auto ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px rgb(31, 31, 31); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; display: inline; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; gap: normal; hyphens: manual; inset: auto; interactivity: auto; isolation: auto; line-height: 1.15; margin-bottom: 0px; margin-left: 0px !important; margin-right: 0px !important; margin-top: 0px !important; margin: 0px; marker: none; mask-clip: border-box; mask-composite: add; mask-image: none; mask-mode: match-source; mask-origin: border-box; mask-repeat: repeat; mask-size: auto; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(31, 31, 31) none 3px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rule: 3px rgb(31, 31, 31); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;"&gt;(หรือใช้ &lt;code data-index-in-node="9" data-path-to-node="3,2,2" style="animation: auto ease 0s 1 normal none running none; appearance: none; background: none 0% 0% / auto repeat scroll padding-box border-box rgb(242, 240, 240); border: 0px rgba(0, 0, 0, 0.55); clear: none; clip: auto; color: rgba(0, 0, 0, 0.55); columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; display: inline-block; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; font-family: &amp;quot;Google Sans Text&amp;quot;, sans-serif; font-feature-settings: normal; font-kerning: auto; font-language-override: normal; font-optical-sizing: auto; font-size-adjust: none; font-size: 15px; font-stretch: normal; font-style: normal; font-variant: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; interactivity: auto; isolation: auto; line-height: 1.15; margin-bottom: 0px; margin-left: 0px !important; margin-right: 0px !important; margin-top: 0px !important; margin: 0px; marker: none; mask-clip: border-box; mask-composite: add; mask-image: none; mask-mode: match-source; mask-origin: border-box; mask-repeat: repeat; mask-size: auto; mask: none; offset: normal; opacity: 1; order: 0; outline: rgba(0, 0, 0, 0.55) none 3px; overlay: none; padding: 4px 6px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rule: 3px rgba(0, 0, 0, 0.55); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;"&gt;brew install postgresql&lt;/code&gt; เพื่อติดตั้งเวอร์ชันเสถียรล่าสุด)&lt;/i&gt;&lt;/div&gt;&lt;br /&gt;&lt;/li&gt;&lt;li style="animation: auto ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px rgb(31, 31, 31); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; gap: normal; hyphens: manual; inset: 0px; interactivity: auto; isolation: auto; line-height: 1.15; margin-bottom: 0px; margin-left: 0px !important; margin-right: 0px !important; margin-top: 0px !important; margin: 0px; marker: none; mask-clip: border-box; mask-composite: add; mask-image: none; mask-mode: match-source; mask-origin: border-box; mask-repeat: repeat; mask-size: auto; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(31, 31, 31) none 3px; overlay: none; padding: 0px 0px 0px 36px; page: auto; perspective: none; position: relative; quotes: auto; r: 0px; resize: none; rotate: none; rule: 3px rgb(31, 31, 31); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;"&gt;&lt;div style="animation: auto ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px rgb(31, 31, 31); clear: none; clip: auto; color: #1f1f1f; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; font-family: &amp;quot;Google Sans Text&amp;quot;, sans-serif; gap: normal; hyphens: manual; inset: auto; interactivity: auto; isolation: auto; line-height: 1.15; margin-bottom: 0px; margin-left: 0px !important; margin-right: 0px !important; margin-top: 0px !important; margin: 0px; marker: none; mask-clip: border-box; mask-composite: add; mask-image: none; mask-mode: match-source; mask-origin: border-box; mask-repeat: repeat; mask-size: auto; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(31, 31, 31) none 3px; overlay: none; padding: 0px 0px 0px 4px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rule: 3px rgb(31, 31, 31); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;"&gt;&lt;b data-index-in-node="0" data-path-to-node="3,3,0" style="animation: auto ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px rgb(31, 31, 31); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; display: inline; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; gap: normal; hyphens: manual; inset: auto; interactivity: auto; isolation: auto; line-height: 1.15; margin-bottom: 0px; margin-left: 0px !important; margin-right: 0px !important; margin-top: 0px !important; margin: 0px; marker: none; mask-clip: border-box; mask-composite: add; mask-image: none; mask-mode: match-source; mask-origin: border-box; mask-repeat: repeat; mask-size: auto; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(31, 31, 31) none 3px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rule: 3px rgb(31, 31, 31); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;"&gt;เริ่มการทำงานของ Service&lt;/b&gt;&lt;/div&gt;&lt;div style="animation: auto ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px rgb(31, 31, 31); clear: none; clip: auto; color: #1f1f1f; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; font-family: &amp;quot;Google Sans Text&amp;quot;, sans-serif; gap: normal; hyphens: manual; inset: auto; interactivity: auto; isolation: auto; line-height: 1.15; margin-bottom: 0px; margin-left: 0px !important; margin-right: 0px !important; margin-top: 0px !important; margin: 0px; marker: none; mask-clip: border-box; mask-composite: add; mask-image: none; mask-mode: match-source; mask-origin: border-box; mask-repeat: repeat; mask-size: auto; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(31, 31, 31) none 3px; overlay: none; padding: 0px 0px 0px 4px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rule: 3px rgb(31, 31, 31); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;"&gt;สั่งให้ PostgreSQL ทำงานในพื้นหลังและเริ่มทำงานอัตโนมัติทุกครั้งที่เปิดเครื่อง:&lt;/div&gt;&lt;br /&gt;&lt;span style="color: red;"&gt;brew services start postgresql@16&lt;/span&gt;&lt;br /&gt;&lt;div style="animation: auto ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px rgb(31, 31, 31); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; font-family: &amp;quot;Google Sans Text&amp;quot;, sans-serif; gap: normal; hyphens: manual; inset: auto; interactivity: auto; isolation: auto; line-height: 1.15; margin-bottom: 0px; margin-left: 0px !important; margin-right: 0px !important; margin-top: 0px !important; margin: 0px; marker: none; mask-clip: border-box; mask-composite: add; mask-image: none; mask-mode: match-source; mask-origin: border-box; mask-repeat: repeat; mask-size: auto; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(31, 31, 31) none 3px; overlay: none; padding: 0px 0px 0px 4px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rule: 3px rgb(31, 31, 31); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;"&gt;&lt;i data-index-in-node="0" data-path-to-node="3,3,2" style="animation: auto ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px rgb(31, 31, 31); clear: none; clip: auto; color: #1f1f1f; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; display: inline; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; gap: normal; hyphens: manual; inset: auto; interactivity: auto; isolation: auto; line-height: 1.15; margin-bottom: 0px; margin-left: 0px !important; margin-right: 0px !important; margin-top: 0px !important; margin: 0px; marker: none; mask-clip: border-box; mask-composite: add; mask-image: none; mask-mode: match-source; mask-origin: border-box; mask-repeat: repeat; mask-size: auto; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(31, 31, 31) none 3px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rule: 3px rgb(31, 31, 31); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;"&gt;การตรวจสอบ:&lt;/i&gt;&lt;span style="color: #1f1f1f;"&gt; พิมพ์ &lt;/span&gt;&lt;code data-index-in-node="18" data-path-to-node="3,3,2" style="animation: auto ease 0s 1 normal none running none; appearance: none; background: none 0% 0% / auto repeat scroll padding-box border-box rgb(242, 240, 240); border: 0px rgba(0, 0, 0, 0.55); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; display: inline-block; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; font-family: &amp;quot;Google Sans Text&amp;quot;, sans-serif; font-feature-settings: normal; font-kerning: auto; font-language-override: normal; font-optical-sizing: auto; font-size-adjust: none; font-size: 15px; font-stretch: normal; font-variant: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; interactivity: auto; isolation: auto; line-height: 1.15; margin-bottom: 0px; margin-left: 0px !important; margin-right: 0px !important; margin-top: 0px !important; margin: 0px; marker: none; mask-clip: border-box; mask-composite: add; mask-image: none; mask-mode: match-source; mask-origin: border-box; mask-repeat: repeat; mask-size: auto; mask: none; offset: normal; opacity: 1; order: 0; outline: rgba(0, 0, 0, 0.55) none 3px; overlay: none; padding: 4px 6px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rule: 3px rgba(0, 0, 0, 0.55); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;"&gt;&lt;span style="color: #ff00fe;"&gt;brew services list&lt;/span&gt;&lt;/code&gt;&lt;span style="color: #1f1f1f;"&gt; จะเห็นสถานะเป็น &lt;/span&gt;&lt;code data-index-in-node="53" data-path-to-node="3,3,2" style="animation: auto ease 0s 1 normal none running none; appearance: none; background: none 0% 0% / auto repeat scroll padding-box border-box rgb(242, 240, 240); border: 0px rgba(0, 0, 0, 0.55); clear: none; clip: auto; color: rgba(0, 0, 0, 0.55); columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; display: inline-block; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; font-family: &amp;quot;Google Sans Text&amp;quot;, sans-serif; font-feature-settings: normal; font-kerning: auto; font-language-override: normal; font-optical-sizing: auto; font-size-adjust: none; font-size: 15px; font-stretch: normal; font-variant: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; interactivity: auto; isolation: auto; line-height: 1.15; margin-bottom: 0px; margin-left: 0px !important; margin-right: 0px !important; margin-top: 0px !important; margin: 0px; marker: none; mask-clip: border-box; mask-composite: add; mask-image: none; mask-mode: match-source; mask-origin: border-box; mask-repeat: repeat; mask-size: auto; mask: none; offset: normal; opacity: 1; order: 0; outline: rgba(0, 0, 0, 0.55) none 3px; overlay: none; padding: 4px 6px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rule: 3px rgba(0, 0, 0, 0.55); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;"&gt;started&lt;/code&gt;&lt;span style="color: #1f1f1f;"&gt; สีเขียว&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;/li&gt;&lt;li style="animation: auto ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px rgb(31, 31, 31); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; gap: normal; hyphens: manual; inset: 0px; interactivity: auto; isolation: auto; line-height: 1.15; margin-bottom: 0px; margin-left: 0px !important; margin-right: 0px !important; margin-top: 0px !important; margin: 0px; marker: none; mask-clip: border-box; mask-composite: add; mask-image: none; mask-mode: match-source; mask-origin: border-box; mask-repeat: repeat; mask-size: auto; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(31, 31, 31) none 3px; overlay: none; padding: 0px 0px 0px 36px; page: auto; perspective: none; position: relative; quotes: auto; r: 0px; resize: none; rotate: none; rule: 3px rgb(31, 31, 31); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;"&gt;&lt;div style="animation: auto ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px rgb(31, 31, 31); clear: none; clip: auto; color: #1f1f1f; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; font-family: &amp;quot;Google Sans Text&amp;quot;, sans-serif; gap: normal; hyphens: manual; inset: auto; interactivity: auto; isolation: auto; line-height: 1.15; margin-bottom: 0px; margin-left: 0px !important; margin-right: 0px !important; margin-top: 0px !important; margin: 0px; marker: none; mask-clip: border-box; mask-composite: add; mask-image: none; mask-mode: match-source; mask-origin: border-box; mask-repeat: repeat; mask-size: auto; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(31, 31, 31) none 3px; overlay: none; padding: 0px 0px 0px 4px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rule: 3px rgb(31, 31, 31); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;"&gt;&lt;b data-index-in-node="0" data-path-to-node="3,4,0" style="animation: auto ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px rgb(31, 31, 31); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; display: inline; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; gap: normal; hyphens: manual; inset: auto; interactivity: auto; isolation: auto; line-height: 1.15; margin-bottom: 0px; margin-left: 0px !important; margin-right: 0px !important; margin-top: 0px !important; margin: 0px; marker: none; mask-clip: border-box; mask-composite: add; mask-image: none; mask-mode: match-source; mask-origin: border-box; mask-repeat: repeat; mask-size: auto; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(31, 31, 31) none 3px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rule: 3px rgb(31, 31, 31); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;"&gt;ทดสอบการเชื่อมต่อฐานข้อมูล&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="color: red;"&gt;psql postgres&lt;/span&gt;&lt;br /&gt;&lt;div style="animation: auto ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px rgb(31, 31, 31); clear: none; clip: auto; color: #1f1f1f; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; font-family: &amp;quot;Google Sans Text&amp;quot;, sans-serif; gap: normal; hyphens: manual; inset: auto; interactivity: auto; isolation: auto; line-height: 1.15; margin-bottom: 0px; margin-left: 0px !important; margin-right: 0px !important; margin-top: 0px !important; margin: 0px; marker: none; mask-clip: border-box; mask-composite: add; mask-image: none; mask-mode: match-source; mask-origin: border-box; mask-repeat: repeat; mask-size: auto; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(31, 31, 31) none 3px; overlay: none; padding: 0px 0px 0px 4px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rule: 3px rgb(31, 31, 31); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;"&gt;&lt;i data-index-in-node="0" data-path-to-node="3,4,2" style="animation: auto ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px rgb(31, 31, 31); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; display: inline; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; gap: normal; hyphens: manual; inset: auto; interactivity: auto; isolation: auto; line-height: 1.15; margin-bottom: 0px; margin-left: 0px !important; margin-right: 0px !important; margin-top: 0px !important; margin: 0px; marker: none; mask-clip: border-box; mask-composite: add; mask-image: none; mask-mode: match-source; mask-origin: border-box; mask-repeat: repeat; mask-size: auto; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(31, 31, 31) none 3px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rule: 3px rgb(31, 31, 31); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;"&gt;การตรวจสอบ:&lt;/i&gt; หากสำเร็จ หน้าจอจะเปลี่ยนเป็น command prompt ของ PostgreSQL เช่น &lt;code data-index-in-node="77" data-path-to-node="3,4,2" style="animation: auto ease 0s 1 normal none running none; appearance: none; background: none 0% 0% / auto repeat scroll padding-box border-box rgb(242, 240, 240); border: 0px rgba(0, 0, 0, 0.55); clear: none; clip: auto; color: rgba(0, 0, 0, 0.55); columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; display: inline-block; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; font-family: &amp;quot;Google Sans Text&amp;quot;, sans-serif; font-feature-settings: normal; font-kerning: auto; font-language-override: normal; font-optical-sizing: auto; font-size-adjust: none; font-size: 15px; font-stretch: normal; font-variant: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; interactivity: auto; isolation: auto; line-height: 1.15; margin-bottom: 0px; margin-left: 0px !important; margin-right: 0px !important; margin-top: 0px !important; margin: 0px; marker: none; mask-clip: border-box; mask-composite: add; mask-image: none; mask-mode: match-source; mask-origin: border-box; mask-repeat: repeat; mask-size: auto; mask: none; offset: normal; opacity: 1; order: 0; outline: rgba(0, 0, 0, 0.55) none 3px; overlay: none; padding: 4px 6px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rule: 3px rgba(0, 0, 0, 0.55); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;"&gt;postgres=#&lt;/code&gt; (สามารถพิมพ์ &lt;code data-index-in-node="101" data-path-to-node="3,4,2" style="animation: auto ease 0s 1 normal none running none; appearance: none; background: none 0% 0% / auto repeat scroll padding-box border-box rgb(242, 240, 240); border: 0px rgba(0, 0, 0, 0.55); clear: none; clip: auto; color: rgba(0, 0, 0, 0.55); columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; display: inline-block; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; font-family: &amp;quot;Google Sans Text&amp;quot;, sans-serif; font-feature-settings: normal; font-kerning: auto; font-language-override: normal; font-optical-sizing: auto; font-size-adjust: none; font-size: 15px; font-stretch: normal; font-variant: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; interactivity: auto; isolation: auto; line-height: 1.15; margin-bottom: 0px; margin-left: 0px !important; margin-right: 0px !important; margin-top: 0px !important; margin: 0px; marker: none; mask-clip: border-box; mask-composite: add; mask-image: none; mask-mode: match-source; mask-origin: border-box; mask-repeat: repeat; mask-size: auto; mask: none; offset: normal; opacity: 1; order: 0; outline: rgba(0, 0, 0, 0.55) none 3px; overlay: none; padding: 4px 6px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rule: 3px rgba(0, 0, 0, 0.55); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;"&gt;\q&lt;/code&gt; แล้วกด Enter เพื่อออกจากโปรแกรม)&lt;/div&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;h3 data-path-to-node="5" style="animation: auto ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px rgb(31, 31, 31); clear: none; clip: auto; color: #1f1f1f; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; font-family: &amp;quot;Google Sans&amp;quot;, sans-serif; gap: normal; hyphens: manual; inset: auto; interactivity: auto; isolation: auto; line-height: 1.15; margin-bottom: 0px; margin-left: 0px !important; margin-right: 0px !important; margin-top: 0px !important; margin: 0px; marker: none; mask-clip: border-box; mask-composite: add; mask-image: none; mask-mode: match-source; mask-origin: border-box; mask-repeat: repeat; mask-size: auto; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(31, 31, 31) none 3px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rule: 3px rgb(31, 31, 31); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;"&gt;วิธีที่ 2: ติดตั้งผ่านแอปพลิเคชัน Postgres.app (สำหรับผู้ที่ต้องการหน้าต่าง GUI)&lt;/h3&gt;&lt;ol data-path-to-node="6" start="1" style="animation: auto ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px rgb(31, 31, 31); clear: none; clip: auto; color: #1f1f1f; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; font-family: &amp;quot;Google Sans Text&amp;quot;, sans-serif; gap: normal; hyphens: manual; inset: auto; interactivity: auto; isolation: auto; line-height: 1.15; margin-bottom: 0px; margin-left: 0px !important; margin-right: 0px !important; margin-top: 0px !important; margin: 0px; marker: none; mask-clip: border-box; mask-composite: add; mask-image: none; mask-mode: match-source; mask-origin: border-box; mask-repeat: repeat; mask-size: auto; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(31, 31, 31) none 3px; overlay: none; padding-inline-start: 32px; padding: 0px 0px 0px 4px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rule: 3px rgb(31, 31, 31); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;"&gt;&lt;li style="animation: auto ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px rgb(31, 31, 31); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; gap: normal; hyphens: manual; inset: 0px; interactivity: auto; isolation: auto; line-height: 1.15; margin-bottom: 0px; margin-left: 0px !important; margin-right: 0px !important; margin-top: 0px !important; margin: 0px; marker: none; mask-clip: border-box; mask-composite: add; mask-image: none; mask-mode: match-source; mask-origin: border-box; mask-repeat: repeat; mask-size: auto; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(31, 31, 31) none 3px; overlay: none; padding: 0px 0px 0px 36px; page: auto; perspective: none; position: relative; quotes: auto; r: 0px; resize: none; rotate: none; rule: 3px rgb(31, 31, 31); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;"&gt;&lt;div style="animation: auto ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px rgb(31, 31, 31); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; gap: normal; hyphens: manual; inset: auto; interactivity: auto; isolation: auto; line-height: 1.15; margin-bottom: 0px; margin-left: 0px !important; margin-right: 0px !important; margin-top: 0px !important; margin: 0px; marker: none; mask-clip: border-box; mask-composite: add; mask-image: none; mask-mode: match-source; mask-origin: border-box; mask-repeat: repeat; mask-size: auto; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(31, 31, 31) none 3px; overlay: none; padding: 0px 0px 0px 4px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rule: 3px rgb(31, 31, 31); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;"&gt;เข้าไปที่เว็บไซต์ทางการของ &lt;response-element class="no-md" ng-version="0.0.0-PLACEHOLDER" style="animation: auto ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px rgb(31, 31, 31); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; display: inline; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; gap: normal; hyphens: manual; inset: auto; interactivity: auto; isolation: auto; line-height: 1.15; margin-bottom: 0px; margin-left: 0px !important; margin-right: 0px !important; margin-top: 0px !important; margin: 0px; marker: none; mask-clip: border-box; mask-composite: add; mask-image: none; mask-mode: match-source; mask-origin: border-box; mask-repeat: repeat; mask-size: auto; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(31, 31, 31) none 3px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rule: 3px rgb(31, 31, 31); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;"&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;link-block _nghost-ng-c2438709630="" class="ng-star-inserted" style="animation: auto ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px rgb(31, 31, 31); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; display: inline; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; gap: normal; hyphens: manual; inset: auto; interactivity: auto; isolation: auto; line-height: 1.15; margin-bottom: 0px; margin-left: 0px !important; margin-right: 0px !important; margin-top: 0px !important; margin: 0px; marker: none; mask-clip: border-box; mask-composite: add; mask-image: none; mask-mode: match-source; mask-origin: border-box; mask-repeat: repeat; mask-size: auto; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(31, 31, 31) none 3px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rule: 3px rgb(31, 31, 31); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;"&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;a _ngcontent-ng-c2438709630="" _nghost-ng-c3278892317="" class="ng-star-inserted" data-hveid="0" data-ved="0CAAQ_4QMahgKEwjgh8K-zseXAxUAAAAAHQAAAAAQiwE" decode-data-ved="1" externallink="" href="https://postgresapp.com/" jslog="197247;track:generic_click,impression,attention;BardVeMetadataKey:W1sicl81M2I2NTlmMGJhN2U1OWQxIiwiY181OGM3NzQxZWQxMmI0MzE1IixudWxsLCJyY185NzBlYzg1NzNiZjk5MmU4IixudWxsLG51bGwsInRoIixudWxsLDEsbnVsbCxudWxsLDEsMF1d" rel="noopener" style="animation: auto ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px rgb(0, 0, 0); clear: none; clip: auto; color: black; columns: auto; contain: none; container: none; content: normal; cursor: pointer; cx: 0px; cy: 0px; d: none; direction: ltr; display: inline; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; gap: normal; hyphens: manual; inset: auto; interactivity: auto; isolation: auto; line-height: 1.15; margin-bottom: 0px; margin-left: 0px !important; margin-right: 0px !important; margin-top: 0px !important; margin: 0px; marker: none; mask-clip: border-box; mask-composite: add; mask-image: none; mask-mode: match-source; mask-origin: border-box; mask-repeat: repeat; mask-size: auto; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(0, 0, 0) none 3px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rule: 3px rgb(0, 0, 0); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;" target="_blank"&gt;Postgres.app&lt;/a&gt;&lt;!----&gt;&lt;/link-block&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;/response-element&gt;&lt;/div&gt;&lt;br /&gt;&lt;/li&gt;&lt;li style="animation: auto ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px rgb(31, 31, 31); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; gap: normal; hyphens: manual; inset: 0px; interactivity: auto; isolation: auto; line-height: 1.15; margin-bottom: 0px; margin-left: 0px !important; margin-right: 0px !important; margin-top: 0px !important; margin: 0px; marker: none; mask-clip: border-box; mask-composite: add; mask-image: none; mask-mode: match-source; mask-origin: border-box; mask-repeat: repeat; mask-size: auto; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(31, 31, 31) none 3px; overlay: none; padding: 0px 0px 0px 36px; page: auto; perspective: none; position: relative; quotes: auto; r: 0px; resize: none; rotate: none; rule: 3px rgb(31, 31, 31); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;"&gt;&lt;div style="animation: auto ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px rgb(31, 31, 31); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; gap: normal; hyphens: manual; inset: auto; interactivity: auto; isolation: auto; line-height: 1.15; margin-bottom: 0px; margin-left: 0px !important; margin-right: 0px !important; margin-top: 0px !important; margin: 0px; marker: none; mask-clip: border-box; mask-composite: add; mask-image: none; mask-mode: match-source; mask-origin: border-box; mask-repeat: repeat; mask-size: auto; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(31, 31, 31) none 3px; overlay: none; padding: 0px 0px 0px 4px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rule: 3px rgb(31, 31, 31); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;"&gt;ดาวน์โหลดไฟล์ &lt;code data-index-in-node="14" data-path-to-node="6,1,0" style="animation: auto ease 0s 1 normal none running none; appearance: none; background: none 0% 0% / auto repeat scroll padding-box border-box rgb(242, 240, 240); border: 0px rgba(0, 0, 0, 0.55); clear: none; clip: auto; color: rgba(0, 0, 0, 0.55); columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; display: inline-block; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; font-family: &amp;quot;Google Sans Text&amp;quot;, sans-serif; font-feature-settings: normal; font-kerning: auto; font-language-override: normal; font-optical-sizing: auto; font-size-adjust: none; font-size: 15px; font-stretch: normal; font-variant: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; interactivity: auto; isolation: auto; line-height: 1.15; margin-bottom: 0px; margin-left: 0px !important; margin-right: 0px !important; margin-top: 0px !important; margin: 0px; marker: none; mask-clip: border-box; mask-composite: add; mask-image: none; mask-mode: match-source; mask-origin: border-box; mask-repeat: repeat; mask-size: auto; mask: none; offset: normal; opacity: 1; order: 0; outline: rgba(0, 0, 0, 0.55) none 3px; overlay: none; padding: 4px 6px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rule: 3px rgba(0, 0, 0, 0.55); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;"&gt;.dmg&lt;/code&gt; ที่รองรับเวอร์ชัน macOS ของคุณ&lt;/div&gt;&lt;br /&gt;&lt;/li&gt;&lt;li style="animation: auto ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px rgb(31, 31, 31); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; gap: normal; hyphens: manual; inset: 0px; interactivity: auto; isolation: auto; line-height: 1.15; margin-bottom: 0px; margin-left: 0px !important; margin-right: 0px !important; margin-top: 0px !important; margin: 0px; marker: none; mask-clip: border-box; mask-composite: add; mask-image: none; mask-mode: match-source; mask-origin: border-box; mask-repeat: repeat; mask-size: auto; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(31, 31, 31) none 3px; overlay: none; padding: 0px 0px 0px 36px; page: auto; perspective: none; position: relative; quotes: auto; r: 0px; resize: none; rotate: none; rule: 3px rgb(31, 31, 31); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;"&gt;&lt;div style="animation: auto ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px rgb(31, 31, 31); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; gap: normal; hyphens: manual; inset: auto; interactivity: auto; isolation: auto; line-height: 1.15; margin-bottom: 0px; margin-left: 0px !important; margin-right: 0px !important; margin-top: 0px !important; margin: 0px; marker: none; mask-clip: border-box; mask-composite: add; mask-image: none; mask-mode: match-source; mask-origin: border-box; mask-repeat: repeat; mask-size: auto; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(31, 31, 31) none 3px; overlay: none; padding: 0px 0px 0px 4px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rule: 3px rgb(31, 31, 31); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;"&gt;เปิดไฟล์ &lt;code data-index-in-node="9" data-path-to-node="6,2,0" style="animation: auto ease 0s 1 normal none running none; appearance: none; background: none 0% 0% / auto repeat scroll padding-box border-box rgb(242, 240, 240); border: 0px rgba(0, 0, 0, 0.55); clear: none; clip: auto; color: rgba(0, 0, 0, 0.55); columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; display: inline-block; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; font-family: &amp;quot;Google Sans Text&amp;quot;, sans-serif; font-feature-settings: normal; font-kerning: auto; font-language-override: normal; font-optical-sizing: auto; font-size-adjust: none; font-size: 15px; font-stretch: normal; font-variant: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; interactivity: auto; isolation: auto; line-height: 1.15; margin-bottom: 0px; margin-left: 0px !important; margin-right: 0px !important; margin-top: 0px !important; margin: 0px; marker: none; mask-clip: border-box; mask-composite: add; mask-image: none; mask-mode: match-source; mask-origin: border-box; mask-repeat: repeat; mask-size: auto; mask: none; offset: normal; opacity: 1; order: 0; outline: rgba(0, 0, 0, 0.55) none 3px; overlay: none; padding: 4px 6px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rule: 3px rgba(0, 0, 0, 0.55); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;"&gt;.dmg&lt;/code&gt; แล้วลากไอคอน &lt;b data-index-in-node="27" data-path-to-node="6,2,0" style="animation: auto ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px rgb(31, 31, 31); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; display: inline; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; gap: normal; hyphens: manual; inset: auto; interactivity: auto; isolation: auto; line-height: 1.15; margin-bottom: 0px; margin-left: 0px !important; margin-right: 0px !important; margin-top: 0px !important; margin: 0px; marker: none; mask-clip: border-box; mask-composite: add; mask-image: none; mask-mode: match-source; mask-origin: border-box; mask-repeat: repeat; mask-size: auto; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(31, 31, 31) none 3px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rule: 3px rgb(31, 31, 31); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;"&gt;Postgres&lt;/b&gt; ไปไว้ในโฟลเดอร์ &lt;b data-index-in-node="52" data-path-to-node="6,2,0" style="animation: auto ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px rgb(31, 31, 31); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; display: inline; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; gap: normal; hyphens: manual; inset: auto; interactivity: auto; isolation: auto; line-height: 1.15; margin-bottom: 0px; margin-left: 0px !important; margin-right: 0px !important; margin-top: 0px !important; margin: 0px; marker: none; mask-clip: border-box; mask-composite: add; mask-image: none; mask-mode: match-source; mask-origin: border-box; mask-repeat: repeat; mask-size: auto; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(31, 31, 31) none 3px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rule: 3px rgb(31, 31, 31); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;"&gt;Applications&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;/li&gt;&lt;li style="animation: auto ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px rgb(31, 31, 31); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; gap: normal; hyphens: manual; inset: 0px; interactivity: auto; isolation: auto; line-height: 1.15; margin-bottom: 0px; margin-left: 0px !important; margin-right: 0px !important; margin-top: 0px !important; margin: 0px; marker: none; mask-clip: border-box; mask-composite: add; mask-image: none; mask-mode: match-source; mask-origin: border-box; mask-repeat: repeat; mask-size: auto; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(31, 31, 31) none 3px; overlay: none; padding: 0px 0px 0px 36px; page: auto; perspective: none; position: relative; quotes: auto; r: 0px; resize: none; rotate: none; rule: 3px rgb(31, 31, 31); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;"&gt;&lt;div style="animation: auto ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px rgb(31, 31, 31); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; gap: normal; hyphens: manual; inset: auto; interactivity: auto; isolation: auto; line-height: 1.15; margin-bottom: 0px; margin-left: 0px !important; margin-right: 0px !important; margin-top: 0px !important; margin: 0px; marker: none; mask-clip: border-box; mask-composite: add; mask-image: none; mask-mode: match-source; mask-origin: border-box; mask-repeat: repeat; mask-size: auto; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(31, 31, 31) none 3px; overlay: none; padding: 0px 0px 0px 4px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rule: 3px rgb(31, 31, 31); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;"&gt;เปิดแอป Postgres แล้วคลิกปุ่ม &lt;b data-index-in-node="30" data-path-to-node="6,3,0" style="animation: auto ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px rgb(31, 31, 31); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; display: inline; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; gap: normal; hyphens: manual; inset: auto; interactivity: auto; isolation: auto; line-height: 1.15; margin-bottom: 0px; margin-left: 0px !important; margin-right: 0px !important; margin-top: 0px !important; margin: 0px; marker: none; mask-clip: border-box; mask-composite: add; mask-image: none; mask-mode: match-source; mask-origin: border-box; mask-repeat: repeat; mask-size: auto; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(31, 31, 31) none 3px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rule: 3px rgb(31, 31, 31); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;"&gt;Initialize&lt;/b&gt; เพื่อสร้างฐานข้อมูลเริ่มต้น&lt;/div&gt;&lt;br /&gt;&lt;/li&gt;&lt;li style="animation: auto ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px rgb(31, 31, 31); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; gap: normal; hyphens: manual; inset: 0px; interactivity: auto; isolation: auto; line-height: 1.15; margin-bottom: 0px; margin-left: 0px !important; margin-right: 0px !important; margin-top: 0px !important; margin: 0px; marker: none; mask-clip: border-box; mask-composite: add; mask-image: none; mask-mode: match-source; mask-origin: border-box; mask-repeat: repeat; mask-size: auto; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(31, 31, 31) none 3px; overlay: none; padding: 0px 0px 0px 36px; page: auto; perspective: none; position: relative; quotes: auto; r: 0px; resize: none; rotate: none; rule: 3px rgb(31, 31, 31); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;"&gt;&lt;div style="animation: auto ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px rgb(31, 31, 31); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; gap: normal; hyphens: manual; inset: auto; interactivity: auto; isolation: auto; line-height: 1.15; margin-bottom: 0px; margin-left: 0px !important; margin-right: 0px !important; margin-top: 0px !important; margin: 0px; marker: none; mask-clip: border-box; mask-composite: add; mask-image: none; mask-mode: match-source; mask-origin: border-box; mask-repeat: repeat; mask-size: auto; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(31, 31, 31) none 3px; overlay: none; padding: 0px 0px 0px 4px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rule: 3px rgb(31, 31, 31); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;"&gt;คลิกปุ่ม &lt;b data-index-in-node="9" data-path-to-node="6,4,0" style="animation: auto ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px rgb(31, 31, 31); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; display: inline; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; gap: normal; hyphens: manual; inset: auto; interactivity: auto; isolation: auto; line-height: 1.15; margin-bottom: 0px; margin-left: 0px !important; margin-right: 0px !important; margin-top: 0px !important; margin: 0px; marker: none; mask-clip: border-box; mask-composite: add; mask-image: none; mask-mode: match-source; mask-origin: border-box; mask-repeat: repeat; mask-size: auto; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(31, 31, 31) none 3px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rule: 3px rgb(31, 31, 31); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;"&gt;Start&lt;/b&gt; เพื่อเริ่มการทำงานของเซิร์ฟเวอร์ฐานข้อมูล&lt;/div&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;h3 data-path-to-node="8" style="animation: auto ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px rgb(31, 31, 31); clear: none; clip: auto; color: #1f1f1f; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; font-family: &amp;quot;Google Sans&amp;quot;, sans-serif; gap: normal; hyphens: manual; inset: auto; interactivity: auto; isolation: auto; line-height: 1.15; margin-bottom: 0px; margin-left: 0px !important; margin-right: 0px !important; margin-top: 0px !important; margin: 0px; marker: none; mask-clip: border-box; mask-composite: add; mask-image: none; mask-mode: match-source; mask-origin: border-box; mask-repeat: repeat; mask-size: auto; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(31, 31, 31) none 3px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rule: 3px rgb(31, 31, 31); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;"&gt;เครื่องมือจัดการฐานข้อมูลแบบ GUI (แนะนำเพิ่มเติม)&lt;/h3&gt;&lt;div style="animation: auto ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px rgb(31, 31, 31); clear: none; clip: auto; color: #1f1f1f; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; font-family: &amp;quot;Google Sans Text&amp;quot;, sans-serif; gap: normal; hyphens: manual; inset: auto; interactivity: auto; isolation: auto; line-height: 1.15; margin-bottom: 0px; margin-left: 0px !important; margin-right: 0px !important; margin-top: 0px !important; margin: 0px; marker: none; mask-clip: border-box; mask-composite: add; mask-image: none; mask-mode: match-source; mask-origin: border-box; mask-repeat: repeat; mask-size: auto; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(31, 31, 31) none 3px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rule: 3px rgb(31, 31, 31); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;"&gt;เมื่อติดตั้งเสร็จแล้ว หากต้องการจัดการตารางและเขียน Query ผ่านหน้าจอ UI ที่ใช้งานง่าย สามารถติดตั้งโปรแกรมเสริมตัวใดตัวหนึ่งต่อไปนี้:&lt;/div&gt;&lt;br /&gt;&lt;ul data-path-to-node="10" style="animation: auto ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px rgb(31, 31, 31); clear: none; clip: auto; color: #1f1f1f; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; font-family: &amp;quot;Google Sans Text&amp;quot;, sans-serif; gap: normal; hyphens: manual; inset: auto; interactivity: auto; isolation: auto; line-height: 1.15; margin-bottom: 0px; margin-left: 0px !important; margin-right: 0px !important; margin-top: 0px !important; margin: 0px; marker: none; mask-clip: border-box; mask-composite: add; mask-image: none; mask-mode: match-source; mask-origin: border-box; mask-repeat: repeat; mask-size: auto; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(31, 31, 31) none 3px; overlay: none; padding-inline-start: 32px; padding: 0px 0px 0px 3.36px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rule: 3px rgb(31, 31, 31); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;"&gt;&lt;li style="animation: auto ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px rgb(31, 31, 31); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; gap: normal; hyphens: manual; inset: 0px; interactivity: auto; isolation: auto; line-height: 1.15; margin-bottom: 0px; margin-left: 0px !important; margin-right: 0px !important; margin-top: 0px !important; margin: 0px; marker: none; mask-clip: border-box; mask-composite: add; mask-image: none; mask-mode: match-source; mask-origin: border-box; mask-repeat: repeat; mask-size: auto; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(31, 31, 31) none 3px; overlay: none; padding: 0px 0px 0px 36px; page: auto; perspective: none; position: relative; quotes: auto; r: 0px; resize: none; rotate: none; rule: 3px rgb(31, 31, 31); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;"&gt;&lt;div style="animation: auto ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px rgb(31, 31, 31); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; gap: normal; hyphens: manual; inset: auto; interactivity: auto; isolation: auto; line-height: 1.15; margin-bottom: 0px; margin-left: 0px !important; margin-right: 0px !important; margin-top: 0px !important; margin: 0px; marker: none; mask-clip: border-box; mask-composite: add; mask-image: none; mask-mode: match-source; mask-origin: border-box; mask-repeat: repeat; mask-size: auto; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(31, 31, 31) none 3px; overlay: none; padding: 0px 0px 0px 4px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rule: 3px rgb(31, 31, 31); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;"&gt;&lt;b data-index-in-node="0" data-path-to-node="10,0,0" style="animation: auto ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px rgb(31, 31, 31); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; display: inline; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; gap: normal; hyphens: manual; inset: auto; interactivity: auto; isolation: auto; line-height: 1.15; margin-bottom: 0px; margin-left: 0px !important; margin-right: 0px !important; margin-top: 0px !important; margin: 0px; marker: none; mask-clip: border-box; mask-composite: add; mask-image: none; mask-mode: match-source; mask-origin: border-box; mask-repeat: repeat; mask-size: auto; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(31, 31, 31) none 3px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rule: 3px rgb(31, 31, 31); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;"&gt;pgAdmin 4&lt;/b&gt;: เครื่องมือมาตรฐานทางการของ PostgreSQL รองรับฟีเจอร์ครบถ้วน&lt;/div&gt;&lt;br /&gt;&lt;/li&gt;&lt;li style="animation: auto ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px rgb(31, 31, 31); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; gap: normal; hyphens: manual; inset: 0px; interactivity: auto; isolation: auto; line-height: 1.15; margin-bottom: 0px; margin-left: 0px !important; margin-right: 0px !important; margin-top: 0px !important; margin: 0px; marker: none; mask-clip: border-box; mask-composite: add; mask-image: none; mask-mode: match-source; mask-origin: border-box; mask-repeat: repeat; mask-size: auto; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(31, 31, 31) none 3px; overlay: none; padding: 0px 0px 0px 36px; page: auto; perspective: none; position: relative; quotes: auto; r: 0px; resize: none; rotate: none; rule: 3px rgb(31, 31, 31); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;"&gt;&lt;div style="animation: auto ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px rgb(31, 31, 31); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; gap: normal; hyphens: manual; inset: auto; interactivity: auto; isolation: auto; line-height: 1.15; margin-bottom: 0px; margin-left: 0px !important; margin-right: 0px !important; margin-top: 0px !important; margin: 0px; marker: none; mask-clip: border-box; mask-composite: add; mask-image: none; mask-mode: match-source; mask-origin: border-box; mask-repeat: repeat; mask-size: auto; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(31, 31, 31) none 3px; overlay: none; padding: 0px 0px 0px 4px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rule: 3px rgb(31, 31, 31); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;"&gt;&lt;b data-index-in-node="0" data-path-to-node="10,1,0" style="animation: auto ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px rgb(31, 31, 31); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; display: inline; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; gap: normal; hyphens: manual; inset: auto; interactivity: auto; isolation: auto; line-height: 1.15; margin-bottom: 0px; margin-left: 0px !important; margin-right: 0px !important; margin-top: 0px !important; margin: 0px; marker: none; mask-clip: border-box; mask-composite: add; mask-image: none; mask-mode: match-source; mask-origin: border-box; mask-repeat: repeat; mask-size: auto; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(31, 31, 31) none 3px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rule: 3px rgb(31, 31, 31); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;"&gt;DBeaver&lt;/b&gt;: โปรแกรมจัดการฐานข้อมูลยอดนิยมที่รองรับหลายระบบ&lt;/div&gt;&lt;br /&gt;&lt;/li&gt;&lt;li style="animation: auto ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px rgb(31, 31, 31); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; gap: normal; hyphens: manual; inset: 0px; interactivity: auto; isolation: auto; line-height: 1.15; margin-bottom: 0px; margin-left: 0px !important; margin-right: 0px !important; margin-top: 0px !important; margin: 0px; marker: none; mask-clip: border-box; mask-composite: add; mask-image: none; mask-mode: match-source; mask-origin: border-box; mask-repeat: repeat; mask-size: auto; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(31, 31, 31) none 3px; overlay: none; padding: 0px 0px 0px 36px; page: auto; perspective: none; position: relative; quotes: auto; r: 0px; resize: none; rotate: none; rule: 3px rgb(31, 31, 31); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;"&gt;&lt;div style="animation: auto ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px rgb(31, 31, 31); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; gap: normal; hyphens: manual; inset: auto; interactivity: auto; isolation: auto; line-height: 1.15; margin-bottom: 0px; margin-left: 0px !important; margin-right: 0px !important; margin-top: 0px !important; margin: 0px; marker: none; mask-clip: border-box; mask-composite: add; mask-image: none; mask-mode: match-source; mask-origin: border-box; mask-repeat: repeat; mask-size: auto; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(31, 31, 31) none 3px; overlay: none; padding: 0px 0px 0px 4px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rule: 3px rgb(31, 31, 31); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;"&gt;&lt;b data-index-in-node="0" data-path-to-node="10,2,0" style="animation: auto ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px rgb(31, 31, 31); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; display: inline; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; gap: normal; hyphens: manual; inset: auto; interactivity: auto; isolation: auto; line-height: 1.15; margin-bottom: 0px; margin-left: 0px !important; margin-right: 0px !important; margin-top: 0px !important; margin: 0px; marker: none; mask-clip: border-box; mask-composite: add; mask-image: none; mask-mode: match-source; mask-origin: border-box; mask-repeat: repeat; mask-size: auto; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(31, 31, 31) none 3px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rule: 3px rgb(31, 31, 31); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;"&gt;TablePlus&lt;/b&gt;: โปรแกรม UI น้ำหนักเบา ออกแบบมาสำหรับ macOS โดยเฉพาะ&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div id="gtx-trans" style="left: -17px; position: absolute; top: 87.5938px;"&gt;&lt;div class="gtx-trans-icon"&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;Are u sure?&lt;/div&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></item><item><title>Recreate docker container กรณีแก้ไขไฟล์ ระบบ หรือไฟล์ env เพื่อโหลดใช้ค่าใหม่แบบ clean</title><link>http://juuier.blogspot.com/2026/10/recreate-docker-container-env-clean.html</link><author>noreply@blogger.com (juuier)</author><pubDate>Mon, 19 Oct 2026 10:03:23 +0700</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-34115975.post-8331769283255411404</guid><description>&lt;p&gt;&lt;b&gt;Ref: by Gemini&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;สั่ง build image ใหม่พร้อมรัน container แบบ daemon&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;span style="color: red;"&gt;docker compose up -d --build&lt;/span&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;/p&gt;&lt;p data-path-to-node="3"&gt;&lt;/p&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;&lt;i data-index-in-node="0" data-path-to-node="3"&gt;(หากใช้ Docker Compose เวอร์ชันเก่า ให้ใช้คำสั่ง &lt;code data-index-in-node="49" data-path-to-node="3"&gt;docker-compose up -d --build&lt;/code&gt;)&lt;/i&gt;&lt;/li&gt;&lt;li&gt;หรือ สั่ง recreate container ใหม่โดย ไม่ต้องสั่ง ​docker compose down ก่อนก็ได้&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;div&gt;&lt;blockquote&gt;&lt;span style="color: red;"&gt;docker compose up -d --force-recreate&lt;/span&gt;&lt;/blockquote&gt;&lt;h3 data-path-to-node="5"&gt;รายละเอียดของ Flag ในคำสั่ง:&lt;/h3&gt;&lt;p&gt;&lt;/p&gt;&lt;h3 data-path-to-node="8"&gt;&lt;/h3&gt;&lt;p&gt;&lt;/p&gt;&lt;ul data-path-to-node="6"&gt;&lt;li&gt;&lt;p data-path-to-node="6,0,0"&gt;&lt;b data-index-in-node="0" data-path-to-node="6,0,0"&gt;&lt;code data-index-in-node="0" data-path-to-node="6,0,0"&gt;--build&lt;/code&gt;&lt;/b&gt;: บังคับให้ Docker ทำการ rebuild image ใหม่ เพื่อให้โค้ด Node.js ล่าสุดถูกอัปเดตเข้าไปใน container&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p data-path-to-node="6,1,0"&gt;&lt;b data-index-in-node="0" data-path-to-node="6,1,0"&gt;&lt;code data-index-in-node="0" data-path-to-node="6,1,0"&gt;-d&lt;/code&gt;&lt;/b&gt; (Detached mode): รันคอนเทนเนอร์ไว้เบื้องหลัง (Background) เพื่อให้เทอร์มินัลพร้อมใช้งานต่อ&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;h3 data-path-to-node="8"&gt;ขั้นตอนการรีสตาร์ทแบบหมดจด (Clean Recreate)&lt;/h3&gt;&lt;p data-path-to-node="9"&gt;หากต้องการหยุดคอนเทนเนอร์เดิมก่อน เพื่อให้แน่ใจว่าค่า Environment Variables ใน &lt;code data-index-in-node="79" data-path-to-node="9"&gt;.env&lt;/code&gt; ถูกโหลดใหม่และคอนเทนเนอร์เดิมถูกลบออก ให้ทำตามลำดับนี้:&lt;/p&gt;&lt;ol class="md-has-block-component" data-path-to-node="10" start="1"&gt;&lt;li&gt;&lt;p data-path-to-node="10,0,0"&gt;&lt;b data-index-in-node="0" data-path-to-node="10,0,0"&gt;หยุดและลบคอนเทนเนอร์เดิม:&lt;/b&gt;&lt;/p&gt;&lt;response-element class="no-md" ng-version="0.0.0-PLACEHOLDER"&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;code-block _nghost-ng-c2555737016="" class="ng-tns-c2555737016-22 enable-luminous-code-block ng-star-inserted"&gt;&lt;!----&gt;&lt;!----&gt;&lt;div _ngcontent-ng-c2555737016="" class="code-block ng-tns-c2555737016-22 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" data-hveid="0" data-ved="0CAAQhtANahgKEwisg42kgcWXAxUAAAAAHQAAAAAQugE" decode-data-ved="1" jslog="223238;track:impression,attention;BardVeMetadataKey:W1sicl9mZWZkNDZiM2QzNTNkMzhiIiwiY19jNmY1NDNhZjg1MDY1M2Y0IixudWxsLCJyY185ZmRkZWViMjNiZWVjYjczIixudWxsLG51bGwsInRoIixudWxsLDEsbnVsbCxudWxsLDEsMF1d"&gt;&lt;!----&gt;&lt;div _ngcontent-ng-c2555737016="" class="formatted-code-block-internal-container ng-tns-c2555737016-22"&gt;&lt;div _ngcontent-ng-c2555737016="" class="animated-opacity ng-tns-c2555737016-22"&gt;&lt;div _ngcontent-ng-c2555737016="" class="code-block-decoration header-formatted gds-emphasized-body-m ng-tns-c2555737016-22 ng-star-inserted"&gt;&lt;span style="color: red;"&gt;docker compose down&lt;/span&gt;&lt;/div&gt;&lt;!----&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;/code-block&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;/response-element&gt;&lt;/li&gt;&lt;li&gt;&lt;p data-path-to-node="10,1,0"&gt;&lt;b data-index-in-node="0" data-path-to-node="10,1,0"&gt;สั่ง Build และเริ่มทำงานใหม่:&lt;/b&gt;&lt;/p&gt;&lt;response-element class="no-md" ng-version="0.0.0-PLACEHOLDER"&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;code-block _nghost-ng-c2555737016="" class="ng-tns-c2555737016-23 enable-luminous-code-block ng-star-inserted"&gt;&lt;!----&gt;&lt;!----&gt;&lt;div _ngcontent-ng-c2555737016="" class="code-block ng-tns-c2555737016-23 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" data-hveid="0" data-ved="0CAAQhtANahgKEwisg42kgcWXAxUAAAAAHQAAAAAQuwE" decode-data-ved="1" jslog="223238;track:impression,attention;BardVeMetadataKey:W1sicl9mZWZkNDZiM2QzNTNkMzhiIiwiY19jNmY1NDNhZjg1MDY1M2Y0IixudWxsLCJyY185ZmRkZWViMjNiZWVjYjczIixudWxsLG51bGwsInRoIixudWxsLDEsbnVsbCxudWxsLDEsMF1d"&gt;&lt;!----&gt;&lt;div _ngcontent-ng-c2555737016="" class="formatted-code-block-internal-container ng-tns-c2555737016-23"&gt;&lt;div _ngcontent-ng-c2555737016="" class="animated-opacity ng-tns-c2555737016-23"&gt;&lt;div _ngcontent-ng-c2555737016="" class="code-block-decoration header-formatted gds-emphasized-body-m ng-tns-c2555737016-23 ng-star-inserted"&gt;&lt;span style="color: red;"&gt;docker compose up -d --build&lt;/span&gt;&lt;/div&gt;&lt;!----&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;/code-block&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;/response-element&gt;&lt;/li&gt;&lt;li&gt;&lt;p data-path-to-node="10,2,0"&gt;&lt;b data-index-in-node="0" data-path-to-node="10,2,0"&gt;ตรวจสอบ Log การทำงาน:&lt;/b&gt;&lt;/p&gt;&lt;response-element class="no-md" ng-version="0.0.0-PLACEHOLDER"&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;code-block _nghost-ng-c2555737016="" class="ng-tns-c2555737016-24 enable-luminous-code-block ng-star-inserted"&gt;&lt;!----&gt;&lt;!----&gt;&lt;div _ngcontent-ng-c2555737016="" class="code-block ng-tns-c2555737016-24 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" data-hveid="0" data-ved="0CAAQhtANahgKEwisg42kgcWXAxUAAAAAHQAAAAAQvAE" decode-data-ved="1" jslog="223238;track:impression,attention;BardVeMetadataKey:W1sicl9mZWZkNDZiM2QzNTNkMzhiIiwiY19jNmY1NDNhZjg1MDY1M2Y0IixudWxsLCJyY185ZmRkZWViMjNiZWVjYjczIixudWxsLG51bGwsInRoIixudWxsLDEsbnVsbCxudWxsLDEsMF1d"&gt;&lt;!----&gt;&lt;div _ngcontent-ng-c2555737016="" class="formatted-code-block-internal-container ng-tns-c2555737016-24"&gt;&lt;div _ngcontent-ng-c2555737016="" class="animated-opacity ng-tns-c2555737016-24"&gt;&lt;div _ngcontent-ng-c2555737016="" class="code-block-decoration header-formatted gds-emphasized-body-m ng-tns-c2555737016-24 ng-star-inserted"&gt;&lt;span style="color: red;"&gt;docker compose logs -f &lt;/span&gt;&lt;span style="color: #2b00fe;"&gt;&amp;lt;ชื่อ_service&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;pre _ngcontent-ng-c2555737016="" class="ng-tns-c2555737016-24"&gt;&lt;code _ngcontent-ng-c2555737016="" class="code-container formatted ng-tns-c2555737016-24" data-test-id="code-content" role="text"&gt;&lt;span class="hljs-comment"&gt;# หรือดู log ทั้งหมด&lt;/span&gt;
&lt;span style="color: red;"&gt;docker compose logs -f&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;!----&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;/code-block&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;/response-element&gt;&lt;/li&gt;&lt;/ol&gt;&lt;blockquote data-path-to-node="11"&gt;&lt;p data-path-to-node="11,0"&gt;&lt;b data-index-in-node="0" data-path-to-node="11,0"&gt;ข้อสังเกตเพิ่มเติม:&lt;/b&gt;&lt;/p&gt;&lt;ul data-path-to-node="11,1"&gt;&lt;li&gt;&lt;p data-path-to-node="11,1,0,0"&gt;หากไฟล์ &lt;code data-index-in-node="8" data-path-to-node="11,1,0,0"&gt;.env&lt;/code&gt; ถูกเรียกผ่าน &lt;code data-index-in-node="26" data-path-to-node="11,1,0,0"&gt;env_file:&lt;/code&gt; ใน &lt;code data-index-in-node="39" data-path-to-node="11,1,0,0"&gt;docker-compose.yml&lt;/code&gt; ค่าใหม่จะถูกโหลดเข้าคอนเทนเนอร์ทันทีที่คอนเทนเนอร์ถูก recreate ขึ้นมาใหม่&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p data-path-to-node="11,1,1,0"&gt;หากมีการใช้ Volume mount สำหรับโฟลเดอร์โค้ด (เช่น &lt;code data-index-in-node="50" data-path-to-node="11,1,1,0"&gt;./:/app&lt;/code&gt;) การเปลี่ยนแปลงโค้ดจะเห็นผลทันที แต่หากไม่ได้ทำ Volume ไว้ จำเป็นต้องใส่ &lt;code data-index-in-node="131" data-path-to-node="11,1,1,0"&gt;--build&lt;/code&gt; เสมอ&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;b&gt;เพิ่มเติม&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;เข้าไปใน container&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;span style="color: red;"&gt;docker exec -it &lt;/span&gt;&lt;span style="color: #2b00fe;"&gt;&amp;lt;container_name | id&amp;gt;&lt;/span&gt;&lt;span style="color: red;"&gt; &amp;lt;sh | bash&amp;gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;ตัวอย่าง&amp;nbsp; node:22-alpine ด้วยคำสั่ง&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: red;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;span style="color: red;"&gt;docker exec -it &lt;/span&gt;&lt;span style="color: #2b00fe;"&gt;mynode&lt;/span&gt;&lt;span style="color: red;"&gt; sh&lt;/span&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;Are u sure?&lt;/div&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></item><item><title>create and grant privileges user PostgreSQL</title><link>http://juuier.blogspot.com/2026/10/create-and-grant-privileges-user.html</link><author>noreply@blogger.com (juuier)</author><pubDate>Fri, 16 Oct 2026 08:38:55 +0700</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-34115975.post-5271369847875319625</guid><description>&lt;p&gt;&lt;b&gt;วิธีที่ 1: ให้สิทธิ์ Superuser (จัดการได้ทั้งหมด เบ็ดเสร็จ)&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;span style="color: red;"&gt;sudo -u postgres psql&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #800180;"&gt;CREATE ROLE myuser WITH LOGIN SUPERUSER PASSWORD 'your_secure_password';&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;วิธีที่ 2: ให้สิทธิ์จัดการ Database แต่ไม่ใช่ Superuser (แนะนำด้านความปลอดภัย)&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;สร้าง User ที่มีสิทธิ์สร้าง Database (CREATEDB) และสร้าง Role อื่นได้ (CREATEROLE):&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;span style="color: #2b00fe;"&gt;CREATE USER myuser WITH CREATEDB CREATEROLE PASSWORD 'your_secure_password';&lt;/span&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;หากต้องการให้ User นี้เข้าไปจัดการข้อมูลและ Table ภายใน Database ที่มีอยู่แล้ว ต้องให้สิทธิ์เพิ่มเติมในแต่ละ Database นั้นๆ:&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;-- สิทธิ์เชื่อมต่อ Database&lt;/p&gt;&lt;p&gt;&lt;span style="color: #2b00fe;"&gt;GRANT CONNECT ON DATABASE target_db TO myuser;&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;-- เชื่อมต่อเข้าไปใน target_db แล้วรันสิทธิ์ใน schema&lt;/p&gt;&lt;p&gt;&lt;span style="color: #2b00fe;"&gt;\c target_db&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #2b00fe;"&gt;GRANT ALL ON SCHEMA public TO myuser;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #2b00fe;"&gt;GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO myuser;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #2b00fe;"&gt;GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO myuser;&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;กรณีต้องการเปลี่ยนสิทธิ์ User เดิมที่มีอยู่แล้ว&lt;/li&gt;&lt;li&gt;หากมี User เดิมอยู่แล้วและต้องการอัปเกรดให้เป็น Superuser ทันที:&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;span style="color: #800180;"&gt;ALTER USER myuser WITH SUPERUSER;&lt;/span&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;b&gt;Related:&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;https://juuier.blogspot.com/2026/10/shell-postgresql-dump-and-restore.html&lt;/li&gt;&lt;li&gt;https://juuier.blogspot.com/2026/10/postgresql-ubuntu-2204.html&lt;/li&gt;&lt;li&gt;https://juuier.blogspot.com/2026/10/postgresql-remote.html&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;Ref:&amp;nbsp;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;Gemini&amp;nbsp;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;Are u sure?&lt;/div&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></item><item><title>ติดตั้ง PostgreSQL Ubuntu 22.04</title><link>http://juuier.blogspot.com/2026/10/postgresql-ubuntu-2204.html</link><author>noreply@blogger.com (juuier)</author><pubDate>Thu, 15 Oct 2026 16:22:08 +0700</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-34115975.post-8382018557404811020</guid><description>&lt;p&gt;&lt;/p&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;อัปเดตดัชนีแพ็กเกจระบบ&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;span style="color: red;"&gt;sudo apt update&lt;/span&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;ติดตั้ง PostgreSQL และชุดเครื่องมือเสริม (Contrib)&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;span style="color: red;"&gt;sudo apt install -y postgresql postgresql-contrib&lt;/span&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;ตรวจสอบสถานะการทำงานของ Service&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;span style="color: red;"&gt;sudo systemctl status postgresql&lt;/span&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;เข้าระบบด้วย user postgres&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;span style="color: red;"&gt;sudo -i -u postgres&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: red;"&gt;psql&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;/p&gt;&lt;p data-path-to-node="11,1,0"&gt;&lt;b data-index-in-node="0" data-path-to-node="11,1,0"&gt;คำสั่งพื้นฐานใน &lt;code data-index-in-node="16" data-path-to-node="11,1,0"&gt;psql&lt;/code&gt;:&lt;/b&gt;&lt;/p&gt;&lt;ul data-path-to-node="11,1,1"&gt;&lt;li&gt;&lt;p data-path-to-node="11,1,1,0,0"&gt;ตรวจสอบเวอร์ชันและสถานะการเชื่อมต่อ: &lt;code data-index-in-node="37" data-path-to-node="11,1,1,0,0"&gt;\conninfo&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p data-path-to-node="11,1,1,1,0"&gt;แสดงรายชื่อฐานข้อมูล: &lt;code data-index-in-node="22" data-path-to-node="11,1,1,1,0"&gt;\l&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p data-path-to-node="11,1,1,2,0"&gt;ออกจากโปรแกรม: &lt;code data-index-in-node="15" data-path-to-node="11,1,1,2,0"&gt;\q&lt;/code&gt; แล้วพิมพ์ &lt;code data-index-in-node="28" data-path-to-node="11,1,1,2,0"&gt;exit&lt;/code&gt; เพื่อกลับสู่ user ปกติ&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;b&gt;ตั้งรหัสผ่านให้ผู้ใช้ &lt;code data-index-in-node="22" data-path-to-node="11,2,0"&gt;postgres&lt;/code&gt; (เผื่อใช้งานจากภายนอก):&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;blockquote&gt;&lt;span style="color: #2b00fe;"&gt;ALTER USER postgres PASSWORD 'your_secure_password';&lt;/span&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Related&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;https://juuier.blogspot.com/2026/10/shell-postgresql-dump-and-restore.html&lt;/li&gt;&lt;li&gt;https://juuier.blogspot.com/2026/10/postgresql-remote.html&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div id="gtx-trans" style="left: 38px; position: absolute; top: 542px;"&gt;&lt;div class="gtx-trans-icon"&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;Are u sure?&lt;/div&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></item><item><title>PostgreSQL เปิดให้ remote ได้จากเครื่อง อื่นๆ</title><link>http://juuier.blogspot.com/2026/10/postgresql-remote.html</link><author>noreply@blogger.com (juuier)</author><pubDate>Wed, 14 Oct 2026 14:49:42 +0700</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-34115975.post-7368525337342023763</guid><description>&lt;p&gt;&lt;b&gt;ขั้นตอนที่ 1: แก้ไขไฟล์ &lt;code data-index-in-node="24" data-path-to-node="3"&gt;postgresql.conf&lt;/code&gt; เพื่อเปิดรับ IP&amp;nbsp;&lt;/b&gt;&lt;/p&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;หาไฟล์คอนฟิก&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;span style="color: red;"&gt;$ sudo -u postgres psql -c "SHOW config_file;"&lt;/span&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;แก้ไขคอนฟิกตามพาธที่ได้&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;span style="color: red;"&gt;$ sudo nano /etc/postgresql/*/main/postgresql.conf&lt;/span&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;ค้นหาบรรทัด listen_address = 'localhost' ค่าเริ่มต้นจะถูก comment อยู่&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;span style="color: #2b00fe;"&gt;listen_addresses = '*'&lt;/span&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;บันทึกและปิดไฟล์&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;ขั้นตอนที่ 2: แก้ไขไฟล์ &lt;code data-index-in-node="24" data-path-to-node="6"&gt;pg_hba.conf&lt;/code&gt; เพื่ออนุญาตสิทธิ์เข้าใช้งาน&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;ค้นหาที่อยู่ไฟล์ &lt;code data-index-in-node="17" data-path-to-node="7,0,0"&gt;pg_hba.conf&lt;/code&gt;:&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;span style="color: red;"&gt;$ sudo -u postgres psql -c "SHOW hba_file;"&lt;/span&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;เปิดแก้ไข&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;span style="color: red;"&gt;$ sudo nano /etc/postgresql/*/main/pg_hba.conf&lt;/span&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;เลื่อนลงไปล่างสุดของไฟล์ แล้วเพิ่มบรรทัดนี้ลงไป&lt;/li&gt;&lt;li&gt;กรณีให้เข้าได้เฉพาะวง LAN เดียวกัน (ปลอดภัยกว่า):&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;span style="color: #2b00fe;"&gt;host&amp;nbsp; &amp;nbsp; all&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;all&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;192.168.100.0/24&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; scram-sha-256&lt;/span&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;หรือกรณีต้องการเปิดให้ทุก IP เข้ามาได้:&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;span style="color: #2b00fe;"&gt;host&amp;nbsp; &amp;nbsp; all&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;all&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;0.0.0.0/0&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;scram-sha-256&lt;/span&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;(หมายเหตุ: หากเวอร์ชันเดิมใช้รหัสผ่านแบบ &lt;code data-index-in-node="41" data-path-to-node="7,2,1,1,2"&gt;md5&lt;/code&gt; สามารถเปลี่ยนคำว่า &lt;code data-index-in-node="64" data-path-to-node="7,2,1,1,2"&gt;scram-sha-256&lt;/code&gt; ด้านหลังเป็น &lt;code data-index-in-node="91" data-path-to-node="7,2,1,1,2"&gt;md5&lt;/code&gt; ได้)&lt;/li&gt;&lt;li&gt;บันทึกและปิดไฟล์&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;ขั้นตอนที่ 3: รีสตาร์ต PostgreSQL Service&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;span style="color: red;"&gt;$ sudo systemctl restart postgresql&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: red;"&gt;$ sudo systemctl status postgresql&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;ทดสอบ remote connect&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;span style="color: red;"&gt;$ psql -h remote_host_ip -U user1 -d mydb&lt;/span&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;เพิ่มเติม&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;พอร์ตเค้าคือ 5432&amp;nbsp; TCP ตรวจสอบ Firewall ด้วย&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;div id="gtx-trans" style="left: 10px; position: absolute; top: 894px;"&gt;&lt;div class="gtx-trans-icon"&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;Are u sure?&lt;/div&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></item><item><title>เข้า shell PostgreSQL dump and restore</title><link>http://juuier.blogspot.com/2026/10/shell-postgresql-dump-and-restore.html</link><author>noreply@blogger.com (juuier)</author><pubDate>Wed, 14 Oct 2026 14:43:38 +0700</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-34115975.post-3893049115139040525</guid><description>&lt;p&gt;เข้า shell PostgreSQL&lt;/p&gt;&lt;p&gt;Linux&lt;/p&gt;&lt;p&gt;&lt;span style="color: red;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;span style="color: red;"&gt;$ sudo -u postgres psql&lt;/span&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Windows&lt;/p&gt;&lt;p&gt;&lt;span style="color: red;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;span style="color: red;"&gt;&amp;gt; psql -U postgres&lt;/span&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;เราจะได้ shell แบบนี้&lt;/p&gt;&lt;p&gt;&lt;span style="color: #800180;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;span style="color: #800180;"&gt;postgres=#&amp;nbsp;&lt;/span&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;ออกจาก shell&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #800180;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;span style="color: #800180;"&gt;postgres=# \q&lt;/span&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;-- สร้าง user&lt;/p&gt;&lt;p&gt;&lt;span style="color: #800180;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;span style="color: #800180;"&gt;CREATE USER user1 WITH PASSWORD 'your_password';&lt;/span&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;-- สร้างฐานข้อมูลใหม่ชื่อ mydb&lt;/p&gt;&lt;p&gt;&lt;span style="color: #800180;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;span style="color: #800180;"&gt;CREATE DATABASE mydb OWNER user1;&lt;/span&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;-- หรือหากมีฐานข้อมูลเดิมอยู่แล้ว ให้มอบสิทธิ์เข้าถึงทั้งหมด&lt;/p&gt;&lt;p&gt;&lt;span style="color: #800180;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;span style="color: #800180;"&gt;GRANT ALL PRIVILEGES ON DATABASE mydb TO user1;&lt;/span&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;เข้าระบบระบุ db&lt;/p&gt;&lt;p&gt;&lt;span style="color: red;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;span style="color: red;"&gt;$ psql -U user1 -h localhost -d mydb&lt;/span&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Export data&amp;nbsp; จาก remote Server 1 (สั่ง dump ที่ client server 2&amp;nbsp; เลย)&lt;/p&gt;&lt;p&gt;&lt;span style="color: red;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;span style="color: red;"&gt;$ pg_dump -U &amp;lt;postgres_user&amp;gt; -h localhost -d &amp;lt;dbname&amp;gt; -F c -b -v -f &amp;lt;backup_file&amp;gt;.dump&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: red;"&gt;$ pg_dump -U user1 -h remote_host -d mydb -F c -b -b -f mydb.dump&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;span style="color: red;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Restore to server 2&lt;/p&gt;&lt;p&gt;# สร้างฐานข้อมูลเปล่า&lt;/p&gt;&lt;p&gt;&lt;span style="color: red;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;span style="color: red;"&gt;$ createdb -U &amp;lt;postgres_user&amp;gt; -h localhost &amp;lt;dbname&amp;gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;# ทำการ restore ข้อมูล&lt;/p&gt;&lt;p&gt;&lt;span style="color: red;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;span style="color: red;"&gt;$ pg_restore -U &amp;lt;postgres_user&amp;gt; -h localhost -d &amp;lt;dbname&amp;gt; -v &amp;lt;backup_file&amp;gt;.dump&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: red;"&gt;$ pg_restore -U user1 -h localhost -d mydb -v mydb.dump&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;h2&gt;อธิบายแต่ละ Option dump&lt;/h2&gt;&lt;div&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;th&gt;&lt;p&gt;Option&lt;/p&gt;&lt;/th&gt;&lt;th&gt;&lt;p&gt;ชื่อเต็ม&lt;/p&gt;&lt;/th&gt;&lt;th&gt;&lt;p&gt;ทำหน้าที่&lt;/p&gt;&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;&lt;code&gt;pg_dump&lt;/code&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;PostgreSQL Dump&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;คำสั่งสำหรับ Backup ฐานข้อมูล PostgreSQL&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;&lt;code&gt;-U&lt;/code&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;code&gt;--username&lt;/code&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;ระบุ Username ที่ใช้เชื่อมต่อ PostgreSQL&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;&lt;code&gt;&amp;lt;postgres_user&amp;gt;&lt;/code&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;—&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;ชื่อ User เช่น &lt;code&gt;postgres&lt;/code&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;&lt;code&gt;-h&lt;/code&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;code&gt;--host&lt;/code&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;ระบุ Hostname หรือ IP Address ของ PostgreSQL Server&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;&lt;code&gt;localhost&lt;/code&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;—&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;เชื่อมต่อ PostgreSQL ที่เครื่องตัวเอง&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;&lt;code&gt;-d&lt;/code&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;code&gt;--dbname&lt;/code&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;ระบุชื่อ Database ที่ต้องการ Backup&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;&lt;code&gt;&amp;lt;dbname&amp;gt;&lt;/code&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;—&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;ชื่อ Database เช่น &lt;code&gt;mydb&lt;/code&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;&lt;code&gt;-F c&lt;/code&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;code&gt;--format=custom&lt;/code&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;กำหนดรูปแบบไฟล์ Backup เป็น Custom Format ซึ่งใช้กับ &lt;code&gt;pg_restore&lt;/code&gt; ได้&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;&lt;code&gt;-b&lt;/code&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;code&gt;--blobs&lt;/code&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;รวม Large Objects (BLOBs) ไว้ใน Backup&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;&lt;code&gt;-v&lt;/code&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;code&gt;--verbose&lt;/code&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;แสดงรายละเอียดขั้นตอนการ Backup ระหว่างทำงาน&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;&lt;code&gt;-f&lt;/code&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;code&gt;--file&lt;/code&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;ระบุชื่อและตำแหน่งไฟล์ Backup ที่ต้องการบันทึก&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;&lt;code&gt;&amp;lt;backup_file&amp;gt;.dump&lt;/code&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;—&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;ชื่อไฟล์ Backup เช่น &lt;code&gt;mydb_backup.dump&lt;/code&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;p&gt;Ref: by Gemini&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span style="color: red;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;Are u sure?&lt;/div&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></item><item><title>ssh แล้ว WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED server ใหม่ใช้ ip เดิม</title><link>http://juuier.blogspot.com/2026/09/ssh-warning-remote-host-identification.html</link><author>noreply@blogger.com (juuier)</author><pubDate>Tue, 29 Sep 2026 13:16:36 +0700</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-34115975.post-4592243238872880897</guid><description>&lt;p&gt;&lt;span style="color: red;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;span style="color: red;"&gt;&amp;nbsp;$ ssh user@remote_host&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #800180;"&gt;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #800180;"&gt;@&amp;nbsp; &amp;nbsp; WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!&amp;nbsp; &amp;nbsp; &amp;nbsp;@&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #800180;"&gt;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #800180;"&gt;IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #800180;"&gt;Someone could be eavesdropping on you right now (man-in-the-middle attack)!&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #800180;"&gt;It is also possible that a host key has just been changed.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #800180;"&gt;The fingerprint for the ED25519 key sent by the remote host is&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #800180;"&gt;SHA256:xxxxxxxxx7RxS+v+7D/cS380Gp2k42xxxxxxxxxxxxx&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #800180;"&gt;Please contact your system administrator.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #800180;"&gt;Add correct host key in /home/user/.ssh/known_hosts to get rid of this message.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #800180;"&gt;Offending ECDSA key in /home/user/.ssh/known_hosts:14&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #800180;"&gt;&amp;nbsp; remove with:&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #800180;"&gt;&amp;nbsp; ssh-keygen -f '/home/user/.ssh/known_hosts' -R 'remote_host'&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #800180;"&gt;Host key for remote_host has changed and you have requested strict checking.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #800180;"&gt;Host key verification failed.&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;span style="color: #800180;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;ปัญหาคือ server ใหม่ แต่ใช้ ip เดิม key เปลี่ยน สร้าง key ใหม่&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;Solved&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;span style="color: red;"&gt;$ ssh-keygen -R &amp;lt;remote_host&amp;gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;Add&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;ทำการตั้งค่า private key authen&amp;nbsp; ใหม่ กรณี client มี public key อยู่แล้ว และ มี username เดียวกันระหว่าง client กับ remote host นะคับใช้คำสั่งเดียวเลย&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;span style="color: red;"&gt;$ ssh-copy-id username@remote_host&lt;/span&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;b&gt;Related&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;https://juuier.blogspot.com/2021/06/set-remote-ssh-by-public-key.html&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div id="gtx-trans" style="left: -115px; position: absolute; top: 917px;"&gt;&lt;div class="gtx-trans-icon"&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;Are u sure?&lt;/div&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></item><item><title>Ubuntu ดู package version ก่อนจะ apt install</title><link>http://juuier.blogspot.com/2026/09/ubuntu-package-version-apt-install.html</link><author>noreply@blogger.com (juuier)</author><pubDate>Thu, 24 Sep 2026 07:51:28 +0700</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-34115975.post-7917041546674325064</guid><description>&lt;p&gt;&lt;/p&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;ประเด็นคือจะติดตั้ง mysql-server แต่อยากได้ version 8 ไม่แน่จะ&lt;/li&gt;&lt;li&gt;จะตรวจสอบสิ่งที่เรากำลังจะติดตั้งอย่างไร&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #2b00fe;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;span style="color: #2b00fe;"&gt;$ apt-cache policy &amp;lt;package_name&amp;gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Exam&lt;/p&gt;&lt;p&gt;&lt;span style="color: red;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;span style="color: red;"&gt;$ apt-cache policy mysql-server&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #800180;"&gt;mysql-server:&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #800180;"&gt;&amp;nbsp; Installed: (none)&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #800180;"&gt;&amp;nbsp; Candidate: 8.0.46-0ubuntu0.24.04.4&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #800180;"&gt;&amp;nbsp; Version table:&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #800180;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;8.0.46-0ubuntu0.24.04.4 500&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #800180;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 500 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 Packages&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #800180;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 500 http://security.ubuntu.com/ubuntu noble-security/main amd64 Packages&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #800180;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;8.0.36-2ubuntu3 500&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #800180;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 500 http://archive.ubuntu.com/ubuntu noble/main amd64 Packages&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: red;"&gt;$ apt-cache policy mysql-server-8.0&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #800180;"&gt;mysql-server-8.0:&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #800180;"&gt;&amp;nbsp; Installed: (none)&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #800180;"&gt;&amp;nbsp; Candidate: 8.0.46-0ubuntu0.24.04.4&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #800180;"&gt;&amp;nbsp; Version table:&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #800180;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;8.0.46-0ubuntu0.24.04.4 500&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #800180;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 500 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 Packages&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #800180;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 500 http://security.ubuntu.com/ubuntu noble-security/main amd64 Packages&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #800180;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;8.0.36-2ubuntu3 500&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #800180;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 500 http://archive.ubuntu.com/ubuntu noble/main amd64 Packages&lt;/span&gt;&lt;/p&gt;&lt;div&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;Are u sure?&lt;/div&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></item><item><title>ตรวจสอบความถูกต้องของไวยากรณ์ (Syntax Check) nginx apache</title><link>http://juuier.blogspot.com/2026/09/nginx-apache.html</link><author>noreply@blogger.com (juuier)</author><pubDate>Fri, 18 Sep 2026 10:07:10 +0700</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-34115975.post-6085881935050349650</guid><description>&lt;p&gt;Nginx&lt;/p&gt;&lt;p&gt;$ &lt;span style="color: red;"&gt;sudo nginx -t&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Aapche&lt;/p&gt;&lt;p&gt;Ubuntu&amp;nbsp;&lt;/p&gt;&lt;p&gt;$ &lt;span style="color: red;"&gt;sudo apache2ctl -t&lt;/span&gt;&lt;/p&gt;&lt;p&gt;CentOS&lt;/p&gt;&lt;p&gt;$ &lt;span style="color: red;"&gt;sudo apachectl -t&lt;/span&gt;&lt;/p&gt;&lt;p&gt;หรือ&lt;/p&gt;&lt;p&gt;$ &lt;span style="color: red;"&gt;sudo httpd -t&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: red;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;b&gt;MySQL&lt;/b&gt;&lt;p&gt;&lt;span style="color: red;"&gt;$ sudo mysqld --validate-config&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: red;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;h4 data-path-to-node="5"&gt;วิธีดูผลลัพธ์:&lt;/h4&gt;&lt;p&gt;&lt;span style="color: red;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;ul data-path-to-node="6"&gt;&lt;li&gt;&lt;p data-path-to-node="6,0,0"&gt;&lt;b data-index-in-node="0" data-path-to-node="6,0,0"&gt;ถ้าคอนฟิกถูกต้อง 100%:&lt;/b&gt; คำสั่งจะทำงานเสร็จเงียบๆ โดย&lt;b data-index-in-node="51" data-path-to-node="6,0,0"&gt;ไม่แสดงข้อความใดๆ&lt;/b&gt; (Exit code = 0)&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p data-path-to-node="6,1,0"&gt;&lt;b data-index-in-node="0" data-path-to-node="6,1,0"&gt;ถ้ามีข้อผิดพลาด (Syntax Error / พารามิเตอร์ผิด):&lt;/b&gt; จะแสดงข้อความ &lt;code data-index-in-node="63" data-path-to-node="6,1,0"&gt;[ERROR]&lt;/code&gt; ขึ้นมาทันที พร้อมระบุบรรทัดและไฟล์ที่มีปัญหา เช่น:&lt;/p&gt;&lt;response-element class="no-md" ng-version="0.0.0-PLACEHOLDER"&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;code-block _nghost-ng-c3000283895="" class="ng-tns-c3000283895-270 enable-luminous-code-block ng-star-inserted"&gt;&lt;!----&gt;&lt;!----&gt;&lt;div _ngcontent-ng-c3000283895="" class="code-block ng-tns-c3000283895-270 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" data-hveid="0" data-ved="0CAAQhtANahgKEwiB_rTO0oOXAxUAAAAAHQAAAAAQqwQ" decode-data-ved="1" jslog="223238;track:impression,attention;BardVeMetadataKey:W1sicl9hNGZiYWEwM2QwMTY2YmEwIiwiY18xMzFjOGRiN2Y2ZWQxNTE2IixudWxsLCJyY19kMGZiMjExZDE2Zjk3Y2E2IixudWxsLG51bGwsInRoIixudWxsLDEsbnVsbCxudWxsLDEsMF1d"&gt;&lt;!----&gt;&lt;div _ngcontent-ng-c3000283895="" class="formatted-code-block-internal-container ng-tns-c3000283895-270"&gt;&lt;div _ngcontent-ng-c3000283895="" class="animated-opacity ng-tns-c3000283895-270"&gt;&lt;div _ngcontent-ng-c3000283895="" class="code-block-decoration header-formatted gds-emphasized-body-m ng-tns-c3000283895-270 ng-star-inserted"&gt;&lt;span _ngcontent-ng-c3000283895="" class="ng-tns-c3000283895-270"&gt;Plaintext&lt;/span&gt;&lt;div _ngcontent-ng-c3000283895="" class="buttons ng-tns-c3000283895-270 ng-star-inserted"&gt;&lt;gem-icon-button _ngcontent-ng-c3000283895="" _nghost-ng-c2926198288="" aria-describedby="cdk-describedby-message-ng-1-37" arialabel="Download code" cdk-describedby-host="ng-1" class="mat-mdc-tooltip-trigger download-button ng-tns-c3000283895-270 gem-button gem-button-badge-size-small gem-button-size-small gem-button-type-on-surface lm-enabled ng-star-inserted" fonticonname="arrow_circle_down" gemtooltip="Download code" size="small" tabindex="-1" theme="lm" type="onSurface"&gt;&lt;!----&gt;&lt;!----&gt;&lt;button _ngcontent-ng-c2926198288="" aria-label="Download code" class="mdc-icon-button mat-mdc-icon-button mat-mdc-button-base mat-badge mat-unthemed mat-badge-overlap mat-badge-above mat-badge-after mat-badge-small mat-badge-hidden ng-star-inserted" jslog="305704;track:generic_click,impression" mat-ripple-loader-centered="" mat-ripple-loader-class-name="mat-mdc-button-ripple" matbadgeposition="after" maticonbutton=""&gt;&lt;span class="mat-mdc-button-persistent-ripple mdc-icon-button__ripple"&gt;&lt;/span&gt;&lt;gem-icon _ngcontent-ng-c2926198288="" _nghost-ng-c4224566667=""&gt;&lt;mat-icon _ngcontent-ng-c4224566667="" aria-hidden="true" class="mat-icon notranslate lm-icon-l lumi-symbols mat-ligature-font mat-icon-no-color ng-star-inserted" data-mat-icon-name="arrow_circle_down" data-mat-icon-namespace="lumi-symbols" data-mat-icon-type="font" fonticon="arrow_circle_down" role="img"&gt;&lt;/mat-icon&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;/gem-icon&gt;&lt;!----&gt;&lt;span class="mat-focus-indicator"&gt;&lt;/span&gt;&lt;span class="mat-mdc-button-touch-target"&gt;&lt;/span&gt;&lt;span class="mat-ripple mat-mdc-button-ripple"&gt;&lt;/span&gt;&lt;/button&gt;&lt;!----&gt;&lt;!----&gt;&lt;/gem-icon-button&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;gem-icon-button _ngcontent-ng-c3000283895="" _nghost-ng-c2926198288="" aria-describedby="cdk-describedby-message-ng-1-38" arialabel="Copy code" cdk-describedby-host="ng-1" class="mat-mdc-tooltip-trigger copy-button ng-tns-c3000283895-270 gem-button gem-button-badge-size-small gem-button-size-small gem-button-type-on-surface lm-enabled ng-star-inserted" data-test-id="gem-copy-button" fonticonname="copy" gemtooltip="Copy code" size="small" tabindex="-1" theme="lm" type="onSurface"&gt;&lt;!----&gt;&lt;!----&gt;&lt;button _ngcontent-ng-c2926198288="" aria-label="Copy code" class="mdc-icon-button mat-mdc-icon-button mat-mdc-button-base mat-badge mat-unthemed mat-badge-overlap mat-badge-above mat-badge-after mat-badge-small mat-badge-hidden ng-star-inserted" jslog="179062;track:generic_click,impression;BardVeMetadataKey:W1sicl9hNGZiYWEwM2QwMTY2YmEwIiwiY18xMzFjOGRiN2Y2ZWQxNTE2IixudWxsLCJyY19kMGZiMjExZDE2Zjk3Y2E2IixudWxsLG51bGwsInRoIixudWxsLDEsbnVsbCxudWxsLDEsMF1d;mutable:true" mat-ripple-loader-centered="" mat-ripple-loader-class-name="mat-mdc-button-ripple" matbadgeposition="after" maticonbutton=""&gt;&lt;span class="mat-mdc-button-persistent-ripple mdc-icon-button__ripple"&gt;&lt;/span&gt;&lt;gem-icon _ngcontent-ng-c2926198288="" _nghost-ng-c4224566667=""&gt;&lt;mat-icon _ngcontent-ng-c4224566667="" aria-hidden="true" class="mat-icon notranslate lm-icon-l lumi-symbols mat-ligature-font mat-icon-no-color ng-star-inserted" data-mat-icon-name="copy" data-mat-icon-namespace="lumi-symbols" data-mat-icon-type="font" fonticon="copy" role="img"&gt;&lt;/mat-icon&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;/gem-icon&gt;&lt;!----&gt;&lt;span class="mat-focus-indicator"&gt;&lt;/span&gt;&lt;span class="mat-mdc-button-touch-target"&gt;&lt;/span&gt;&lt;span class="mat-ripple mat-mdc-button-ripple"&gt;&lt;/span&gt;&lt;/button&gt;&lt;!----&gt;&lt;!----&gt;&lt;/gem-icon-button&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;/div&gt;&lt;!----&gt;&lt;!----&gt;&lt;/div&gt;&lt;!----&gt;&lt;pre _ngcontent-ng-c3000283895="" class="ng-tns-c3000283895-270"&gt;&lt;code _ngcontent-ng-c3000283895="" class="code-container formatted ng-tns-c3000283895-270" data-test-id="code-content" role="text"&gt;[ERROR] [MY-000067] [Server] unknown variable 'innodb_log_file_size=2G # ควรเป็น...'&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code-block&gt;&lt;/response-element&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;Are u sure?&lt;/div&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></item><item><title>Run and kill process python with crontab Ubuntu 22.04</title><link>http://juuier.blogspot.com/2026/09/run-and-kill-process-python-with.html</link><author>noreply@blogger.com (juuier)</author><pubDate>Wed, 16 Sep 2026 10:03:02 +0700</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-34115975.post-6986017486069943770</guid><description>&lt;p&gt;&lt;span style="color: #800180;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;span style="color: #800180;"&gt;&amp;nbsp;# Job 1: ทำงานทุกวันเวลา 07:00 น. (Kill โพรเซสเดิมถ้ามี แล้วสั่งรันใหม่)&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #800180;"&gt;0 7 * * * pkill -f host_watcher.py; sleep 2; /usr/bin/python3 /home/user1/py_app1.py &amp;gt; /dev/null 2&amp;gt;&amp;amp;1 &amp;amp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #800180;"&gt;# Job 2: ทำงานทุกวันเวลา 21:00 น. (Kill โพรเซสทิ้ง)&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #800180;"&gt;0 21 * * * pkill -f py_app1.py&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;span style="color: #800180;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;ตรวจสอบว่าโพรเซสรันอยู่หรือไม่:&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: red;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;span style="color: red;"&gt;$ pgrep -fl py_app1.py&lt;/span&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;ทดสอบสั่ง Kill ด้วยตนเอง:&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;span style="color: red;"&gt;$ pkill -f py_app1.py&lt;/span&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;Are u sure?&lt;/div&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></item><item><title>ปัญหาเรื่อง Your connection is not private Nginx SSL HTTPS  ในระบบ หน่วยงาน</title><link>http://juuier.blogspot.com/2026/09/your-connection-is-not-private-nginx.html</link><author>noreply@blogger.com (juuier)</author><pubDate>Fri, 4 Sep 2026 14:55:00 +0700</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-34115975.post-7224255363404148711</guid><description>&lt;p&gt;&lt;/p&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;ส่วนมากเข้าได้ปกติ แต่บางครั้งขึ้นแบบนี้ คับ ก็เข้าใจว่าโดน MITM&lt;/li&gt;&lt;li&gt;แต่เข้าไปดู cer info ก็ถูกต้องปกตินิ&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;span style="color: red;"&gt;Your connection is not private&lt;/span&gt;&lt;/p&gt;
Attackers might be trying to steal your information from &lt;strong&gt;domain.com&lt;/strong&gt;&amp;nbsp;(for example, passwords, messages, or credit cards). &lt;a class="font-medium [&amp;amp;&amp;amp;]:underline [&amp;amp;&amp;amp;]:decoration-current [&amp;amp;&amp;amp;]:underline-offset-2 [&amp;amp;&amp;amp;]:hover:no-underline" href="" rel="noopener noreferrer" target="_blank"&gt;Learn more about this warning&lt;/a&gt;&lt;/blockquote&gt;&lt;div&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;ถาม GPT เค้าแนะนำประมาณให้ทำ fullchain.crt&lt;/li&gt;&lt;li&gt;เราทำ nginx และ&amp;nbsp; reverse proxy เข้าไปอีกที&lt;/li&gt;&lt;li&gt;ตั้ง SSL ที่ nginx นี่แหละ linux ด้วย&lt;/li&gt;&lt;li&gt;ได้ไฟล์สำหรับคอนฟิก ssl มา 3 ไฟล์&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;div&gt;&lt;span style="color: #2b00fe;"&gt;DigiCertCA.crt&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #2b00fe;"&gt;wildcard_mydomain.crt&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #2b00fe;"&gt;wildcard_mydomain.key&lt;/span&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;div&gt;&lt;span style="color: #800180;"&gt;อาการนี้มีความเป็นไปได้สูงว่า &lt;strong data-end="68" data-start="30"&gt;Nginx ส่ง certificate chain ไม่ครบ&lt;/strong&gt; ครับ โดยเฉพาะจากข้อมูลที่บอกว่า ได้&amp;nbsp;&lt;strong data-end="127" data-start="117"&gt;3 ไฟล์&lt;/strong&gt; และตอนนี้ Nginx ใช้เฉพาะ wildcard_mydomain&lt;code data-end="174" data-start="153"&gt;.crt&lt;/code&gt; ซึ่งอาจเป็นแค่ server certificate ไม่รวม DigiCert intermediate certificate&lt;/span&gt;&lt;/div&gt;&lt;div&gt;
&lt;p data-end="275" data-start="251"&gt;&lt;span style="color: #800180;"&gt;จุดสำคัญคือไฟล์เหล่านี้:&lt;/span&gt;&lt;/p&gt;
&lt;pre class="overflow-visible! px-0!" data-end="421" data-start="277"&gt;&lt;div class="relative w-full mt-4 mb-1"&gt;&lt;div&gt;&lt;div class="contents"&gt;&lt;div class="relative"&gt;&lt;div class="h-full min-h-0 min-w-0"&gt;&lt;div class="h-full min-h-0 min-w-0"&gt;&lt;div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl"&gt;&lt;div class="h-full w-full border-radius-3xl bg-(--code-block-surface) corner-superellipse/1.1 overflow-clip rounded-3xl [--code-block-surface:var(--bg-elevated-secondary)] dark:[--code-block-surface:var(--composer-surface-primary)] lxnfua_clipPathFallback"&gt;&lt;div class="pointer-events-none absolute end-1.5 top-1 z-2 md:end-2 md:top-1"&gt;&lt;/div&gt;&lt;div class="relative"&gt;&lt;div class="pe-11 pt-3"&gt;&lt;div class="relative z-0 flex max-w-full"&gt;&lt;div class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼd ͼr" dir="ltr" id="code-block-viewer"&gt;&lt;div class="cm-scroller"&gt;&lt;pre class="cm-content q9tKkq_readonly m-0"&gt;&lt;code&gt;&lt;span style="color: #800180;"&gt;wildcard_mydomain.crt       ← Certificate ของเว็บ
wildcard_mydomain.key       ← Private key
DigiCertCA.crt             ← Intermediate CA&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;div&gt;&lt;pre class="overflow-visible! px-0!" data-end="421" data-start="277"&gt;&lt;div class="relative w-full mt-4 mb-1"&gt;&lt;div&gt;&lt;div class="contents"&gt;&lt;div class="relative"&gt;&lt;div class="h-full min-h-0 min-w-0"&gt;&lt;div class="h-full min-h-0 min-w-0"&gt;&lt;div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl"&gt;&lt;div class="h-full w-full border-radius-3xl bg-(--code-block-surface) corner-superellipse/1.1 overflow-clip rounded-3xl [--code-block-surface:var(--bg-elevated-secondary)] dark:[--code-block-surface:var(--composer-surface-primary)] lxnfua_clipPathFallback"&gt;&lt;div class="relative"&gt;&lt;div class="pe-11 pt-3"&gt;&lt;div class="relative z-0 flex max-w-full"&gt;&lt;div class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼd ͼr" dir="ltr" id="code-block-viewer"&gt;&lt;div class="cm-scroller"&gt;&lt;pre class="cm-content q9tKkq_readonly m-0"&gt;&lt;code&gt;&lt;span style="color: #800180;"&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;คุณ GPT ให้ทำ&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: red;"&gt;&lt;/span&gt;&lt;blockquote&gt;&lt;span style="color: red;"&gt;$ sudo cat DigiCertCA.crt wildcard_mydomain.crt &amp;gt; wildcard_mydomain-fullchain.crt&lt;/span&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;div&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;แล้วใช้ config ไฟล์นี้แทน&lt;/li&gt;&lt;li&gt;จากนั้นก็ reload config file&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: red;"&gt;&lt;/span&gt;&lt;blockquote&gt;&lt;span style="color: red;"&gt;$ sudo systemctl reload nginx&lt;/span&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;ระบบยังทำงานได้ปกติ รอด รอดูยาวๆ จะเป็นอีกมั้ย&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;blockquote&gt;&lt;p class="p1" style="font-family: Menlo; font-feature-settings: normal; font-kerning: auto; font-language-override: normal; font-optical-sizing: auto; font-size-adjust: none; font-size: 11px; font-stretch: normal; font-style: normal; font-variant: normal; font-variation-settings: normal; line-height: normal; margin: 0px;"&gt;&lt;span class="s1" style="font-variant-ligatures: no-common-ligatures;"&gt;&lt;span style="color: #ff00fe;"&gt;ssl_certificate /etc/letsencrypt/live/mydomain/wildcard_mydomain-fullchain.crt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p2" style="color: #2eaebb; font-family: Menlo; font-feature-settings: normal; font-kerning: auto; font-language-override: normal; font-optical-sizing: auto; font-size-adjust: none; font-size: 11px; font-stretch: normal; font-style: normal; font-variant: normal; font-variation-settings: normal; line-height: normal; margin: 0px;"&gt;&lt;span class="s1" style="font-variant-ligatures: no-common-ligatures;"&gt;# ssl_certificate /etc/letsencrypt/live/mydomain/wildcard_mydomain.crt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p1" style="font-family: Menlo; font-feature-settings: normal; font-kerning: auto; font-language-override: normal; font-optical-sizing: auto; font-size-adjust: none; font-size: 11px; font-stretch: normal; font-style: normal; font-variant: normal; font-variation-settings: normal; line-height: normal; margin: 0px;"&gt;&lt;span class="s1" style="font-variant-ligatures: no-common-ligatures;"&gt;ssl_certificate_key /etc/letsencrypt/live/mydomain/wildcard_mydomain.key;&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;/p&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;ดูทรงแล้ว ปัญหาน่าจะเกิดจาก DNS หลายตัว ชี้ domain name นี้ไป คนละไอพี เดานะ ไอพีใน หรือ ไปไอพีนอก สลับกัน&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;b&gt;อธิบายเพิ่มโดย Gemini&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;h2 data-path-to-node="1"&gt;คำสั่งนี้ทำไปเพื่ออะไร?&lt;/h2&gt;&lt;p data-path-to-node="2"&gt;การใช้คำสั่ง &lt;code data-index-in-node="13" data-path-to-node="2"&gt;cat&lt;/code&gt; รวมไฟล์แบบนี้ ทำไปเพื่อ &lt;b data-index-in-node="41" data-path-to-node="2"&gt;สร้างความน่าเชื่อถือที่สมบูรณ์ (Chain of Trust)&lt;/b&gt; ให้กับเบราว์เซอร์ของผู้ใช้งานครับ&lt;/p&gt;&lt;p data-path-to-node="3"&gt;อธิบายให้เห็นภาพง่ายๆ คือ:&lt;/p&gt;&lt;ol data-path-to-node="4" start="1"&gt;&lt;li&gt;&lt;p data-path-to-node="4,0,0"&gt;&lt;b data-index-in-node="0" data-path-to-node="4,0,0"&gt;เบราว์เซอร์ของผู้ใช้&lt;/b&gt; (เช่น Chrome, Safari) จะมีความน่าเชื่อถือพื้นฐานที่ฝังมาในเครื่อง เรียกว่า Root CA&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p data-path-to-node="4,1,0"&gt;&lt;b data-index-in-node="0" data-path-to-node="4,1,0"&gt;ใบรับรองเว็บของคุณ&lt;/b&gt; (&lt;code data-index-in-node="20" data-path-to-node="4,1,0"&gt;wildcard_mydomain.crt&lt;/code&gt;) ไม่ได้ถูกออกโดย Root CA โดยตรง แต่ถูกออกโดยคนกลางที่เรียกว่า &lt;b data-index-in-node="104" data-path-to-node="4,1,0"&gt;Intermediate CA&lt;/b&gt; (&lt;code data-index-in-node="121" data-path-to-node="4,1,0"&gt;DigiCertCA.crt&lt;/code&gt;)&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p data-path-to-node="4,2,0"&gt;ถ้า Web Server ของคุณส่งแค่ใบรับรองเว็บ (&lt;code data-index-in-node="41" data-path-to-node="4,2,0"&gt;wildcard_mydomain.crt&lt;/code&gt;) ไปให้เบราว์เซอร์ เบราว์เซอร์บางตัว (โดยเฉพาะในมือถือรุ่นเก่าๆ หรือบางระบบปฏิบัติการ) จะหาทางเชื่อมกลับไปที่ Root CA ไม่เจอ ทำให้มันแจ้งเตือนผู้ใช้ว่า &lt;b data-index-in-node="214" data-path-to-node="4,2,0"&gt;"เว็บนี้ไม่ปลอดภัย (Not Secure)"&lt;/b&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p data-path-to-node="5"&gt;&lt;b data-index-in-node="0" data-path-to-node="5"&gt;การรวมไฟล์ (Bundle)&lt;/b&gt; จึงเป็นการเอาใบรับรองเว็บของคุณและใบรับรองของคนกลางมาต่อกันเป็นไฟล์เดียว เพื่อให้ Web Server (เช่น Nginx หรือ HAProxy) ส่งแพ็กเกจนี้ไปให้เบราว์เซอร์ทีเดียวจบ เบราว์เซอร์จะสามารถตรวจสอบย้อนกลับไปถึง Root CA ได้อย่างไร้รอยต่อครับ&lt;/p&gt;&lt;p data-path-to-node="5"&gt;&lt;br /&gt;&lt;/p&gt;&lt;h2 data-path-to-node="7"&gt;ข้อควรระวังที่สำคัญ: ลำดับไฟล์ของคุณสลับกันอยู่&lt;/h2&gt;&lt;p data-path-to-node="8"&gt;คำสั่งที่คุณระบุมาคือ:
&lt;code data-index-in-node="23" data-path-to-node="8"&gt;sudo cat DigiCertCA.crt wildcard_mydomain.crt &amp;gt; wildcard_mydomain-fullchain.crt&lt;/code&gt;&lt;/p&gt;&lt;p data-path-to-node="9"&gt;&lt;b data-index-in-node="0" data-path-to-node="9"&gt;ลำดับนี้ผิดหลักการของ Web Server ส่วนใหญ่ (เช่น Nginx) ครับ&lt;/b&gt; การต่อไฟล์ Full Chain ที่ถูกต้อง จะต้องให้ &lt;b data-index-in-node="103" data-path-to-node="9"&gt;ใบรับรองของโดเมนเราอยู่บนสุด&lt;/b&gt; แล้วเรียงลำดับลงไปหา Intermediate CA ครับ หากเอา Intermediate ขึ้นก่อน Web Server อาจจะ Error สตาร์ทไม่ขึ้น หรือเบราว์เซอร์อ่านค่าผิดพลาดได้&lt;/p&gt;&lt;p data-path-to-node="10"&gt;&lt;b data-index-in-node="0" data-path-to-node="10"&gt;คำสั่งที่ถูกต้องคือต้องสลับที่กันแบบนี้ครับ:&lt;/b&gt;&lt;/p&gt;&lt;div _ngcontent-ng-c3943669687="" class="code-block ng-tns-c3943669687-17 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" data-hveid="0" data-ved="0CAAQhtANahcKEwjlzYPIvuCWAxUAAAAAHQAAAAAQKQ" decode-data-ved="1" jslog="223238;track:impression,attention;BardVeMetadataKey:W1sicl9iYTA3MDVmNTQ2Yzg4ZmY3IiwiY19lZTQ4ZjVhMDMzMTJlYWM1IixudWxsLCJyY19jODA1MDIwNjQxOGU5NTQ0IixudWxsLG51bGwsInRoIixudWxsLDEsbnVsbCxudWxsLDEsMF1d"&gt;&lt;div _ngcontent-ng-c3943669687="" class="formatted-code-block-internal-container ng-tns-c3943669687-17"&gt;&lt;div _ngcontent-ng-c3943669687="" class="animated-opacity ng-tns-c3943669687-17"&gt;&lt;div _ngcontent-ng-c3943669687="" class="code-block-decoration header-formatted gds-emphasized-body-m ng-tns-c3943669687-17 ng-star-inserted"&gt;&lt;div _ngcontent-ng-c3943669687="" class="buttons ng-tns-c3943669687-17 ng-star-inserted"&gt;&lt;span style="color: red;"&gt;&lt;gem-icon-button _ngcontent-ng-c3943669687="" _nghost-ng-c3667586020="" aria-describedby="cdk-describedby-message-ng-1-34" arialabel="Copy code" cdk-describedby-host="ng-1" class="mat-mdc-tooltip-trigger copy-button ng-tns-c3943669687-17 gem-button gem-button-badge-size-small gem-button-size-small gem-button-type-on-surface lm-enabled ng-star-inserted" data-test-id="gem-copy-button" fonticonname="copy" gemtooltip="Copy code" size="small" tabindex="-1" theme="lm" type="onSurface"&gt;&lt;!----&gt;&lt;!----&gt;&lt;/gem-icon-button&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;/span&gt;&lt;/div&gt;&lt;!----&gt;&lt;!----&gt;&lt;/div&gt;&lt;!----&gt;&lt;pre _ngcontent-ng-c3943669687="" class="ng-tns-c3943669687-17"&gt;&lt;code _ngcontent-ng-c3943669687="" class="code-container formatted ng-tns-c3943669687-17" data-test-id="code-content" role="text"&gt;&lt;span style="color: red;"&gt;sudo cat &lt;/span&gt;&lt;span style="color: #2b00fe;"&gt;wildcard_mydomain.crt&lt;/span&gt;&lt;span style="color: red;"&gt; &lt;/span&gt;&lt;span style="color: #ff00fe;"&gt;DigiCertCA.crt&lt;/span&gt;&lt;span style="color: red;"&gt; &amp;gt; &lt;/span&gt;&lt;span style="color: #38761d;"&gt;wildcard_mydomain-fullchain.crt&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;!----&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p data-path-to-node="5"&gt;&lt;response-element class="no-md" ng-version="0.0.0-PLACEHOLDER"&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;code-block _nghost-ng-c3943669687="" class="ng-tns-c3943669687-17 enable-luminous-code-block ng-star-inserted"&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;/code-block&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;!----&gt;&lt;/response-element&gt;&lt;/p&gt;&lt;p data-path-to-node="12"&gt;เมื่อใช้คำสั่งนี้เสร็จ คุณจะได้ไฟล์ &lt;code data-index-in-node="36" data-path-to-node="12"&gt;wildcard_mydomain-fullchain.crt&lt;/code&gt; และคุณจะใช้แค่ไฟล์นี้ คู่กับไฟล์ Private Key (&lt;code data-index-in-node="114" data-path-to-node="12"&gt;wildcard_mydomain.key&lt;/code&gt;) ไปตั้งค่าใน Web Server ของคุณครับ (ส่วน 2 ไฟล์แรกที่เป็น .crt ไม่ต้องเอาไปคอนฟิกใน Web Server แล้ว)&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p class="p1" style="font-family: Menlo; font-feature-settings: normal; font-kerning: auto; font-language-override: normal; font-optical-sizing: auto; font-size-adjust: none; font-size: 11px; font-stretch: normal; font-style: normal; font-variant: normal; font-variation-settings: normal; line-height: normal; margin: 0px;"&gt;&lt;span class="s1" style="font-variant-ligatures: no-common-ligatures;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;div id="gtx-trans" style="left: 370px; position: absolute; top: 1653.62px;"&gt;&lt;div class="gtx-trans-icon"&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;Are u sure?&lt;/div&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></item><item><title>Session table for CodeIgnitor 4</title><link>http://juuier.blogspot.com/2026/05/session-table-for-codeignitor-4.html</link><author>noreply@blogger.com (juuier)</author><pubDate>Mon, 11 May 2026 20:10:00 +0700</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-34115975.post-680983692615830338</guid><description>&lt;p&gt;&lt;/p&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;Execute sql command&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: red;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;span style="color: red;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: red;"&gt;CREATE TABLE IF NOT EXISTS `ci_sessions` (&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: red;"&gt;&amp;nbsp; &amp;nbsp; `id`&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;varchar(128) NOT NULL,&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: red;"&gt;&amp;nbsp; &amp;nbsp; `ip_address` varchar(45)&amp;nbsp; NOT NULL,&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: red;"&gt;&amp;nbsp; &amp;nbsp; `timestamp`&amp;nbsp; timestamp&amp;nbsp; &amp;nbsp; NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: red;"&gt;&amp;nbsp; &amp;nbsp; `data`&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;blob&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;NOT NULL,&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: red;"&gt;&amp;nbsp; &amp;nbsp; KEY `ci_sessions_timestamp` (`timestamp`)&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: red;"&gt;);&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;span style="color: red;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;ตรวจสอบแก้ไข app/Config/Session.php ถ้ามีไฟล์นี้ใน&lt;/li&gt;&lt;li&gt;CI4 เวอร์ชันใหม่ย้าย config มาไว้ที่นี่&lt;/li&gt;&lt;li&gt;ด้านบนสุดของไฟล์ session.php ต่อจาก namespace Config; เพิ่ม&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;span style="color: #2b00fe;"&gt;&lt;blockquote&gt;use CodeIgniter\Session\Handlers\DatabaseHandler;&lt;/blockquote&gt;&lt;/span&gt;&lt;div&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;และในไฟล์ ให้แก้ไขเป็นประมาณนี้&lt;/li&gt;&lt;/ul&gt;&lt;span style="color: #ff00fe;"&gt;&lt;/span&gt;&lt;blockquote&gt;&lt;span style="color: #ff00fe;"&gt;// public string $driver = FileHandler::class;&lt;/span&gt;&lt;p&gt;&lt;span style="color: red;"&gt;&lt;span class="token token"&gt;public&lt;/span&gt; &lt;span class="token token type-declaration"&gt;string&lt;/span&gt; &lt;span class="token token"&gt;$driver&lt;/span&gt; &lt;span class="token token"&gt;=&lt;/span&gt; &lt;span class="token token scope"&gt;DatabaseHandler&lt;/span&gt;&lt;span class="token token scope"&gt;::&lt;/span&gt;&lt;span class="token token"&gt;class&lt;/span&gt;&lt;span class="token token"&gt;;&lt;/span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;span style="color: #ff00fe;"&gt;    // public string $savePath = WRITEPATH . 'session';&lt;/span&gt;&lt;p&gt;&lt;span style="color: red;"&gt;&lt;span class="token token"&gt;public&lt;/span&gt; &lt;span class="token token type-declaration"&gt;string&lt;/span&gt; &lt;span class="token token"&gt;$savePath&lt;/span&gt; &lt;span class="token token"&gt;=&lt;/span&gt; &lt;span class="token token single-quoted-string"&gt;'ci_sessions'&lt;/span&gt;&lt;span class="token token"&gt;;&lt;/span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;span style="color: #ff00fe;"&gt;    // public ?string $DBGroup = null;&lt;/span&gt;&lt;p&gt;&lt;span style="color: red;"&gt;&lt;span class="token token"&gt;public&lt;/span&gt; &lt;span class="token token type-declaration"&gt;string&lt;/span&gt; &lt;span class="token token"&gt;$DBGroup&lt;/span&gt;  &lt;span class="token token"&gt;=&lt;/span&gt; &lt;span class="token token single-quoted-string"&gt;'default'&lt;/span&gt;&lt;span class="token token"&gt;;&lt;/span&gt; &lt;span class="token token"&gt;// ชื่อ db group ใน Database.php&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;-------------------------------------------------------------------------&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;CI4 อันเก่าก็ให้แก้ที่ app/Config/App.php&amp;nbsp;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;// ถ้าพบบรรทัดนี้ให้ เปลี่ยนบรรทัดนี้ (ต่อจาก namespace)&lt;/p&gt;&lt;p&gt;&lt;span style="color: #800180;"&gt;use CodeIgniter\Session\Handlers\FileHandler;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;// เป็น&lt;/p&gt;&lt;p&gt;&lt;span style="color: #2b00fe;"&gt;use CodeIgniter\Session\Handlers\DatabaseHandler;&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;// เปลี่ยน sessionDriver&lt;/p&gt;&lt;p&gt;&lt;span style="color: red;"&gt;public string $sessionDriver = DatabaseHandler::class;&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;p&gt;// เปลี่ยน sessionSavePath เป็นชื่อ table&lt;/p&gt;&lt;p&gt;&lt;span style="color: red;"&gt;public string $sessionSavePath = 'ci_sessions';&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;ul&gt;&lt;li&gt;หรือ ถ้าไม่พบ use CodeIgniter\Session\Handlers\FileHandler; เราอาจจะพบด้านล่างนี้แทน&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;span style="color: #04ff00;"&gt;&lt;span style="font-family: Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; white-space: pre;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;span style="color: #800180;"&gt;&lt;span style="font-family: Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; white-space: pre;"&gt;// public $sessionDriver = 'CodeIgniter\Session\Handlers\FileHandler';&lt;/span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;span style="color: #2b00fe;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;span style="color: #2b00fe;"&gt;public $sessionDriver = 'CodeIgniter\Session\Handlers\DatabaseHandler';&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: red;"&gt;&lt;span class="token token"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;div id="gtx-trans" style="left: 25px; position: absolute; top: 1062.6px;"&gt;&lt;div class="gtx-trans-icon"&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;Are u sure?&lt;/div&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></item><item><title>Hacked Axios 1.14.1 &amp;&amp; 0.30.4 และ ตรวจสอบ version axios ใน nodejs project ใน Docker container</title><link>http://juuier.blogspot.com/2026/04/version-axios-nodejs-project-docker.html</link><author>noreply@blogger.com (juuier)</author><pubDate>Sun, 5 Apr 2026 14:56:00 +0700</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-34115975.post-1722938138888547341</guid><description>&lt;p&gt;&lt;b&gt;Ref:&amp;nbsp;https://www.blognone.com/node/150163&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;ประเด็นคือ&amp;nbsp; axios โดยวาง trojan ไว้ ซึ่งมันจะทำงานเมื่อ axios ที่ติด malware ทำงานมันจะติดตั้ง plain-crypto-js เพิ่มเข้าไป ใน projecct และ แล้วไปควานหาข้อมูลที่สำคัญทุกอย่างใน .env แล้วส่งข้อมูลออกไปให้ ผู้ไม่ประสงค์ดี&amp;nbsp;&lt;span style="color: red;"&gt;remote access trojan (RAT) &lt;/span&gt;นำไปใช้เจาะระบบท่านต่อไป และมันจะถอน lib plain-crypto-js ออกไปแบบเนียนๆ เลย&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;axios ที่โดน version 1.14.1 และ 0.30.4&lt;/li&gt;&lt;li&gt;เราจะตรวจสอบใน&amp;nbsp; container เราอย่างไรล่ะทีนี้&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;b&gt;Solved&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;วิธีแรกรันจาก host แม่ได้เลย&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;span style="color: red;"&gt;$ docker exec mynode_name_container npm ls axios&lt;/span&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;วิธ๊ที่สอง เข้าไปใน&amp;nbsp; container ก่อนแล้วรันคำสั่งและ exit ออกมา&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: red;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;span style="color: red;"&gt;$ docker &lt;span class="hljs-built_in"&gt;exec&lt;/span&gt; -it mynode_name_container sh&lt;/span&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;แล้วรันคำสั่งตรวจสอบ ใน container ต่อได้โดย&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: red;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;span style="color: red;"&gt;# npm ls axios&lt;/span&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;span style="color: #04ff00;"&gt;/usr/src/app # npm ls axios&lt;br /&gt;nodeslide@1.0.0 /usr/src/app&lt;br /&gt;`-- axios@1.xx.2&lt;/span&gt;&lt;/blockquote&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;แบบนี้รอดคับ&lt;/li&gt;&lt;li&gt;หรือ yarn โดย&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: red;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;span style="color: red;"&gt;# yarn list --pattern axios&lt;/span&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;วิธีที่สามลองตรวจสอบดูว่า โปรเจคมี plain-crypto-js ติดตั้งไว้หรือไม่&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: red;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;span style="color: red;"&gt;# npm ls plain-crypto-js&lt;/span&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;ถ้าผลลัพธ์ได้ -- (empty) ก็โชคดีไป&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;กรณีโดนแล้ว&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;&lt;span style="color: #04ff00;"&gt;ให้ไป revoke token key ของ บริการที่เราเรียกใช้ใน project ที่มีใน .env ก่อนเลย แล้ว invoke&amp;nbsp; ใหม่&lt;/span&gt;&lt;/li&gt;&lt;li&gt;จากนั้น ไปแก้ไข package.json แล้ว แก้ axios version&amp;nbsp; ไปใช้ตัวใหม่ล่าสุด ที่ไม่ใช่&amp;nbsp;1.14.1 และ 0.30.4&amp;nbsp; แล้วบันทึกไฟล์ให้เรียบร้อย&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: red;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;span style="color: red;"&gt;sudo nano ./package.json&lt;/span&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;ลบ folder ชื่อ node_mudules และ ไฟล์ package.lock.json ออก&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: red;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;span style="color: red;"&gt;sudo rm -rf ./node_modules &amp;amp;&amp;amp; sudo rm ./package.lock.json&lt;/span&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;แล้วติดตั้ง lib ใหม่&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: red;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;span style="color: red;"&gt;sudo npm install&lt;/span&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;Are u sure?&lt;/div&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></item><item><title>ติดตั้ง Android Studio + Flutter แบบ  snap สำหรับ Ubuntu 24.04</title><link>http://juuier.blogspot.com/2026/04/android-studio-flutter-snap-ubuntu-2404.html</link><author>noreply@blogger.com (juuier)</author><pubDate>Sun, 5 Apr 2026 14:00:00 +0700</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-34115975.post-7438282944333907774</guid><description>&lt;p&gt;&lt;/p&gt;&lt;div&gt;&lt;b&gt;Android&lt;/b&gt;&lt;/div&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;ติดตั้ง Android Studio (Ubuntu 24.04 มันจะได้&amp;nbsp;Android Studio Narwhal 3 Feature Drop | 2025.1.3 ถ้าอยากได้ panda ต้อง download ติดตั้งผ่าน .tar.gz เอง แบบ manual)&lt;/li&gt;&lt;li&gt;ติดตั้งผ่าน snap&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;span style="color: red;"&gt;sudo apt update&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: red;"&gt;sudo snap install android-studio --classic&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;เพิ่ม user เราเพื่อรัน emulator&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;span style="color: red;"&gt;sudo adduser $USER kvm&lt;/span&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;Flutter&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;ติดตั้ง Flutter SDK (วิธีที่ง่ายที่สุด)&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;span style="color: red;"&gt;sudo snap install flutter --classic&lt;/span&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;ตั้งค่า Android Toolchain&lt;/li&gt;&lt;li&gt;หลังจากลง Flutter เสร็จแล้ว คุณต้องเชื่อมต่อ Flutter เข้ากับ Android Studio ที่เพิ่งลงไป:&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;span style="color: red;"&gt;flutter doctor --android-licenses&lt;/span&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;ถ้ารันคำสั่งนี้ได้ผลลัพธ์ประมาณนี้&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;span style="color: #800180;"&gt;Android sdkmanager not found. Update to the latest Android SDK and ensure that the cmdline-tools are installed to resolve this.&lt;/span&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;&lt;span style="color: #ffa400;"&gt;ให้เราติดตั้ง Command-line Tools ผ่าน Android Studio&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color: #ffa400;"&gt;เปิดโปรแกรม Android Studio&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color: #ffa400;"&gt;ไปที่ Settings (ถ้าอยู่ที่หน้า Welcome ให้คลิก More Actions หรือถ้าเปิดโปรเจกต์อยู่ให้ไปที่ File &amp;gt; Settings)&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color: #ffa400;"&gt;ไปที่หัวข้อ Languages &amp;amp; Frameworks &amp;gt; Android SDK&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color: #ffa400;"&gt;คลิกที่แถบ SDK Tools (อยู่ข้างๆ SDK Platforms)&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color: #ffa400;"&gt;มองหารายการที่ชื่อว่า Android SDK Command-line Tools (latest)&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color: #ffa400;"&gt;ติ๊กถูกที่หน้าช่องนั้น แล้วกด Apply หรือ OK เพื่อเริ่มการดาวน์โหลดและติดตั้ง&lt;/span&gt;&lt;/li&gt;&lt;li&gt;รันคำสั่งยอมรับ License อีกครั้ง&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;span style="color: red;"&gt;flutter doctor --android-licenses&lt;/span&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;เช็กความเรียบร้อยครั้งสุดท้าย&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;span style="color: red;"&gt;flutter doctor&lt;/span&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;ติดตั้งเครื่องมือเสริมสำหรับ Linux (optional)&lt;/li&gt;&lt;li&gt;เนื่องจาก Ubuntu 24.04 เป็นระบบที่เน้นการพัฒนา Desktop app ด้วย คุณต้องลง library เหล่านี้เพื่อให้ Flutter ทำงานได้ครบถ้วน:&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;span style="color: red;"&gt;sudo apt update&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: red;"&gt;sudo apt install clang cmake ninja-build pkg-config libgtk-3-dev liblzma-dev libstdc++-12-dev&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;เพิ่มเติม&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;หากติดตั้งแล้วยังใช้ไม่ได้ อาจเป็นเพราะ Flutter หาตำแหน่ง SDK ไม่เจอ ให้คุณลองรันคำสั่งนี้ใน Terminal เพื่อระบุ Path (ปกติ Android Studio จะลงไว้ที่นี่ครับ):&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;span style="color: red;"&gt;flutter config --android-sdk ~/Android/Sdk&lt;/span&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;/p&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;Dell Inspiron 14 5000 series เรารัน emulator android ไม่ขึ้นหว่า รันผ่าน physical device สาย usb ใน debug mode เท่านั้นหว่า&amp;nbsp;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div id="gtx-trans" style="left: -45px; position: absolute; top: 1191px;"&gt;&lt;div class="gtx-trans-icon"&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;Are u sure?&lt;/div&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></item></channel></rss>