Instalacja środowiska Django (dev) dopasowanego do prod (MyDevil)

Sprawdzenie wersji Pythona na produkcji (MyDevil)

Zaloguj się przez SSH na hosting i sprawdź wersję Pythona używaną faktycznie przez venv aplikacji (nie systemową!):

source venv/bin/activate
python --version

np. Python 3.12.11

Uwaga: samo python3 --version poza aktywnym venv pokaże wersję domyślną hostingu, a nie tę, na której faktycznie działa Twoja aplikacja. MyDevil udostępnia kilka wersji jako osobne polecenia: python3.8, python3.9, python3.10, python3.11, python3.12 — zawsze sprawdzaj wersję z aktywnego środowiska projektu.

Instalacja Pythona na dev (Debian) — przez uv

Nie instalujemy Pythona przez apt (systemowa wersja Debiana zwykle nie pokrywa się z wersją na hostingu) ani nie kompilujemy go przez pyenv (bardzo długi czas kompilacji na słabszych maszynach/LXC). Zamiast tego używamy uv — pobiera gotowe, prekompilowane binarki Pythona w kilkadziesiąt sekund.

curl -LsSf https://astral.sh/uv/install.sh | sh
source ~/.bashrc

# podmień na dokładną wersję sprawdzoną na prod
uv python install 3.12.11

Tworzenie katalogu projektu i środowiska

mkdir -p /opt/wsi_django && cd /opt/wsi_django

uv venv --python 3.12.11 venv
source venv/bin/activate
python --version   # powinno pokazać 3.12.11

Instalacja Django

uv pip install --upgrade pip
uv pip install django

Inicjalizacja projektu

django-admin startproject wsi_django .

Instalacja modułów

uv pip install django-environ openpyxl weasyprint django-axes python-dotenv
uv pip freeze > requirements.txt
  • django-environ — do bezpiecznego przechowywania konfiguracji i haseł w pliku .env.
  • openpyxl — lekka biblioteka do tworzenia i modyfikacji plików Excel (.xlsx), używana też do exportu do Excela.
  • weasyprint — generowanie dokumentów PDF przy użyciu szablonów HTML i CSS.
  • django-axes — blokuje adres IP lub konto użytkownika po określonej liczbie nieudanych prób logowania (ochrona przed brute-force).

Uruchomienie WWW

Dodaj IP kontenera do dozwolonych hostów:

nano wsi_django/settings.py
"""
Django settings for wsi_django project.
Generated by 'django-admin startproject' using Django 6.0.7.
For more information on this file, see
https://docs.djangoproject.com/en/6.0/topics/settings/
For the full list of settings and their values, see
https://docs.djangoproject.com/en/6.0/ref/settings/
"""
import os                             # <-- Dodany import systemu operacyjnego
from pathlib import Path
from dotenv import load_dotenv        # <-- Dodany import do obsługi .env

# Build paths inside the project like this: BASE_DIR / 'subdir'.
BASE_DIR = Path(__file__).resolve().parent.parent

# Wczytanie zmiennych z pliku .env z głównego katalogu projektu
load_dotenv(BASE_DIR / '.env')        # <-- Ta linijka ładuje plik .env

# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/6.0/howto/deployment/checklist/

# SECURITY WARNING: keep the secret key used in production secret!
# Szuka DJANGO_SECRET_KEY w .env. Jeśli go nie ma, używa Twojego dotychczasowego klucza:
SECRET_KEY = os.getenv('DJANGO_SECRET_KEY', 'django-insecure-p02yiaj=dt2=lzpu!e&14(s_v3oow!2-isshp74x#@7gt*4e#_')

# SECURITY WARNING: don't run with debug turned on in production!
# DEBUG będzie True tylko wtedy, gdy w .env znajdzie się linijka DJANGO_DEBUG=True
DEBUG = os.getenv('DJANGO_DEBUG', 'False') == 'True'

# Szuka DJANGO_ALLOWED_HOSTS w .env jako tekstu z przecinkami.
# Jeśli go nie znajdzie, używa Twojej dotychczasowej listy hostów jako domyślnej:
allowed_hosts_raw = os.getenv('DJANGO_ALLOWED_HOSTS', '192.168.1.205,localhost,127.0.0.1')
ALLOWED_HOSTS = [host.strip() for host in allowed_hosts_raw.split(',') if host.strip()]

Plik z hasłami .env:

nano .env

Twój lokalny plik .env może wyglądać tak:

DJANGO_DEBUG=True
DJANGO_ALLOWED_HOSTS=192.168.1.205,localhost,127.0.0.1

Dodaj też do repo plik .env.example z przykładowymi (pustymi/fake) wartościami jako szablon dla kolejnych wdrożeń — .env jest ignorowane przez git, więc po sklonowaniu repo na nowym środowisku trzeba je utworzyć ręcznie.

Migracja pierwszej bazy:

source venv/bin/activate
python manage.py migrate
python manage.py runserver 0.0.0.0:8000

Strona WWW:

http://192.168.1.205:8000/

Wdrożenie na produkcję (MyDevil) — git

Repo wysyłane jest na git z .gitignore (patrz niżej). Na hostingu klonujemy je i tworzymy środowisko na tej samej wersji Pythona co obecnie na koncie:

git clone git@github.com:TWÓJ_LOGIN/NAZWA_REPOZYTORIUM.git public_python
cd public_python

python3.12 --version   # potwierdź dostępną wersję na hostingu

virtualenv venv -p python3.12
source venv/bin/activate
pip install --upgrade pip
pip install -r requirements.txt

Uwaga dot. kompilacji pakietów natywnych (np. Pillow) na MyDevil

Niektóre pakiety z natywnym kodem C (Pillow, lxml, psycopg2) mogą wymagać dodatkowych zmiennych środowiskowych, aby kompilacja się powiodła:

export CFLAGS="-I/usr/local/include"
export CXXFLAGS="-I/usr/local/include"

Ustaw je przed instalacją takich pakietów, jeśli pip install zwraca błąd kompilacji.

Po instalacji warto zweryfikować, czy Pillow wbudował te same formaty/biblioteki co na dev:

python -c "from PIL import features; features.pilinfo()"

Po zainstalowaniu zależności

python manage.py collectstatic --noinput
python manage.py migrate

Wskaż w panelu MyDevil (typ strony: Python → "Inny plik wykonywalny") ścieżkę do interpretera z venv:

/usr/home/LOGIN/domains/TWOJA_DOMENA/public_python/venv/bin/python

.gitignore

# Środowisko wirtualne
venv/
.venv/
env/

# Baza danych SQLite
*.sqlite3
db.sqlite3

# Pliki tymczasowe Pythona
__pycache__/
*.pyc
*.pyo
*.pyd

# Automatyczne puste foldery (media i tmp)
media/*
!media/.gitkeep

tmp/*
!tmp/.gitkeep

# Pozostałe pliki generowane i statyczne
school_logos/
staticfiles/

# Pliki konfiguracyjne edytora i systemu
.vscode/
.idea/
.DS_Store

# Pliki z sekretami/konfiguracją (np. klucze, hasła)
.env
local_settings.py

Upewnij się, że .gitkeep faktycznie istnieją w media/ i tmp/ i są commitowane — inaczej te foldery nie powstaną po sklonowaniu repo na nowym środowisku.


Checklist przy każdej aktualizacji wersji Pythona na produkcji

  1. Sprawdź wersję na prod: source venv/bin/activate && python --version (nie samo python3 --version).
  2. Zainstaluj tę samą wersję na dev: uv python install X.Y.Z.
  3. Podmień venv projektu: rm -rf venv && uv venv --python X.Y.Z venv.
  4. Zainstaluj zależności: uv pip install -r requirements.txt.
  5. Sprawdź działanie: python manage.py check i test Pillow (features.pilinfo()), jeśli projekt przetwarza obrazy.

Spis treści: