WSL:Ubuntu22.04-v1 & VPS

1. フォルダーとファイルの構造

  • 本プロジェクトは、JavaScriptを使っています。
  • DjangoProject Tree
    ProjectRoot$ 
    .
    ├── .git
    ├── README.md
    ├── assets
    │   ├── admin
    │   ├── css
    │   ├── desktop.ini
    │   ├── fonts
    │   ├── images
    │   ├── js
    │   └── libs
    ├── blog
    ├── company
    ├── contact
    ├── db.sqlite3
    ├── desktop.ini
    ├── gulpfile.js
    ├── job
    │   ├── asgi.py
    │   ├── desktop.ini
    │   ├── settings.py
    │   ├── urls.py
    │   ├── views.py
    │   └── wsgi.py
    ├── manage.py
    ├── my_env
    ├── package.json
    ├── pages
    ├── readme.txt
    ├── src
    ├── static
    ├── templates
    │   ├── blog
    │   ├── bookmark-jobs.html
    │   ├── company
    │   ├── contact.html
    │   ├── index
    │   ├── manage-jobs-post.html
    │   ├── manage-jobs.html
    │   ├── pages
    │   ├── partials
    │   └── profile.html
    └── yarn.lock
    

2. Djangoのセットアップ

2-1. 前提 条件

  1. Yarn

    $ yarn -v
    1.22.15
    
  2. Nodejs

    $ node -v
    v16.15.0
    
    $ npm -v
    8.5.5
    
  3. Gulp Gulpがインストールされ、コンピュータで実行されていることを確認してください。

    • 煩雑な処理を自動で行うことができるため、作業を効率的に進められます。
    • VSCodeでなくPowerShellで実行するとうまくいきました。
    • VScodeは、便利だけど何かエラーのもとになりますね。Woo~
    $ yarn global add gulp ・・・OK
    
    ~/workspace/Jobcy-Django$
    $ gulp --version
    CLI version: 2.3.0
    Local version: Unknown
    
  4. Git

    $ git -v
    git version 2.39.0
    
  5. Python

    $ sudo update-alternatives --config python3
    [sudo] password for matsu: 
    There are 2 choices for the alternative python3 (providing /usr/bin/python3).
    
    Selection    Path                 Priority   Status
    ------------------------------------------------------------
    0            /usr/bin/python3.10   110       auto mode
    1            /usr/bin/python3.10   110       manual mode
    *2           /usr/bin/python3.11   100       manual mode
    
    • python3.11
  • (注意)Ubuntuで「sudo apt update」する場合は   「0 /usr/bin/python3.10 110 auto mode」にすること。エラーとなります。
  1. Check Pip version
    $ python3 -m pip --version
    pip 22.3.1 from /home/matsu/.local/lib/python3.11/site-packages/pip (python 3.11)
    
  2. Virtualenv
    $ virtualenv --version
    virtualenv 20.13.0+ds from /usr/lib/python3/dist-packages/virtualenv/__init__.py
    

3. インストール

3-1. Djangoのインストール

  • Python3.11で実行
    .ProjectRoot$
    python3 -m venv my_env
    source my_env/bin/activate
    
    (my_env) $ pip3 install django
    
    (my_env) $ pip show Django
    Name: Django
    Version: 4.1.5
    

3-2. データベース接続の設定ファイルの更新

  • ProjectRoot/job/settings.py
    DATABASES = {
        'default': {
        'ENGINE': 'django.db.backends.#databaseservername#',
        'NAME': 'Your Database Name',
        'USER' : 'Database User Name',
        'PASSWORD' : 'Your Password',
        'HOST' : 'Write down Host',
        'PORT' : 'Write down port',
        }
    }
    

3-3. データベースのマイグレート

  • フォルダー名の変更
  • /ProjectRoot/manage.py
    (Line9)
    os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'jobcy.settings')
    
    jobvia ⇒ jobcy
    
  • migration
    (my_env) $ python3 manage.py migrate
    

3-4. 管理者の作成

  • Djangoプロジェクト管理者作成(管理画面へのアカウント)
    (my_env) $ python3 manage.py createsuperuser
    Username (leave blank to use 'matsu'): admin
    Email address: 
    Password: 
    Password (again): 
    Superuser created successfully.
    

3-5. gulpの起動

  • gulpがない場合はインストールします。
    (my_env) $ gulp
    [05:14:00] Local modules not found in ~/workspace/Jobcy-Django
    [05:14:00] Try running: yarn install
    

3-6. アプリの起動

  • /ProjectRoot/jobcy/settings.py
    ALLOWED_HOSTS = ['*']
    
  • 起動
    (my_env) $ python3 manage.py runserver 172.28.100.227:8000
    (my_env) $ python3 manage.py runserver 0.0.0.0:8000
    (Output)
    Starting development server at http://172.28.100.227:8000/
    Quit the server with CONTROL-C.
    
    (my_env) $ deactivate
    

3-7. 静的ファイルのロード

  • /ProjectRoot/jobcy/settings.py
    STATIC_URL = '/static/'
    STATICFILES_DIRS = [os.path.join(BASE_DIR,'static')]
    STATIC_ROOT= os.path.join(BASE_DIR,'assets')
    
  • コマンド
    (my_env) python3 manage.py collectstatic
    
    673 static files copied to '/home/<user>/Jobcy-Django/assets'.
    

3-8. メールの設定(SMTPの構成)

  • Gmailを使ってメールを送信する設定です。

  • 参考URL

  • /ProjectRoot/jobcy/settings.py

    # メールサーバーへの接続設定
    EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
    EMAIL_HOST = 'smtp.gmail.com'
    EMAIL_PORT = 587
    EMAIL_USE_TLS = True
    EMAIL_HOST_USER = 'yamasaki@raizin.net'
    EMAIL_HOST_PASSWORD = 'xxxxxx'
    DEFAULT_FROM_EMAIL = 'yamasaki@raizin.net'
    
  • メールを実際には送らずに、コンソールに表示してくれる設定

    EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend'
    

4. 日本語、日本時間

  • /ProjectRoot/jobcy/settings.py
    LANGUAGE_CODE = 'ja'
    TIME_ZONE = 'Asia/Tokyo'
    
  • i18:設定ファイル
  • Jobcy-Django/my_env/lib/python3.11/site-packages/django/contrib/admin/locale/ja/LC_MESSAGES/django.po
  • VSCode拡張機能追加:django.po

5. Githubソース管理

  • 新規リポジトリの作成
  • Githubで「Jobcy-Django」を事前に作成しておきます。
    git init
    git add .
    git commit -m "first commit"
    git branch -M main
    git remote add origin https://github.com/TechRZN/ProjectRoot.git
    git push -u origin main
    
  • 「Jobcy-Django_v1.0.0」フォルダーは、Templateのソースとドキュメントです。

6. PostgreSQLの導入

  • Search:django migrate sqlite to postgresql

6-1. PostgreSQLのインストール

同じVPS上にサーバーもクライアントもインストールしていますので、同じバージョンとなります。

  • Install

    sudo sh -c 'echo "deb http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list'
    wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -
    sudo apt update
    sudo apt -y install postgresql-15
    
  • 起動

    sudo systemctl status postgresql
    ● postgresql.service - PostgreSQL RDBMS
        Loaded: loaded (/lib/systemd/system/postgresql.service; enabled; vendor preset: enabled)
        Active: active (exited) since Sat 2023-01-07 20:35:52 JST; 1 week 3 days ago
    
  • バージョン確認(クライアント)

    $ sudo -u postgres -i
    postgres@i-50100000452180:~$ psql
    psql (14.5 (Ubuntu 14.5-0ubuntu0.22.04.1))
    
    postgres=# 
    
  • バージョン確認(サーバー)

    postgres=# select version();
                                                                version                                                             
    ---------------------------------------------------------------------------------------------------------------------------------
    PostgreSQL 14.5 (Ubuntu 14.5-0ubuntu0.22.04.1) on x86_64-pc-linux-gnu, compiled by gcc (Ubuntu 11.2.0-19ubuntu1) 11.2.0, 64-bit
    
  • DBから抜ける「CTL-D」または「\q]

6-2. DjangoのSQlieからのデータをPostgreSQLへ移行します。

プロジェクトが大きくなるにつれて、MySQLやPostgreSQLなどの標準データベースを移動する必要性となります。しかし、データベースにいくつかのデータがありますよのでsettings.py ファイルを変更するだけで、SQliteデータベースに保存されているすべてのデータが失われます。そのため、このチュートリアルでは、SQliteからPostgreSQLにデータを安全に移行します。

  1. DBのセッションに入ります。
    sudo -u postgres -i
    $ psql
    postgres=# 
    
  2. SQliteから移行するデータを格納するデータベースの作成
    CREATE DATABASE job_database;
    
  3. このデータベースのユーザーを作成しましす。
    CREATE USER job_database_user WITH PASSWORD 'xxxxxx';
    
  4. このユーザーに対していくつかのアクセス許可といくつかの構成を指定します。
    ALTER ROLE job_database_user SET client_encoding TO 'utf8';
    ALTER ROLE job_database_user SET timezone TO 'Asia/Tokyo';
    
    \q
    exit
    

6-3. プロジェクトの設定の構成

  1. デフォルトのSQlite以外の選択したデータベースを使用するには、psycopg2パッケージをインストールする必要があります。

    × pip install psycopg2
    (<https://www.psycopg.org/docs/install.html>)
    〇 pip install psycopg2-binary
    
  2. SQliteのデータを通常のファイルではなくファイルに格納する必要があります。次のコマンドを使用して、データを json ファイルに保存します。

  • プロジェクトディレクトリに移動します。
    × (my_env) $ python manage.py dumpdata > data.json
    (my_env) $ python3 manage.py dumpdata > data.json
    (Output)
    data.json
    

6-4. PostgreSQLをデータベースとして設定する

  • データが安全になったので、settings.py ファイルを微調整して、データベースをPostgreSQLとして構成する必要があります。settings.pyの次の行を変更します。
    DATABASES = {     
        'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': 'job_database',
        'USER': 'job_database_user',
        'PASSWORD': 'adminDE_s0',
        'HOST': 'localhost',
        'PORT': ''  
        } 
    } 
    

6-5. データの移行

  1. settings.py ファイルを変更した後、次のコマンドを使用して、ユーザー名をデータベース上でPostgreSQLサーバーを実行します。

    sudo -u postgres -i
    postgres@i-50100000452180:~$ psql job_database job_database_user
    Password for user job_database_user: 
    psql (14.5 (Ubuntu 14.5-0ubuntu0.22.04.1))
    Type "help" for help.
    
    job_database=> 
    ...
    
  2. 1.をバックグラウンドで実行し続け、Djangoプロジェクトに戻ってください。次のコマンドを実行します。

    (my_env) $ python3 manage.py migrate --run-syncdb
    
  3. データベースバックエンドをSQLiteからpostgresql に変更します。

    (my_env) python3 manage.py migrate --run-syncdb
    (Output)
    Operations to perform:
      Synchronize unmigrated apps: messages, staticfiles
      Apply all migrations: admin, auth, contact, contenttypes, sessions
    Synchronizing apps without migrations:
      Creating tables...
        Running deferred SQL...
    Running migrations:
      Applying contenttypes.0001_initial... OK
    
  4. jsonファイルにデータがあるので、Djangoに付属しているデータベースにデフォルトのデータは必要ありません。したがって、postgresql を使用して新しいデータベースを作成したので、そのデータベースのデフォルトデータを削除する必要があります。これを行うには、次のコマンドを実行します。

    (my_env) $ python3 manage.py shell
        (Output)
        Python 3.11.1 (main, Dec  7 2022, 01:11:34) [GCC 11.3.0] on linux
        Type "help", "copyright", "credits" or "license" for more information.
        (InteractiveConsole)
        >>> from django.contrib.contenttypes.models import ContentType
        >>> ContentType.objects.all().delete()
        (35, {'auth.Permission': 28, 'contenttypes.ContentType': 7})
        >>> quit()
    
  5. jsonファイルのデータをデータベース(postgresql)にダンプする必要があります。次のコマンドを使用します。

    (my_env) $ python3 manage.py loaddata data.json
    

※これでSQLiteから以前のデータが全て移行されました。 6. PosgreSQL

  • データベース一覧の表示
  • $ sudo -u postgres -i
  • $ psql job_database job_database_user
    job_database=> \l
                                    List of databases
        Name     |  Owner   | Encoding | Collate |  Ctype  |    Access privileges     
    --------------+----------+----------+---------+---------+--------------------------
    djangodeploy | postgres | UTF8     | C.UTF-8 | C.UTF-8 | =Tc/postgres            +
                  |          |          |         |         | postgres=CTc/postgres   +
                  |          |          |         |         | djangoadmin=CTc/postgres
    job_database | postgres | UTF8     | C.UTF-8 | C.UTF-8 | 
    postgres     | postgres | UTF8     | C.UTF-8 | C.UTF-8 | 
    template0    | postgres | UTF8     | C.UTF-8 | C.UTF-8 | =c/postgres             +
                  |          |          |         |         | postgres=CTc/postgres
    template1    | postgres | UTF8     | C.UTF-8 | C.UTF-8 | =c/postgres             +
                  |          |          |         |         | postgres=CTc/postgres
    
  • テーブル一覧の表示
    job_database=> \dt;
                            List of relations
    Schema |            Name            | Type  |       Owner       
    --------+----------------------------+-------+-------------------
    public | auth_group                 | table | job_database_user
    public | auth_group_permissions     | table | job_database_user
    public | auth_permission            | table | job_database_user
    public | auth_user                  | table | job_database_user
    public | auth_user_groups           | table | job_database_user
    public | auth_user_user_permissions | table | job_database_user
    public | contact_contact            | table | job_database_user
    public | django_admin_log           | table | job_database_user
    public | django_content_type        | table | job_database_user
    public | django_migrations          | table | job_database_user
    public | django_session             | table | job_database_user
    (11 rows)
    
以上