После того, как свой старый компьютер (Lubuntu 18.04 Desktop) я приспособил к проекту изучения работы связки Python3 + нейронные сети, а то обычное системное администрирование уже как-то под надоело, хочется может сменить или дополнить навыки в пользу программирования. И дабы быстрее производить изучение и сразу видеть результат, я решил вогрузить на него компьютерApache2 + Jupyter.

Jupyter Notebook — это Web оболочка для интерактивных вычислений. Этот инструмент поможет создавать файлы (notebooks), которые содержат не только компьютерный код, но и другие элементы (заметки, уравнения, диаграммы, ссылки и т.д.), которыми можно потом поделиться с заказчиками или друзьями.

Старый компьютер:

  • Motherboard: Gigabyte GA-MA770-UD3
  • CPU: AMD Phenom(tm) 9850 Quad-Core Processor
  • HDD: 120 ГБ SSD диск Kingston A400 (SA400S37/120G)
  • RAM: 8G (DDR 2)
  • VideoCard: PALIT nVidia GeForce GTX 1080 , PA-GTX1080 GameRock Premium 8G, 8Гб, GDDR5X, Ret [neb1080h15p2-1040g]

Шаг №1: Установка системы Lubuntu 18.04 Desktop выполнена по заметке:

Шаг №2: Установка драйверов на видеокарту выполнена по заметке:

Шаг №3: К систему Lubuntu 18.04 Desktop применена заметка где настраивается AutoLogon:

Шаг №4: Устанавливаю на систему Lubuntu 18.04 Desktop Web-сервис apache2:

ekzorchik@srv-dbionic:~$ sudo apt-get install -y apache2
ekzorchik@srv-dbionic:~$ echo "ServerName localhost" | sudo tee -a /etc/apache2/apache2.conf
ekzorchik@srv-dbionic:~$ sudo rm -f /var/www/html/index.html
ekzorchik@srv-dbionic:~$ sudo cp /etc/apache2/sites-available/000-default.conf /etc/apache2/sites-available/jupyter.conf
ekzorchik@srv-dbionic:~$ sudo nano /etc/apache2/sites-available/jupyter.conf
<VirtualHost *:80>
        ServerName 172.33.33.2
        ProxyPreserveHost On
        ProxyRequests Off
        ProxyPass /api/kernels/ ws://localhost:5000/api/kernels/
        ProxyPassReverse /api/kernels/ http://localhost:5000/api/kernels/
        ProxyPass / http://localhost:5000/
        ProxyPassReverse / http://localhost:5000/
</VirtualHost> 
ekzorchik@srv-dbionic:~$ sudo unlink /etc/apache2/sites-available/000-default.conf
ekzorchik@srv-dbionic:~$ sudo unlink /etc/apache2/sites-available/default-ssl.conf
ekzorchik@srv-dbionic:~$ sudo unlink /etc/apache2/sites-enabled/000-default.conf

Шаг №5: Устанавливаю пакеты Python3 на систему:

ekzorchik@srv-dbionic:~$ sudo apt-get install -y python3.6-venv python3.6 python3-venv ipython3 python3-pip virtualenvwrapper

ekzorchik@srv-dbionic:~$ sudo pip3 install virtualenv virtualenvwrapper

Шаг №6: Создаю виртуальное окружение для Jupyter:

ekzorchik@srv-dbionic:~$ python3.6 -m venv jupyterenv

ekzorchik@srv-dbionic:~$ source jupyterenv/bin/activate

(jupyterenv) ekzorchik@srv-dbionic:~$

(jupyterenv) ekzorchik@srv-dbionic:~$ pip install jupyter wheel

(jupyterenv) ekzorchik@srv-dbionic:~$

(jupyterenv) ekzorchik@srv-dbionic:~$ jupyter notebook --generate-config

Writing default config to: /home/ekzorchik/.jupyter/jupyter_notebook_config.py

(jupyterenv) ekzorchik@srv-dbionic:~$

(jupyterenv) ekzorchik@srv-dbionic:~$ mkdir notebooks

(jupyterenv) ekzorchik@srv-dbionic:~$ nano ~/.jupyter/jupyter_notebook_config.py

c.NotebookApp.notebook_dir = '/home/ekzorchik/notebooks/'

c.NotebookApp.open_browser = False

c.NotebookApp.port = 5000

jupyterenv) ekzorchik@srv-dbionic:~$ jupyter notebook password

Enter password: указываю пароль 712mbddr@

Verify password: указываю пароль 712mbddr@

[NotebookPasswordApp] Wrote hashed password to /home/ekzorchik/.jupyter/jupyter_notebook_config.json

(jupyterenv) ekzorchik@srv-dbionic:~$

(jupyterenv) ekzorchik@srv-dbionic:~$ cat .jupyter/jupyter_notebook_config.json

{

"NotebookApp": {

"password": "sha1:9a1a2f1301f2:5bfc952787102560963e56ace6c6bc54231651d3"

}

}(jupyterenv) ekzorchik@srv-dbionic:~$

(jupyterenv) ekzorchik@srv-dbionic:~$ deactivate

ekzorchik@srv-dbionic:~$

Шаг №7: Активирую сайт jupyter.conf и модули для работы Web-сервиса с окружением Python3 сервиса jupyter:

ekzorchik@srv-dbionic:~$ sudo a2ensite jupyter.conf

ekzorchik@srv-dbionic:~$ sudo a2enmod proxy

ekzorchik@srv-dbionic:~$ sudo a2enmod proxy_http

ekzorchik@srv-dbionic:~$ sudo a2enmod proxy_wstunnel

ekzorchik@srv-dbionic:~$ nano jupyter

#!/bin/bash

. /home/ekzorchik/jupyterenv/bin/activate

jupyter notebook --config="/home/ekzorchik/.jupyter/jupyter_notebook_config.py" &

ekzorchik@srv-dbionic:~$ chmod +x jupyter

Шаг №8: Теперь нужно настроить чтобы созданный в предыдущем шаге скрипт запускался вместе с системой.

Далее по заметке "Как на Ubuntu 18.04 включить rc.local"

ekzorchik@srv-dbionic:~$ sudo nano /etc/systemd/system/rc-local.service

[Unit]

Description=/etc/rc.local Compatibility

ConditionPathExists=/etc/rc.local

[Service]

Type=forking

ExecStart=/etc/rc.local start

TimeoutSec=0

StandardOutput=tty

RemainAfterExit=yes

SysVStartPriority=99

[Install]

WantedBy=multi-user.target

Вот только в Ubuntu 18.04 Server файл rc.local есть, а в Lubuntu Desktop 18.04 его нет, значит создаю:

ekzorchik@srv-dbionic:~$ sudo nano /etc/rc.local

#!/bin/bash

exit 0

ekzorchik@srv-dbionic:~$ sudo chmod +x /etc/rc.local

ekzorchik@srv-dbionic:~$ sudo systemctl enable rc-local

Created symlink /etc/systemd/system/multi-user.target.wants/rc-local.service → /etc/systemd/system/rc-local.service.

ekzorchik@srv-dbionic:~$ sudo systemctl start rc-local

Да, все в заметке выше справедливо и для Lubuntu 18.04 Desktop amd64

После действий выше указываю строку на запуск скрипта:

ekzorchik@srv-dbionic:~$ sudo nano /etc/rc.local

#!/bin/bash

su -c "/home/ekzorchik/jupyter" -s /bin/sh ekzorchik

exit 0

Шаг №9: Отправляю систему в перезагрузку дабы проверить, что после отработает скрипт запуска виртуального окружения jupyter через Web-сервис Apache2:

ekzorchik@srv-dbionic:~$ sudo reboot

ekzorchik@srv-dbionic:~$ sudo netstat -tulpn | grep -I '80\|5000'

tcp 0 0 127.0.0.1:5000 0.0.0.0:* LISTEN 809/python3

tcp6 0 0 ::1:5000 :::* LISTEN 809/python3

tcp6 0 0 :::80 :::* LISTEN 692/apache2

ekzorchik@srv-dbionic:~$

Из локальной сети обращаюсь на http://172.33.33.2

При обращении к jupyter из сети получаю 403: Forbidden

Почему?

Запустил строки вручную и выявил ошибку вида

[W 17:24:43.493 NotebookApp] Blocking request with non-local 'Host' 172.33.33.2 (172.33.33.2). If the notebook should be accessible at that name, set NotebookApp.allow_remote_access to disable the check.

ekzorchik@srv-dbionic:~$ nano .jupyter/jupyter_notebook_config.py

c.NotebookApp.allow_remote_access = True

ekzorchik@srv-dbionic:~$ sudo reboot

После открываю браузер и в строке адрес указываю URL где все выше проделывается: http://172.33.33.2 и вот он запрос на авторизацию.

Теперь вижу окно ввода пароля на доступ в Jupyter

Ввел пароль (тот который я указывал шагами выше, т.е. 712mbddr@) и я успешно авторизован:

Успешно авторизовался созданным паролем выше

Итого, теперь с каждым запуском компьютера у меня в автоматическом режиме запускается Jupyter.

На заметку: Shift + Enter — это выполнить код в ячейке

В процессе использования выявил, что не работает New - Terminal, но это пока для меня не главное. Будет нужда разберусь. На этом пока все, с уважением автор блога Олло Александр aka ekzorchik.