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