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 --versionnp. Python 3.12.11
Uwaga: samo
python3 --versionpoza 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 djangoInicjalizacja 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 .envTwój lokalny plik .env może wyglądać tak:
DJANGO_DEBUG=True
DJANGO_ALLOWED_HOSTS=192.168.1.205,localhost,127.0.0.1Dodaj też do repo plik
.env.examplez przykładowymi (pustymi/fake) wartościami jako szablon dla kolejnych wdrożeń —.envjest 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.txtUwaga 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 migrateWskaż 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
.gitkeepfaktycznie istnieją wmedia/itmp/i są commitowane — inaczej te foldery nie powstaną po sklonowaniu repo na nowym środowisku.
Checklist przy każdej aktualizacji wersji Pythona na produkcji
- Sprawdź wersję na prod:
source venv/bin/activate && python --version(nie samopython3 --version). - Zainstaluj tę samą wersję na dev:
uv python install X.Y.Z. - Podmień venv projektu:
rm -rf venv && uv venv --python X.Y.Z venv. - Zainstaluj zależności:
uv pip install -r requirements.txt. - Sprawdź działanie:
python manage.py checki test Pillow (features.pilinfo()), jeśli projekt przetwarza obrazy.