UbutnuサーバーをVirtualBoxにインストールしよう

皆さん、お疲れ様です。

今日は、Ubutnu ServerのISOファイルを使って、VirtualBoxにインストールする作業を説明します。

Ubutnu のデスクトップバージョンも同じやり方でできますし、他のLinuxも同じ方法なので是非試してみてください。

特にお金のかかるサーバーをレンタルする前のテストにはもってこいです!

今日の環境

  • Windows10(VirtualBoxのホストPC、OSで何でもOKです。)
  • ホストPCのメモリが8G以上(理想は16G以上)
  • VirtualBoxがインストールされた状態
  • UbutnuServer22.04

VirtualBoxってなに?

VirtualBoxはOracle社が提供している仮想マシンのアプリケーションのことです。MicrosoftではHyper-Vという同じような仮想マシンを提供しています。他に、有名なものではVMWareというものもあります。

動画ではVirtualBox(以下、略してVB)のインストールから説明しているのでご覧ください。

ISOファイルをダウンロード

Ubuntuの公式サイトからUbuntu ServerのISOファイルをダウンロードしておきます。

https://ubuntu.com/download/server

VBインスタンスを作成

Instanceは事例、という意味ですが、プログラマーの世界では、プロジェクトの意味合いに近いものになります。

では、早速Newのボタンを押して新しいインスタンス(プロジェクト)を作成します。これが各OSがインストールされる仮想マシンになるわけですね。

で、マシン名と、メモリのサイズを指定していきます。サーバーだけならデスクトップよりもメモリは食わないので4Gあれば足りるかな?私は8Gに設定しておきました。これは後から調整できるので色々試してください。

で、Createをクリック。

ファイルサイズを指定します。

使用目的にもよりますが、使うと思う分のハードディスクを割り当ててください。

Hard Disk File Typeは、仮想マシンのファイル端子のことです。他の人とシェアしないならどれでも構わないと思います。

私はVMDKを選びました、これならエキスポートした仮想マシンファイルをVirtualBox以外のアプリケーションにインポートすることができます。

Storage on physical hard diskはハードディスクの容量をどのように区切るかの設定です。

通常はDynamically allocatedでOKです。これは、指定した分を実際にハードディスクから削り取るのではなく、使った分だけダイナミックにホストPCから割り当てるという事になります。

これで問題なければCreateを押します。

ネットワークの設定

では、インスタンスがハイライトされた状態でSettingsを押して詳細を確認します。 

ネットワーク設定を見てみましょう。

もし同じLANネットワークで使用したいのであればBrige Networkを使用しましょう。

その場合は、ホストPCが192.168.1.5とかなら、192168.5.16などの同じネットワークのIPが割り当てられます。

NATの場合はちょっと複雑になります。私の場合はとりあえずこのままでOKにしておきます。

インストールするOSを指定

ではStartボタンからマシンを起動しましょう。

そうするとスタートアップに使用するででディスクを指定してくださいというメッセージが出ます。

フォルダのアイコンをクリックしましょう。

Addを押します。

では、ダウンロードしておいたUbuntuサーバーのISOファイルを指定します。

Chooseを押します。

ではStartを押してマシンを起動しましょう。

Ubuntuサーバーのインストール

ではインストールが始まるので言語選択の画面になるまで待ちます。

日本語がないので英語で進めていきます。私はプログラミングは全部英語で行っています。皆さんも同じ習慣をつけることをお勧めします。

ではEnglishがハイライトされた状態でエンターを押します。

キーボードの設定をします。

キーボードのタブボタンを使って上下にスクロールします。スクロールアップの場合はシフトを押しながらタブになります。LayoutをJapanese、VariantをJapaneseにしましょう。

完了したらDoneを選択します。

特にハードディスクに制限がない場合は通常版のサーバーをインストールしましょう。

minimizedバージョン(軽量版)をインストールしても後から変更できるのでどっちでもOKです。

選択したらDoneをクリックします。

ネットワークの設定をします。

これも後から変更できるのでそのままにしてDoneにしましょう。

次のプロキシアドレスの設定も後から行うのでそのままdoneにします。

これもそのままDoneでOKです。

ストレージはヴァーチャルボックスで割り当てた分をUbuntuサーバーで使用できるようになっているのでデフォルトのまま次に進みましょう。

では全体のサマリーをみて問題がなさそうならdoneを押します。

そうすると確認のメッセージが出るのでContinueを選択しエンター。

Ubutnuのユーザーを作成します。

これはログインの際に使います。

こんな感じで適当に入力できたらDoneを押します。

次にオープンSSHサーバーをインストールするか聞かれます。

もしSSHの意味が分からない人は下記に説明の動画があるので見てみてください。

要約すると、ホスト側(ユーザー側)のPCのコマンドライン(シェル、コマンドプロンプト、ターミナル)からサーバー側のマシンにアクセスするためのツールになります。

これは必須の知識なので是非、練習してみましょう。

ですので、タブとエンターキーを使ってInstall Open SSHServerにチェックを入れてDoneを選択します。

次に他にインストールしたいアプリケーションがあれば選択してください。

個人的にnextcloudのファイル管理アプリが楽しそうだと思いました。

とりあえず今回はスキップするのでそのままDoneを選択します。

インストールが始まります。

インストールが完了したら下のオプションからReboot Nowを選択してマシンを再起動します。

バーチャルボックス側ではインストール用のISOファイルは外れると思いますが、一応それを確認して、サーバーが起動できることを確認します。

サーバーを再起動

サーバーを再起動すると先ほど設定したパスワードを聞かれます。

パスワードの部分は打っても何も動かないですが、入力されています。

ログイン情報を入力したらエンターを押します。

これでログインができました!

とりあえずUbuntu Serverがインストールできたので今日はこれでおしまいにします。

この後はサーバーの更新、初期設定をしたり、SSHで接続してWebサーバーを設定していきたいと思います。

良かったら他の記事も参考にしてください。

ではお疲れ様です。

DB BrowserでSQLiteのデータベースを作ろう

SQLiteの使い方

日本のプログラマーの皆さんこんにちは。今日はDB Browserを使ってSQLiteのデータベースを管理していく方法を紹介します。 エクセルのような感覚で始められるのでリレーショナルデータベースを使ったことがない人には得にお勧めです。 SQLiteってなに? SQLiteは下記のような長所があります。 オープンソースです。(ソースコードが一般に公開されています。) データベースの一種です。(MySQLとかPostgreSQLとかと同じ) ポータブルです。(OSに依存せず、DBファイルにそのままアクセスすることができます。) SQLiteの欠点はこのようなものがあります。 DBサーバー無しで使えるのでネットワークからアクセスできない。 大規模なアプリケーションには向いていない。 データサイズに制限がある。 本日の環境 Windows10(MacOSでも、Linuxでも問題ありません。) 本日の目的 今日も目的はSQLiteのデータベースがどのような仕組みで作れるのか見ていくことが目的になります。慣れてきたら、次回以降はSQL(クエリ)を書いてデータベースを操作できるようにしたいですね。 SQLite DB Browserをダウンロード では、SQLiteのデータベースの作業をするために下記の公式リンクからSQLite Browserをダウンロードしましょう。 https://sqlitebrowser.org/dl/ では、ダウンロードページに行ったらWindowsのポータブル版をダウンロードしましょう。 windowsにインストールしちゃいたい人は64bitのインストーラーをダウンロードしてもOKです。MacOCの人はMacの方からダウンロードしてください。 DBBrowserを展開 ではダウンロードした.exeファイルをダブルクリックしてファイルを展開しましょう。 Nextをクリックします。 ポータブル版のファイルをおきたいファイルパス(場所)を指定します。これだとダウンロードに展開されることになります。 では、Instalをクリック。 Finishをクリックで完了です。 SQLiteDatabaseBrowserを実行 では先ほど展開したファイルを開くと.exe実行ファイルがあるのでそれをクリックしてアプリを起動します。 データベースを作成 では、NewDatabaseのボタンを押してデータベースを作成します。 それからデータベース名を決めて、Saveします。名前は後から変更できるのでご心配なく。 Addをクリックしてカラム(Column)を追加します。 まずは、テーブル名をInventoryとかにしておきましょう。 今回は在庫管理業務で使えそうなデータベースを作ってみましょう。 では下記のようにカラムを追加していきましょう。 Nameはカラムの名前です。クエリで指定する際に使います。 Typeはデータのタイプになります。Textは文字のデータです。(数字を入れると文字データの数字として扱われます。プログラミングを学習する際に習いますね。) INTEGERは整数のことになります。 その横にあるチェックボックスを説明します。 NN NotNull(Null=データがないことを許さないという事です。) PK プライマリーキー(他のデータと被らない行を区別するためのキーです。) AI auto increment (自動で数字が足されていくことです。) U ユニーク(PKと同じですが、PKはテーブルに1つしか設定できないことに対しUは複数設定可能です。 では、今回設定した内容を説明します。 idはプライマリーキーでそれぞれのデータの行を区別するために設定しておきます。またAIにチェックが入っているので新しいデータが作成されるたびに数が1,2と増えていくようになります。 最後にadded_date(追加日)のDefault(デフォルト)の部分に下記のテキストを追加します。 CURRENT_TIMESTAMP デフォルトで初期値を設定することができます。もし何もインプットがない場合にデフォルトの値を記録することになります。 この場合は現在の日時を自動で入力するように指示したことになります。 では右下のOKボタンを押してDB(データベース)が作成されました。 … Read more

Let’s EncryptとCertbotでSSL取得

AsameshiCode

今日の課題 今日は、Let’s EncryptとCertbotを使ってTLS/SSL Certificationを無料で取得します。 今回はウェブサーバーはnginxで行いますが、apacheでも同じことができます。 ちなみに、nginxではデフォルトファイルとは別のサーバーブロックを作成します。ドメイン毎にサーバーブロックをそれぞれ作成することでドメインごとの設定ができます。 準備するもの ・Ubuntuサーバー(20.04) ・root 権限(もしくはsudo権限のユーザー) ・ドメイン(なんとか.com) ・すでにnginxがインストールされていることを前提です。 ・/etc/nginx/sites-available/example.comでアプリがデプロイされていることが前提です。 ・SSHでサーバーに接続できる状態。 ・コマンドラインを使ったことがない人には理解をすることが難しい内容です。 Certbotのインストール では、SSHでサーバーに接続します。私はMobaXtermという無料ツールを2年くらい使っています。詳しいMobaXtermの使い方はこちらの記事を読んでください。 では、Certbotを入れます。 毎回、何を入れているのか公式サイトから確認する癖をつけましょう。 https://certbot.eff.org/ で、下記のコマンドからインストールします。 これでCertBotの準備ができましたが、nginxの方で設定が必要なのでこれからやっていきます。 Nginxの設定 CertBotに自動でSSLを取得するために、正しいサーバーブロックを探すように指示してあげなければいけません。 この記事で説明しているように下記のファイルを先に設定しましょう。 このファイルの中に下記のラインがあることを確認してください。 Nginxのテストをします。 エラーが出た場合はコンフィグを修正してnginxをリロードしましょう。 HTTPSをファイアウォールで許可する Ubuntuサーバーで使われているファイヤーウォールの設定は下記のコマンドで確認できます。 Inactive の場合はsudo ufw enableでアクティブにします。この時にSSHのポートを許可しておきましょう。 では、nginxのポートを許可します。 ここまでできたらCertBotを使ってSSLを取得します。 SSL Certificateを取得 では下記のコマンドでSSLを取得しましょう。 ここで、色々聞かれるので答えていきます。 root@localhost:/etc/nginx/sites-available# sudo certbot –nginx -d ドメイン.com -d www.ドメイン.com Saving debug log to /var/log/letsencrypt/letsencrypt.log Plugins selected: … Read more

Vueアプリをデプロイしよう!

AsameshiCode

準備するもの

・Ubuntuサーバー(今回はバージョン20)

・root権限

知っておきたいこと

・SSHの簡単な操作

・Liniuxの簡単なコマンド

・VueJSの基本知識

サーバーの準備

今回はVPS (Virtual Private Server)を使います。Linodeというアメリカのフィラデルフィアにある会社のレンタルサーバーを毎月5ドル~で借りられます。

サーバー自体は東京で設定できるのでそれも良い点だと思います。

LinodeはAWSに比べて安く、しかもサービスも良いので良い会社として有名です。

では早速、linodeのページを見てみます。

また、他のレンタルサーバーや自宅サーバーでもUbuntuの準備ができたらほとんど手順は同じです。

Linode(サーバー)を作成します。

個人的にはOSはFedoraが好きですがUbuntuで行きます。

場所は東京にしましょう。

今回はRAM2GBでやってみます。しょぼいけど、パフォーマンスがどうなるか見てみます。

で、このlinodeの中のサーバー名とrootのパスワードを設定します。

SSHキーも必要なら生成して入れてあげましょう。

でCreate Linodeボタンを作成してサーバーを作成します。(お金がかかります)

サーバーにSSHで接続

でサーバーができたらSSHで接続します。今期はお気に入りのmobaXtermを使います。

IPアドレスがあるので、それとさっき作成したrootのパスワードを使います。

WindowsならmobaXtermの代わりにPuTTYでもOKですね。

サーバーに入れましたね。

Ubuntuのユーザーを作成

Rootだとすべてのファイルにアクセスでき、セキュリティ上安全ではないので新しくユーザーを作成します。

adduser dan

ユーザーができましたね。

では rootから新しく作成したユーザーのdanに切り替えます。

su - dan

ユーザーにrootと同じ権限を与える

では下記のコマンドから新しく作成したユーザーにrootと同じ権限を与えます。

一旦rootに戻ります。

su -

visudo

でコンフィグファイルが開くので下のrootと同じように新しく作成したユーザーにも権限を与えます。

root    ALL=(ALL:ALL) ALL

dan   ALL=(ALL:ALL) ALL #追加

wwwフォルダにアクセス権を与える

今回使用するnginxがこれからアップロードするvueのファイルにアクセスできるようにします。

これからwww-dataグループのwww-dataユーザーに読み込みする権利を与えます。

今回はvar/wwwkaravueファイルをデプロイすると仮定して進めます。

cd var

mkdir www
sudo chown -R www-data:www-data /var/www


sudo chmod -R g+rwX /var/www

では、下記のコマンドで新しく作成したubuntuのユーザーをwww-dataグループに追加します。

sudo adduser dan www-data

ここまでできたらrootから新しく作成したuserの方にスイッチしておきましょう。

 su - dan

NPMをインストール

yarnを使いたい人はyarnでも同じようにできますのでいつも使っている方をどうぞ。

※このやり方だと現時点でバージョン12の古いNodeがインストールされるので後で別のインストールの仕方を説明します。

sudo apt update

sudo apt install nodejs npm

できたらバージョンを確認しましょう。

node --version

【最新のNodeJSをインストールする方法】

sudo apt update -y

cd ~

curl -sL https://deb.nodesource.com/setup_16.x -o nodesource_setup.sh

sudo bash nodesource_setup.sh

sudo apt install nodejs

node --version

バージョン16がインストールできました。

Nginxのインストールと設定

主流のウェブサーバーとしてapache(ワードプレスで使っている)もありますが、個人的にお勧めのnginxを使っていきます。

インストールはこれで。

sudo apt install nginx

Nginxのディレクトリに移動

cd /etc/nginx

ここにsites-availableとsites-enabledの2つのディレクトリがありますね。

使い方としては、sites-enabledにウェブサイトのファイルを準備し、それとsites-availableから読み込むようにします。

Windowsではショートカットに近いもの(同じではありませんが感覚として)ですが、シンボリックリンクという方法でファイルをコピーします。 

まずは、sites-available内にvue_projectというファイルを作成します。

sudo touch /etc/nginx/sites-available/vue_project
sudo ln -s /etc/nginx/sites-available/vue_project /etc/nginx/sites-enabled/vue_project

ではvue_projectのファイルにnginxのコンフィグを書いていきます。

sudo nano sites-available/vue_project

実際のファイル(例)

server {

    listen 80;

    server_name 139.162.84.105;

    charset utf-8;

    root    /var/www/html/Vue/dist;

    index   index.html index.htm;



    location = /favicon.ico { access_log off; log_not_found off; }

    location / {

        root /var/www/html/Vue/dist;

        try_files $uri /index.html;

    }



    error_log /var/log/nginx/vue-app-error.log;

    access_log /var/log/nginx/vue-app-access.log;

}

nginxにvar/www/html/Vue/distのディレクトリを見るように指示しています。

では下記のコマンドでnginxをテストします。

sudo nginx -t

イェイ!

ではnginxをリスタートしてみます。

sudo service nginx restart

Nginxが参照するディレクトリを作成

では先ほどのコンフィグで設定したdistファイルがないので設定していきます。

デプロイの際に vue のbuildコマンドでdistディレクトリが自動で作成されますが、まずはnginxのテストでダミーファイルを作成します。

cd var/www/html



mkdir Vue

cd Vue

mkdir dist

nano index.html

で、適当に<h1>Hi</hi>とか入れてセーブします。

で、ブラウザからサーバーのIPアドレスかドメインにいくと。。。

やったー!

Nginxサーバーが問題なく動いていることを確認できました。

ではテスト用で使ったdistディレクトリは削除しておきます。

 rm -rf dist/

Gitを使ってvueアプリをサーバーにプッシュ

では、distディレクトリからindex.htmlがサーブされていることを確認できたので、本番のVueアプリをアップロードしていきます。

ここで、gitを使ったことがない人は、FTPでサーバーに接続してマニュアルでアップロードする方法もあります。

しかし、今後のファイル更新の事を考えると、gitを使って、バージョンをコントロールしていく方がより効率的です。

このやり方は他の記事でも説明しているので、それも見てみてください。

今回はコマンドだけ記載しておきます。

Gitのインストールとコンフィグ

sudo apt install git-all

git init --bare github-hook.git

cd github-hook.git/

cd hooks



nano post-receive
git --work-tree=/var/www/html/Vue/ --git-dir=/var/www/html/Vue/github-hook.git/ checkout -f

Vueアプリのある環境からpush

ではローカルのPCからVueアプリをサーバーにpushします。

git remote add live ssh://root@139.162.84.105:/var/www/html/Vue/github-hook.git

git push live master

ファイルが上がったことが確認できました。

Vueアプリのbuild

では、Vueアプリがアップロードされたらデプロイ用にアプリをプロダクション用にコンパイルしていきます。

npm install

#デペンデンスィーのインストール(ライブラリとか)

npm run build

#distディレクトリの作成

ここでエラーがなければOKですね。

【おまけ】

さっきのpost-receiveファイルに下記のコマンドを追加してgitでpushした後に自動でnpm run buildのコマンドが実行されるようにしましょう。

これでいちいちdistのファイルを更新しなくてすみますね。

cd /var/www/html/Vue
npm install
npm run build

実際にデプロイしたVueアプリ

下記のIPアドレスから実際にデプロイしたVueのアプリにアクセスができます。

良かったら見てみてください。

http://172.104.81.40:82/login

Gitでサーバーのリポを更新しよう

準備するもの

・Ubuntuサーバー

・root権限

今日の課題

Gitは世界のどこのデベロッパーでも使っておきたいバージョンコントロールシステムのことです。

Gitを使ってコードをブランチに分けたり、前のバージョンに戻ったりできるプログラマーの親友です。

今日はGitを使ってサーバーに上げたリポジトリを更新する作業を行います。

サーバーにSSH接続

まずはサーバーにSSH接続しましょう。

私のお気に入りのSSHクライアントはmobaXtermです。他に自分で使っているのがあればそれで構いません。

では、サーバーには入れたらgitをインストールしましょう。

sudo apt install git-all

y/nで聞かれたらyesのy、でエンター。

ではgitをinit(イニシャライズ)したいファイルパスに行き、下記のコマンドを実行します。

.git前の名前は何でもいいです。

git init --bare github-hook.git

post-receive Hookを追加

Initした後に作成されたファイルを見てみましょう。

ではこの中のhooksに移動します。

ここではpost-receiveファイルを作成します。

nano post-receive
git --work-tree=/home/djangoboy/backendAPI/ --git-dir=/home/github-hook.git/ checkout -f

git –work-tree=/pushしたいディレクトリ/ –git-dir=/Gitの場所/ checkout -f

post-receiveを実行ファイルにする

さっき作成したpost-receieveファイルをexcecutableのファイルにします。

これがないとうまくいきません。

chmod +x post-receive

権限をみたい場合は
ls -all

ローカルサーバーでpushの行先を設定

git remote のコマンドでどこにpushするか教えてあげます。

これでローカルのPCで更新したコードをサーバーにpushできるようにします。

git remote add live ssh://root@104.248.231.241/var/repo/myproject.git

例2:git remote add live ssh://root@172.104.81.42/home/dan/ticketapi/github-hook.git

Liveの部分は名称なのでdeoployとかprod(プロダクションの略)とかに変えてもOKです。

でsshの次にサーバーのIPから、pushするパスまでを書きます。

git remote add live ssh://root@172.105.192.111/home/github-hook.git

Push!

git push live master

git push live

おまけ

現在の接続先をみたい場合

git remote -v

DjangoをUbuntu(22.04)からデプロイする

先に知っておくべきこと

・SSHの概念、簡単なコマンド

・IPアドレスの基礎

・Linuxの基礎

・Djangoフレームワークの基礎

準備するもの

・レンタルサーバーにSSHで入れる状態、若しくは

・自宅のゴミPCにUbuntuサーバーが入った状態

今日の課題

今日は自分で作ったDjangoアプリをデプロイする作業を行います。いつもLinuxを使っていない方には混乱する作業が多いと思います。

もし難しいと思ったらLinuxをインストールしてみてターミナル(コマンドライン)をいじってみたりSSHで接続してプログラムをインストールする練習をしてみてください。

SSHでサーバーに入る

SSHはセキュアセルといってコマンドラインからネットワークを通して他のサーバー等に接続するテクノロジーの事です。

まずは、SSHクライアントでサーバーに入り込みましょう。

別の記事で詳しく説明しますが、サーバー側でOpenSSH等でサーバーを設定してポートを開けておきます。

私の場合は、MobaXtermという無料のSSHクライアントを使います。

MobaXtermはこちらはから、インストーラかポータブルのアプリをダウンロードできます。

https://mobaxterm.mobatek.net/

で、セッション開始!

Host側(サーバー側)にアクセスしたいIPアドレスを入力し、usernameにサーバーで作成したユーザーネームを入力します。レンタルサーバーでOSを作成した際にrootのPWを設定した場合はusernameはrootになります。

SSHでログイン出来たら

では、SSHでログインできたらちょっとコーヒー休憩。ここでサーバーの中に入り込めたという事ですね。

では、Ubuntuの設定を行い、Djangoのデプロイに必要なdependency(デペンデンスィー:必要なライブラリ等)をインストールしていきます。

sudo apt update

OSのアップデートが終わりました。

では、Python3が入っていることを確かめましょう。

python3 --version


このサーバーにpythonの3.9.7が入っていることが確認できました。

※python2でもできますが、2020年の1月に公式サポートが終了したのでバージョン3をお勧めします。

では次。

Ubuntuユーザーの作成

もし、Ubuntuでユーザーを作成していない場合は新しくubuntuにユーザーを追加しましょう。

すでにroot以外のUbuntuユーザーがある場合は飛ばしてください。

sudo adduser ユーザー名
sudo adduser dan

usermod -aG sudo ユーザー名(ユーザーにsudo権限を与える)
usermod -aG sudo dan

sudo adduser dan www-data

rootからユーザーに入れ替える。

su ユーザー名 ※(rootで入っている場合はユーザーに入れ替えます。)
su dan

ライブラリのインストールと設定

sudo apt install python3-pip python3-dev libpq-dev postgresql postgresql-contrib nginx curl


このコマンドで下記のライブラリがインストールされます。

python3-pipはパッケージマネージャー

python3-devはスタティックライブラリ、デベロップメントツール

Libpq-devはクライアント側からpostgresにクエリを流すツール

postgresql-contribはエクステンション

nginxはウェブサーバー

curlはClient URLの略でコマンドラインツール

本当にインストールしますか?と聞かれたらyとタイプ(yesのy)

もしくはインストールの際に最後に-yを打ちます。

PostgreSQLのデータベースを作成

Postgresのdb(データベース)を作ったことがある人ならここは簡単です。

postgresをインストールしたときに自動でpostgres というアドミン権限のユーザーが作成されます。

この権限を使って新しいデータベースとユーザーを作成します。

sudo -u postgres psql

postgres=#に現在のディレクトリが変わったことでpostgresに入れたことが確認できます。

CREATE DATABASE myproject; myprojecyはDB名

でdbを作成します。myprojectの部分はdb名になるので好きな名前でどうぞ。

【注意】

SQLのコマンドは全てセミコロン;で終わります。必ずつけ忘れないように!

エラーがでずに次に進めたらdbができたはずです。

これを確認するには\l(バックスラッシュと小文字のL)です。

これで現在のdbがList(一覧)で表示されました。

PostgreSQLのユーザーを作成

CREATE USER myprojectuser WITH PASSWORD 'password';

このコマンドでユーザーとそのパスワードを作成します。

Myprojectuserはユーザー名なのでお好きなものを。

‘Password’ の部分も自分で決めたパスワードを入力。

PostgreSQLをモディファイ(修正)

ではpostgresの接続をスムースにするためにコネクションパラメーターを変えます。

まずはエンコーディングをutf-8に変えます。

ALTER ROLE myprojectuser SET client_encoding TO 'utf8';

次に下のコマンドでpostgresがコミット(確定)したデータのみを読み取るようにします。

ALTER ROLE myprojectuser SET default_transaction_isolation TO 'read committed';

Djangoのタイムゾーンがデフォルト(初期設定)でUTCにセットさせているのでそれに合わせます。

ALTER ROLE myprojectuser SET timezone TO 'UTC';

Djangoのドキュメンテーションを読んで変更したい箇所があれば詳しく見てみましょう。

https://docs.djangoproject.com/en/4.0/ref/databases/#optimizing-postgresql-s-configuration

作成したユーザーにdbのアドミン権限をつける

GRANT ALL PRIVILEGES ON DATABASE myproject TO myprojectuser;

とりあえずpostgresは一旦完了なのでquitのコマンドでpostgresから抜け出しましょう。

Django用に仮想環境を作成

Djangoアプリのデプロイまでもう少しの辛抱です!

pythonではいくつか仮想環境のライブラリがありますが今回はvirtualenvを使用します。

仮想環境を使ったことがない人は詳しく理解しておいた方が良いですね。

簡単に説明すると同じサーバーで違うバージョンのライブラリを使いたいとき(例えばDjangoの3.0と4.0)に仮想環境をアクティベートして同じマシンでも同時に使用できる様になります。

また、複数人で仕事をするときもバージョンを統一してするために使います。

Pipの準備

pipはpythonパッケージマネージャーでpythonのライブラリをインストールする際に使用しますね。

-HのフラグはsudoのコマンドでユーザーのhomeディレクトリではなくrootのHOMEディレクトリにインストールするように指示します。

まずはpipを最新のものにします。

sudo -H pip3 install --upgrade pip

次にvirtualenvをインストールします。

sudo -H pip3 install virtualenv

Djangoのプロジェクトディレクトリを作成

では、どこにDjangoのプロジェクトを置くか決めましょう。

これは特に決まりはありません。

今日はhome/user名の直下にプロジェクトを置きます。理由はvar/www直下にプロジェクトを作成するとユーザーのパーミッション設定が面倒なので、すべての権限があるユーザーの為に作成されたフォルダを使いたいからです。

ここで簡単なLinuxコマンドを知っていると理解できやすいと思います。

若しくはSSHの代わりにFTPとかでサーバーに入ればUIツールでディレクトリを作成できるようになります。今日使っているSSHクライアントにはどちらのツールも入っているので是非試してください。

Linuxの基本コマンド

  • pwdで現在のパス
  • cd ..で一階層上に移動
  • lsで現在のパスにあるファイルを一覧で表示

で、/varまで移動したら下のコマンドでディレクトリを作成します。

ルートのパスにいる場合は一階層上がり、varフォルダに入ります。

cd..

cd var/www

ls

ではこのコマンドでディレクトリを作成します。

mkdir myprojectdir(myprojectdirはフォルダ名です。)

※ディレクトリ名は自分で好きなものに名前を変えてください。

で、cdコマンドで先ほど作成したディレクトリに入ります。

cd myprojectdir

仮想環境をアクティベート

下のコマンドでvirtualenvで仮想環境を作成します。envの所はディレクトリ名なので自分で好きなものを決めてください。

virtualenv env

バーチャル環境ができたら下のコマンドでアクティベートします。

source env/bin/activate

画像を見てわかるようにユーザー名の前に(env)がつきましたね。

これで仮想環境がアクティベートされたことがわかります。

ここからpipでインストールしたライブラリは全てこの仮想環境内のみでインストールされるのでディアクティベートしたらあとはサーバー自体には全く影響しません。

pipでDjangoプロジェクトのライブラリをインストール

pipで下記のライブラリをインストールします。

他に使っているライブラリがある場合はここで全てインストールしてしまいましょう。

もし、requirements.txt 等でライブラリを一覧で書き出している場合はそれを使ってインストールしましょう。

pip install django gunicorn psycopg2-binary

もしくは、FTP等を使って自分で使ったDjano プロジェクトを持ってきましょう。

私の使っているSSHクライアントのmobaXtermはFTPもついてくるのでそのままファイルをドラグandドロップで転送しちゃいます。

もし、WindowsのPCでvirtualenvを使ってDjangoのプロジェクトを作成している場合は下記のコマンドでrequreiments.txtの名前(一般的なので)でデペンデンスィーを書き出します。

pip freeze > requirements.txt

私の場合の requirements.txtの中身はこんな感じになります。

asgiref==3.4.1

autopep8==1.6.0

distlib==0.3.4

Django==4.0.1

django-ckeditor==6.2.0

django-cors-headers==3.11.0

django-js-asset==1.2.2

djangorestframework==3.13.1

filelock==3.4.0

platformdirs==2.4.0

psycopg2==2.9.3

pycodestyle==2.8.0

pytz==2021.3

six==1.16.0

sqlparse==0.4.2

toml==0.10.2

tzdata==2021.5

virtualenv==20.13.0

ではWindowsのPCから必要なファイルだけサーバーに上げていきます。

画像はMobaXtermのSFTPを使用しています。

SSHの方にもファイル転送の機能があるのでわざわざSFTPで接続しなくてもOKです。

requirements.txtからライブラリをインストールしたい場合はこれ。

pip install -r requirements.txt

Gunicornを入れ忘れずに。デベロップメントでは入れていないと思うので。

pip install gunicorn 

Djangoプロジェクトの設定

Djangoプロジェクトを新規で作る場合

Djangoのアプリをデプロイする前に練習で新しいプロジェクトを作成したい場合はこちらです。

インストールしたDjangoから下記のコマンドでプロジェクトを作成します。

django-admin.py startproject myproject ~/myprojectdir

すでにDjangoプロジェクトを転送した人は飛ばしてください。

Settings.pyのコンフィグ設定

Djangoのプロジェクトを作成した際に自動settings.pyが作成されます。

このファイルでホスト側の設定とDBの設定を行います。

まずは、setting.pyがあるディレクトリに移動しましょう。

nano settings.py

ALLOWED_HOSTSの箇所を見つけて、下記のように変更します。

ALLOWED_HOSTS = [ 'example.com', '203.0.113.5']

ALLOWED_HOSTS = [ *] で全てのIpを許可しますが、セキュリティ上、良くないのでこれはやめましょう。

DBの設定

同じく、settings.pyの所でDATABASEの箇所を見つけて、ENGINE、ユーザー名とパスワード、ホストのIPを確認しましょう。

ちなみにこの作業はデベロップメント(開発)の際に既に接続を確認しているべきですので、windowsとmacをそれぞれ使っている人はその時からDBを接続しておきましょう。

ポートはローカルで接続する場合は空でOKです。

DATABASES = {

    'default': {

        'ENGINE': 'django.db.backends.postgresql_psycopg2',

        'NAME': 'project',

        'USER': 'postgres',

        'PASSWORD': 'password',

        'HOST': '127.0.0.1',

        'PORT': '5432',

    }

}

Staticファイルの扱い

同じくsettings.pyです。

下記のようにosモジュールをインポートしてStaticファイル(CSS,JS,画像ファイル)等の保管場所を指定してあげます。

import os


STATIC_URL = '/static/'


STATIC_ROOT = os.path.join(BASE_DIR, 'static/')

データベースのマイグレーション

ではmanage.pyがあるディレクトリから下記のコマンドで接続したDBにDjangoのモデルで作成したテーブルの枠組みをmigration(マイグレーション:移動)します。

python3 manage.py makemigrations

python3 manage.py migrate

ここでエラーがでなければ問題なくDBにテーブル(スキーマ)が作成されました。

おめでとう。

スーパーユーザーの作成

次にDjangoのアドミンパネルに入るためのスーパーユーザを作成します。

python3 manage.py createsuperuser

今回は説明の為にユーザー名:admin、パスワード:adminで作成し警告が出ましたが、本番環境ではハッキングされないものを作りましょう。

collectstaticの実行

ではmanage.pyから下記のコマンドを実行して、Staticファイルをデプロイ用に一か所にまとめます。

python3 manage.py collectstatic

ファイヤーウォールの設定

では、このDjangoプロジェクトをテストで公開するために下記のコマンドでサーバーのポートを開けます。

sudo ufw allow 8000

Djangoのテストサーバーでテスト

では下記のコマンドでDjangoにおまけでついてきたウェブサーバーで実際にpublicのネットワークから見れるか確認しましょう。

ちなみに自宅のLAN環境の場合はポートフォワーディングをして外からのアクセスを許可しないといけません。※おすすめしません。

python3 manage.py runserver 0.0.0.0:8000

やったよー。

ここまでできたらちょっとうれしいですね。

で、さっき作成したDjanogoのアドミンパネルにも入れますね。

Gunicornを使ってテスト

では、今度はgunicornを使って同じようにDjangoアプリをデプロイできるか試してみましょう。

※このproject.wsgiのprojectはDjangoのアプリ名です。settings.pyが入っているディレクトリ名ですね。

gunicorn --bind 0.0.0.0:8000 project.wsgi

※必要に応じてパスを移動(pwdで確認)
gunicorn --bind 0.0.0.0:8000 Djangoのプロジェクト名.wsgi

【ちなみに】

gunicornでサーブしたDjangoプロジェクトのアドミンパネルのCSSスタイルが抜けてますよね?これはgunicornがどこのCSSを見たらいいか分かっていないからです。今は無視しておきましょう。

では、ここまでできたら、一旦テストサーバーを止めて、仮想環境もディアクティベートしましょう。

サーバーはCtrl(コントール)+Cで止められます。

Systemdソケットとサービスファイルの作成

ではここからgunicorn様にsystemd socket(ソケット)とサービスファイルを作成します。

さっき、gunicornが動くことが分かったのですが、よりコントロールのある設定をしていきます。

下記のコマンドでソケットファイルを作成します。

sudo nano /etc/systemd/system/gunicorn.socket

中身をこんな感じで書きましょう。

[Unit]

Description=gunicorn socket



[Socket]

ListenStream=/run/gunicorn.sock



[Install]

WantedBy=sockets.target

次に、systemdサービスファイルを作成します。

sudo nano /etc/systemd/system/gunicorn.service

中はこんな感じです。

UserはUbuntuのユーザー名になります。

[Unit]

Description=gunicorn daemon

Requires=gunicorn.socket

After=network.target



[Service]

User=sammy(Ubuntuのユーザー名)

Group=www-data

WorkingDirectory=/home/sammy/myprojectdir

ExecStart=/home/sammy/myprojectdir/myprojectenv/bin/gunicorn \

          --access-logfile - \

          --workers 3 \

          --bind unix:/run/gunicorn.sock \

          myproject.wsgi:application(※myprojectはDjangoのプロジェクト名)




[Install]

WantedBy=multi-user.target

次に下のコマンドでGunicornソケットを実行します。これで自動でソケットファイルが作成されます。

sudo systemctl start gunicorn.socket

次にこれをEnable(実行:オン)にします。これで、ソケットに接続された際にsystemdが自動でgunicorn.socketを実行して処理してくれるようになります。

Gunicorn Socketファイルを確認しよう

gunicorn.socketをアクティブにします。

sudo systemctl enable gunicorn.socket

では下記のコマンドでプロセスのステータスを確認しましょう。

sudo systemctl status gunicorn.socket

Output

● gunicorn.socket – gunicorn socket

     Loaded: loaded (/etc/systemd/system/gunicorn.socket; enabled; vendor prese>

     Active: active (listening) since Thu 2021-12-02 19:58:48 UTC; 14s ago

   Triggers: ● gunicorn.service

     Listen: /run/gunicorn.sock (Stream)

      Tasks: 0 (limit: 1136)

     Memory: 0B

     CGroup: /system.slice/gunicorn.socket

Dec 02 19:58:48 gunicorn systemd[1]: Listening on gunicorn socket.

次に、/runディレクトリ直下にgunicorn.sockファイルがあるか確認します。

file /run/gunicorn.sock

※もしここで、systemctl statusのコマンドでエラーが出るか、gunicorn.sockファイルが見つからないメッセージが出た場合はgunicornソケットが作成されていないことが原因になるかと思います。下記のコマンドでgunicornソケットのログを出しましょう。

sudo journalctl -u gunicorn.socket

次のステップに進む前に下記のファイルに問題が無いか確認してください。

/etc/systemd/system/gunicorn.socket

ソケットアクティベーションのテスト

Gunicorn.scoketユニットをスタートしただけだとgunicorn.serviceはアクティブになりません。それはソケットが接続を受けていないからです。

下記のコマンドでステータスをチェックしましょう。

sudo systemctl status gunicorn

ソケットのアクティベーションのメカニズムをテストするには、curlコマンドを使ってソケットに接続シグナルを送ります。

curl --unix-socket /run/gunicorn.sock localhost

ここでHTMLの200のレスポンスが返ってきたらOKです。

これでGunicornが開始し、Djangoのアプリをデプロイする準備ができました。

では、Gunicornのステータスをもう一度確認してみましょう。

sudo systemctl status gunicorn

修正したら下記のコマンド

sudo systemctl daemon-reload

で、gunicornのプロセスもリスタートしましょう。

sudo systemctl restart gunicorn

では、次に進む前にここまでで問題ないことを確認しましょう。

NginxのGunicornにパスするプロキシを設定する

では、gunicornも設定ができたところで、次にプロセスにnginxのトラフィックを設定してきます。

Nginxのsites-availableディレクトリに新しいサーバーブロックを作成します。

sudo nano /etc/nginx/sites-available/myproject

ではこの中に下記のようにコンフィグを書いていきます。

server {

    listen 80;

    server_name server_domain_or_IP;

}

Nginxはfavicon(ファビコン:お気に入りのアイコン)とスタティックファイルを無視をするので、マニュアルで場所を教えてあげます。

server {

    listen 80;

    server_name server_domain_or_IP;



    location = /favicon.ico { access_log off; log_not_found off; }

    location /static/ {

        root /home/sammy/myprojectdir;

    }

}

最後に、location / {} ブロックで通常のproxy_paramsを含めた全てのリクエストを処理するようにします。

server {

    listen 80;

    server_name server_domain_or_IP;



    location = /favicon.ico { access_log off; log_not_found off; }

    location /static/ {

        root /home/sammy/myprojectdir;

    }



    location / {

        include proxy_params;

        proxy_pass http://unix:/run/gunicorn.sock;

    }

}

このファイルができたらシンボリックリンクでsites-enabledディレクトリとリンクしてあげます。

sudo ln -s /etc/nginx/sites-available/myproject /etc/nginx/sites-enabled

では、nginxのコンフィグレーションをテストしてみましょう。

sudo nginx -t

ここでエラーがでなければ、再度nginxをリスタートします。

sudo systemctl restart nginx

では、最初に開けた8000番のポートはデベロップメント用なので閉じてあげます。

sudo ufw delete allow 8000

それから、通常のアクセスは80番と443番のポートなので HTTPとHTTPSのポートを下記のように許可します。

sudo ufw allow 'Nginx Full'

ファイヤーウォールが起動しているか確認したい場合はこれで。

 

ufw status

sudo ufw enable

rootでしか変更できない場合はいったんrootのアカウントに変更します。

これで、サーバーのIPかドメインでDjangoのアプリが見れるようになりました。

トラブルシュート

DjangoのアドミンぺージのCSSが読み込めていない。

読み込まれていないCSSをクリックします。

CSSのソースページに=アクセスできない場合、www-dataが許可(permission)がないことが理由です。

まずは下記のコマンドでエラーがあるか見てみましょう。

sudo tail -F /var/log/nginx/error.log

必要に応じて、ユーザーのグループに追加しましょう。

etc/nginx/sites-enabled# gpasswd -a www-data root
etc/nginx/sites-enabled# gpasswd -a www-data ユーザー名

でサービスをリスタートして直るはずです。

sudo systemctl restart nginx

sudo systemctl restart gunicorn

トラブルシューティングはプログラミングの基本です。

他人の汚い部屋をきれいにしたり、分厚い契約書を見てミスがない確認するのと同じようで、練習を重ねていけば面倒でも慣れていきます。

慣れてくると、楽しい部分が見えてくるものです。

頑張りましょう!