/staff-portal

Корпоративный портал с личным кабинетом для сотрудников

Primary LanguageHTML

Django staff

Корпоративный портал на Django.

Технологический стек

Описание проекта

Бекенд сделан на django. Для фронта взята бесплатная тема для bootstrap - niceadmin. Для некоторых запросов используется обновление контента без перезагрузки страницы на jquery ajax.

На данный момент в проекте реализовано 3 приложения:

  1. Приложение пользователи
  2. Приложение документы
  3. Приложение новости

Приложение пользователи

Модель пользователя отнаследована от AbstractBaseUser. Добавлено подтверждение регистрации по Email. Написаны кастомные шаблоны для страниц регистрации и авторизации.

Пользователи делятся на 2 основные роли: Администраторы и обычные пользователи. Администраторы имеют доступ в администраторский раздел, где могут управлять пользователями и другими приложениями.

Так же, для пользователей предусмотрены группы. У каждого пользователя может быть одна или несколько групп. Практическое применение - отделение отдого отдела комании от другого, а пользователи видят только документы и новости, которые предназначены только для их отдела(ов)

Регистрация осуществляется только на корпоративный email. Шаблон Email-а задан по regex-маске.

Пользователи могут заполнять информацию о себе (помимо обязательного корпоративного email, есть возможность добавить телефон, telegram, личный email, установить аватарку и заполнить другие поля о себе)

Приложение документы

Цель приложения - ознакомление сотрудников с внутренними документами компании.

В приложении документы есть модель с категориями документов. У каждой категории может быть родительская и дочерняя категории. Это позволяет представить пользоватлю древовидную структуру категорий документов.

У добавляемого документа можно выбрать одну категорию, к которой он относится, группы пользователей, которым он будет показываться, и статус - нуждается ли документ в подписании (да, юридической силы это не несет, но чтобы не выпускать ЭЦП на госуслугах, этого может быть достаточно). Если документ НЕ нуждается в подписании, то пользователь увидит его как "для ознакомления", иначе - "для подписания" и "подписан" при успешном подписании.

Для изображений (jpg, png итд) и pdf документов есть предпросмотр и скачивание. Для остальных - только скачивание.

У администратора есть возможность смотреть, какие сотрудники подписали и не подписали конкретный документ.

Приложение новости

Классический блог, в возможностью выбора, для каких групп пользователей создается новость. Для фронта основной контент новости добавляется через TinyMCE (есть возможность добавлять форматированный текст, заголовки, iframe, фотографии итд)

Защита файлов

Пользовательские файлы доступны только для зарегистрированных и авторизованных пользователей. Функиця реализована через x-accel-redirect

Разворачивание образа на личном или vps сервере (в docker контейнере)

Настройка Nignx

Предполагается, что есть готовый настроенный свой или vps сервер с установленным docker, docker-compose и nginx (не контейнерным).

  1. Перейти в каталог sites-available
cd /etc/nginx/sites-available/
  1. Создать файл с именем вашего домена
nano domain.example.com
  1. Внутри написать
server {
    server_name domain.example.com;
    listen 80;
    server_tokens off;
    location /static/ {
        root /home/<username>/portal/django_files;
    }
    location /protected/ {
        internal;
        alias /home/<username>/portal/django_files/;
    }
    location / {
        include proxy_params;
        proxy_pass http://127.0.0.1:8001;
      }
}

server_name - ваш домен с подключенным ssl сертификатом (например, Let's Encrypt). Эти же настройки прописаны в файле nginx.conf в корне проекта

Вместо /telegram/ можно написать любой путь, на который должны приниматься данные. 4. Создать ярлык в каталоге sites-enabled

sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/
  1. Установить https соединение, выпустив ssl сертификат с помощью certbot для вашего домена. При установке сертификата certbot сам предложит проставить редирект в конфиге nginx.
sudo certbot --nginx 
  1. Проверить что нет ошибок в конфигурации nginx
sudo nginx -t
  1. Перезапустить службу nginx
sudo systemctl restart nginx

Запуск портала

Проект настроен на запуск через github actions. Краткая инструкция для actions написана тут. В настройках предполагается что проект будет лежать в /home//portal/

  1. Форкнуть репозиторий

  2. Дать гитбаху доступ к вашему серверу по ssh (добавить ключик с вашего устройства, с которого вы подключаетесь, в список ssh ключей на гитхабе)

  3. На всякий случай, можно установить пользователю на сервере, от имени которого будет производиться деплой, группу docker.

  4. Скопировать docker-compose.yml в /home/<имя_пользователя>/portal . Именно в нем workflow будет искать инструкции для создания контейнеров

  5. Склонировать форкнутый репозиторий к себе на комп.

  6. Добавить в secrets в настройках проекта следующие секреты в формате: КЛЮЧ, ЗНАЧЕНИЕ. Внизу есть пояснение, что где брать

ALLOWED_HOSTS=127.0.0.1 localhost <domain.example.com>
DB_HOST=postgres
DB_NAME=portal
DB_PORT=5432
DOCKER_PASSWORD=<пароль_от_докерхаба>
DOCKER_USERNAME=<логин_от_докерхаба>
EMAIL_HOST_PASSWORD=<email_для_отправки_почты>
EMAIL_HOST_USER=<пароль>
HOST=<ip вашего сервера>
POSTGRES_PASSWORD=<пароль пользователя БД>
POSTGRES_USER=<логин пользователя БД>
SECRET_KEY=<секретный ключ джанго>
SENDFILE_ROOT=/home/<username>/portal/django_files
SITE_DOMAIN=<domain.example.com>
SITE_PROTOCOL=<https или http>
SSH_KEY=<приватный ssh ключ>
TELEGRAM_ID=<ваш id телеграм>
TELEGRAM_TOKEN=<токен вашего бота в телеграм>
USER=<имя пользователя на сервере>
  1. Внести изменения в проект, если нужно. В portal_workflow.yml стоит задание собирать docker-образ и деплоить его на сервер, в случае пуша в главную ветку.
  2. В случае правильных настроек, все должно быть ОК (проверить или прочитать ошибки можно на github во вкладке actions). Поднимутся 2 конетйнера, портал и БД. Можно проверить командой docker ps

Что есть что

  1. ALLOWED_HOSTS - через пробел домены, на которых будет открываться сайт
  2. DB_HOST имя контейнера базы данных
  3. DB_NAME имя базы данных. В данном случае portal
  4. DB_PORT - порт БД, стандарт 5432
  5. DOCKER_PASSWORD - пароль от докерхаба DOCKER_USERNAME - логин от докерхаба
  6. EMAIL_HOST_PASSWORD - email для отправки почты, настроена на отправку с ящика яндекс, если поменять, надо подправить в settings.py
  7. EMAIL_HOST_USER - пароль к почте выше
  8. HOST IP сервера
  9. POSTGRES_PASSWORD - пароль пользователя БД
  10. POSTGRES_USER - логин пользователя БД
  11. SECRET_KEY - секретный ключ джанго. Actions плохо относится к символам, так что можно что нибудь из букв и цифр, лучше посложнее
  12. SENDFILE_ROOT - путь каталога, из которого будут браться защищенные файлы
  13. SITE_DOMAIN - домен сайта
  14. SITE_PROTOCOL - протокол сайта
  15. SSH_KEY - приватный ключ, ответная часть ключа, загруженного на гитхаб
  16. USER - имя пользователя на сервере.
  17. TELEGRAM_ID - для отправки сообщения в телеграм об успешном деплое от имени бота вам в личку. Можно не использовать, но и надо удалить джоб send_message из portal_workflow.yml 18.TELEGRAM_TOKEN=токен телеграм бота, для этого же

Настройка БД

База данных может создаться, а может и не создаться. Зависит от настроек в контейнере postgres. Лучше проверить и создать вручную и создать.

  1. Заходим в psql в контейнере
docker exec -it postgres psql -U <имя пользователя бд>
  1. Листаем базы данных. В списке должна быть portal.
\l
  1. Если нет - создаем и выдаем права доступа пользователю БД
create database portal;
grant all privileges on database <имя_бд> to <имя_пользователя>;
  1. Выходим из psql

Миграции, статика, пользователь

Остается только применить миграции, создать суперпользователя и собрать статику.

docker exec -it portal python manage.py migrate
docker exec -it portal python manage.py createsuperuser
docker exec -it portal python manage.py collectstatic
  1. Резюме. Портал размещен в контейнере portal, база данных в контейнере postgres. вольюмы контейнеров, docker-compose.yml, сгенерированный .env файл находятся в /home/<имя_пользователя>/portal/

Автор

dvkonstantinov telegram: https://t.me/Dvkonstantinov