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
-
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
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
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
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
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
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
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
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
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
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)
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.
- Djangocentral. n.a. Luettavissa Using PostgreSQL with Django. Luettu 15.5.2022.
- Karvinen, T. 2022a. Luettavissa Configuration management systems 2022. Luettu 03-05/22.
- Karvinen, T. 2022b. Django 4 Instant Customer Database Tutorial. Luettu 14-15.5.2022.
- Karvinen, T. 2022c. Deploy Django 4 - Production Install. Luettu 14-15.5.2022.
- SaltStack Contributors. 2022. SALT.STATES.USER , MANAGEMENT OF USER ACCOUNTS
- Shellhacks Contributors. 2020. Luettavissa Auto Answer “Yes/No” to Prompt – PowerShell & CMD. Luettu 15.5.2022.