Serwer VPS kosztuje tyle co droższe kraftowe piwo. Kupiłem I nie żałuje. Za kilka złotych ciężko oczekiwać wydajność rozwiązań chmurowych i faktycznie pojawiło się kilka zgrzytów :) Poniże krótka instrukcja konfiguracji, która sprawdza się u mnie. Dla sportu robię reinstalację servera raz na jakiś czas dopracowując szczegóły. Pojawia się kilka drobnych różnic w stosunku do oryginalnego tekstu Łukasza Prokulskiego ( stawiamy własny serwer ), ale mają one charakter kosmetyczny.
v2
Od czasu, gdy pisałem pierwszą wersję instrukcji minęło ponad pół roku. W tym czasie wyszło bardzo wiele niedociągnięć, które popełniłem za pierwszym razem. Z okazjis wyjścia Ubuntu 20.04 postanowiłem przeinstalować wszystko od zera, starając się wdrożyć to wszystko, o czym dowiedziałem się w tym czasie.
Podstawowa konfiguracja serwera
Opis na podstawie tekstu Łukasza Prokulskiego: Stawiamy własny serwer uzupełnianego o inne źródła. Za radą Łukasza wybrałem serwer webh.pl i ogólnie nie żałuję, miał być tani i taki jest. Ma jednak jedną istotną wadę, która na początku może spędzać sen z powiek.
Jest nią niepoprawna obsługa rozszerzenia instrukcji procesora AVX2 przez wirtualna maszynę (problem z biblioteką OpenBLAS). Link do szerszego opisu dla dociekliwych.
Rozwiązaniem jest ręczne określenie typu procesora w zmiennych systemowych, co można zrobić ręcznie z poziomu konsoli instrukcją:
export OPENBLAS_CORETYPE="Skylake"
Ewentualnie z poziomu skryptu pythona:
import os
os.environ["OPENBLAS_CORETYPE"] ="Skylake"
os.getenv("OPENBLAS_CORETYPE")
W jupyter możemy skorzystać z magiczej funkcji:
%env OPENBLAS_CORETYPE=Skylake
Polecam rozwiązać to w sposób permanentny, poprzez modyfikację sudo nano /etc/environment
i dodanie w nim linii:
OPENBLAS_CORETYPE="Skylake"
Pozostaje przeładować zmienne systemowe i można sprawdzić czy wszystko jest ok:
source /etc/environment
echo $OPENBLAS_CORETYPE
Skylake
Jeżeli mimo tego nadal pojawiałyby się problemy, to należy zrestartować serwer.
Użytkownicy i logowanie
Dodanie nowego użytkownika którego będziemy używać do pracy zamiast konta root
adduser lambda
Dodanie użytkownika lambda
do grupy administratorów:
gpasswd -a lambda sudo
Wyłączenie możliwości logowania użytkownika root
poprzez SSH
sudo nano /etc/ssh/sshd_config
PermitRootLogin yes
zamienić na:
PermitRootLogin no
O tym dlaczego warto to zrobić dla własnego bezpieczenstwa, można poczytać w artykule Lessons Learned from SSH Credential Honeypots
Jeżeli mimo wszystko potrzebujesz naocznie przekonać się na jakie zagrożenia narażone sa komputery podłączone do internetu to polecam wykonanie komendy
grep "Failed password" /var/log/auth.log
Aktywacja firewalla, dodanie reguły dla OpenSSH
sudo ufw app list
sudo ufw allow OpenSSH
sudo ufw enable
sudo ufw status
Poprawna konfiguracja:
Status: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
restart
sudo service ssh restart
Aktualizacja systemu:
sudo apt-get update
sudo apt-get upgrade
Przydatne programy:
sudo apt install mc
Jeżeli planujemy instalację biblioteki OpenCV z conda-forge
to można od razu doinstalować:
sudo apt install libgl1-mesa-glx
W ten sposób nie musimy pózniej google-ować co powoduje błąd (ImportError: libGL.so.1: cannot open shared object file: No such file or directory). Zaoszczedziliśmy właśnie 30s życia :)
3) Python
Instalacja podstawowych pakietów
python3 -V
> Python 3.6.9
Instalacja i aktualizacja pip
sudo apt install python3-pip python3-dev
sudo -H pip3 install --upgrade pip
pip3 -V
>pip 9.0.1 from /usr/lib/python3/dist-packages (python 3.6)
Menadżer pakietów dla Python, komendy w wierszu poleceń:
pip list # – lista zainstalowanych pakietów
pip search # – szuka pakietów w repozytorium online
pip install pakiet # – instalowanie modułu
pip uninstall pakiet # - odinstalowanie
pip list –o # - sprawdzenie nieaktualnych pakietów
pip install –U pakiet # - update pakietu
pip freeze> plik.txt # – zapisanie informacji do pliku o pakietach
pip install –r plik.txt # – zainstaluje wszystkie wymagane pakiety
Biblioteki systemowe:
sudo apt install build-essential libssl-dev libffi-dev
Przykład pliku requirements.txt:
# Moduł warunek wersja
numpy >= 1.15.2
pandas == 0.23.4
Conda & JupyterLab
Za pierwszym razem instalowałem Jupyter Notebook i JupyterLab wykorzystując venv. Tym razem zdecydowałem się bardziej odseparować od systemowego pythona i wykorzystałem menadżer pakietów conda.
Opisane na podstawie:
Odblokowanie portów firewalla:
sudo ufw enable
sudo ufw allow 8888
sudo ufw allow 22
sudo ufw status
Wynik:
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
8888 ALLOW Anywhere
Pobranie Anaconda, najnowsza wersja Linux x64 Miniconda w najnowszej wersji (i po co był ten curl? wget
zrobi to samo i jest dostępny od razu):
cd /tmp
sudo apt install curl
# notka do przyszłego mnie: uzyj miniconda, zaoszczędzisz miejsca i czasu
wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh
# curl -O https://repo.anaconda.com/archive/Anaconda3-2020.07-Linux-x86_64.sh
Instalacja:
#sh Anaconda3-2020.07-Linux-x86_64.sh
sh Miniconda3-latest-Linux-x86_64.sh
W celu inicjalizacji po zakończeniu procesu instalacji, najpierw należy uruchomić:
<ścieżka do conda>/bin/activate
a następnie uruchomić conda init
Można to też zrobić w trakcie instalacji wyrażając zgodę pod koniec instalacji.
Po instalacji:
source ~/.bashrc
Sprawdzenie czy instalacja przebiegła poprawnie:
conda --version
Stworzenie wirtualnego środowiska conda (z Python 3.7.0):
conda create --name env python=3.7.0
conda activate env
Instalacja JupyterLab:
conda install -c conda-forge jupyterlab
Polecam też doinstalować od razu podstawowe biblioteki:
conda install -y -c conda-forge numpy
conda install -y -c conda-forge pandas
conda install -y -c conda-forge matplotlib
conda install -y -c conda-forge missingno
# conda install -y -c conda-forge opencv
# warto rozważyć instalację OpenCV z pomoca pip.
# Zyskamy dostęp do dodatkowych modułów:
pip install opencv-contrib-python
Stworzenie pliku konfiguracyjnego:
jupyter-lab --generate-config
Writing default config to: /home/lambda/.jupyter/jupyter_lab_config.py
Można od razu ustawić w nim domyślny folder roboczy:
nano /home/lambda/.jupyter/jupyter_lab_config.py
poprzez ustawienie linii
c.ServerApp.root_dir = '/home/lambda/ntbks'
Ustawienie hasła (nie będzie konieczne podawanie długiego tokena do autoryzacji):
jupyter notebook password
jupyter server password
Enter password: **********
Verify password: **********
[NotebookPasswordApp] Wrote hashed password to: /home/lambda/.jupyter/jupyter_notebook_config.py
Po połączaniu przez SSH powinniśmy mieć dostęp do JupyterLab (pod adresem localhost:8888):
ssh -L 8888:localhost:8888 myuser@your_server_ip
W PUTTy:
Ustawienie tunelu w SSH
SSH -> Tunnels
L8000 localhost:8888
Połączenie (na komputerze lokalnym):
http://localhost:8000
Po zalogowaniu każdorazowo konieczne jest uruchomienie ręcznie środowiska:
conda activate env
jupyter lab
###
Dlib
Dodatkowe informacje temat niuansów instalacji OpenCV. Warto pomyśleć też nad instalacją biblioteki Dlib:
- Utworzenie środowiska z python 3.7:
conda create -n cenv python=3.7.0
- Instalacja cmake:
conda install cmake
- Instalacja Dlib :
pip install dlib
- Sprawdzenie poprawności w IPython:
python
Python 3.7.0 (default, Oct 9 2018, 10:31:47)
[GCC 7.3.0] :: Anaconda, Inc. on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import dlib
>>> dlib.__version__
'19.21.0'
Jeżeli zastanawiasz się czego jeszcze nie ma w utworzonym środowisku, to conda list
powie co już mamy.
PS.
Korzystam zwykle z kanału conda-forge można na przyszłość ustawić go jako domyślny.
NodeJs
Doinstalowanie nodeJS (w celu późniejszego korzystania z rozszerzeń)
cd /tmp
curl -sL https://deb.nodesource.com/setup_14.x -o nodesource_setup.sh
sudo bash nodesource_setup.sh
sudo apt-get install -y nodejs
Dodatki
Jeżeli wszystko działa to możemy na koniec doinstalować ciemny motyw:
jupyter labextension install @telamonian/theme-darcula
CTRL + /
- komentowanie (jednej lub wielu) linii kodu
SHIFT + L
- pokazuje ukrywa numery linii
Lokalnie pracuję korzystając z Dockera
Sprawdzanie pisowni:
jupyter labextension install @ijmbarr/jupyterlab_spellchecker
Git
Od razu zainstalujemy git tak żeby od razu synchronizować całą pracę.
sudo apt-get install git
Konfiguracja:
git config --global user.name "user_name"
git config --global user.email "email_id"
Klonowanie repozytorium (po przejściu do właściwego folderu):
cd ~/github
git clone https://github.com/xxx/py_otomoto.git
Remote VS Code
sudo apt-get install openssh-server
sudo apt-get install sshfs