Chuyên mục
Network

Sửa lỗi Bad Gateway – Không thể đăng nhập Dashboard của Nginx Proxy Manager

Nginx Proxy Manager là một trong những ứng dụng Docker mình cài đặt đầu tiên khi bắt đầu tìm hiểu về Homelab / Virtualization. Mới đây, mình đã không thể truy cập vào Dashboard của NPM sau khi nâng cấp lên phiên bản mới.

Đăng nhập bị báo lỗi Bad Gateway như hình dưới đây.

Kiểm tra logs bằng lệnh docker compose logs thì thấy báo lỗi liên quan đến database.

nginxproxymanager-app-1  | [5/3/2023] [9:14:15 AM] [Global   ] › ✖  error     create table `migrations` (`id` int unsigned not null auto_increment primary key, `name` varchar(255), `batch` int, `migration_time` timestamp) - ER_CANT_CREATE_TABLE: Can't create table `npm`.`migrations` (errno: 13 "Permission denied")

Sau 1 vòng Google, mình đã tìm ra issue này trên Github: https://github.com/NginxProxyManager/nginx-proxy-manager/issues/2774. Lỗi này do phiên bản NPM mới có sự thay đổi về phân quyền, khiến database container không truy cập được database.

Cách khắc phục

Mình cài đặt Nginx Proxy Manager theo hướng dẫn từ cách đây 2 năm. Khi đó NPM yêu cầu phải kết hợp thêm với MariaDB container. File docker-compose.yml có cấu trúc như sau

version: '3'
services:
  app:
    image: 'jc21/nginx-proxy-manager:latest'
    restart: unless-stopped
    ports:
      - '80:80'
      - '81:81'
      - '443:443'
    environment:
      DB_MYSQL_HOST: "db"
      DB_MYSQL_PORT: 3306
      DB_MYSQL_USER: "npm"
      DB_MYSQL_PASSWORD: "npm"
      DB_MYSQL_NAME: "npm"
    volumes:
      - ./data:/data
      - ./letsencrypt:/etc/letsencrypt
  db:
    image: 'jc21/mariadb-aria:latest'
    restart: unless-stopped
    environment:
      MYSQL_ROOT_PASSWORD: 'npm'
      MYSQL_DATABASE: 'npm'
      MYSQL_USER: 'npm'
      MYSQL_PASSWORD: 'npm'
    volumes:
      - ./data/mysql:/var/lib/mysql

Theo cấu trúc này, dữ liệu của mariadb container (thư mục mysql) nằm trong thư mục data của nginx-proxy-manager. Do đó gây lỗi ownership khi kích hoạt.

Để tạm thời khắc phục lỗi, mình tạm ngưng Nginx Proxy Manager

cd nginxproxymanager
docker compose stop

Di chuyển thư mục mysql ra ngoài

sudo mv data/mysql

Sửa lại file docker-compose.yml, thay đổi dòng 28 thành - ./mysql:/var/lib/mysql

version: '3'
services:
  app:
    image: 'jc21/nginx-proxy-manager:latest'
    restart: unless-stopped
    ports:
      - '80:80'
      - '81:81'
      - '443:443'
    environment:
      DB_MYSQL_HOST: "db"
      DB_MYSQL_PORT: 3306
      DB_MYSQL_USER: "npm"
      DB_MYSQL_PASSWORD: "npm"
      DB_MYSQL_NAME: "npm"
    volumes:
      - ./data:/data
      - ./letsencrypt:/etc/letsencrypt
  db:
    image: 'jc21/mariadb-aria:latest'
    restart: unless-stopped
    environment:
      MYSQL_ROOT_PASSWORD: 'npm'
      MYSQL_DATABASE: 'npm'
      MYSQL_USER: 'npm'
      MYSQL_PASSWORD: 'npm'
    volumes:
      - ./mysql:/var/lib/mysql

Sau đó kích hoạt lại Nginx Proxy Manager

docker compose up -d

Truy cập lại Dashboard, giờ đã có thể đăng nhập lại ngon lành.

Tham khảo: Github