프로젝트 세부 정보

서버구축 date sudo ln -sf /usr/share/zoneinfo/Asia/Seoul /etc/localtime date sudo apt-get -y update sudo apt-get -y upgrade python3 -V sudo apt-get -y install python3-venv python3-pip sudo pip3 --version sudo apt-get -y install mysql-server libmysqlclient-dev sudo systemctl start mysql sudo systemctl enable mysql mysqld --version mkdir projects mkdir venvs cd venvs python3 -m venv mysite cd mysite cd bin . activate pip install wheel pip install django pip install markdown pip install mysqlclient cd ~/projects mkdir mysite cd mysite django-admin startproject config . python manage.py runserver ctrl+c python manage.py runserver 0:8000 python manage.py runserver [수정전] git clone https://github.com/jema10/Python_Django.git mysite python manage.py migrate --settings=mysite.settings.prod python manage.py migrate --settings=mysite.settings.prod [Nginx설치] 위치> (mysite)master@:~/projects/config$ sudo apt -y install nginx cd /etc/nginx/sites-available sudo nano mysite server { listen 80; server_name; location = {} location /static {} location / {} } server { listen 80; server_name 192.168.XXX.XXX; location = /favicon.ico { access_log off; log_not_found off;} location /static {alias /home/master/projects/mysite/static;} location / { include proxy_params; proxy_pass http://unix:/tmp/gunicorn.sock; } } cd /etc/nginx/sites-enabled ls sudo rm default sudo ln -s /etc/nginx/sites-available/mysite sudo systemctl restart nginx sudo nginx -t sudo systemctl stop nginx sudo systemctl start nginx sudo systemctl status nginx [Gunicorn설치] 위치> (mysite)master@:~/projects/mysite$ pip install gunicorn cd ~/projects/mysite gunicorn --bind 0:8000 config.wsgi:application gunicorn --bind unix:/tmp/gunicorn.sock config.wsgi:application 위치> /home/master/venvs nano mysite.env DJANGO_SETTINGS_MODULE=config.settings.prod 위치> /etc/systemd/system sudo nano mysite.service [Unit] [Service] [Install] [Unit] Description=gunicorn daemon After=network.target [Service] User=master Group=master WorkingDirectory=/home/master/projects/mysite EnvironmentFile=/home/master/venvs/mysite.env ExecStart=/home/master/venvs/mysite/bin/gunicorn \ --workers 2 \ --bind unix:/tmp/gunicorn.sock \ config.wsgi:application [Install] WantedBy=multi-user.target home/master/projects/ <-- 최상위 폴더 #폴더 명은 각자 다릅니다. |-- mysite/ <-- 장고 프로젝트 폴더 #폴더 명은 각자 다릅니다. | |-- config/ | | |-- __init__.py | | |-- settings.py | | |-- urls.py | | |-- wsgi.py | |-- boards1/ <-- 방금 만든 장고 어플리케이션! | | |-- migrations/ | | | +-- __init__.py | | |-- __init__.py | | |-- admin.py | | |-- apps.py | | |-- models.py | | |-- tests.py | | +-- views.py | +-- manage.py +-- venvs/ <-- 가상환경 폴더 #폴더 명은 각자 다릅니다. [urls.py] """ URL configuration for config project. The `urlpatterns` list routes URLs to views. For more information please see: https://docs.djangoproject.com/en/5.0/topics/http/urls/ Examples: Function views 1. Add an import: from my_app import views 2. Add a URL to urlpatterns: path('', views.home, name='home') Class-based views 1. Add an import: from other_app.views import Home 2. Add a URL to urlpatterns: path('', Home.as_view(), name='home') Including another URLconf 1. Import the include() function: from django.urls import include, path 2. Add a URL to urlpatterns: path('blog/', include('blog.urls')) """ from django.contrib import admin from django.urls import path from boards1 import views urlpatterns = [ path('admin/', admin.site.urls), path('', views.home, name='home'), path('new/',views.new_topic,name='new_topic'), path('log/', views.log, name='log'), path('lrzsz/',views.lrzsz, name='lrzsz'), path('topic/<int:topic_id>/', views.topic_detail, name='topic_detail'), path('new_topic/', views.new_topic, name='new_topic'), ] [settings.py] """ Django settings for config project. Generated by 'django-admin startproject' using Django 5.0.5. For more information on this file, see https://docs.djangoproject.com/en/5.0/topics/settings/ For the full list of settings and their values, see https://docs.djangoproject.com/en/5.0/ref/settings/ """ from pathlib import Path import os # Build paths inside the project like this: BASE_DIR / 'subdir'. BASE_DIR = Path(__file__).resolve().parent.parent #BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) # Quick-start development settings - unsuitable for production # See https://docs.djangoproject.com/en/5.0/howto/deployment/checklist/ # SECURITY WARNING: keep the secret key used in production secret! SECRET_KEY = 'django-insecure-k$6h-_(2*bf1olkk*we^vn&lfgn!7j^7=8+%ubt36e=%xoy6z#' # SECURITY WARNING: don't run with debug turned on in production! DEBUG = True ALLOWED_HOSTS = ['192.168.0.21', 'jeonjucom.kr','jeonjucom.kr:8021'] #ALLOWED_HOSTS = ['localhost', '127.0.0.1', '[::1]', '192.168.0.21'] # Application definition INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'boards1', 'log', ] MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', ] ROOT_URLCONF = 'config.urls' TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [], 'APP_DIRS': True, 'OPTIONS': { 'context_processors': [ 'django.template.context_processors.debug', 'django.template.context_processors.request', 'django.contrib.auth.context_processors.auth', 'django.contrib.messages.context_processors.messages', ], }, }, ] WSGI_APPLICATION = 'config.wsgi.application' # Database # https://docs.djangoproject.com/en/5.0/ref/settings/#databases #DATABASES = { # 'default': { # 'ENGINE': 'django.db.backends.sqlite3', # 'NAME': BASE_DIR / 'db.sqlite3', # } #} DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'Syslog', #'NAME': 'rsyslog', 'USER': 'rsyslog', #'USER': 'root', 'PASSWORD': '123456', 'HOST': '192.168.0.87', #'HOST': '127.0.0.1', 'PORT': '3306', } } # Password validation # https://docs.djangoproject.com/en/5.0/ref/settings/#auth-password-validators AUTH_PASSWORD_VALIDATORS = [ { 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', }, { 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', }, { 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', }, { 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', }, ] # Internationalization # https://docs.djangoproject.com/en/5.0/topics/i18n/ LANGUAGE_CODE = 'en-us' TIME_ZONE = 'UTC' USE_I18N = True USE_TZ = True # Static files (CSS, JavaScript, Images) # https://docs.djangoproject.com/en/5.0/howto/static-files/ STATIC_URL = 'static/' STATIC_ROOT = os.path.join(BASE_DIR, 'static') # Default primary key field type # https://docs.djangoproject.com/en/5.0/ref/settings/#default-auto-field DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' [views.py] from django.shortcuts import render from django.http import HttpResponse from django.contrib.auth.models import User from django.shortcuts import render, redirect from .models import Topic, Reply from django.shortcuts import render, get_object_or_404 from .models import Syslog, SystemEvents from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger #def home(request): # topics = Topic.objects.all() # return render(request,'home.html',{'topics':topics}) from django.shortcuts import render from .models import Syslog #def home(request): # syslog_entries = Syslog.objects.all() # system_events = SystemEvents.objects.order_by('-id')[:10] # return render(request, 'home.html', {'syslog_entries': syslog_entries, 'system_events': system_events}) def main(request): return render(request,'main.html') def home(request): # 페이지당 항목 수 설정 items_per_page = 100 # 전체 항목 가져오기 syslog_entries = Syslog.objects.all() system_events = SystemEvents.objects.filter(FromHost='master.jeonjucom.kr',SysLogTag__contains='sshd').order_by('-ReceivedAt') #system_events = SystemEvents.objects.order_by('-id') # Paginator 객체 생성 syslog_paginator = Paginator(syslog_entries, items_per_page) system_events_paginator = Paginator(system_events, items_per_page) # 요청된 페이지 번호 가져오기 syslog_page_number = request.GET.get('syslog_page') system_events_page_number = request.GET.get('system_events_page') try: # 요청된 페이지의 항목 가져오기 syslog_entries = syslog_paginator.page(syslog_page_number) system_events = system_events_paginator.page(system_events_page_number) except PageNotAnInteger: # 페이지 번호가 정수가 아닌 경우, 첫 페이지를 반환합니다. syslog_entries = syslog_paginator.page(1) system_events = system_events_paginator.page(1) except EmptyPage: # 페이지 번호가 범위를 벗어난 경우, 마지막 페이지를 반환합니다. syslog_entries = syslog_paginator.page(syslog_paginator.num_pages) system_events = system_events_paginator.page(system_events_paginator.num_pages) return render(request, 'home.html', {'syslog_entries': syslog_entries, 'system_events': system_events}) #def home(request): # syslog_entries = Syslog.objects.all() # return render(request, 'home.html', {'syslog_entries': syslog_entries}) def topic_list(request): syslog_entries = Syslog.objects.all() return render(request, 'home.html', {'syslog_entries': syslog_entries}) def log(request): items_per_page = 10 syslog_entries = Syslog.objects.all() system_events = SystemEvents.objects.filter(FromHost='master.jeonjucom.kr',SysLogTag__contains='sshd').order_by('-ReceivedAt') # Paginator 객체 생성 system_events_paginator = Paginator(system_events, items_per_page) # 요청된 페이지 번호 가져오기 system_events_page_number = request.GET.get('system_events_page') try: # 요청된 페이지의 항목 가져오기 system_events = system_events_paginator.page(system_events_page_number) except PageNotAnInteger: # 페이지 번호가 정수가 아닌 경우, 첫 페이지를 반환합니다. system_events = system_events_paginator.page(1) except EmptyPage: # 페이지 번호가 범위를 벗어난 경우, 마지막 페이지를 반환합니다. system_events = system_events_paginator.page(system_events_paginator.num_pages) return render(request, 'log.html', {'syslog_entries': syslog_entries, 'system_events': system_events}) def lrzsz(request): items_per_page = 100 syslog_entries = Syslog.objects.all() system_events = SystemEvents.objects.filter(FromHost='master.jeonjucom.kr',SysLogTag__contains='sz').order_by('-ReceivedAt') # Paginator 객체 생성 system_events_paginator = Paginator(system_events, items_per_page) # 요청된 페이지 번호 가져오기 system_events_page_number = request.GET.get('system_events_page') try: # 요청된 페이지의 항목 가져오기 system_events = system_events_paginator.page(system_events_page_number) except PageNotAnInteger: # 페이지 번호가 정수가 아닌 경우, 첫 페이지를 반환합니다. system_events = system_events_paginator.page(1) except EmptyPage: # 페이지 번호가 범위를 벗어난 경우, 마지막 페이지를 반환합니다. system_events = system_events_paginator.page(system_events_paginator.num_pages) return render(request, 'lrzsz.html', {'syslog_entries': syslog_entries, 'system_events': system_events}) def new_topic(request): topics = Topic.objects.all() if request.method =='POST': subject = request.POST['subject'] message = request.POST['message'] user = User.objects.first() topic = Topic.objects.create( subject=subject, message=message, writer=user ) post = Reply.objects.create( message=message, created_by=user ) return redirect('home') return render(request,'new_topic.html',{'topics':topics}) def topic_detail(request, topic_id): topic = get_object_or_404(Topic, id=topic_id) return render(request, 'topic_detail.html', {'topic': topic}) def delete_topic(request, topic_id): topic = get_object_or_404(Topic, id=topic_id) topic.delete() return redirect('home') [models.py] from django.db import models from django.contrib.auth.models import User class Syslog(models.Model): field1 = models.CharField(max_length=100) field2 = models.IntegerField() class Topic(models.Model): message = models.TextField(max_length=5000, null=True) subject = models.CharField(max_length=255) last_updated = models.DateField(auto_now_add=True, null=True) writer = models.ForeignKey(User, related_name='topics', on_delete=models.CASCADE, null=True) class Reply(models.Model): message = models.TextField(max_length=5000) created_at = models.DateTimeField(auto_now_add=True) created_by = models.ForeignKey(User, null=True, related_name='posts', on_delete=models.CASCADE) updated_at = models.DateField(null=True) updated_by = models.ForeignKey(User, null=True, related_name='+', on_delete=models.CASCADE) class SystemEvents(models.Model): ID = models.IntegerField(default=0, null=True) CustomerID = models.CharField(max_length=1000, null=True) ReceivedAt = models.DateTimeField('ReceivedAt', null=True) DeviceReportedTime = models.DateTimeField('DeviceReportedTime', null=True) Facility = models.IntegerField(default=0, null=True) Priority = models.IntegerField(default=0, null=True) FromHost = models.CharField(max_length=1000, null=True) Message = models.CharField(max_length=1000, null=True) NTSeverity = models.IntegerField(default=0, null=True) Importance = models.IntegerField(default=0, null=True) EventSource = models.CharField(max_length=1000, null=True) EventUser = models.CharField(max_length=1000, null=True) EventCategory = models.IntegerField(default=0, null=True) EventID = models.IntegerField(default=0, null=True) EventBinaryData = models.CharField(max_length=1000, null=True) MaxAvailable = models.IntegerField(default=0, null=True) CurrUsage = models.IntegerField(default=0, null=True) MinUsage = models.IntegerField(default=0, null=True) MaxUsage = models.IntegerField(default=0, null=True) InfoUnitID = models.IntegerField(default=0, null=True) SysLogTag = models.CharField(max_length=1000, null=True) EventLogType = models.CharField(max_length=1000, null=True) GenericFileName = models.CharField(max_length=1000, null=True) SystemID = models.IntegerField(default=0, null=True) class Meta: db_table ='SystemEvents' class SystemEventsProperties(models.Model): question = models.ForeignKey(SystemEvents, on_delete=models.CASCADE) choice_text = models.CharField(max_length=200) votes = models.IntegerField(default=0) class Meta: db_table ='SystemEventsProperties' # PROJECT class Myauth(models.Model): date = models.CharField(max_length=100, null=True) host = models.CharField(max_length=100, null=True) process = models.CharField(max_length=100, null=True) message = models.CharField(max_length=1000, null=True) class Meta: db_table ='Myauth' class Rsyslogd(models.Model): date = models.CharField(max_length=100, null=True) host = models.CharField(max_length=100, null=True) process = models.CharField(max_length=100, null=True) message = models.CharField(max_length=1000, null=True) class Meta: db_table ='Rsyslogd' class Systemd(models.Model): date = models.CharField(max_length=100, null=True) host = models.CharField(max_length=100, null=True) process = models.CharField(max_length=100, null=True) message = models.CharField(max_length=1000, null=True) class Meta: db_table ='Systemd' class Postfix(models.Model): date = models.CharField(max_length=100, null=True) host = models.CharField(max_length=100, null=True) process = models.CharField(max_length=100, null=True) message = models.CharField(max_length=1000, null=True) class Meta: db_table ='Postfix' class Vsftpd(models.Model): date = models.CharField(max_length=100, null=True) host = models.CharField(max_length=100, null=True) process = models.CharField(max_length=100, null=True) message = models.CharField(max_length=1000, null=True) class Meta: db_table ='Vsftpd' class Tripwire(models.Model): date = models.CharField(max_length=100, null=True) host = models.CharField(max_length=100, null=True) process = models.CharField(max_length=100, null=True) message = models.CharField(max_length=1000, null=True) class Meta: db_table ='Tripwire' class Sshd(models.Model): date = models.CharField(max_length=50, null=True) host = models.CharField(max_length=50, null=True) pid = models.CharField(max_length=50, null=True) message = models.CharField(max_length=1000, null=True) class Meta: db_table ='Sshd' [home.html] <!DOCTYPE html> <html lang="ko"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>LogServer</title> <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css"> <style> table { border-collapse: collapse; width: 100%; } th, td { border: 1px solid #ddd; padding: 8px; text-align: left; } th { background-color: white; } .pagination { display: flex; justify-content: center; margin-top: 20px; } .pagination a { padding: 8px 16px; text-decoration: none; color: black; border: 1px solid #ddd; margin: 0 4px; } .pagination span { padding: 8px 16px; border: 1px solid #ddd; margin: 0 4px; background-color: #f2f2f2; } </style> <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script> <script src="https://cdn.jsdelivr.net/npm/bootstrap@4.6.0/dist/js/bootstrap.min.js"></script> <script> $(document).ready(function(){ $("#search_btn").click(function(){ if($("#q").val()==''){ location.href="/CI3/index.php/Welcome/lrzsz"; //alert('검색어를 입력하세요'); return false; }else{ var act ='/CI3/index.php/Welcome/lrzsz/q/'+$("#q").val()+'/page/1'; $("#bd_search").attr('action', act).submit(); } }); }); function board_search_enter(event){ if(event.keyCode == 13) $("#search_btn").click(); } </script> </head> <body> <header> <nav class="navbar navbar-expand-sm bg-dark navbar-dark"> <a class="navbar-brand" href="">LogServer</a> <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#collapsibleNavbar"> <span class="navbar-toggler-icon"></span> </button> <div class="collapse navbar-collapse" id="collapsibleNavbar"> <ul class="navbar-nav"> <li class="nav-item"><a class="nav-link" href="log">SSHD</a></li> <li class="nav-item"><a class="nav-link" href="lrzsz">LRZSZ</a></li> </ul> </div> </nav> </header> <br> <section> <h1>산대특 3기 django 기반 로그분석 사이트</h1> </section> <footer> <div class="text-center"> <hr> <br> <p>192.168.0.87 DB connect</p> <p>Eom Ga Won</p> </div> </footer> </body> </html> [log.html] <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Syslog Entries</title> <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css"> <style> table { border-collapse: collapse; width: 100%; } th, td { border: 1px solid #ddd; padding: 8px; text-align: left; } th { background-color: #f2f2f2; } .pagination { display: flex; justify-content: center; margin-top: 20px; } .pagination a { padding: 8px 16px; text-decoration: none; color: black; border: 1px solid #ddd; margin: 0 4px; } .pagination span { padding: 8px 16px; border: 1px solid #ddd; margin: 0 4px; background-color: #f2f2f2; } </style> </head> <body> <header> <nav class="navbar navbar-expand-sm bg-dark navbar-dark"> <a class="navbar-brand" href="../">LogServer</a> <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#collapsibleNavbar"> <span class="navbar-toggler-icon"></span> </button> <div class="collapse navbar-collapse" id="collapsibleNavbar"> <ul class="navbar-nav"> <li class="nav-item"><a class="nav-link" href="">SSHD</a></li> <li class="nav-item"><a class="nav-link" href="../lrzsz">LRZSZ</a></li> </ul> </div> </nav> </header> <br> <br> <h1>산대특 3기 django 기반 로그분석 사이트</h1> <br> <table> <thead> <tr> <th>ID</th> <th>ReceivedAt</th> <th>DeviceReportedTime</th> <th>FromHost</th> <th>Message</th> <th>SysLogTag</th> </tr> </thead> <tbody> {% for event in system_events %} <tr> <td>{{ event.ID }}</td> <td>{{ event.ReceivedAt }}</td> <td>{{ event.DeviceReportedTime }}</td> <td>{{ event.FromHost }}</td> <td>{{ event.Message }}</td> <td>{{ event.SysLogTag }}</td> </tr> {% endfor %} </tbody> </table> <div class="pagination"> {% if system_events.has_previous %} <a href="?system_events_page=1">처음</a> <a href="?system_events_page={{ system_events.previous_page_number }}">이전</a> {% endif %} {% for page_number in system_events.paginator.page_range %} {% if system_events.number == page_number %} <span>{{ page_number }}</span> {% else %} <a href="?system_events_page={{ page_number }}">{{ page_number }}</a> {% endif %} {% endfor %} {% if system_events.has_next %} <a href="?system_events_page={{ system_events.next_page_number }}">다음</a> <a href="?system_events_page={{ system_events.paginator.num_pages }}">마지막</a> {% endif %} </div> <pre> </pre> </body> </html> [lrzsz.html] <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css"> <title>lrzsz</title> <style> table { border-collapse: collapse; width: 100%; } th, td { border: 1px solid #ddd; padding: 8px; text-align: left; } th { background-color: #f2f2f2; } .pagination { display: flex; justify-content: center; margin-top: 20px; } .pagination a { padding: 8px 16px; text-decoration: none; color: black; border: 1px solid #ddd; margin: 0 4px; } .pagination span { padding: 8px 16px; border: 1px solid #ddd; margin: 0 4px; background-color: #f2f2f2; } </style> </head> <body> <header> <nav class="navbar navbar-expand-sm bg-dark navbar-dark"> <a class="navbar-brand" href="/">LogServer</a> <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#collapsibleNavbar"> <span class="navbar-toggler-icon"></span> </button> <div class="collapse navbar-collapse" id="collapsibleNavbar"> <ul class="navbar-nav"> <li class="nav-item"><a class="nav-link" href="../log">SSHD</a></li> <li class="nav-item"><a class="nav-link" href="">LRZSZ</a></li> </ul> </div> </nav> </header> <br> <br> <h1>산대특 3기 django 기반 로그분석 사이트</h1> <br> <table> <thead> <tr> <th>ID</th> <th>ReceivedAt</th> <th>DeviceReportedTime</th> <th>FromHost</th> <th>Message</th> <th>SysLogTag</th> </tr> </thead> <tbody> {% for event in system_events %} <tr> <td>{{ event.ID }}</td> <td>{{ event.ReceivedAt }}</td> <td>{{ event.DeviceReportedTime }}</td> <td>{{ event.FromHost }}</td> <td>{{ event.Message }}</td> <td>{{ event.SysLogTag }}</td> </tr> {% endfor %} </tbody> </table> </body> </html>