Развертывание ABCLib/WWWLib с помощью docker и docker-compose
Вначале я хотел сформировать виртуальную машину в VMWare Player
или в VirtualBox
, установить на нее приложение со всей оснасткой, затем запаковать в zip
или ovf/ova
и выложить для скачивания. Идея, конечно, так себе, потому что даже в запакованном виде размер обещал быть не менее полутора гигабайт. Впрочем, в конечном итоге, я бы так и поступил, но появилась идея посвежее.
Поскольку я все равно для развертывания приложения собираюсь применять docker
, то почему бы и конечному пользователю не воспользоваться этим же инструментом. Тем более, что пара экспериментальных попыток развертывания на различных операционных системах была вполне успешной.
О "железе"
Нет необходимости в использовании "навороченного" железа. Для экспериментов я создавал виртуальную среду на основе CentOS 7 и Debian 9.5 с 4 GB оперативки и виртуальным жестким диском с "зарезервированным" объемом 40 GB. Жесткий диск я поделил на разделы:
Назначение | Размер | Точка монтирования |
boot | 512 MB | /boot |
root | 16 GB | / |
swap | 4 GB | swap |
opt | 20 GB | /opt |
Деление чисто условное, просто мне так привычно. Вы можете поделить пространство любым удобным для вас образом. Учитывайте, что раздел /opt самый большой, потому что сюда попадают книги перед тем, как будут отданы пользователю и именно здесь находится всё "хозяйство" с приложением и докерами.
Сразу хочу оговориться, что намеренно опускаю вопрос с местом хранения самих коллекций. В моём случае это внешнее хранилище объемом в 3 TB с доступом по сети. Все zip-файлы коллекций сайтов lib.rus.ec
и flibusta.org
, скачанные в разное время с торрент-трекеров, занимают около 2 TB - это файлы с книгами как fb2-формата, так и usr-формата. Внешнее хранилище монтируется по протоколу NFS
в папку /mnt/lib
. В архиве с данными по развертыванию приложения есть текстовый файл с содержимым папки /mnt/lib
, представленным в виде "дерева" и перечнем zip-файлов коллекций с сайтов lib.rus.ec
и flibusta.org
.
docker и docker-compose
Итак, нам потребуется компьютер с предустановленной операционной системой, полагаю, подойдет любая, за исключением Windows. Впрочем, если вы используете Windows, то наличие VMWare Player или VirtualBox так же поможет решить проблему.
Установите в вашу систему docker и docker-compose. Если вы используете вашу ОС достаточно длительное время, то это не будет для вас проблемой. Обычно я использую CentOS, гораздо реже Ubuntu. Когда я попытался воспользоваться Ubuntu 18.04 LTS в последний раз, у меня возникли трудности с установкой пакетов. Прекрасно понимаю, что это не проблема Ubuntu, это проблема моих знаний и хронического недостатка времени. Я отложил Ubuntu "на потом" и просто воспользовался Debian 9.5, где все у меня прекрасно "срослось".
Скачивание
Скачайте на свой компьютер один из двух архивов, представленных ниже:
- Полный вариант - (с виртуальным окружением и базами данных MariaDB) 446 MB.
- Только исходники - (виртуальное окружение и базы данных будут сформированы в процессе установки) 130 MB.
- Дополнение (набор сокращений, наиболее часто используемых команд docker) 2 KB
Какой вариант выбрать решайте сами. Я бы посоветовал попробовать для начала второй вариант. Если возникнут проблемы, то вернуться к первому. Результат будет одинаков.
По окончании установки объем используемого дискового пространства уведичится до 3 гигабайт. Большая часть этого обьема - базы данных MariaDB сервера, восстановленные из дампов. Дампы, кстати, после установки можно удалить.
В качестве бонуса рекомендую скачать небольшое дополнение, призванное слегка облегчить работу с часто набираемыми командами docker. Ничего особенного, но возможность сократить команду
docker ps -q | xargs docker inspect --format '{{ .Config.Image }} - {{ .Config.Hostname }} - {{ .NetworkSettings.IPAddress }}'
до
drip
согласитесь, многого стоит.
Скопируйте содержимое папки bin в папку /bin вашей системы, только проверьте предварительно, чтобы наименования команд в исходной и конечной папке не совпадали.
Установка
Распакуйте содержимое скачанного архива в папку /opt компьютера.
Должна получиться приблизительно следующая картина:
/opt. └──/ abc ├── /abclib │ ├── /abcapp │ │ ├── abclib.ini │ │ ├── abclib_wsgi │ │ ├── abclib.wsgi │ │ ├── /apps # собственно, сам код приложения │ │ ├── /cache # осталось от предыдущих версий │ │ ├── config.py │ │ ├── init_abc.sh │ │ ├── manage.py │ │ ├── requirements.txt │ │ ├── /tmp │ │ ├── /translate │ │ ├── wsgi.py │ │ ├── wwwlib.ini │ │ └── wwwlib.wsgi │ └── Dockerfile # для сборки докера с программой ├── create_all.sh ├── docker-compose.yml ├── dumps_abc.sh ├── libenv # (каталог с книгами - изначально почти пуст) │ ├── /flibusta-all │ ├── /flibusta-fb2 -> flibusta-all │ ├── /librusec-all │ ├── /librusec-fb2 -> librusec-all │ ├── /service │ └── /zip ├── /mariadb # базы данных - папка изначально пуста ├── mntlib_tree ├── /nginx │ ├── /conf.d │ │ └── abclib.conf │ └── nginx.conf ├── /opt │ ├──abc_dumps.sh
│ ├── abc_restore.sh │ ├── create_databases.sh │ ├── drop_databases.sh │ └── /dumps # дампы баз данных │ ├── abc-09-09-2018.sql │ ├── fa-09-09-2018.sql │ ├── fb-09-09-2018.sql │ ├── la-09-09-2018.sql │ └── lb-09-09-2018.sql └──restore_abc.sh
Прежде чем мы начнем, следует проделать следующее действие.
Откройте для редактирования файл nginx/conf.d/abclib.conf
и измените свойство server_name
. Впишите вместо приведенных данных ip-адрес компьютера с вашей будущей библиотекой.
# abclib.conf
server {
listen 80;
# ваш_ip_адрес;
server_name 192.168.0.224;
. . .
Сохраните изменения, убедитесь в наличии доступа к интернету и запустите на выполнение скрипт create_all.sh
.
Процесс установки в варианте "Только исходники" займет около 10 минут. За это время ваш компьютер скачает из интернета несколько базовых образов, и один образ создаст из Dockerfile непосредственно на месте. В процессе будут развернуты четыре контейнера, восстановлены из дампов базы данных MariaDB, создано виртуальное окружение для Python 3.6, запустится вначале сервер uWSGI и, наконец, веб-сервер nginx. Следует иметь ввиду, что результат проявится не сразу, последние три действия будут выполняться после запуска контейнера abclib, т.е. после того, как "видимая" часть работы будет завершена.
Подождите пару минут и откройте в браузере ссылку http://ваш_ip_адрес
. Если все нормально, то сайт с приложением заработает сразу.
В случае с "Полным вариантом" все произойдет приблизительно вдвое быстрее, поскольку базы данных уже сформированы, а виртуальное окружение Python-а готово заранее.
Коротко о командах docker и docker-compose
Некоторые команды выполняются инструментом docker
, другие инструментом docker-compose
. Правильно будет выролнять их из каталога, в котором расположен файл docker-compose.yml
.
Просмотр списка скачанных и сформированных образов:
# docker images
Прсмотр списка запущенных контейнеров:
# docker ps -a
Остановить работающий контейнер:
# docker-compose stop abclib
Остановить все контейнеры, перечисленные в docker-compose.yml:
# docker-compose stop
Запустить неактивные контейнеры:
# docker-compose start abclib adminer
Запустить все контейнеры, перечисленные в docker-compose.yml:
# docker-compose start
Удалить контейнер:
# docker rm abclib
Удалить работающий контейнер:
# docker rm -f abclib
"Убить" все контейнеры:
# docker-compose kill && docker-compose down
Удалить образ:
# docker rmi -f IMAGE_ID
Удалить несколько образов:
# docker rmi -f IMAGE_ID [IMAGE_ID] ...
Решение проблем
Ниже приведён пример "успешного" развертывания:
# лог процесса развертывания [email protected]:/opt/dockers/abclib# ./create_all.sh # запуск Init MariaDB server with docker-compose Creating mariadb ... done Creating adminer ... done Sleeping 5 seconds Starting MariaDB server Stopping adminer ... done Sleeping 5 seconds Creating databases for ABCLib Running the start mysql function. +-------+-----------+ | user | host | +-------+-----------+ | admin | % | | root | % | | admin | localhost | | root | localhost | +-------+-----------+ Sleeping 5 seconds Uploading databases from dumps Uploading abclib Uploading fa Uploading fb Uploading la Uploading lb Sleeping 5 seconds Init abclib and nginx Building abclib Step 1/9 : FROM centos:centos7 ---> 5182e96772bf Step 2/9 : MAINTAINER The CentOS Project with sshd <[email protected]> ---> Using cache ---> a73bb2968e3b Step 3/9 : RUN yum -y update; yum -y install gcc gcc-c++ kernel-devel mariadb mariadb-devel; yum clean all ---> Using cache ---> ae41ba298164 Step 4/9 : RUN yum install -y https://centos7.iuscommunity.org/ius-release.rpm ---> Using cache ---> 9176c4cc4293 Step 5/9 : RUN yum install -y python36u python36u-libs python36u-devel python36u-pip; yum clean all ---> Using cache ---> eb6e4b1246d3 Step 6/9 : RUN mkdir /opt/abc -p; mkdir /opt/libenv; mkdir /mnt/lib ---> Using cache ---> a0222aa41358 Step 7/9 : COPY ./abcapp/init_abc.sh /opt/abc ---> Using cache ---> 0834c69dfea8 Step 8/9 : WORKDIR /opt/abc ---> Using cache ---> d8f8db6a3f83 Step 9/9 : CMD /opt/abc/init_abc.sh ---> Using cache ---> f82ea11ff3df Successfully built f82ea11ff3df Successfully tagged abclib_abclib:latest mariadb is up-to-date Creating abclib ... done Creating nginx ... done Sleeping 5 seconds [email protected]:/opt/dockers/abclib# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 7c5262bf6b84 nginx:latest "nginx -g 'daemon ..." 2 minutes ago Up 2 minutes 0.0.0.0:80->80/tcp nginx af3dab4b24f9 abclib_abclib "/opt/abc/init_abc.sh" 2 minutes ago Up 2 minutes abclib eacea0bffd6a adminer "entrypoint.sh doc..." 6 minutes ago Exited (0) 6 minutes ago adminer 28a8d11227b3 mariadb "docker-entrypoint..." 6 minutes ago Up 6 minutes 3306/tcp mariadb [email protected]:/opt/dockers/abclib# docker images REPOSITORY TAG IMAGE ID CREATED SIZE abclib_abclib latest f82ea11ff3df 22 hours ago 667MB adminer latest 571854511c81 31 hours ago 81.6MB mariadb latest 199cc294e316 7 days ago 363MB nginx latest 06144b287844 8 days ago 109MB centos centos7 5182e96772bf 5 weeks ago 200MB [email protected]:/opt/dockers/abclib#
В случае возникновения проблем и необходимости повторного развертывания вначале проверяем запущенные контейнеры, затем "убиваем" и удаляем их.
# лог остановки всех контейнеров и удаления образов [email protected]:/opt/dockers/abclib# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 7c5262bf6b84 nginx:latest "nginx -g 'daemon ..." 11 minutes ago Up 11 minutes 0.0.0.0:80->80/tcp nginx af3dab4b24f9 abclib_abclib "/opt/abc/init_abc.sh" 11 minutes ago Up 11 minutes abclib eacea0bffd6a adminer "entrypoint.sh doc..." 15 minutes ago Exited (0) 15 minutes ago adminer 28a8d11227b3 mariadb "docker-entrypoint..." 15 minutes ago Up 15 minutes 3306/tcp mariadb [email protected]:/opt/dockers/abclib# docker-compose kill Killing nginx ... done Killing abclib ... done Killing mariadb ... done [email protected]:/opt/dockers/abclib# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 7c5262bf6b84 nginx:latest "nginx -g 'daemon ..." 12 minutes ago Exited (137) 10 seconds ago nginx af3dab4b24f9 abclib_abclib "/opt/abc/init_abc.sh" 12 minutes ago Exited (137) 10 seconds ago abclib eacea0bffd6a adminer "entrypoint.sh doc..." 16 minutes ago Exited (0) 15 minutes ago adminer 28a8d11227b3 mariadb "docker-entrypoint..." 16 minutes ago Exited (137) 10 seconds ago mariadb [email protected]:/opt/dockers/abclib# docker-compose down Removing nginx ... done Removing abclib ... done Removing adminer ... done Removing mariadb ... done [email protected]:/opt/dockers/abclib# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
Возможно, нет необходимости проделывать то же самое с образами.
Но, предположим, нужно все удалить:
[email protected]:/opt/dockers/abclib# docker images REPOSITORY TAG IMAGE ID CREATED SIZE abclib_abclib latest f82ea11ff3df 22 hours ago 667MB adminer latest 571854511c81 31 hours ago 81.6MB mariadb latest 199cc294e316 7 days ago 363MB nginx latest 06144b287844 8 days ago 109MB centos centos7 5182e96772bf 5 weeks ago 200MB [email protected]:/opt/dockers/abclib# docker rmi -f f82ea11ff3df 571854511c81 199cc294e316 06144b287844 5182e96772bf Untagged: abclib_abclib:latest Deleted: sha256:f82ea11ff3df054d0cb48700da21d5bf6c93809d045436fbf5da5c77552f262f Deleted: sha256:d8f8db6a3f837dba19da94339d132e0aed326f1a1d4104304952bce56d5bb56f Deleted: sha256:0834c69dfea82889954220c7e20c97c80cb72fcad40bf72e4519d3a6d0230c66 Deleted: sha256:8f878d7652452345c7153663ad23fdc4f9158b8b3083f6bcd6359c944472110a Deleted: sha256:a0222aa413586265618af55aaded13ee15bb72a96348c056f907bc438884b740 Deleted: sha256:6cc94b10107aafde134fc91d10d509d74cc4695afda46ff4e30d884a7cd43e55 Deleted: sha256:eb6e4b1246d32fc842a0e3c666ab24ff2e17cf28b1d5d4c3675dc3dbdf3c84bb Deleted: sha256:79c526aa20920a2533f2ad2954e39a71c974ea41e67c4783967bfc25fb7916ab Deleted: sha256:9176c4cc4293648e9ff5be5d68eef877dd46c1726e672c015d9940b6d4b90227 Deleted: sha256:8ad3f227968a7f5f737158599889faf90781b18cd0e5f3d14f7856058c203371 Deleted: sha256:ae41ba2981646d833f8a2662f0f40023578985ad9c2a7efbb110d504a55cbe29 Deleted: sha256:7e8a88b4541f7ca6464079f6c38538abf28efda961793fdf91115a021e4595cb Deleted: sha256:a73bb2968e3b57c5da4a6fcef7a3a36f0ababa882f5118d7430b01d8aa9e4f2d Untagged: adminer:latest Untagged: [email protected]:3cb167f74f4c822175a4e5e84062a2eef60ac5c2453e22f342d4185935b4d885 Deleted: sha256:571854511c81e715f7c4a3f5776879c59a4b340b59a155426b540eb05e3bee5a Deleted: sha256:fb8b5cbdd07156e45e3969c1b220b6df8573bdb8b3b93f0c4ad1ffda157cc50d Deleted: sha256:db0a1302b4cb1885eb4ea63b551ed7f0231cf2a95ccb6e2e57a97dea6b99d698 Deleted: sha256:48a0c306726055fa3af1f59f593dca58487acb6e77a59808aa79e201c06a3073 Deleted: sha256:b2e789c504ca23732e0f8cbc703cee7420c106e769a8b20332ddf1a1c11d806b Deleted: sha256:f6f3cf855fda79704d7261cb2a740b2cb12feb073f664ca5fa50927e46a30a91 Deleted: sha256:36a58687b8437d17c185bf95180d26302bd0858c1ab4917f5e97bcc8679434bf Deleted: sha256:49ef8ae06dbd682a088a42520064fa933c636cd50a972714c6996ab7606bad42 Deleted: sha256:cdd7d6f1a7c3089119fe44e7e8f0e17a365fc3db18c1cb2ee7d29c4ce2040cf8 Deleted: sha256:0eacf83813c795a9caab09e7e96b711117c090f58f65627098c5f785d2443fd6 Deleted: sha256:26304c07b01c0350fca5c2820baa469550263462d7d9df99e76a3d77919189cd Deleted: sha256:a9fcba27d39f66c362f3e1d7d05cb9867aadc075d73d539b45d4b2ce756ecf0d Deleted: sha256:c08dcfc6515da5b32cbc3b527dbed30c63e48680ae581c0584c0aeedeacc1f56 Deleted: sha256:52660490b816d36960ee958851acb45e7db70bbd1d0a6c218767c0b11719c7a4 Deleted: sha256:962ea6483089895a40823eeb397023e0d72a2a86439e8aca569f3903aacded18 Deleted: sha256:a56dbdd7f3a285e745f684be44887a469f6fca24b392546e03363c12ac9d3e55 Deleted: sha256:df64d3292fd6194b7865d7326af5255db6d81e9df29f48adde61a918fbd8c332 Untagged: mariadb:latest Untagged: [email protected]:b7894bd08e5752acdd41fea654cb89467c99e67b8293975bb5d787b27e66ce1a Deleted: sha256:199cc294e3168cac8c8f5499649d258a9d5fbd6700d7c899d9dded911d0b1c58 Deleted: sha256:39804f3f47afd4f3fa243de79d204de281d694222a0bfc05393cca3e06703db3 Deleted: sha256:16ff082f69b487a40c645a65df1badf28500df13b00c3250539592dd4b0be3fe Deleted: sha256:cb7db56c3f7b7537aca51c352b39e80f92a527fed0f7ac16b58f2fc1c6501a23 Deleted: sha256:eb39f8c814726205140d5fa0860318818a85d1ab1ea447fd53ab5cc1208679ff Deleted: sha256:608032e661f8edf0e25048587bbc907e2137b76d5a99e53b0f9cbee4ac73af64 Deleted: sha256:0841bbe1be7526defa0a8abd0f0e1e65cd76032378edc96da34d905c7f2f780a Deleted: sha256:fb3efac08438692b42a884f136c2c276f3b32e4c68854068a555ca17877afd0e Deleted: sha256:2e7455fe419598db8cae61e958478119d9ee676500fb3fb82c1fe7ec6b26e016 Deleted: sha256:f2b7f8dda7a4e16426350a3f65a0e14032c816885bd2da9279005ebcbe99c013 Deleted: sha256:33b6e49777fd6a6a9db5c1fd37de5205d631c448b5d323bfa6bdbd23b26b76e1 Deleted: sha256:2416e906f135eea2d08b4a8a8ae539328482eacb6cf39100f7c8f99e98a78d84 Deleted: sha256:7f8291c73f3ecc4dc9317076ad01a567dd44510e789242368cd061c709e0e36d Deleted: sha256:4b3d88bd6e729deea28b2390d1ddfdbfa3db603160a1129f06f85f26e7bcf4a2 Deleted: sha256:f51700a4e396a235cee37249ffc260cdbeb33268225eb8f7345970f5ae309312 Deleted: sha256:a30b835850bfd4c7e9495edf7085cedfad918219227c7157ff71e8afe2661f63 Untagged: nginx:latest Untagged: [email protected]:24a0c4b4a4c0eb97a1aabb8e29f18e917d05abfe1b7a7c07857230879ce7d3d3 Deleted: sha256:06144b2878448774e55577ae7d66b5f43a87c2e44322b3884e4e6c70d070b262 Deleted: sha256:824a442ee3c96744d75be3737a22cc6a47aebad1b30be67f3c2f8f29cb0aa879 Deleted: sha256:8e3d1e9e4945f930c93c30617512998437f6edafd86676770d29b1581f2520bb Deleted: sha256:8b15606a9e3e430cb7ba739fde2fbb3734a19f8a59a825ffa877f9be49059817 Untagged: centos:centos7 Untagged: [email protected]:6f6d986d425aeabdc3a02cb61c02abb2e78e57357e92417d6d58332856024faf Deleted: sha256:5182e96772bf11f4b912658e265dfe0db8bd314475443b6434ea708784192892 Deleted: sha256:1d31b5806ba40b5f67bde96f18a181668348934a44c9253b420d5f04cfb4e37a [email protected]:/opt/dockers/abclib# docker images REPOSITORY TAG IMAGE ID CREATED SIZE [email protected]:/opt/dockers/abclib#
Кажется, все...
--------------------------------------------------------------------------------------
Пароли и настройка "под себя"
Для упрощения я везде использовал пароль "SecretKey".
Для доступа к MariaDB-серверу используются следующие данные:
- Логин: root
- Пароль: SecretKey
Для доступа к базам данных MariaDB из кода приложения:
- Логин: admin
- Пароль: SecretKey
Для веб-доступа к административной части приложения:
- Логин: [email protected]
- Пароль: SecretKey
Случай, когда вы еще не запускали процесс установки
Здесь все просто.
Прежде всего необходимо изменить пароль доступа к MariaDB-серверу и к базам данных. Для этого откройте docker-compose.yml
, найдите в секции mariadb
раздел environment
и измените содержимое MYSQL_ROOT_PASSWORD
с "SecretKey" на что-то другое:
...
environment:
# mariadb
MYSQL_ROOT_PASSWORD: SecretKey
MYSQL_ROOT_USER: root
...
Зайдите в папку opt, откройте попеременно все скрипты инициализации и измените пароль "SecretKey" на что-либо другое. Различайте пароли: root
- для сервера MariaDB и admin
- для баз данных. В нашем примере они одинаковы, в вашем случае они могут различаться.
Если вы еще не запускали процесс развертывания, то сейчас самое время сделать это. Перейдите в папку, где расположен файл docker-compose.yml
и запустите скрипт create_all.sh
.
Случай, когда процесс установки уже выполнен
Когда все уже заработало, можно воспользоваться прямым подключением к контейнеру. Не вдаваясь в различия, можно воспринимать контейнеры как виртуальные машины. В грубом приближении так оно и есть. И, соответственно, существуют инструменты для подключения к ним.
Для начала убедитесь, что необходимые нам контейнеры активны:
# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 48561b72110e nginx:latest "nginx -g 'daemon ..." 20 hours ago Exited (0) 20 hours ago nginx e5340b0cba0f abclib_abclib "/opt/abc/init_abc.sh" 20 hours ago Up About an hour abclib c3ef7fdc3474 adminer "entrypoint.sh doc..." 21 hours ago Up 3 hours 0.0.0.0:8080->8080/tcp adminer 841d443bb3b7 mariadb "docker-entrypoint..." 21 hours ago Up 3 hours 3306/tcp mariadb
Обратите внимание, контейнер nginx
у нас неактивен. Это указано в колонке STATUS
, значение которой в строке nginx
явно говорит "Exited (0) 20 hours ago". Остальные активны, поскольку в колонке STATUS
указано значение "Up". В том числе активен контейнер mariadb
, к которому подключаемся следующей командой:
# docker exec -it mariadb /bin/bash [email protected]:/# ls bin dev docker-entrypoint.sh home lib64 mnt proc run srv tmp var boot docker-entrypoint-initdb.d etc lib media opt root sbin sys usr [email protected]:/#
Итак, мы подключились к контейнеру mariadb, который является сервером MySQL. Подключаемся к серверу MySQLи выполняем все манипуляции по изменению прав доступа к самому серверу и базам данных:
# mysql -u root -pSecretKey
MariaDB [(none)]> USE mysql; MariaDB [(none)]> UPDATE user SET password=PASSWORD('NewPassword') WHERE User='root' AND Host = 'localhost'; MariaDB [(none)]> FLUSH PRIVILEGES;
Затем последовательно подключаемся ко всем базам данных и меняем пароль для admin:
MariaDB [(none)]> use abclib;
MariaDB [(none)]> SET PASSWORD FOR 'abclib'@'localhost' = PASSWORD('NewPassword'); MariaDB [(none)]> use fa;
MariaDB [(none)]> SET PASSWORD FOR 'fa'@'localhost' = PASSWORD('NewPassword'); MariaDB [(none)]> use fb;
MariaDB [(none)]> SET PASSWORD FOR 'fb'@'localhost' = PASSWORD('NewPassword'); MariaDB [(none)]> use la;
MariaDB [(none)]> SET PASSWORD FOR 'la'@'localhost' = PASSWORD('NewPassword'); MariaDB [(none)]> use lb;
MariaDB [(none)]> SET PASSWORD FOR 'lb'@'localhost' = PASSWORD('NewPassword'); MariaDB [(none)]> FLUSH PRIVILEGES;
MariaDB [(none)]> \q Bye [email protected]:/# exit exit #
И, наконец, выходим из редактирования MySQL и контейнера. Проделанное нами сейчас, по сути дублирует вариант, когда мы еще не запускали процесс установки.
Следующий шаг - настройка доступа из приложения. Для этого перейдите в папку abclib/abcapp
, откройте файл config.py
и в самом конце файла измените пароль доступа к базам данных - параметр MYSQL_PASSWORD
. Здесь же стоит сразу обратить внимание на MAIL_USERNAME
и MAIL_PASSWORD
. Если у вас есть почтовый аккаунт на gmail.com, то введите здесь ваши учетные данные. В этом случае gmail.com будет выступать в качестве посредника между приложением и конечным пользователем.
И, наконец, настройка веб-доступа к административной части приложения. Эту часть следует выполнять после завершения развертывания.
Необходимо инициализировать таблицы базы данных abclib
со списком пользователей и ролей и внести в неё пользователя с правами администратора.
Вначале необходимо отредактивать файл abclib/abcapp/manage.py
. Отыщите в модуле init_db()
строки, начинающиеся с "admin = User(firstname...
" и измените информацию, содержащуюся в них. Обычно я вписываю сюда пользователя с email фактически несуществующего почтового сервера, вида "[email protected]
", главное, чтобы пароль был достаточно сложным. Согласитесь, сложно взломать почтовый ящик несуществующего пользователя.
Теперь мы должны удалить таблицы с пользовательскими данными. Проверяем, что контейнер abclib
активен
# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 5c9792fb095f nginx:latest "nginx -g 'daemon ..." 12 hours ago Up 2 hours 0.0.0.0:80->80/tcp nginx 66e9ff10cb23 abclib_abclib "/opt/abc/init_abc.sh" 12 hours ago Up 2 hours abclib c3ef7fdc3474 adminer "entrypoint.sh doc..." 41 hours ago Exited (0) 2 hours ago adminer 841d443bb3b7 mariadb "docker-entrypoint..." 41 hours ago Up 2 hours 3306/tcp mariadb
и подключаемся к нему
# docker exec -it abclib /bin/bash
[[email protected] abc]#
Ранее мы подключадись к контейнеру mariadb
и уже изнутри подключались к серверу MySQL командой mysql -u root -p
. Сразу скажу, что в этом случае подобный финт не прокатит, поскольку контейнер другой. Здесь применим вариант команды MySQL, учитывающий подключение к сервису удаленного компьютера:
# mysql --protocol=tcp --host=mariadb --user=root --password=SecretKey Welcome to the MariaDB monitor. Commands end with ; or \g. Your MariaDB connection id is 27 Server version: 10.3.9-MariaDB-1:10.3.9+maria~bionic mariadb.org binary distribution Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. MariaDB [(none)]>
Подключаемся к базе данных, смотрим список таблиц и удаляем roles_users
, role
и user
.
MariaDB [(none)]> use abclib; Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Database changed MariaDB [abclib]> show tables; +------------------+ | Tables_in_abclib | +------------------+ | favorite | | popular | | role | | roles_users | | service | | session | | user | +------------------+ 7 rows in set (0.00 sec) MariaDB [abclib]> drop table roles_users; Query OK, 0 rows affected (0.07 sec) MariaDB [abclib]> drop table role; Query OK, 0 rows affected (0.06 sec) MariaDB [abclib]> drop table user; Query OK, 0 rows affected (0.03 sec) MariaDB [abclib]> \q
Bye
[[email protected] abc]#
И выходим из редактирования MySQL, но пока остаемся приаттачеными к контейнеру abclib
. Вспоминаем python-овский virtualenv:
[[email protected] abc]# cd /opt/abc (env) [[email protected] abc]# env/bin/python manage.py create_db (env) [[email protected] abc]# env/bin/python manage.py init_db
(env) [[email protected] abc]# exit
exit
#
С помощью первой команды переходим в каталог /opt/abc
. Второй - создаем заново удаленные таблицы. С помощью третьей - инициализируем таблицы новыми данными учетки администратора.
Теперь можно перейти в браузер по адресу http://ваш_ip_адрес и войти в программу с правами администратора.
--------------------------------------------------------------------------------------
PS.
Это надо сделать обязательно, иначе новые пользователи не смогут регистрироваться.
Найдите файл abclib/abcapp/env/lib/python3.6/site-packages/flask_security/views.py, найдите в нем модуль register() и измените его в соответствии с приведенной ниже информацией.
. . .
@anonymous_user_required def register(): """View function which handles a registration request.""" if _security.confirmable or request.is_json: # было так
if request.is_json: # надо так
. . .
Вот теперь все!