Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/jyrinsan/hh_saltproject

Haaga-helian palvelinohjelmointi kurssin miniprojekti
https://github.com/jyrinsan/hh_saltproject

django saltstack saltstack-formula

Last synced: about 19 hours ago
JSON representation

Haaga-helian palvelinohjelmointi kurssin miniprojekti

Awesome Lists containing this project

README

        

## Django tuotantoympäristö SaltStackilla

Moduulin tarkoitus on asentaa Django-tuotantoympäristö webbipalvelun julkaisuun Linux-palvelimille. Moduuli asentaa djangon, apachen, tulimuurin, postgresql tietokannan sekä hyödyllisiä pikkusovelluksia, joita sovelluksen tekoon tarvitaan. Moduuli asentaa myös yksinkertaisen crm-esimerkkisovelluksen, jolla ympäristön toimintaa voi demota. Tämän hetkinen versio käyttää vielä sqlite3 kantaa, jatkokehityksessä kanta aiotaan vaihtaa postgresql-kantaan, jonka vuoksi sen asennus on jo otettu mukaan tähän.

Moduulin lisenssi: [GNU General Public License v2.0](https://opensource.org/licenses/gpl-2.0.php)

```
Nimi Sanna Jyrinki
Oppilaitos Haaga-Helian ammattikorkeakoulu
Kurssi Palvelinten hallinta ICT4TN022-3015
Opettaja Tero Karvinen
Tietokoneena AMD Ryzen 5 PRO 4650U with Radeon Graphics 2.10 GHz
Käyttöjärjestelmä Windows 11 Pro, Versio 21H2
Linux Oracle Virtual Box 6.1, Debian 11.3
```

### Toteutussuunnitelma
- moduuli sisältää seuraavat tilat:
- appikset: hyödyllisiä pikkuohjelmia micro, bash-completion, pwgen, tree, curl
- palomuuri: ufw palomuurin, asennus, enablointi ja avaus ssh ja apache portille
- postgresql: tietokanta jatkokehitystä varten (django sisältää oletuksena kevyen sqlite3 tietokannan)
- apache asennus, testisivu ja käyttäjän kotisivu
- django asennus, tuotanto-projektin luonti
- testisovellus crm, jolla toiminta voidaan demota

- jatkokehitysehdotuksia, joita ei keretty toteuttaa tähän versioon
- kehitysserveri, jossa django asennetaan kehitysserverinä
- postgressql ja sen käyttöönotto djangossa vakiona olevan sqlite3:n sijaan
- jinjalla voisi siistiä usein toistuvat esim tunnukset/hakemistopolut yhdessä paikassa oleviksi vakioiksi
- ssh ja sftp mahdollisesti olisi myös hyödyllistä asentaa, jos on tarpeen toimia myös ulkoisen virtuaalipalvelimen kanssa

### Toteutus

Moduuli sisältää seuraavat tilat ja top.sls tiedoston, jonka avulla koko moduulin saa ajettua
```
sudo salt '*' state.apply
```

master@master-virtualbox:/srv/salt$ ls

apache appsit crmapp django djangoproject firewall postgresql top.sls
master@master-virtualbox:/srv/salt$ cat top.sls
base:
'*':
- appsit
- firewall
- postgresql
- apache
- django
- djangoproject
- crmapp

#### Moduulin tilat

##### appsit

Tila **appsit** asentaa yksinkertaisia pikkusovelluksia, jotka osoittautuivat hyödyllisiksi djangon asennuksessa ja djangosovelluksen teossa.

master@master-virtualbox:/srv/salt$ ls appsit

init.sls
master@master-virtualbox:/srv/salt$ cat appsit/init.sls
appsit:
pkg.installed:
- pkgs:
- micro
- bash-completion
- pwgen
- tree
- curl

##### firewall

Tila **firewall** asentaa ja konfiguroi ufw tulimuurin. Se enabloi sen serverin käynnistyessä, ja avaa reiät ssh:n ja apache:n portteihin.

master@master-virtualbox:/srv/salt$ ls firewall

init.sls
master@master-virtualbox:/srv/salt$ cat firewall/init.sls
ufw:
pkg.installed

'ufw enable':
cmd.run:
- unless: "ufw status verbose |grep 'Status: active'"

'ufw allow 22/tcp':
cmd.run:
- unless: "ufw status verbose |grep '^22/tcp' "

'ufw allow 80/tcp':
cmd.run:
- unless: "ufw status verbose |grep '^80/tcp' "

ufw.service:
service.running

##### postgresql

Tila **postgresql** asentaa postgresql tietokantademonin ja käynnistää sen. Ko. tietokantaa ei kuitenkaan vielä tässä versiossa hyödynnetä djangon kanssa.

master@master-virtualbox:/srv/salt$ ls postgresql

init.sls
master@master-virtualbox:/srv/salt$ cat postgresql/init.sls
postgresql:
pkg.installed

postgresql.service:
service.running

##### apache

Tila **apache** asentaa apachen, muodostaa oletustestisivun ja aktivoi käyttäjien kotisivun, jos käyttäjä tekee kotisivun oman kotihakemiston public_html hakemistoon. Tila myös käynnistää apachen.

master@master-virtualbox:/srv/salt$ ls apache

default-index.html init.sls
master@master-virtualbox:/srv/salt$ cat apache/init.sls
apache2:
pkg.installed

/var/www/html/index.html:
file.managed:
- source: salt://apache/default-index.html

/etc/apache2/mods-enabled/userdir.conf:
file.symlink:
- target: ../mods-available/userdir.conf

/etc/apache2/mods-enabled/userdir.load:
file.symlink:
- target: ../mods-available/userdir.load

apache2.service:
service.running:
- watch:
- file: /etc/apache2/mods-enabled/userdir.conf
- file: /etc/apache2/mods-enabled/userdir.load

##### django

Tila **django** luo django nimisen käyttäjän (salasana on django, joka asetetaa ssh tiedostoon hashattuna linux-komennolla `openssl passwd -1` [SaltStack Contributors, 2022](https://docs.saltproject.io/en/3000/ref/states/all/salt.states.user.html). Tila luo käyttäjän kotihakemiston alle publicwsgi-hakemiston ja asentaa djangon. Tilassa on myös asennettu virtualenv-ympäristö. Sitä ei salt-asennuksen yhteydessä hyödynnetä, mutta ylläpitäjä voi kaivata sitä sovelluksen manuaaliseen kehittämiseen.

master@master-virtualbox:/srv/salt$ ls django

init.sls requirements.txt
master@master-virtualbox:/srv/salt$ cat django/init.sls
asennukset:
pkg.installed:
- pkgs:
- virtualenv
- libapache2-mod-wsgi-py3

adduser:
user.present:
- name: django
- password: $1$JeVTvOSq$lbPDz6CkLxA.dmo8CWml20

/home/django/publicwsgi:
file.directory:
- user: django
- group: django
- mode: 0755

'virtualenv -p python3 --system-site-packages env':
cmd.run:
- cwd: /home/django/publicwsgi
- runas: django
- unless: ls |grep env

/home/django/publicwsgi/requirements.txt:
file.managed:
- source: salt://django/requirements.txt
- user: django
- group: django
- mode: 0644

'pip install -r requirements.txt':
cmd.run:
- cwd: /home/django/publicwsgi
- unless: django-admin --version

##### djangoproject

Tila **djangoproject** luon djangoprojektin nimeltään **myapp**, joka tekee publicwsgi:n alle myapp hakemiston alihakemistoineen. Tila tekee myös apachelle konfiguraation myapp.conf, joka säätelee apachelle enabloidut sivut. Djangon automaattisesti tarjoaman /admin sivun lisäksi asetetaan siinä staattiset sivut päälle polussa /static. Tila myös kopioi saltin alta settings.xml tiedoston, johon on tehty muutamia muutoksia, mm. asetettu debug tila pois päältä ja sallittu osoite localhost. Lähteinä olevista Djangon materiaaleista voit katsoa tarkemmin asennuksen yksityiskohdat. Jotta /admin polusta löytyvä sisäänkirjautumissivu näyttää tyylikkäämmältä, tila myös kerää static hakemiston alle djangon staattiset tyylisivut.

master@master-virtualbox:/srv/salt$ tree djangoproject/

djangoproject/
├── init.sls
├── myapp.conf
├── settings.py
└── static
└── staticpage.html

1 directory, 4 files
master@master-virtualbox:/srv/salt$ cat djangoproject/myapp.conf
Define TDIR /home/django/publicwsgi/myapp
Define TWSGI /home/django/publicwsgi/myapp/myapp/wsgi.py
Define TUSER django
Define TVENV /home/django/publicwsgi/env/lib/python3.9/site-packages

<VirtualHost *:80>
Alias /static/ ${TDIR}/static/
<Directory ${TDIR}/static/>
Require all granted
</Directory>

WSGIDaemonProcess ${TUSER} user=${TUSER} group=${TUSER} threads=5 python-path="${TDIR}:${TVENV}"
WSGIScriptAlias / ${TWSGI}
<Directory ${TDIR}>
WSGIProcessGroup ${TUSER}
WSGIApplicationGroup %{GLOBAL}
WSGIScriptReloading On
<Files wsgi.py>
Require all granted
</Files>
</Directory>

</VirtualHost>

Undefine TDIR
Undefine TWSGI
Undefine TUSER
Undefine TVENV
master@master-virtualbox:/srv/salt$ cat djangoproject/init.sls
'django-admin startproject myapp':
cmd.run:
- cwd: /home/django/publicwsgi
- runas: django
- unless: ls | grep myapp

/etc/apache2/sites-available/myapp.conf:
file.managed:
- source: salt://djangoproject/myapp.conf

/etc/apache2/sites-enabled/myapp.conf:
file.symlink:
- target: ../sites-available/myapp.conf

/etc/apache2/sites-enabled/000-default.conf:
file.absent

/home/django/publicwsgi/myapp/myapp/settings.py:
file.managed:
- source: salt://djangoproject/settings.py
- user: django
- group: django
- mode: 0644

'echo yes | python3 ./manage.py collectstatic':
cmd.run:
- cwd: /home/django/publicwsgi/myapp
- runas: django
- unless: ls | grep static

/home/django/publicwsgi/myapp/static:
file.recurse:
- source: salt://djangoproject/static
- user: django
- group: django
- dir_mode: 0755
- file_mode: 0755
- makedirs: True
- recurse:
- user
- group
- mode

##### crmapp

Tila **crmapp** muodostaa esimerkkisovelluksen, jonka alulla voi demota sovelluksen toiminta. Sovellus on aluksi muodostettu käsin, ja tila vain kopioi sekä crm-hakemiston sisällön paikoilleen sekä myös sqlite3 tietokannan. Myöhemmässä moduulin vaiheessa tietokanta voidaan muuttaa postgressql tietokannaksi.

master@master-virtualbox:/srv/salt$ tree crmapp

crmapp
├── crm
│   ├── admin.py
│   ├── apps.py
│   ├── __init__.py
│   ├── migrations
│   │   ├── 0001_initial.py
│   │   ├── 0002_alter_customer_name.py
│   │   ├── __init__.py
│   │   └── __pycache__
│   │   ├── 0001_initial.cpython-39.pyc
│   │   ├── 0002_alter_customer_name.cpython-39.pyc
│   │   └── __init__.cpython-39.pyc
│   ├── models.py
│   ├── __pycache__
│   │   ├── admin.cpython-39.pyc
│   │   ├── apps.cpython-39.pyc
│   │   ├── __init__.cpython-39.pyc
│   │   └── models.cpython-39.pyc
│   ├── tests.py
│   └── views.py
├── db.sqlite3
└── init.sls

4 directories, 18 files
master@master-virtualbox:/srv/salt$ cat crmapp/init.sls
/home/django/publicwsgi/myapp/db.sqlite3:
file.managed:
- source: salt://crmapp/db.sqlite3
- user: django
- group: django
- mode: 0755

/home/django/publicwsgi/myapp/crm:
file.recurse:
- source: salt://crmapp/crm
- user: django
- group: django
- dir_mode: 0755
- file_mode: 0755
- makedirs: True
- replace: True

#### Testaus

Moduulin toteutus ja testaus suoritettiin Windows-tietokoneella, jossa oli asennettuna VirtualBoxiin 2 eri Debian 11-konetta, joista toisesta tehtiin salt-master ja toisesta salt-minion. Tämän raportin yläosasta löytyy tarkemmat versiotiedot ajoympäristöstä. Koneet olivat yhteydessä toisiinsa VirtualBoxiin asennetun "Host Only Adapter":n kautta, joka määriteltiin koneiden asetuksissa NAT adapterin lisäksi. Salt masterilla moduuli on /srv/salt hakemistossa, jonka sisältö vietiin versionhallintaan. Kehitystä tehtiin askel kerrallaan asentaen ensin orja-koneelle asia manuaalisesti ja sen jälkeen automatisoimalla saltila masterin kautta. Useita kertoja (tai kymmeniä jopa) tehtiin uusi orja-debian kone, ja testattiin puhtaalla debianilla toimiiko moduulin sen hetkinen vaihe.

Ennen moduulin ajoa testataan orjakoneella mitä curl tavoiteosoitteisiin palauttaa. Curl ei saa yhteyttä oletusporttiin 80:


sanna@sanna-virtualbox:~$ curl http://localhost/admin
curl: (7) Failed to connect to localhost port 80: Connection refused
sanna@sanna-virtualbox:~$ curl http://localhost/static
curl: (7) Failed to connect to localhost port 80: Connection refused

[Täältä](files/RUN1.MD) löytyy salt loki, kun koko valmistunut moduuli ajetaan puhtaalle Debianille, jonne ei vielä ole asennettu muutakuin salt-minion.

[Täältä](files/RUN2.MD) löytyy salt loki, kun koko valmistunut moduuli ajetaan toisen kerran peräkkäin, josta näkyy, että koko moduuli on idempotentti, eli mitään uutta ei asennu, koska mitään ei ole muutettu.

Ajojen jälkeen testataan taas curlilla:

sanna@sanna-virtualbox:~$ curl http://localhost/admin

sanna@sanna-virtualbox:~$ curl http://localhost/static/staticpage.html
Tässä jokin staattinen sivu

Nyt kun orjakoneella avataan selain osoitteessa `http://localhost/admin`, päästään sovelluksen login näkymän avulla sisälle sovellukseen admin tunnuksella (tunnus admin, salasana ftqjbp5ayj4XraBGOR4s)

![Images](files/django_login.PNG)
![Images](files/django_screen1.PNG)
![Images](files/django_screen2.PNG)

### Asennusohje

Moduulia voit testata kopioimalla sen salt-masterisi /srv/salt hakemistoon ja ajamalla ´sudo salt '*' state.apply`, joka ajaa moduulin kaikille masterille rekisteröidyille orjillesi. Jos haluat jonkun muun käyttäjän kuin django, pitää tiloja muokata. Oma sovellus pitää tehdä manuaalisesti, ohjeita löytyy alla olevista Tero Karvisen loistavista Django materiaaleista.

### Lähteet

- Djangocentral. n.a. Luettavissa [Using PostgreSQL with Django](https://djangocentral.com/using-postgresql-with-django/). Luettu 15.5.2022.
- Karvinen, T. 2022a. Luettavissa [Configuration management systems 2022](https://terokarvinen.com/2021/configuration-management-systems-2022-spring/#arviointi). Luettu 03-05/22.
- Karvinen, T. 2022b. [Django 4 Instant Customer Database Tutorial](https://terokarvinen.com/2022/django-instant-crm-tutorial/). Luettu 14-15.5.2022.
- Karvinen, T. 2022c. [Deploy Django 4 - Production Install](https://terokarvinen.com/2022/deploy-django/?fromSearch=django). Luettu 14-15.5.2022.
- SaltStack Contributors. 2022. [SALT.STATES.USER
, MANAGEMENT OF USER ACCOUNTS](https://docs.saltproject.io/en/3000/ref/states/all/salt.states.user.html)
- Shellhacks Contributors. 2020. Luettavissa [Auto Answer “Yes/No” to Prompt – PowerShell & CMD](https://www.shellhacks.com/auto-answer-yes-no-prompt-powershell-cmd/). Luettu 15.5.2022.