Ací es mostren les diferències entre la revisió seleccionada i la versió actual de la pàgina.
| Ambdós costats versió prèvia Revisió prèvia Següent revisió | Revisió prèvia | ||
|
django_react_produccio [2026/04/13 08:47] enric_mieza_sanchez [Conceptes previs] |
django_react_produccio [2026/04/13 10:58] (actual) enric_mieza_sanchez [Configurar Apache2] super per isard user |
||
|---|---|---|---|
| Línia 38: | Línia 38: | ||
| Abans de començar necessitem disposar de: | Abans de començar necessitem disposar de: | ||
| - | * Un projecte Django amb React, ja sigui en un sol repo en o en repositoris separats. Si no en tens cap, pots fer servir [[https:// | + | * Un **projecte Django amb React**, ja sigui en un sol repo en o en repositoris separats. Si no en tens cap, pots fer servir [[https:// |
| - | * Un servidor operatiu amb accés SSH i amb un domnini configurat que l'hi apunta elmeudomini.com . L' | + | * Un **servidor** operatiu amb accés SSH i amb un domnini configurat que l'hi apunta elmeudomini.com . L' |
| + | |||
| + | Assumim que el servidor que disposem és dedicat únicament a aquesta app. És possible configurar diverses aplicacions en un server, però en ares de la simplicitat ho plategem així. | ||
| \\ | \\ | ||
| Línia 56: | Línia 58: | ||
| </ | </ | ||
| - | Amb això ja tindriem | + | <WRAP important> |
| + | Mai poseu una // | ||
| + | </ | ||
| + | |||
| + | Amb això ja tindríem | ||
| \\ | \\ | ||
| + | ===== Django ===== | ||
| + | |||
| + | Instal·lem dependències del sistema. Utilitzarem [[Python venv]] per a la gestió de les biblioteques de codi. | ||
| + | |||
| + | Haurem d' | ||
| + | |||
| + | Assumim que el projecte Django utilitza un plugin com '' | ||
| + | |||
| + | També assumim que instal·larem l' | ||
| + | |||
| + | <code bash> | ||
| + | $ sudo apt install default-libmysqlclient-dev python3-dev python3-venv git | ||
| + | $ git clone https:// | ||
| + | $ cd projecte-django-react | ||
| + | $ python3 -m venv env | ||
| + | $ source env/ | ||
| + | (env) $ pip install -r requirements.txt | ||
| + | (env) $ pip install mysqlclient | ||
| + | (env) $ cp .env.example .env | ||
| + | </ | ||
| + | |||
| + | Ajusta els valors de '' | ||
| + | |||
| + | També ajusta el domini **elmeudomini.com** com pertoqui: | ||
| + | |||
| + | <file bash .env> | ||
| + | SECRET_KEY=sdjfhisdfg67sdtf78ewhf8w3efheh7uf9iehfj98er | ||
| + | DATABASE_URL=mysql:// | ||
| + | # | ||
| + | ALLOWED_HOSTS=elmeudomini.com | ||
| + | CORS_ALLOWED_ORIGINS=http:// | ||
| + | </ | ||
| + | |||
| + | <WRAP important> | ||
| + | Fixeu-vos que ALLOWED_HOSTS hem tret el domini wildcard " | ||
| + | </ | ||
| + | |||
| + | Ara ja podem acabar de fer comprovacions i crear les taules de la BD: | ||
| + | |||
| + | <code bash> | ||
| + | (env) $ ./manage.py check | ||
| + | (env) $ ./manage.py migrate | ||
| + | (env) $ ./manage.py createsuperuser | ||
| + | </ | ||
| + | |||
| + | === Tests === | ||
| + | |||
| + | Podeu fer també un '' | ||
| + | (env) $ ./manage.py runserver | ||
| + | |||
| + | Amb el servidor de desenvolupament obert podeu provar d' | ||
| + | $ curl localhost: | ||
| + | $ curl localhost: | ||
| + | |||
| + | \\ | ||
| + | |||
| + | ===== ReactJS ===== | ||
| + | |||
| + | Assumim que disposem de la part de React del projecte a la carpeta ''/ | ||
| + | |||
| + | Instal·lem NodeJS versió LTS. Primer instal·lem la versió que hi hagi als repos del sistema operatiu que tinguem, i després fem un //upgrade// amb l'eina '' | ||
| + | <code bash> | ||
| + | sudo apt install nodejs npm | ||
| + | sudo npm i -g n | ||
| + | sudo n lts | ||
| + | </ | ||
| + | |||
| + | Tanqueu el terminal o la connexió SSH perquè els canvis de la versió de NodeJS prenguin efecte. | ||
| + | |||
| + | Aneu a la carpeta de React, configurem i compilem: | ||
| + | |||
| + | <code bash> | ||
| + | $ cd / | ||
| + | $ npm install | ||
| + | $ cp src/ | ||
| + | </ | ||
| + | |||
| + | Editeu '' | ||
| + | |||
| + | Un cop configurat amb els dominis adequats, podem compilar l'app React. | ||
| + | |||
| + | $ npm run build | ||
| + | |||
| + | <WRAP tip> | ||
| + | El '' | ||
| + | </ | ||
| + | |||
| + | \\ | ||
| + | |||
| + | ===== Configurar Apache2 ===== | ||
| + | |||
| + | \\ | ||
| + | |||
| + | === Permisos de carpetes === | ||
| + | |||
| + | Probablement haureu clonat el repositori del projecte al //home directory// de l' | ||
| + | |||
| + | $ chmod 755 ~ | ||
| + | |||
| + | \\ | ||
| + | |||
| + | === Arxius estàtics Django === | ||
| + | Necessitem recollir tots els arxius estàtics del projecte Django per servir-los a la URL ''/ | ||
| + | STATIC_URL = ' | ||
| + | |||
| + | I afegiu a darrera el nom de la carpeta o vulgueu els arxius estàtics (podeu triar el nom): | ||
| + | STATIC_ROOT = ' | ||
| + | |||
| + | Ara ja podeu recollir tots els arxius estàtics de l'app Django i del seu //admin panel//: | ||
| + | (env) $ ./manage.py collectstatic | ||
| + | |||
| + | \\ | ||
| + | |||
| + | === Instal·lem Apache === | ||
| + | |||
| + | Ara sí! Instal·lem Apache i el mòdul '' | ||
| + | |||
| + | $ sudo apt install apache2 libapache2-mod-wsgi-py3 | ||
| + | $ sudo a2enmod rewrite | ||
| + | |||
| + | \\ | ||
| + | |||
| + | === Configuració Apache === | ||
| + | |||
| + | La configuració, | ||
| + | * **Django**: | ||
| + | * Rutes de processament: | ||
| + | * ''/ | ||
| + | * ''/ | ||
| + | * ''/ | ||
| + | * ''/ | ||
| + | * **ReactJS**: | ||
| + | * ''/'': | ||
| + | * ''/ | ||
| + | |||
| + | |||
| + | Assumim que tenim una configuració monousuari i monoaplicació (una VM o CT dedicat per a aquesta app). En aquest cas podeu implementar directament a la site per defecte d' | ||
| + | |||
| + | <file apache / | ||
| + | < | ||
| + | # Si només tenim 1 domini, no cal anomenar-lo | ||
| + | # | ||
| + | |||
| + | WSGIDaemonProcess myapp python-home=/ | ||
| + | WSGIProcessGroup myapp | ||
| + | WSGIScriptAlias / / | ||
| + | |||
| + | < | ||
| + | <Files wsgi.py> | ||
| + | Require all granted | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | Alias /static/ / | ||
| + | < | ||
| + | Require all granted | ||
| + | </ | ||
| + | Alias /media/ / | ||
| + | < | ||
| + | Require all granted | ||
| + | </ | ||
| + | |||
| + | # REACT FRONTEND | ||
| + | Alias /assets / | ||
| + | Alias /index.html / | ||
| + | AliasMatch ^/$ / | ||
| + | < | ||
| + | Require all granted | ||
| + | </ | ||
| + | |||
| + | # Regla de reescriptura per a React Router | ||
| + | # Les rutes conegudes no entren: /admin /api /static /media i /assets | ||
| + | # La resta de rutes van a dist/ | ||
| + | RewriteEngine On | ||
| + | RewriteCond %{REQUEST_URI} !^/admin | ||
| + | RewriteCond %{REQUEST_URI} !^/api | ||
| + | RewriteCond %{REQUEST_URI} !^/static | ||
| + | RewriteCond %{REQUEST_URI} !^/media | ||
| + | RewriteCond %{REQUEST_URI} !^/assets | ||
| + | RewriteCond %{REQUEST_FILENAME} !-f | ||
| + | RewriteRule ^ / | ||
| + | |||
| + | ServerAdmin webmaster@localhost | ||
| + | DocumentRoot / | ||
| + | |||
| + | ErrorLog ${APACHE_LOG_DIR}/ | ||
| + | CustomLog ${APACHE_LOG_DIR}/ | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | Reinicia Apache amb: | ||
| + | $ sudo systemctl restart apache2.service | ||
| + | |||
| + | \\ | ||
| + | |||
| + | ===== Comprovacions ===== | ||
| + | |||
| + | Si no et dona errors al reiniciar Apache, prova les següents comprovacions. | ||
| + | |||
| + | Django funciona a ''/ | ||
| + | $ curl https:// | ||
| + | $ curl https:// | ||
| + | |||
| + | Si no es veu des de fora amb el domini, intenta comprovar que sí que funciona des de dins: | ||
| + | $ curl http:// | ||
| + | $ curl http:// | ||
| + | |||
| + | En particular, comprova que els arxius estàtics es veuen quan anem a ''/ | ||
| + | |||
| + | Funciona el // | ||
| + | |||
| + | Si no es veu des de fora, intenta la comprovació interna: | ||
| + | $ curl http:// | ||
| + | |||
| + | Si apareix la pàgina de React però no carrega les dades de l'API, obre la consola de Javascript del navegador i investiga el problema que estigui succeint (CORS, etc.) | ||
| + | |||
| + | \\ | ||
| + | |||
| + | ===== Media Uploads ===== | ||
| + | Comproveu que es pot accedir a ''/ | ||
| + | |||
| + | Si us dona problemes, segurament és que necessitareu donar permisos a ''/ | ||
| + | |||
| + | $ sudo chown -R www-data / | ||