DjangoをVPSにデプロイする1〜初期設定編〜

VPSを提供している会社は様々ですが、このシリーズではXserverVPSにデプロイします。

Xサーバーは無料のお試し期間が無いので、1ヶ月契約する場合は「別のVPS」で試した方が良いです。

安易にお試し契約すると、キャンペーン価格が適応されず非常に手間なのでオススメしません。

最終環境

  • ubuntu 24.0.4
  • PostgreSQL 14
  • Nginx 1.22.1
  • Gunicorn
  • 独自ドメイン
  • SSL化
  • メール配信

VPSのOSを選ぶ

2022/11/22現在、XserverVPSでは次のOSが提供されています。

  • Ubuntu 18.04、20.04、22.04
  • Debian 10、11
  • Rocky Linux 8.6 9.0
  • AlmaLinux 8.6、9.0
  • CentOS 7.9
  • CentOS Stream 8、9
  • Oracle Linux 8.6、9.0

好みのOSで良いですが、このサイトでは「ubuntu 22.04」を使います。


SSH Keyを取得

OSとrootのパスワードを決めたらSSH Keyの作成をします。

SSL Keyの項目で、新たにSSL Keyを作成を選択し、nameの部分に好きなファイル名を入力してください。

確認画面に進むとSSH Keyのダウンロードを促されると思うので、ダウンロードします。

SSH Key
Mac(ターミナル)でVPSサーバーを操作できるようにする為のパスワードです。XserverVPSのコンソール画面でも操作できますが、コピペできなかったりと扱いづらいのでSSH接続してターミナルで操作しましょう。

ポートの設定

XserverVPSのVPSパネルに「接続許可ポート」という項目があるので次をONにしてください。

  • SSH(22)
  • Web(20/21/80/443)
  • PostgreSQL(5432)
  • メール(25/110/143/465/587/993/995)

データベースとメールは必要に応じて変更してください。


SSH Keyを配置

ダウンロードした「ファイル名.pem」を「.ssh」ディレクトリに配置します。

.sshの場所は「Macintosh HD > ユーザ > ユーザー名」の中にあります。

隠しファイルを表示・非表示する方法は「Control + Command + . 」

この「.ssh」ディレクトリの中に、ダウンロードした「ファイル名.pem」を配置します。

もし、「.ssh」ディレクトリが無ければ作成してください。


pemファイルに権限付与

移動したpemファイルに「読み取りの権限」を与えます。

ターミナルで次のコマンドを実行します。

$ chmod 400 ~/.ssh/FILENAME.pem

400の番号の意味については以下の記事がわかりやすいです。

chmod コマンド

権限
あまり普段意識することは無いと思いますが、パソコンでも全てのディレクトリとファイルに所有者や権限が付与されています。同様にVPSのディレクトリやファイルにも所有者と権限があります。VPSはネット上にあるパソコンと考えてください。

SSH接続

.sshにpemファイルを配置し、読み取り権限を与えるだけで、ターミナルからVPSに接続できるようになります。

次のコマンドで、ターミナルからVSPにアクセスできます。

まだアクセスしないでね。

$ ssh -i ~/.ssh/FILENAME.pem root@xxx.xxx.xxx.xxx

rootは管理ユーザーで、xxx.xxx.xxx.xxxは契約したVPSのIPアドレスです。

デフォルトでubuntuユーザーも用意されています。

ショートコード作成

VPSにアクセスする時は、上記のコマンドを入力するのですが、非常に長く、書くのが面倒なので独自のコマンドを作ります。

先程の「.ssh」ディレクトリに「config」ファイルを作成し、以下の内容を追加します。

Host COMAND_NAME(好きな名前)
    HostName xxx.xxx.xxx.xxx(VPSのIPアドレス)
    User root(後で変更する)
    IdentityFile ~/.ssh/FILENAME.pem

これを保存すると、長かったssh接続のコマンドが以下のように短くなります。

まだアクセスしないでね(2回目)

$ ssh COMAND_NAME

「vi」でも作成・編集ができます。

$ vi ~/.ssh/config

「vi」や「vim」はターミナル上で編集するエディタですが、VPSのファイルを変更する時に良く使うので、慣れておきましょう。

  • 編集モード i
  • 編集モード終了 esc
  • 上書き保存 :wq
  • 保存せずに終了 :q
  • 強制終了 :q!

SSH Keyの承認

SSH接続でアクセスしてみましょう!(やっと)

$ ssh COMAND_NAME

初回アクセス時のみ次のようなメッセージがでるので「yes」で実行

The authenticity of host 'xxx.xxx.xxx.xxx (xxx.xxx.xxx.xxx.xxx)' can't be established.
ED25519 key fingerprint is SHA256:hogehogehoge.
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])? 

アップグレード

ログインするとアップグレードできますよとメッセージが書かれていると思います。

aptをアップデート

最初に、パッケージ一覧をアップデートします。

リポジトリ(パッケージ一覧)の追加・削除時にも必ず実行します。

root@xxx.xxx.xxx.xxx:~$ apt update
apt
ubuntuにデフォルト入っているパッケージを操作するコマンドです。pythonのpipのようなもの。

アップグレードのリスト

アップグレードできるパッケージの一覧を表示します。

root@xxx.xxx.xxx.xxx:~$ apt list --upgradable

アップグレード

リストに表示されたパッケージをアップグレードします。

root@xxx.xxx.xxx.xxx:~$ apt upgrade

不要なパッケージの削除

「以下のパッケージが自動でインストールされましたが、もう必要とされていません」というメッセージが出たと思うので、次のコマンドで削除します。

root@xxx.xxx.xxx.xxx:~$ apt autoremove

ユーザーの設定

rootユーザーは、サーバーの管理権限を持っているので、パスワードを盗まれた場合、サーバーを簡単に乗っ取られてしまいます。

そのため、rootユーザーで直接ログイン出来ないように設定して、一般ユーザーでログインします。

管理者権限が必要な作業をする場合は、一般ユーザーでログインした後rootユーザーに切り替えます。

これをスイッチユーザーと言います。

一般ユーザーの作成

adduserでユーザーを作成します。

ユーザー名はローカルでデータベースに使っているユーザー名にしておくと楽です。

フルネーム以下は空白でもOKです。

root@xxx.xxx.xxx.xxx:~$ adduser YOURNAME

ユーザー `YOURNAME' を追加しています...
新しいグループ `YOURNAME' (1001) を追加しています...
新しいユーザー `YOURNAME' (1001) をグループ `YOURNAME' に追加しています...
ホームディレクトリ `/home/YOURNAME' を作成しています...
`/etc/skel' からファイルをコピーしています...
新しい パスワード: 
新しい パスワードを再入力してください: 
passwd: パスワードは正しく更新されました
YOURNAME のユーザ情報を変更中
新しい値を入力してください。標準設定値を使うならリターンを押してください
	フルネーム []: 
	部屋番号 []: 
	職場電話番号 []: 
	自宅電話番号 []: 
	その他 []: 
以上で正しいですか? [Y/n] Y

sudoの権限を与える

今作ったユーザーが「sudo」の操作を行えるようにします。

root@xxx.xxx.xxx.xxx:~$ gpasswd -a YOURNAME sudo

「sudo」はスーパーユーザー(管理者)権限の操作を実行する時に使います。

SSH接続許可

今作ったユーザーでもターミナルからアクセスできるようにします。

デフォルトで作成されている、rootとubuntuユーザーには、SSH keyの設定ファイルが既にあるので、そこから設定ファイルをYOURNAMEユーザーのディレクトリにコピーして持ってきます。

adduserを行うと自動でhome下にYOURNAMEのディレクトリが作成されます。

ubuntuユーザーの.sshディレクトリを中身ごとYOURNAMEディレクトリにコピーします。

root@xxx.xxx.xxx.xxx:~$ cp -arp /home/ubuntu/.ssh /home/YOURNAME

「.ssh」ディレクトリには「authorized_keys」というファイルが入っていて、SSH Keyが書いてあります。

VPS側のYOURNAMEのSSH Keyと、パソコン側のSSH Keyが一致することで、ターミナルからVPSに接続できるようになるという仕組みですね。

ただ、現状「.ssh」ディレクトリをコピーしただけなので、所有者が「ubuntu」のままになっており、YOURNAMEには「.ssh」にアクセスする権限がありません。

なので、コピーした「.ssh」の所有者をYOURNAMEに変更します。

root@xxx.xxx.xxx.xxx:~$ chown -R YOURNAME /home/YOURNAME/.ssh

configファイルの変更

最初に設定したPCのconfigファイルのUser rootを、作成したユーザーに変更します。

VPSからログアウトします。

root@xxx.xxx.xxx.xxx:~$ exit

ターミナルでconfigファイルを編集します。

$ vi ~/.ssh/config
Host COMAND_NAME
    HostName xxx.xxx.xxx.xxx
    User YOURNAME(変更)
    IdentityFile ~/.ssh/FILENAME.pem
  • 編集モード i
  • 編集モード終了 esc
  • 上書き保存 :wq
  • 保存せずに終了 :q
  • 強制終了 :q!

これで作成したYOURNAMEで、SSH接続できるようになりました。


ログイン設定

rootでのログインを許可したままだと、パスワードの総当り攻撃で乗っ取られてしまいます。

rootで直接ログインできないようにします。

一般ユーザーでログイン

先程作成したユーザーでログインします。

$ ssh COMAND_NAME

先程configファイルのUserをYOURNAMEに変更したので、YOURNAMEでログインできるはずです。

YOURNAME@xxx.xxx.xxx.xxx:~$

rootでログイン不可にする

YOURNAMEでログインできたら、rootユーザーに切り替えてみます。

YOURNAME@xxx.xxx.xxx.xxx:~$ sudo su
[sudo] YOURNAME のパスワード: 

名前がrootに変わっていると思います。

root@xxx.xxx.xxx.xxx:/home/YOURNAME$

sshd_configの設定を変更して、rootユーザーで直接ログインできないようにします。

root@xxx.xxx.xxx.xxx:/home/YOURNAME$ vi /etc/ssh/sshd_config

デフォルトの設定は、#でコメントアウトして残しておきましょう。

33行目辺り。rootのログインを不可に

#PermitRootLogin prohibit-password
PermitRootLogin no

58行目辺り。パスワード認証を不可に

#PasswordAuthentication yes
PasswordAuthentication no

他にも任意で設定を変えてください。

最大認証トライ回数
#MaxAuthTries 6
MaxAuthTries 3

最大同時接続数
#MaxSessions 10
MaxSessions 5

各項目の説明についてはunskilledさんのページが勉強になります。

  • 編集モード i
  • 編集モード終了 esc
  • 上書き保存し終了 :wq
  • 保存せずに終了 :q
  • 強制終了 :q!

sshdを再起動

sshd_configの設定を変更した場合は、sshdの再起動が必要なので次のコマンドで再起動。

root@xxx.xxx.xxx.xxx:/home/YOURNAME$ sudo systemctl reload sshd

rootからUSERNAMEに戻し、USERNAMEからもログアウトします。

root@xxx.xxx.xxx.xxx:/home/YOURNAME$ exit

YOURNAME@xxx.xxx.xxx.xxx:/home/YOURNAME$ exit

反映できているか確認

念の為にrootでログインできないように設定できているかどうか確認してみてください。

パソコンのconfigファイルのUserをrootに戻してログインしてみてください。

root@xxx.xxx.xxx.xxx: Permission denied (publickey).

権限が無いと言われログインできなくなっていたら成功です!

configファイルのUserは、YOURNAMEに戻しておきましょう。


これで初期設定編は終わりです。

次は「DjangoをVPSにデプロイする2〜パッケージ編〜」です。