jyrinsan / hh_saltproject

Haaga-helian palvelinohjelmointi kurssin miniprojekti

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

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

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. 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ä löytyy salt loki, kun koko valmistunut moduuli ajetaan puhtaalle Debianille, jonne ei vielä ole asennettu muutakuin salt-minion.

Täältä 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 Images Images

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

About

Haaga-helian palvelinohjelmointi kurssin miniprojekti

License:GNU General Public License v2.0


Languages

Language:Python 57.6%Language:SaltStack 41.6%Language:HTML 0.8%