Monday, March 31, 2025

Move Codeigniter 4 project to Container Docker get Class "Locale" not found

  • ย้าย CI4 site project จาก physical สู่ container docker
  • ทำ alias name reverse proxy apache เรียบร้อย
  • รันโปรเจค error (env developement mode)

Solved

  • ติดตั้ง php extension ใน container เราด้วย Dockerfile
  • ตัวอย่าง Dockerfile จาก Gemini

FROM php:7.4-apache


# Install necessary extensions and dependencies

RUN apt-get update && apt-get install -y \

    libzip-dev \

    zip \

    unzip \

    libicu-dev \  # Required for intl

    && docker-php-ext-install zip intl


# Copy your CodeIgniter 4 application

COPY . /var/www/html/


# Set document root

RUN a2enmod rewrite

RUN sed -i 's!/var/www/html!/var/www/html/public!g' /etc/apache2/sites-available/000-default.conf


# Restart Apache

RUN service apache2 restart


# Expose port 80

EXPOSE 80

  • ส่วนอันนี้ตัวอย่างของเรา Dockerfile

FROM php:7.4-apache

# Install PHP extensions
RUN docker-php-ext-install pdo pdo_mysql mysqli
# RUN a2enmod rewrite

# Copy the custom php.ini file
#COPY php.ini /usr/local/etc/php/
#RUN a2enmod rewrite && apache2-foreground
#RUN service apache2 restart

# Use the official PHP-Apache image from Docker Hub
#FROM php:8.1-apache

# Install dependencies if needed
RUN apt-get update && apt-get install -y \
    libpng-dev \
    libjpeg-dev \
    libfreetype6-dev \
    libzip-dev \
    zip \
    unzip \
    libicu-dev \ 
    && docker-php-ext-configure gd --with-freetype --with-jpeg \
    && docker-php-ext-install gd zip intl
# Required for intl
# libicu-dev
# Enable Apache modules, including mod_rewrite
#RUN a2enmod rewrite

  • สั่ง build image ใหม่ก่อน run จาก image อันใหม่ (ใส่ --build ถ้าไม่ใส่มันจะเรียกใช้ image จาก cache ที่โหลดไว้แล้วในเครื่องนั้นๆ)

# docker-compose up -d --build

เพิ่มเติม

  • ตัวอย่าง reverse proxy apache2 alias 


ProxyPass /mysite/ http://ip:port/

ProxyPassReverse /mysite/ http://ip:port/

ProxyPreserveHost On

RequestHeader set X-Forwarded-Proto "https"

RequestHeader set X-Forwarded-For %{REMOTE_ADDR}s

  • แก้ไขโค้ดบางอัน CI4

return redirect()->to("/"); => return redirect()->to(base_url("/home"));


Monday, February 17, 2025

ทบทวน export & import file.sql จาก docker container server1 ไป docker container server2

server 1 export db ที่ parent host terminal

$ sudo docker exec mycontainer_mysql mysqldump -u myuser -pmypassword mydb > ./dbfile.sql

server 2 import db ที่ parent host terminal

$ sudo scp -r user@server1:/path/dbfile.sql ./

$ sudo docker exec -i mycontainer_mysql2 mysql -umyuser -pmypassword mydb2 < ./dbfile.sql

Related

  • https://juuier.blogspot.com/2024/09/wordpress-site-sub-https-domain-name.html 

Tuesday, January 21, 2025

เพิ่ม Host SNMP Linux สำหรับทำการ Monitor ใน zabbix


  • Configuration => Hosts => Create Host


  • tab Host 
  • ใส่ Host name เป็น ip เครื่องที่เปิด snmp service ไว้แล้ว หรือ ชื่อที่สื่อสารเราเองว่าคือ device อะไร
  • Groups ก็ให้อยู่ใน Linux Server แล้วกัน  หรือ สร้าง group ใหม่ก็ได้

  • Interfaces เลือกเป็น SNMP 
  • SNMP ใส่ ip เครื่องที่ให้บริการ snmp service 
  • SNMP version เลือก เป็น SNMPv2
  • SNMP Community ใส่เป็น ค่าที่ตั้งไว้ที่  เครื่องที่ให้บริการ snmp service 

  • tab Templates เลือก Linux SNMP OID template ที่มีอยู่แล้วใช้เลยแล้วกัน
  • สุดท้ายคลิก add
  • ทุกอย่างใช้งานได้ เราจะได้ host ใหม่ สถานะ snmp ตอนแรกจะเป็น สีเทา พอเริ่ม monitor ค่าได้ปกติจะกลายเป็น สีเขียว คือใช้งาน แสดง graph ของ template ที่เราเลือกได้แล้ว



  • ไปที่ Monitoring => Hosts เลือก Graph หรือ  Dashboard เพื่อแสดงค่าที่ได้ทำด้านบนไง
  • ในที่นี้เราเลือก template เป็น  Linux SNMP เราจะได้ 2 dashboard เรื่อง system ram usage, cpu load และ เรื่อง network usage bandwidth
  • เราสามารถ ปรับเปลี่ยนการ monitor host เราได้เลยไป Configuration แล้วคลิกที่ host ที่เราต้องการแก้ไข แล้วจึงเลือก  template ใหม่นะจ้ะ

เพิ่มเติม

  • Server ที่เปิดบริการ SNMP ตรวจสอบ Firewall 161 UDP ด้วยเปิดให้เครื่อง monitor เข้าถึงได้หรือยัง
  • และ config snmp community string ด้วยให้เรียบร้อย ว่าใช้งาน MIB ได้ทุกตัวมั้ย
  • ลืมบอกไป เข้าระบบด้วย user: Admin , password: zabbix นะคับ

Related การติดตั้ง zabbix

  • https://juuier.blogspot.com/2025/01/zabbix-docker-windows-10.html
  • เราติดตั้ง zabbix ใน docker ใช้ network bridge นี่แหละ แต่ควรตรวจ subnet และ ip range อย่าให้ไปซ้ำในระบบ network เรานะคับ



ติดตั้ง zabbix ใน docker ใน Windows 10

ติดตั้งด้วย docker run

$ docker network create --subnet 172.20.0.0/16 --ip-range 172.20.240.0/20 zabbix-net


$ docker pull mysql:8.0-oracle && docker pull zabbix/zabbix-java-gateway:alpine-5.4.12 && docker pull zabbix/zabbix-server-mysql:alpine-5.4.12 && docker pull zabbix/zabbix-web-nginx-mysql:alpine-5.4.12


$ docker run --name mysql-server -t -e MYSQL_DATABASE="zabbix" \

             -e MYSQL_USER="zabbix" \

             -e MYSQL_PASSWORD="zabbix_pwd" \

             -e MYSQL_ROOT_PASSWORD="root_pwd" \

             --network=zabbix-net \

             --restart unless-stopped \

             -d mysql:8.0-oracle \

             --character-set-server=utf8 --collation-server=utf8_bin \

             --default-authentication-plugin=mysql_native_password



$ docker run --name zabbix-java-gateway -t \

             --network=zabbix-net \

             --restart unless-stopped \

             -d zabbix/zabbix-java-gateway:alpine-5.4.12


$ docker run --name zabbix-server-mysql -t \

             -e DB_SERVER_HOST="mysql-server" \

             -e MYSQL_DATABASE="zabbix" \

             -e MYSQL_USER="zabbix" \

             -e MYSQL_PASSWORD="zabbix_pwd" \

             -e MYSQL_ROOT_PASSWORD="root_pwd" \

             -e ZBX_JAVAGATEWAY="zabbix-java-gateway" \

             --network=zabbix-net \

             -p 10051:10051 \

             --restart unless-stopped \

             -d zabbix/zabbix-server-mysql:alpine-5.4.12


$ docker run --name zabbix-web-nginx-mysql -t \

             -e ZBX_SERVER_HOST="zabbix-server-mysql" \

             -e DB_SERVER_HOST="mysql-server" \

             -e MYSQL_DATABASE="zabbix" \

             -e MYSQL_USER="zabbix" \

             -e MYSQL_PASSWORD="zabbix_pwd" \

             -e MYSQL_ROOT_PASSWORD="root_pwd" \

             --network=zabbix-net \

             -p 80:8080 \

             --restart unless-stopped \

             -d zabbix/zabbix-web-nginx-mysql:alpine-5.4.12

ติดตั้งแบบ docker-compose.yml

version: "3.9"

services:

  mysql-server:

    image: mysql:8.0-oracle

    container_name: mysql-server

    environment:

      MYSQL_DATABASE: zabbix

      MYSQL_USER: zabbix

      MYSQL_PASSWORD: zabbix_pwd

      MYSQL_ROOT_PASSWORD: root_pwd

    networks:

      zabbix-net:

        ipv4_address: 172.20.240.10

    restart: unless-stopped

    command: >

      --character-set-server=utf8

      --collation-server=utf8_bin

      --default-authentication-plugin=mysql_native_password


  zabbix-java-gateway:

    image: zabbix/zabbix-java-gateway:alpine-5.4.12

    container_name: zabbix-java-gateway

    networks:

      - zabbix-net

    restart: unless-stopped


  zabbix-server-mysql:

    image: zabbix/zabbix-server-mysql:alpine-5.4.12

    container_name: zabbix-server-mysql

    environment:

      DB_SERVER_HOST: mysql-server

      MYSQL_DATABASE: zabbix

      MYSQL_USER: zabbix

      MYSQL_PASSWORD: zabbix_pwd

      MYSQL_ROOT_PASSWORD: root_pwd

      ZBX_JAVAGATEWAY: zabbix-java-gateway

    networks:

      - zabbix-net

    ports:

      - "10051:10051"

    restart: unless-stopped


  zabbix-web-nginx-mysql:

    image: zabbix/zabbix-web-nginx-mysql:alpine-5.4.12

    container_name: zabbix-web-nginx-mysql

    environment:

      ZBX_SERVER_HOST: zabbix-server-mysql

      DB_SERVER_HOST: mysql-server

      MYSQL_DATABASE: zabbix

      MYSQL_USER: zabbix

      MYSQL_PASSWORD: zabbix_pwd

      MYSQL_ROOT_PASSWORD: root_pwd

    networks:

      - zabbix-net

    ports:

      - "80:8080"

    restart: unless-stopped


networks:

  zabbix-net:

    driver: bridge

    ipam:

      config:

        - subnet: 172.20.0.0/16

          ip_range: 172.20.240.0/20


  • สั่งให้ pull และ run
$ docker-compose up -d
  • เข้าสู่ระบบโดย http://localhost
user: Admin
pass: zabbix

เพิ่มเติม

  • ทดสอบบน windows 10 docker-compose.yml ที่แปลงจาก docker run ด้วย chatgpt สามารถใช้งานได้จริง

Ref

  • https://medium.com/@ekpicha/%E0%B8%A5%E0%B8%87-zabbix-%E0%B8%94%E0%B9%89%E0%B8%A7%E0%B8%A2-docker-%E0%B9%81%E0%B8%A5%E0%B8%B0-zabbix-agent-template-item-trigger-logs-%E0%B8%9A%E0%B8%99-ubuntu-20-04-48b39118b4a5
  • https://chatgpt.com/share/678fa365-61e8-8010-820d-359a95b107cd

Enable query log MySQL

First, Remember that this logfile can grow very large on a busy server.

Env

  • Ubuntu 22.04
  • MySQL 8.0

Step

$ sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
  • ต่อจาก section [mysqld] เพิ่ม (อยู่ด้านล่าง section นี้ลงไปตำแหน่งใหนก็ได้)
[mysqld]
general_log = 1
general_log_file = /path/to/query_log.log
  • เปิดใช้งานการบันทึกการค้นหา
global general_log = 1;
  • ปิดใช้งานการบันทึกคำถาม (ทางเลือก)
global general_log = 0;
  • และ restart service

$ sudo systemctl restart mysql

เพิ่มเติม

  • แนะนำตั้งค่าพาธ ประมาณนี้ general_log_file = /var/log/mysql/query.log 
  • ตรวจสอบ realtime log query

$ sudo tail -f /var/log/mysql/query.log 

คำเตือน

Ref

  • https://www.geeksforgeeks.org/how-to-enable-mysql-query-log/
  • https://stackoverflow.com/questions/6479107/how-to-enable-mysql-query-log
  • https://askubuntu.com/questions/922521/how-to-enable-mysqls-query-log-see-all-sql-queries-as-they-come

Bin log disable / set expire date of MySQL 8 on Ubuntu 22.04

Binary Log (Binlog) ของ MySQL เป็นไฟล์ที่บันทึกกิจกรรมทั้งหมดที่เปลี่ยนแปลงข้อมูลหรือโครงสร้างฐานข้อมูล เช่น คำสั่ง INSERT, UPDATE, DELETE, และการเปลี่ยนแปลงโครงสร้างเช่นการเพิ่มหรือลบตาราง เป็นต้น โดยไม่รวมคำสั่งที่เป็นการดึงข้อมูล (SELECT) ซึ่งมีประโยชน์สำคัญหลายด้าน ดังนี้:

ประโยชน์ของ Binlog:

  1. การกู้คืนข้อมูล (Data Recovery):

    • ในกรณีที่เกิดความเสียหายหรือข้อมูลหาย สามารถใช้ Binlog ร่วมกับสำรองข้อมูล (Backup) เพื่อคืนค่าข้อมูลล่าสุดก่อนเกิดปัญหาได้
    • เช่น การ Restore ข้อมูลจาก Backup และนำ Binlog มาเล่นซ้ำ (Replay) เพื่อคืนค่าข้อมูลถึงเวลาที่ต้องการ
  2. Replication (การทำสำเนาฐานข้อมูล):

    • ใช้ในการทำงานร่วมกับ MySQL Replication เพื่อคัดลอกการเปลี่ยนแปลงจากเซิร์ฟเวอร์ต้นทาง (Master) ไปยังเซิร์ฟเวอร์ปลายทาง (Slave) เพื่อความทนทานและแบ่งโหลด (Load Balancing)
  3. การตรวจสอบ (Auditing):

    • สามารถตรวจสอบประวัติการเปลี่ยนแปลงในฐานข้อมูล เช่น ใครแก้ไขอะไรเมื่อไหร่
  4. Point-in-Time Recovery (PITR):

    • ช่วยให้สามารถกู้คืนข้อมูลไปยังสถานะที่แน่นอนในช่วงเวลาหนึ่ง (เช่น ก่อนคำสั่งที่ผิดพลาด)

ปัญหา

  • ปัญหาที่เกิดขึ้นใน server  เราคือ พื้นที่เต็มจาก bin log ใช้เยอะสุด $ sudo du -shc /var/lib/mysql/*
  • ผลลัพธ์ที่อยากให้เป็นคือ ได้พื้นที่ว่างกลับมาใช้งาน

Environment

  • MySQL 8.0
  • Ubuntu 22.04

ปิดการทำงาน

  • ก่อนแก้ไขคอนฟิกกันเหนียว

$ sudo cp /etc/mysql/mysql.conf.d/myssqld.cnf /etc/mysql/mysql.conf.d/mysqld.cnf.bak

$ sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf

  • ต่อจาก section [mysqld] เพิ่ม (อยู่ด้านล่าง section นี้ลงไปตำแหน่งใหนก็ได้)

skip-log-bin หรือ skip-log-bin = true


  • หรือ เปิดใช้งานเหมือนเดิมเพิ่มเติมคือ ให้มีวันหมดอายุ โดยแก้ไขไฟล์เดิม

$ sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf

  • ต่อจาก section [mysqld] เพิ่ม (อยู่ด้านล่าง section นี้ลงไปตำแหน่งใหนก็ได้)

expire_logs_days = 3

  • จากนั้นบันทึกไฟล์ แล้ว restart service
$ sudo systemctl restart mysql.service

เพิ่มเติม

  • ตรวจสอบ bin log ปิด หรือ เปิดอยู่ โดย

mysql > show variables like 'log_bin';

  • ดูพื้นที่ระบบ

$ sudo df -h

  • ดูขนาดไฟล์ใน dir

$ sudo du -shc /path/*

Ref

  • https://chatgpt.com/share/678f962a-18ec-8010-b694-7de50f1b6489
  • https://www.veeble.com/kb/how-to-clear-or-purge-mysql-bin-log-files/
  • https://stackoverflow.com/questions/73427460/how-to-disable-mysql-binlog-on-docker-compose
  • https://ploi.io/documentation/server/disable-bin-logs-for-mysql-on-ubuntu
  • https://askubuntu.com/questions/1286583/how-i-can-disable-the-mysql-binlog
  • https://www.youant.net/mysql-tip/mysql-tip-%E0%B8%A7%E0%B8%B4%E0%B8%98%E0%B8%B5%E0%B8%A5%E0%B8%9A-binary-log-%E0%B8%AB%E0%B8%A3%E0%B8%B7%E0%B8%AD-mysql-bin-xx-%E0%B8%82%E0%B8%AD%E0%B8%87-mysql/#google_vignette


MySQL 8.0 - Client does not support authentication protocolb(mysql_native_password) requested by server; consider upgrading MySQL client

  • PHP 5 เชื่อมต่อกับ MySQL 8 แล้วมีปัญหา เรื่องไม่ support mysql_native_password

Solved

mysql > ALTER USER 'myuser'@'localhost' IDENTIFIED WITH mysql_native_password BY 'mypassword';

mysql> flush privileges;

Ref

https://stackoverflow.com/questions/50093144/mysql-8-0-client-does-not-support-authentication-protocol-requested-by-server

Monday, January 20, 2025

MySQL status Active: deactivating (stop-sigterm)

  • ประเด็นคือ MySQL เราขึ้นสถานะ Active: deactivating เมื่อตรวจสอบสถานะด้วยคำสั่ง

$ sudo systemctl status mysql

mysql.service - MySQL Community Server

   Loaded: loaded (/lib/systemd/system/mysql.service; enabled; vendor preset: enabled)

   Active: deactivating (stop-sigterm) since Mon 2025-01-20 03:00:02 +07; 12h ago

  Process: 6894 ExecStart=/usr/sbin/mysqld --daemonize --pid-file=/run/mysqld/mysqld.pid (code=exited, status=0/SUCCESS)

  Process: 6855 ExecStartPre=/usr/share/mysql/mysql-systemd-start pre (code=exited, status=0/SUCCESS)

 Main PID: 6896 (mysqld)

    Tasks: 26 (limit: 4915)

   CGroup: /system.slice/mysql.service

           └─6896 /usr/sbin/mysqld --daemonize --pid-file=/run/mysqld/mysqld.pid


  • จะสั่ง restart ก็ไม่ได้ ค้างเลยคับ
$ sudo systemctl stop mysql && sudo systemctl start mysql

Solved
  • ปกติจะ restart server แต่วันนี้เราไม่ต้องทำแบบนั้นแล้ว
$ sudo killall -9 mysqld
$ sudo systemctl stop mysql && sudo systemctl start mysql && sudo systemctl status mysql
  • จบโดยไม่ต้อง restart server แล้ว

เพิ่มเติม
  • อาการนี้ประมาณ service พยายาม่จะ stop ตัวเองแต่ไม่สำเร็จ เลยแสดงแบบนี้
  • อาจเนื่องจาก connection เยอะ ใช้ resource เยอะทำให้ไม่พอ service จึงพยายามหยุดทำงานด้วยตัวเอง

ChatGPT เค้าว่าประมาณนี้สาเหตุ

If systemctl status mysql shows Active: deactivating (stop-sigterm), it indicates that the MySQL service is in the process of stopping but has not yet successfully completed the shutdown. This can happen for several reasons, such as:

Possible Causes

  1. Hanging Shutdown Process: MySQL might be stuck shutting down due to active connections or unresponsive processes.
  2. Configuration Errors: Misconfigured options in the MySQL configuration files (/etc/my.cnf or /etc/mysql/my.cnf) might prevent clean shutdowns.
  3. High Workload: If MySQL has a large number of open connections or is processing heavy queries, the shutdown might take longer than expected.
  4. Insufficient Permissions: The MySQL process might lack the necessary permissions to shut down gracefully.
  5. Corrupted Database Files: MySQL may be trying to clean up corrupted files during shutdown.

Create and remove custom network docker

  • การสร้างและลบ network ที่เราสร้าง ออกจาก docker
  • สร้าง network type default
$ docker network create --subnet 172.20.0.0/16 --ip-range 172.20.240.0/20 mynetwork
  • list รายการ network ของ docker เราออกมาแสดงว่ามีอะไรบ้าง
$ docker network ls
  • ตรวจสอบว่า network อันนี้ มี container ใหนใช้อยู่บ้าง
$ docker network inspect mynetwork
  • การลบ network ต้องตรวจสอบว่ามี container ใหนใช้งานอยู่ ให้ stop หรือ disconnect
$ docker stop mycontainer
$ docker network disconnect mynetwork mycontainer
$ docker network rm mynetwork
  • ตรวจสอบ network อีกรอบ
$ docker network ls
Ref
  • https://codinggun.com/docker/network/
  • https://medium.com/@ekpicha/%E0%B8%A5%E0%B8%87-zabbix-%E0%B8%94%E0%B9%89%E0%B8%A7%E0%B8%A2-docker-%E0%B9%81%E0%B8%A5%E0%B8%B0-zabbix-agent-template-item-trigger-logs-%E0%B8%9A%E0%B8%99-ubuntu-20-04-48b39118b4a5

How to edit files in stopped/not starting docker container

  • ประเด็นคือ คอนฟิก  mysql 9 container /etc/my.cnf  เพิ่มไปให้ใช้ authen native password ได้ 
  • และพยายาม restart container ด้วยคอนฟิกค่าใหม่ 
  • งานเข้าเลยทีนี้ start ขึ้นเป็น stop เอง
  • แก้ปัญหาโดย เอาไฟล์คอนฟิกใน container ที่ stop อยู่ ออกมาแก้ไขแล้ว คัดลอกไปทับ และ start container

Sample

$ docker cp docker_web_1:/etc/apache2/sites-enabled/apache2.conf .

$ docker cp apache.conf docker_web_1:/etc/apache2/sites-enabled/apache2.conf

Solved

  • คัดลอกไฟล์ออกมาก่อนเลย

$ docker cp docker_mysql:/etc/my.cnf .

  • ทำการแก้ไขคอนฟิกไฟล์ให้เหมือนเดิมแล้วสั่งคัดลอกไปทับ

$ docker cp my.cnf docker_mysql:/etc/my.cnf

  • และทำการ start container อีกรอบ

$ docker start docker_mysql

Ref

  • https://stackoverflow.com/questions/32750748/how-to-edit-files-in-stopped-not-starting-docker-container

Popular Posts