В процессе изучения работы 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.