В процессе изучения работы Nginx Proxy Manager
на Ubuntu 22.04 Server
из документации узнал, что по умолчанию все настройки, проделываемые через Web
—интерфейс, сохраняются в SQLite
файле который располагается в предопределенной директории. Если смотреть предыдущую заметку: "Разворачиваем Nginx Proxy Manager on Ubuntu 22.04 Server"
, то это каталог:
ekzorchik@srv-us2204a:~$ ls nginx-proxy-manager/data/database.sqlite
Но можно хранение настроек предопределить в базы данных MySQL & MariaDB.
На заметку: Из документации минимально поддерживаемые версии
MySQL v5.7.8+
MariaDB v10.2.7+
Я же покажу, каким образом (мне удалось разобрать как сделать, т.к. что указано в документации на официальном сайте у меня не взлетело) нужно изменить docker-compose.yml
дабы настройки хранить в MariaDB.
Шаг №1:
Текущие правила надстройки над iptables
на текущей системе:
ekzorchik@srv-us2204a:~$ sudo firewall-cmd --zone public --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: ens18
sources:
services: dhcpv6-client
ports: 80/tcp 22/tcp 81/tcp 443/tcp
protocols:
forward: yes
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
ekzorchik@srv-us2204a:~$
Шаг №2:
Контейнер для тестовой работы nginx
должен работать:
ekzorchik@srv-us2204a:~/nginx-test$ docker-compose up -d
ekzorchik@srv-us2204a:~/nginx-test$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c92fcc8a5123 nginx:alpine3.21 "/docker-entrypoint.…" 6 minutes ago Up 6 minutes 0.0.0.0:8082->80/tcp, [::]:8082->80/tcp nginx-test-nginx2-1
6b1c71f4e562 nginx:alpine3.21 "/docker-entrypoint.…" 6 minutes ago Up 6 minutes 0.0.0.0:8083->80/tcp, [::]:8083->80/tcp nginx-test-nginx3-1
8486ff20d4b4 nginx:alpine3.21 "/docker-entrypoint.…" 6 minutes ago Up 6 minutes 0.0.0.0:8081->80/tcp, [::]:8081->80/tcp nginx-test-nginx1-1
ekzorchik@srv-us2204a:~/nginx-test$
Шаг №3:
Перехожу в каталог nginx-proxy-manager
, останавливаю если Web
—сервис работает контейнер:
ekzorchik@srv-us2204a:~/nginx-proxy-manager$ docker compose stop
[+] Running 1/1
⠿ Container nginx-proxy-manager-app-1 Stopped 3.2s
ekzorchik@srv-us2204a:~/nginx-proxy-manager$
Шаг №4:
Открываю на редактирование docker-compose.yml
и вношу в него следующие изменения:
ekzorchik@srv-us2204a:~/nginx-proxy-manager$ nano docker-compose.yml
services:
app:
image: 'jc21/nginx-proxy-manager:latest'
restart: unless-stopped
ports:
- '80:80' # Public HTTP Port
- '81:81' # Admin Web Port
- '443:443' # Public HTTPS Port
environment:
DB_MYSQL_HOST: "db" #Or the IP/hostname of your MySQL server
DB_MYSQL_PORT: 3306
DB_MYSQL_USER: "us_proxy"
DB_MYSQL_PASSWORD: "612mbddr@"
DB_MYSQL_NAME: "db_proxy"
DISABLE_IPV6: 'true'
# DB_SQLLITE_FILE: "/data/database.sqlite"
volumes:
- ./data:/data
- ./letsencrypt:/etc/letsencrypt
depends_on:
- db
db:
image: 'mariadb:lts'
command: --character-set-server=utf8mb4 --collation-server=utf8mb4_bin
#command: --bind-address=0.0.0.0
restart: unless-stopped
environment:
MYSQL_ROOT_PASSWORD: '712mbddr@' #your_root_password
TZ: Europe/Moscow
MYSQL_DATABASE: 'db_proxy'
MYSQL_USER: 'us_proxy'
MYSQL_PASSWORD: '612mbddr@'
MARIADB_AUTO_UPGRADE: '1'
ports:
- "3306:3306"
volumes:
- ./db:/var/lib/mysql
После нажимаем Ctrl + O, Enter - Ctrl + X
(для выхода из редактора).
Ниже мои пояснения к использованию образа mariadb и моих параметров:
- DB_MYSQL_HOST — Адрес сервера, на котором запущена база данных, ну точнее это как бы ссылка на именование сервиса.
- DB_MYSQL_PORT — Номер порта, через который осуществляется подключение к базе данных, по умолчанию 3306/tcp
- DB_MYSQL_USER — Имя пользователя, используемое для аутентификации в базе данных, мой пользователь для NPM который я предопределяю
- DB_MYSQL_PASSWORD — Пароль пользователя, из-под которого осуществляется подключение к базе данных, опять же который я предопределяю
- DB_MYSQL_NAME — Название базы данных, к которой производиться подключение, т.е. база данных под сервис NPM
- MYSQL_ROOT_PASSWORD — Пароль cупепользователя root в MySQL, опять который я предопределяю.
- MYSQL_DATABASE — Название базы данных, которая будет автоматически создана при запуске MySQL, а создавать базу буду под сервис NPM, получается — это db_proxy
- MYSQL_USER — Имя дополнительного пользователя, из-под имени которого будет запущена база данных, пусть будет us_proxy
- MYSQL_PASSWORD — Пароль для пользователя, указанного в переменной MYSQL_USER, к примеру, 612mbddr@
- MARIADB_AUTO_UPGRADE — Параметр, отвечающий за необходимость автоматического обновления схемы базы данных MariaDB до последней версии при запуске.
На заметку: Смотрим мой пример выше и уже с учетом его и пояснений предопределяем под ваши требования.
Шаг №5:
Запускаю предопределенные настройки связки Nginx Proxy Manager + MariaDB:
если Вы видите такое к примеру:
ekzorchik@srv-us2204a:~/nginx-proxy-manager$ docker compose up -d
[+] Running 0/1
⠸ Container nginx-proxy-manager-db-1 Starting 0.3s
Error response from daemon: failed to set up container networking: driver failed programming external connectivity on endpoint nginx-proxy-manager-db-1 (7c10d410441825dfd4e12a33bccfa253f089e096a2a3a234a661a7840d0ec704): Unable to enable DNAT rule: (iptables failed: iptables --wait -t nat -A DOCKER -p tcp -d 0/0 --dport 3306 -j DNAT --to-destination 172.19.0.2:3306 ! -i br-b11b3d606dac: iptables: No chain/target/match by that name.
(exit status 1))
ekzorchik@srv-us2204a:~/nginx-proxy-manager$
то у Вас конфликт сетей для контейнера, вроде как лечится перезапуском docker
, но после нужно опять из каталога nginx-test
сделать запуск и после из nginx-proxy-manager
ekzorchik@srv-us2204a:~/nginx-proxy-manager$ sudo systemctl restart docker
либо описать настройки в одном docker-compose.yml
, к примеру, так:
ekzorchik@srv-us2204a:~/nginx-proxy-manager$ nano docker-compose.yml
services:
nginx1:
image: nginx:alpine3.21
ports:
- "8081:80"
volumes:
- ./nginx1/html:/usr/share/nginx/html
command: ["/bin/sh", "-c", "echo 'Hello from nginx1!' > /usr/share/nginx/html/index.html && nginx -g 'daemon off;'"]
nginx2:
image: nginx:alpine3.21
ports:
- "8082:80"
volumes:
- ./nginx2/html:/usr/share/nginx/html
command: ["/bin/sh", "-c", "echo 'Hello from nginx2!' > /usr/share/nginx/html/index.html && nginx -g 'daemon off;'"]
nginx3:
image: nginx:alpine3.21
ports:
- "8083:80"
volumes:
- ./nginx3/html:/usr/share/nginx/html
command: ["/bin/sh", "-c", "echo 'Hello from nginx3!' > /usr/share/nginx/html/index.html && nginx -g 'daemon off;'"]
app:
image: 'jc21/nginx-proxy-manager:latest'
restart: unless-stopped
ports:
- '80:80' # Public HTTP Port
- '81:81' # Admin Web Port
- '443:443' # Public HTTPS Port
environment:
DB_MYSQL_HOST: "db" #Or the IP/hostname of your MySQL server
DB_MYSQL_PORT: 3306
DB_MYSQL_USER: "us_proxy"
DB_MYSQL_PASSWORD: "612mbddr@"
DB_MYSQL_NAME: "db_proxy"
DISABLE_IPV6: 'true'
# DB_SQLLITE_FILE: "/data/database.sqlite"
volumes:
- ./data:/data
- ./letsencrypt:/etc/letsencrypt
depends_on:
- db
db:
image: 'mariadb:lts'
command: --character-set-server=utf8mb4 --collation-server=utf8mb4_bin
#command: --bind-address=0.0.0.0
restart: unless-stopped
environment:
MYSQL_ROOT_PASSWORD: '712mbddr@' #your_root_password
TZ: Europe/Moscow
MYSQL_DATABASE: 'db_proxy'
MYSQL_USER: 'us_proxy'
MYSQL_PASSWORD: '612mbddr@'
MARIADB_AUTO_UPGRADE: '1'
ports:
- "3306:3306"
volumes:
- ./db:/var/lib/mysql
После нажимаем Ctrl + O, Enter - Ctrl + X
(для выхода из редактора).
ekzorchik@srv-us2204a:~/nginx-proxy-manager$ docker compose up -d
[+] Running 5/5
⠿ Container nginx-proxy-manager-nginx3-1 Started 0.9s
⠿ Container nginx-proxy-manager-nginx1-1 Started 0.7s
⠿ Container nginx-proxy-manager-nginx2-1 Started 0.8s
⠿ Container nginx-proxy-manager-db-1 Started 0.7s
⠿ Container nginx-proxy-manager-app-1 Started 0.4s
ekzorchik@srv-us2204a:~/nginx-proxy-manager$
ekzorchik@srv-us2204a:~/nginx-proxy-manager$ cd ~/
ekzorchik@srv-us2204a:~$
Вроде все запустилось без ошибок, теперь смотрим на вывод системы какие порты ожидаю соединения с системой с других систем
ekzorchik@srv-us2204a:~$ ss -tulpn | grep 0.0.0.0:
udp UNCONN 0 0 127.0.0.53%lo:53 0.0.0.0:*
udp UNCONN 0 0 172.33.33.10%ens18:68 0.0.0.0:*
tcp LISTEN 0 4096 0.0.0.0:8081 0.0.0.0:*
tcp LISTEN 0 4096 0.0.0.0:8082 0.0.0.0:*
tcp LISTEN 0 4096 0.0.0.0:8083 0.0.0.0:*
tcp LISTEN 0 4096 127.0.0.53%lo:53 0.0.0.0:*
tcp LISTEN 0 4096 0.0.0.0:3306 0.0.0.0:*
tcp LISTEN 0 4096 0.0.0.0:443 0.0.0.0:*
tcp LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
tcp LISTEN 0 4096 0.0.0.0:80 0.0.0.0:*
tcp LISTEN 0 4096 0.0.0.0:81 0.0.0.0:*
но доступ осуществляться будет исходя из надстроек над iptables
средствами firewalld
Шаг №6:
Открываем через Web
-интерфейс URL http://IP:81
— где IP
— это IP
системы Ubuntu 22.04 Server
, в первый раз заходит с дефолтными аутентификационными данными, а уже после со своими и настраиваем "Add Proxy Host"
Отлично.
Шаг №7:
Чтобы подключиться в контейнер mariadb
с использованием предопределенных административных учетных записей понадобиться узнать "Container ID":
Синтаксис посмотреть, что в контейнере:
docker ps
docker logs <container_name_or_id>
ekzorchik@srv-us2204a:~$ cd nginx-proxy-manager/
ekzorchik@srv-us2204a:~/nginx-proxy-manager$ docker ps | grep mariadb
98a48a00f235 mariadb:lts "docker-entrypoint.s…" 43 minutes ago Up 35 minutes 0.0.0.0:3306->3306/tcp, [::]:3306->3306/tcp nginx-proxy-manager-db-1
ekzorchik@srv-us2204a:~/nginx-proxy-manager$
Где 98a48a00f235
— это и есть "CONTAINER ID"
Далее смотрим лог работы сервиса:
ekzorchik@srv-us2204a:~/nginx-proxy-manager$ docker logs 98a48a00f235
2025-10-08 10:57:48+03:00 [Note] [Entrypoint]: Entrypoint script for MariaDB Server 1:11.8.3+maria~ubu2404 started.
2025-10-08 10:57:48+03:00 [Warn] [Entrypoint]: /sys/fs/cgroup///memory.pressure not writable, functionality unavailable to MariaDB
2025-10-08 10:57:48+03:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql'
2025-10-08 10:57:48+03:00 [Note] [Entrypoint]: Entrypoint script for MariaDB Server 1:11.8.3+maria~ubu2404 started.
2025-10-08 10:57:48+03:00 [Note] [Entrypoint]: MariaDB upgrade not required
2025-10-08 10:57:48 0 [Note] Starting MariaDB 11.8.3-MariaDB-ubu2404 source revision b565b3e7e041c480fd8013e3beec6b99544d6bf8 server_uid YGghYc0GLfydz+muOzy2Sm5TMao= as process 1
2025-10-08 10:57:48 0 [Note] InnoDB: Compressed tables use zlib 1.3
2025-10-08 10:57:48 0 [Note] InnoDB: Number of transaction pools: 1
2025-10-08 10:57:48 0 [Note] InnoDB: Using crc32 + pclmulqdq instructions
2025-10-08 10:57:48 0 [Note] mariadbd: O_TMPFILE is not supported on /tmp (disabling future attempts)
2025-10-08 10:57:48 0 [Warning] mariadbd: io_uring_queue_init() failed with EPERM: sysctl kernel.io_uring_disabled has the value 2, or 1 and the user of the process is not a member of sysctl kernel.io_uring_group. (see man 2 io_uring_setup).
create_uring failed: falling back to libaio
2025-10-08 10:57:48 0 [Note] InnoDB: Using Linux native AIO
2025-10-08 10:57:48 0 [Note] InnoDB: innodb_buffer_pool_size_max=128m, innodb_buffer_pool_size=128m
2025-10-08 10:57:48 0 [Note] InnoDB: Completed initialization of buffer pool
2025-10-08 10:57:48 0 [Note] InnoDB: File system buffers for log disabled (block size=512 bytes)
2025-10-08 10:57:49 0 [Note] InnoDB: End of log at LSN=147568
2025-10-08 10:57:49 0 [Note] InnoDB: Opened 3 undo tablespaces
2025-10-08 10:57:49 0 [Note] InnoDB: 128 rollback segments in 3 undo tablespaces are active.
2025-10-08 10:57:49 0 [Note] InnoDB: Setting file './ibtmp1' size to 12.000MiB. Physically writing the file full; Please wait ...
2025-10-08 10:57:49 0 [Note] InnoDB: File './ibtmp1' size is now 12.000MiB.
2025-10-08 10:57:49 0 [Note] InnoDB: log sequence number 147568; transaction id 276
2025-10-08 10:57:49 0 [Note] Plugin 'FEEDBACK' is disabled.
2025-10-08 10:57:49 0 [Note] Plugin 'wsrep-provider' is disabled.
2025-10-08 10:57:49 0 [Note] InnoDB: Loading buffer pool(s) from /var/lib/mysql/ib_buffer_pool
2025-10-08 10:57:49 0 [Note] InnoDB: Buffer pool(s) load completed at 251008 10:57:49
2025-10-08 10:57:52 0 [Note] Server socket created on IP: '0.0.0.0', port: '3306'.
2025-10-08 10:57:52 0 [Note] Server socket created on IP: '::', port: '3306'.
2025-10-08 10:57:52 0 [Note] mariadbd: Event Scheduler: Loaded 0 events
2025-10-08 10:57:52 0 [Note] mariadbd: ready for connections.
Version: '11.8.3-MariaDB-ubu2404' socket: '/run/mysqld/mysqld.sock' port: 3306 mariadb.org binary distribution
Вывод выше говорит, что сервис mariadb
запущен, ошибок нет.
Также зная "CONTAINER ID"
подключимся к сервису mariadb
и выведем на консоль какие базы на нем развернуты:
ekzorchik@srv-us2204a:~/nginx-proxy-manager$ docker exec -it 98a48a00f235 mariadb -uroot -p712mbddr@ -e "show databases"
+--------------------+
| Database |
+--------------------+
| db_proxy |
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
ekzorchik@srv-us2204a:~/nginx-proxy-manager$
По такому принципу можно найти в какой таблице располагаются данные аутентификации в сервисе Nginx Proxy Manager:
ekzorchik@srv-us2204a:~/nginx-proxy-manager$ docker exec -it 98a48a00f235 mariadb -uroot -p712mbddr@ -e "use db_proxy;show tables"
+--------------------+
| Tables_in_db_proxy |
+--------------------+
| access_list |
| access_list_auth |
| access_list_client |
| audit_log |
| auth |
| certificate |
| dead_host |
| migrations |
| migrations_lock |
| proxy_host |
| redirection_host |
| setting |
| stream |
| user |
| user_permission |
+--------------------+
ekzorchik@srv-us2204a:~/nginx-proxy-manager$
ekzorchik@srv-us2204a:~/nginx-proxy-manager$ docker exec -it 98a48a00f235 mariadb -uroot -p712mbddr@ -e "use db_proxy;select * from user"
+----+---------------------+---------------------+------------+-------------+-----------------------+---------------+----------+-----------------------------------------------------------------------+-----------+
| id | created_on | modified_on | is_deleted | is_disabled | email | name | nickname | avatar | roles |
+----+---------------------+---------------------+------------+-------------+-----------------------+---------------+----------+-----------------------------------------------------------------------+-----------+
| 1 | 2025-10-08 08:36:29 | 2025-10-08 09:21:08 | 0 | 0 | support@ekzorchik.com | Administrator | Admin | //www.gravatar.com/avatar/2bdded4a746ec30ede32d2ada1c1d2e2?default=mm | ["admin"] |
+----+---------------------+---------------------+------------+-------------+-----------------------+---------------+----------+-----------------------------------------------------------------------+-----------+
ekzorchik@srv-us2204a:~/nginx-proxy-manager$
Вот оно как интересно ведь получается.
Шаг №8:
Чтобы остановить работу Nginx Proxy Manager
, когда нужно внести изменения в настройки, ну а потом если нужно запускаем:
ekzorchik@srv-us2204a:~/nginx-proxy-manager$ docker compose stop
[+] Running 5/5
⠿ Container nginx-proxy-manager-nginx1-1 Stopped 0.3s
⠿ Container nginx-proxy-manager-app-1 Stopped 3.4s
⠿ Container nginx-proxy-manager-nginx2-1 Stopped 0.5s
⠿ Container nginx-proxy-manager-nginx3-1 Stopped 0.6s
⠿ Container nginx-proxy-manager-db-1 Stopped 0.6s
ekzorchik@srv-us2204a:~/nginx-proxy-manager$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ekzorchik@srv-us2204a:~/nginx-proxy-manager$
ekzorchik@srv-us2204a:~/nginx-proxy-manager$ docker compose start
Подведу итог, вот что значит своя проработка, она позволяет чуть глубже понять, как работает тот или иной сервис если пощупать его самим и составить себе заметку. Ведь порой даже документация не работает как должна быть.
Что хотел в этой заметке я сделал, а, следовательно, могу прощаться, с уважением автор блога Олло Александр aka ekzorchik.