Thursday, November 20th, 2008

เมื่อคืนกะว่าจะเอาโค้ดขึ้นเซอร์ฟเวอร์อีกรอบหลังจากมันหายไปเพราะลงเครื่องใหม่ นั่งลงไปลงมา เลยอยากลองของซะหน่อย svn มันไม่สะใจใช้ git ละกันปรากฏว่าทำมันทั้งคืนเจอปัญหานู่นนี่จนกว่าจะเสร็จเช้านี้ -_-” ทำเสร็จขอเขียนวิธีเก็บไว้เป็นที่ระทึกหน่อยว่ามันสาหัสต่างจาก svn ขนาดไหน
เริ่มจากเตรียม Apache ก่อนแต่จริงๆ ที่ลงไปก็ลงไปพร้อมอยู่แล้วอ่ะนะจาก svn แต่ถ้าใครยังไม่ได้เตรียมก็ลงตามด้านล่างก่อนละกัน

  1. เริ่มจากลง mod_dav และ mod_dav_fs ก่อน(เอ๊ะ หรือมันมาพร้อมกันไม่แน่ใจ) ถ้าจำไม่ผิดมันจะมีให้เลือกตอนติดจาก port เลยแต่ถ้าเป็น Ubuntu คิดว่าง่ายกว่านั้น apt-get install mod_dav หรือป่าวหว่าแป๊บเดียวก็เสร็จ ส่วนแมคอื่มช่างมันละกัน(จริงๆ คือไปจิ๊ก FreeBSD เอามาใส่เลยก็ได้ ^^!)
  2. จากนั้นกำหนดล๊อกไฟล์ของ DAV ว่าจะให้เป็นไฟล์ในใน httpd.conf
    DavLockDB "/usr/local/var/DavLock"
    

    ด้านบนนี่ใช้ของดั้งเดิมที่แถมมาให้หลังจากติดจาก port ขี้เกียจแก้

  3. เตรียมไฟล์ที่เก็บรายชื่อคนที่เข้ามาใช้ได้ และก็รหัสผ่าน เอาแบบง่ายๆ นะ
    htpasswd -c /path/to/password/file username

    จากนั้นมันจะถามรหัสผ่านก็ใส่ซะ

  4. กำหนด URL ที่จะให้ใช้ผ่านเว็บได้พร้อมกับกำหนดให้ URL นั้นสามารถใช้ DAV ได้
    Alias /project.git /path/to/repository
     
    <Location /project.git>
      #กำหนดให้ URL นี้สามารถใช้ webdav เข้ามาดูได้
      DAV on
     
      #จะเข้ามาดูได้ต้องตรวจสอบกันหน่อย(อยากได้พิศดาร ก็ไปหาดูในเว็บ Apache ละกัน)
      AuthType Basic
      AuthName Project name
      AuthUserFile /path/to/password/file
     
      #จะเข้ามาที่ URL นี้ได้ต้องมีรายชื่ออยู่ใน AuthUserFile (ถ้าอยากให้เข้ามาดูได้แต่ไม่สามารถแก้ไขได้ก็ใส่ <LimitExcept> ไป แต่ขี้เกียจเขียน ยาว
      require valid-user
    </Location>
  5. สั่ง Apache เริ่มใหม่ซักหนึ่งรอบแล้วลองเข้าไปที่ URL ที่ใส่ไว้ดูด้วยโปรแกรมที่ใช้ webdav ได้(อย่าง Finder Cyberduck หรือจะเอาแบบพื้นๆ ก็ Telnet เข้าไปแล้วใช้ PROPFIND ลองเรียกดู ถ้าได้ก็ผ่าน)

เอาหละจบไปหนึ่งส่วนต่อไปก็ถึงตา git จริงๆ ส่วนนี้ไม่ค่อยมีอะไร(หรือป่าว -_-”) ลองดูละกัน

  1. เริ่มจากไปที่ตำแหน่งที่จะเอาไว้เก็บโค้ดที่ฝั่ง server แล้วสั่ง init repository ซะ
    $git init --bare
    

    ที่ใส่ bare เพราะว่าตำแหน่งนี้เราไม่ได้ไว้ใช้ทำงานมีแต่ config ล้วนๆ เพราะงั้นไม่ต้องเอาไปซ่อน สร้างมันตรงนี้เลย
    เพิ่มเติม: หลังจาก init bare เสร็จต้องสั่ง git update-server-info ด้วยอีกรอบเพื่อให้มันสร้าง refs ในแฟ้ม info ไม่งั้น push เข้ามาไม่ได้

  2. ที่ฝั่งไคลเอ็นท์ไปที่ตำแหน่งของโปรเจคจากนั้นก็สั่ง init เหมือนกันพร้อมกับเอาไฟล์ยัดใส่ไปในนั้นให้พร้อม
    $cd /path/to/project
    $git init
    $git add .
    $git commit
    
  3. หลังจากได้ git ที่ฝั่งไคลเอ็นท์แล้วจับมันส่งมาที่ฝั่งเซิร์ฟเวอร์ซะ
    $git push user@server:/path/to/repository master -f
    

    ไอ้ขั้นนี้แหละทำแสบมาก หาต้ังนานเพราะว่า webdav มันดันไม่สามารถสร้าง branch ให้ได้แล้วไอ้ branch master มันก็ไม่สร้างแต่แรกให้ไม่รู้ทำไมต้องใช้ ssh ส่งเข้ามาก่อนพร้อมขืนใจให้มันสร้างให้
    เพิ่มเติม: พลาดเองจากตอนกำหนด DavLock ใน Apache ครับคือถ้ากำหนดถูก Apache สามารถสร้าง lock ได้ขั้นนี้ก็ไม่ต้อง

  4. หลังจากนั้นเวลาแก้ไขไฟล์อะไร พอต้องการ merge รวมกับฝั่งเซิร์ฟเวอร์ก็ใช้คำสั่ง
    $git config remote.upload.url http://username@host/location
    $git push upload master
    

    คำว่า master สามารถเปลี่ยนได้แล้วแต่ branch ที่เราจะยัด ส่วนบรรทัดแรกเป็นการกำหนดตำแหน่งของ repository ซึ่งถ้าไปหาในเว็บทั้งหลายแหล่ มันดันมี - อยู่ระหว่าง git กับ config คาดว่าเป็นรุ่นเก่า หลังจากนี้ repository ในเครื่องเรากับเซิร์ฟเวอร์ก็จะเหมือนกันหละ

โอ่ถึงตัวสุดท้ายกันเสียที อันนี้เหมือนจะไม่ยากแต่ต้องไปแก้โค้ดนิดหน่อยเพื่อให้มันใช้ได้(ก็หวังว่าปลั๊กอินรุ่นใหม่ออกมาจะไม่ต้องแก้นะ)

  1. ติดตั้ง Trac ซักที่ด้วยคำสั่ง
    $trac-admin /path/to/trac initenv
    
  2. จากนั้นไปเอา GitPlugins มาพร้อมกับขยาย
  3. แก้ไขไฟล์ tracext/git/PyGIT.py บรรทัดที่ 316 เป็น
    #assert all(e is not None for e in self.__rev_cache)

    (เอามันออกนั่นแหละ ^^!)

  4. สั่งมันติดตั้งซะ
    $python setup.py install
    
  5. แก้ไข config ของ Trac
    repository_dir = /path/to/repository
    repository_type = git
    

    จากนั้นลองเข้า Trac ผ่านหน้าเว็บดูก็น่าจะได้หละ

ขั้นตอนแค่นี้แหละ ไม่ยาวใช่มะๆ หามันทั้งคืนเลย -_-!!! เห้อไม่น่าลองของแปลกเลย แต่จะทำครึ่งๆ กลางๆ ซะก็ยังไงอยู่ ทำจนเสร็จจนได้หละ
อ้างอิง:

Friday, October 17th, 2008

อาทิตย์นี้ทั้งอาทิตย์วุ่นๆ ทั้งอาทิตย์เพราะจัดการแฟ้มๆ ต่างๆ ในเซิร์ฟเวอร์ใหม่หมดจากเดิมที่ข้อมูลโดเมนและเว็บแต่ละคนจะอยู่ในแฟ้มบ้านแต่ละคนตอนนี้ย้ายมาอยู่ที่เดียวกัน แล้วคนที่เข้ามาแก้ไขข้อมูลก็อยู่ในแฟ้มโดเมนนั้นไปเลย ไม่ให้ออกมาเพ่นพ่านแฟ้มคนอื่น ตอนแรกก็คิดว่ามันคงไม่ยากอะไร เพราะตั้งใจจะย้ายไปใช้ Lighttpd แต่ปรากฏว่ามันดันใช้ .htaccess เพื่อแก้ url แบบ Apache ไม่ได้พวกค่่าต่างๆ ที่ใช้ใน Wordpress และโปรแกรมอื่นๆ พังหมด -_-” พยายามหาทางแก้ข้ามวันข้ามคืนว่า Lighttpd มีทางออกที่ดีกว่าไปเขียน url ใหม่ที่เป็นแบบ Lighttpd โดยเฉพาะหรือป่าว ก็ไม่มีสุดท้ายเลยยอมแพ้ กลับมาใช้ Apache เหมือนเดิม
ที่อยากใช้ Lighttpd มากเพราะนอกจากมันเบาแล้วมันยังมีอุปกรณ์เสริมอีกตัวนึงที่อยากได้ใน Apache แต่ดันไม่มี(จริงๆ เหมือนจะมีแต่กำหนดได้งี่เง่ามาก) นั่นคือ mod_evhost เนื่องจากเซิร์ฟเวอร์ที่ดูแลอยู่มันยังไม่มีโปรแกรมที่ใช้ควบคุมเหมือนคนอื่น(พวก Direct Admin, Plesk, cPanel ไรพวกนั้นหนะ) ด้วยเหตุผลว่าจะทำเอง(จนพวกนั้นมันแพง -_-”) ก็เลยต้องหาทางให้แก้ไขไฟล์ต่างๆของเซิร์ฟเวอร์ให้น้อยที่สุด จะได้ไม่ต้องไปรีโหลด หรือเปิดปิดเว็บเซิร์ฟเวอร์บ่อยๆ แล้วโมดูลตัวนี้มันสามารถกำหนดโดยใช้พวก %1 … ต่างๆได้เพื่อกำหนดไปว่าถ้ามีคนเปิดเว็บโดเมนนี้ จะไปอ่านที่แฟ้มไหน โดยไม่ต้องไปเพิ่มไฟล์เพื่อให้เซิร์ฟเวอร์รู้เลย ซึ่ง Apache มันก็มีชื่อว่า mod_vhost_alias แต่มันไม่ฉลาดเท่านี่สิ เช่น ถ้าผมมีโดเมน example.com แล้วมี subdomain sub1 ถ้าใช้ mod_evhost ก็แค่บอกว่า /path/to/www/%0/%3 แต่ถ้าเป็น Apache กลายเป็นว่าต้องใส่ /path/to/www/%2+/%1 แล้วถ้าเข้า example.com Apache ก็จะงี่เง่าทันทีเพราะ %2+ ของมันนับตั้งแต่ com เป็นต้นไปแทน หรือไม่งั้นก็ต้องไปใช้ mod_rewrite กำหนด url เอาเองแต่วิธีกำหนดมันก็ไม่ง่ายเท่า mod_evhost อ่ะเห้อ
ตอนนี้ก็เลยปรับ Apache ให้เหมือนเดิมเกือบทุกอย่างไว้มีเวลาทดลองอะไรแปลกๆ จะเอาใหม่ แล้วก็จะทำ DNS server เองและ หลังจากที่ไปใช้ของคนอื่นอยู่เสียนาน เพราะว่าอัพเดทแล้วมันต้องแก้สองที่ เอามารวมอยู่ที่เดียวนี่แหละ จะได้ไม่ต้องปวดหัว สงสัยต้องทำ Control panel ให้เป็นรูปเป็นร่างเร็วๆ ซะแล้ว

Thursday, August 28th, 2008

ทำไว้เมื่อสองหรือสามอาทิตย์ก่อนไม่แน่ใจแต่ไม่ได้จดไว้ เดี๊ยวลืมวันนี้ว่างๆ เลยจดไว้ซะหน่อย(ว่างจริงหรอฟะ) สำหรับปัญหาที่ทำให้ต้องติดก็คือ เวลามีคนมาโหลดไฟล์ใหญ่ๆ จากเซิร์ฟเวอร์มากๆ เนี๊ยะเว็บเซิร์ฟเวอร์ที่แสนดีอย่าง Apache มันก็จะอืดลงไปทันตาเห็น คือเข้าเว็บที่เป็น php ธรรมดากว่าจะประมวลผลแล้วส่งกลับมาต้องรอเป็นนาที ไม่รู้มันทำอะไรของมัน แต่จะทิ้งไว้ก็ใช่ที่ ฉะนั้นอย่ารอช้าเลย เอาพวกไฟล์ใหญ่ๆ เหล่านี้ย้ายไปให้ lighttpd ทำแทนดีกว่า มันตายไปตัวหลักก็ยังรอดด้วย(แต่เท่าที่เห็น มันไม่เคยตายเลยแฮะ ทนกว่า Apache อีก -_-”)

อ้อสำหรับใครที่ยังไม่รู้ว่าผมทำอะไร ทำไมมันถึงมีไฟล์ขนาดใหญ่ จริงๆ แล้วเซิร์ฟเวอร์นี้มีโดเมนย่อยอยู่อันนึงไว้เป็นที่ดาวโหลดลินุกซ์(และอื่นๆ อีกมากมายสำหรับเขียนโปรแกรม) เก็บไว้อยู่ด้วย ใครอยากดูหรืออยากโหลดก็เข้าไปที่ http://mirror.nytes.net ได้หรืออยากให้เพิ่มอะไรที่ไม่เถื่อนก็บอกมาละกัน ถ้าพื้นที่ยังเพียงพอก็จะพยายามยัดเข้าไปให้

อ่าวบ่นเยอะและเขียนวิธีทำบ้างดีกว่า

  1. เริ่มจากติด lighttpd ก่อนโดยไปที่ /usr/port/www/lighttpd แล้วก็​ make install ธรรมดาอันนี้ไม่มีอะไรพิเศษ
  2. ไปที่ /usr/port/www/apache22 แล้ว make config จากนั้นเลือก mod_proxy, mod_proxy_connect และ mod_proxy_http เพิ่มแล้วก็เลือก ok ออกไป
  3. สั่ง make deinstall install -DFORCE_PKG_REGISTER เพื่อขืนใจให้มันลงใหม่ให้ จริงๆเกิดจากเปลี่ยน mpm ด้วยแต่ก่อนใช้ prefork ตอนนี้เปลี่ยนเป็น worker มันเลยไม่ยอมเชื่อฟังจนถึงบัดนี้เลยแฮะ
  4. แก้ไฟล์ httpd.conf โดยเพิ่มบรรทัดด้านล่างลงไป
    LoadModule proxy_module libexec/apache22/mod_proxy.so
    LoadModule proxy_connect_module libexec/apache22/mod_proxy_connect.so
    LoadModule proxy_http_module libexec/apache22/mod_proxy_http.so
    
  5. จากนั้นไปแก้ไฟล์ที่เก็บข้อมูล virtual host ต่างๆ ให้บอกว่า path ไหนจะส่งไปที่ไหนแทน อย่างที่ใช้อยู่นี่จะให้ใครก็ตามที่เรียกมาที่ mirror.nytes.net จะส่งไปที่ lighttpd แทนไม่ให้ apache ทำงานก็เลยไปแก้ vhost ของ domain nytes.net โดยเพิ่มบรรทัดด้านล่างไป
    
      ServerName mirror.nytes.net
      ProxyRequests Off
      ProxyPreserveHost On
      ProxyPass / http://localhost:81/
    
    
  6. reload apache รอบนึงแล้วรอดูผลงาน