改定箇所

  1. 2022-07-05:GitHub Token 修正
    • コマンドラインでGitHubに接続するためにアクセストークンが必要となりました
    • 「2-8. GitのUbuntuへ導入」を修正
    • Token:ghp_xxxxx

1. 概要

「システム開発・デプロイ環境の構築」の重要性について、以下の2つ挙げることができます。

  • 開発エンジニアは、開発環境を構築する手間が省き、メンテナンスを容易にする
    Dockerイメージの中に既に開発に必要なものは入っているので、開発エンジニアが自ら開発環境を構築する必要はない。

  • 開発環境と本番環境で全く同じ構成を実現したい。
    開発環境で動作したコンテナをそのまま本番環境で動作させるので、開発環境と本番環境で動作するものは寸分違わず同じものとなる。

開発・デプロイ環境の構築の説明資料として、以下のようにに分けて説明します。

  • (1-1)WSL+Ubuntuインストール
  • (1-2)GitHubへの登録と設定
  • (1-3)Netlifyの登録と設定
  • (1-4)VPSへの登録と設定
  • (1-5)GoogleDomainの登録と設定(メール)
  • (1-6)WSL+Ubuntu20.04+Dockerに関わる設定
  • (1-7)WSL2+Ubuntu20.04+Docker-補足
  • (1-8)(1-8)開発・デプロイ手順

1-1. WSLとは

Linux 用 Windows サブシステムを使用すると、開発者は、従来の仮想マシンまたはデュアルブート セットアップのオーバーヘッドなしで、ほとんどのコマンド ライン ツール、ユーティリティ、アプリケーションを含む GNU/Linux 環境を変更せずそのまま Windows 上で直接実行できます。

1-2. WSL2とは

WSL 2 は、Linux 用 Windows サブシステムが Windows 上で ELF64 Linux バイナリを実行できるようにする、Linux 用 Windows サブシステム アーキテクチャの新しいバージョンです。 その主な目標は、ファイル システムのパフォーマンスを向上させること と、システム コールの完全な互換性 を追加することです。

1-3. WSL2の機能

  • OS ファイル システム間でのパフォーマンス Linux ファイル システムのルート: \wsl$\Ubuntu-18.04\home<user name>\Project Windows ファイル システムのルート: C:\Users<user name>\Project

  • Windows からの Linux ネットワーク アプリへのアクセス (localhost) Linux ディストリビューションでネットワーク アプリ (たとえば、Node.js または SQL Server で実行されるアプリ) を構築する場合、(通常の場合と同様に) localhost を使用して (Microsoft Edge または Chrome インターネット ブラウザーなどの) Windows アプリからアクセスすることができます。

  • Linux ディストリビューションが動作する仮想マシンの IP アドレスを確認するには、次の手順に従います。
    ・WSL ディストリビューション (つまり、Ubuntu) から、次のコマンドを実行します: ip addr
    ・eth0 インターフェイスの inet 値の下で目的のアドレスを見つけてコピーします。
    ・grep ツールがインストールされている場合は、次のコマンドを使用して出力をフィルター処理することにより、これをより簡単に見つけることができます: ip addr | grep eth0
    ・この IP アドレスを使用して Linux サーバーに接続します。

Linux からの Windows ネットワーク アプリへのアクセス (ホスト IP) Linux ディストリビューション (つまり、Ubuntu) から Windows 上で実行されているネットワーク アプリ (たとえば、Node.js または SQL Server で実行されるアプリ) にアクセスする場合は、ホスト マシンの IP アドレスを使用する必要があります。

  • Linux ディストリビューションから次のコマンドを実行して、ホスト マシンの IP アドレスを取得します: cat /etc/resolv.conf
  • 次の語句の後に IP アドレスをコピーします: nameserver。
  • コピーした IP アドレスを使用して、Windows サーバーに接続します。

2. WSLのインストールとUbuntuの基本設定

(参考URL:https://docs.microsoft.com/ja-jp/windows/wsl/install-win10 )

2-1. WSL 2 の実行に関する要件を確認する

Windows ロゴ キー + R キー を押して> winverを入力して確認します。

  • Windows10 Pro

  • x64ベースプロセッサ(AMD社提唱の64ビットCPU規格に準拠したCPU)

  • x86は32ビット、x64は64ビットのことです。

  • Windows10:バージョン2004, OSビルド19041

2-2.「Ubuntu20.04LTS」をインストール

https://aka.ms/wslstore ⇒「WSL」で検索

  • Username:matsu、Password:xxxxx を設定

  • Ubuntuのインストール直後のrootのpassword設定:

    $sudo passwd root ⇒ root:xxxxxxx
    

  • ※Ubuntuの削除(アンインストール)する場合は、 Windows10の[設定]画面の一覧から[アプリ]-Ubuntuをアンインストールします。

2-3. WSL-Ubuntuの保管場所を移動する

  • WSL 2 を別のドライブに安全に移動する

  • Windows ターミナルをインストールします。

  • Ubuntuの内容確認

    $ cat /etc/lsb-release
    
    DISTRIB_ID=Ubuntu
    DISTRIB_RELEASE=20.04
    DISTRIB_CODENAME=focal
    DISTRIB_DESCRIPTION="Ubuntu 20.04.3 LTS"
    
  1. 管理者アクセス権をパワーシェル持つコマンドラインPowerShell またはコマンド プロンプトを開きます。
    PS C:\Users\RYZEN> wsl -l -v
      NAME            STATE           VERSION
    * Ubuntu-20.04    Stopped         2
    
  2. Linuxが実行されている場合は、特定の WSL ディストリビューションを停止する必要があります。
    PS C:\Users\RYZEN> wsl --shutdown
    
  3. 別のフォルダにエクスポートします。(ここでは、Ubuntu-exとしてUbuntuをエクスポート.tar E:wsl2に)
  • E:\exportフォルダーを事前に作成します。
    PS C:\Users\RYZEN> wsl --export Ubuntu-20.04 "E:\export\ubuntu-20.04-ex.tar"
    
  1. 以前の WSL インストールの登録を解除します。
    PS C:\Users\RYZEN> wsl --unregister Ubuntu-20.04
    
  2. 新しいフォルダを作成し、WSL インストールをそのフォルダにインポートします。
  • E:\wsl2フォルダーを事前に作成します。
    PS C:\Users\RYZEN> New-Item -Path "E:\wsl2" -ItemType Directory
    
        ディレクトリ: E:\
    
    Mode                 LastWriteTime         Length Name
    d-----        2021/12/15     15:19                wsl2
    
  1. インポート完了後の確認
    PS C:\Users\RYZEN> wsl -l -v
      NAME            STATE           VERSION
    * Ubuntu-20.04    Stopped         2
    
  2. WSL ディストリビューションの 1 つを(デフォルト)としてマークします。
  • 今回は、1つですので不要
    PS C:\Users\RYZEN> wsl -s Ubuntu-20.04
    
  1. デフォルトのユーザーをrootからmatsuのユーザー名に変更します。
  • root権限で/etc/wsl.confを作成し、以下の内容を記述します。
  • /etc/wsl.conf ファイルは、なければ作ります。(普通はないです)
  • metadata オプションをつけると、Windows側のファイル・フォルダに、WSL側用のパーミッション情報を追加できるようになります。Windows側のパーミッション情報と WSL側のパーミッション情報は別々に設定することができますが、同じ項目に異なるパーミッションを設定した場合、Windows側の設定が優先されます。
  • umask=22 により、Windows側のファイル・フォルダのパーミッションから、グループとその他ユーザーに対する書き込み権限を外します。
  • マウントオプションを指定しているため、これを反映するためには、WSL を再起動する必要があります。
    matsu@RYZEN-PC:~$ sudo vi /etc/wsl.conf
    [sudo] password for matsu:
    
    /# /etc/wsl.confの内容
    [automount]
    enable = true
    root = /mnt/
    options = "metadata,uid=1000,gid=1000,umask=22"
    
    [user]
    default = "matsu"
    
  1. 最後に実行して確認します。
    PS C:\Users\RYZEN> wsl
    root@RYZEN-PC:/mnt/c/Users/RYZEN# cd
    root@RYZEN-PC:~# su matsu
    matsu@RYZEN-PC:/root$ cd
    matsu@RYZEN-PC:~$ echo $USERNAME
    

2-5. WSL 2 仮想ハード ディスクのサイズを拡大する

  • 最大 VHD サイズを 256 GB を超えて拡張するには、次の手順を実行します。
  1. 次のコマンドを使用して、すべての WSL インスタンスを終了します。wsl --shutdown
  2. 配布インストール パッケージ名を見つけるには (‘パッケージファミリ名’)。
    • PowerShell を使用して (‘distro’ はディストリビューション名) コマンドを入力します。
    • Get-AppxPackage -Name "*<distro>*" | Select PackageFamilyName
    • 例えば:Get-AppxPackage -Name "*Ubuntu*" | Select PackageFamilyName
    PS C:\Users\RYZEN> wsl --shutdown
    PS C:\Users\RYZEN> Get-AppxPackage -Name "*Ubuntu*" | Select PackageFamilyName
    
    PackageFamilyName
    -----------------
    CanonicalGroupLimited.Ubuntu20.04onWindows_79rhkp1fndgsc
    
  3. 結果を使用して、WSL 2 のインストールで使用される VHD ファイルを見つけます。
  • Eドライブに移動しています。E:\wsl2\ext4.vhdxとなります。
  1. 次のコマンドを実行して、WSL 2 VHD のサイズを変更します。
  • 管理者特権で Windows コマンド プロンプトを開き、次のように入力します。
    diskpart //別ウインドウが開きます。
    
    DISKPART> diskpart
    
    DISKPART> Select vdisk file="E:\wsl2\ext4.vhdx"
    DiskPart により、仮想ディスク ファイルが選択されました。
    
    DISKPART> detail vdisk
    デバイスの種類 ID: 3 (不明)
    ベンダー ID: {EC984AEC-A0F9-47E9-901F-71415A66345B} (Microsoft Corporation)
    状態: アタッチされたディスクは開いていません
    仮想サイズ:  256 GB
    物理サイズ: 1839 MB
    ファイル名: E:\wsl2\ext4.vhdx
    子: いいえ
    親ファイル名:
    関連付けられたディスク番号: 3
    
  • 詳細コマンドの出力を確認します。出力には、仮想サイズの値が含まれます。これは現在の最大値です。この値をメガバイトに変換します。たとえば、詳細出力に[仮想サイズ: 256 GB]と表示されている場合は、これを256000に変換します。
    DISKPART> expand vdisk maximum=1024000
    
      100% 完了しました
    
    DiskPart により、仮想ディスク ファイルは正常に拡張されました。
    
    DISKPART> detail vdisk
    
    デバイスの種類 ID: 0 (不明)
    ベンダー ID: {00000000-0000-0000-0000-000000000000} (不明)
    状態: 追加済み
    仮想サイズ: 1000 GB
    物理サイズ: 1847 MB
    ファイル名: E:\wsl2\ext4.vhdx
    子: いいえ
    親ファイル名:
    関連付けられたディスク番号: 見つかりません。
    
    DISKPART> exit
    

2-6. Windows Terminalのインストール

2-7. Ubuntuの日本語化等の設定

  • パッケージ情報の更新
    sudo apt update && sudo apt upgrade
    
  • 日本語言語パックのインストール
    sudo apt -y install language-pack-ja
    
  • ロケールを日本語に設定
    sudo update-locale LANG=ja_JP.UTF8
    
  • ここでいったん終了してから、Ubuntuを再起動
    WindowsTwerminalから
    PS C:\Users\hp> wsl --shutdown
    
  • タイムゾーンをJSTに設定
    sudo dpkg-reconfigure tzdata
    
  • 日本語マニュアルのインストール
    sudo apt -y install manpages-ja manpages-ja-dev
    

2-8. GitのUbuntuへ導入

  • 1 台のコンピューターに対して 1 セットのキーを持っている Windows と WSL の間で同じ SSH キーのセットを共有することです。
2-8-1. GitHubへの登録
  • GitHubサイト
  • アカウントの作成
  • GitHubのウェブページからアカウントを作る
2-8-2. コマンドラインでGitHubに接続
  • コマンドラインでGitHubに接続するためにアクセストークンが必要となりました。
  • GitHubの参考URL
  • 個人アクセストークンを使用します。パスワードとして使います
  • 有効期限がありますので最低90日以後は、再度トークンの作成が必要となります。
  • アクセストークンの作成方法を以下のようにします。
  1. まだ検証していない場合はメールアドレスを検証します。

  2. GitHubへ「Sign In」します。

  3. [setting:設定]を表示します。 代替テキスト

  4. 左のサイドバーの下にある「「Developer settings」」をクリックします。

  5. 左のサイドバーで「Personal access tokens」をクリックします。 代替テキスト

  6. [Generate new token] をクリックします。

  7. トークンにわかりやすい名前を付けます。 代替テキスト

  8. 有効期限をExpiration決めます。この場合は1年間としています。 代替テキスト

  9. このトークンに付与するスコープ、すなわち権限を選択します。 トークンを使用してコマンドラインからリポジトリにアクセスするには、[repo] を選択します。今回はすべてチェックを入れています。 代替テキスト

  10. [Generate token] をクリックします。トークンをコピーします。 代替テキスト

  • トークンはパスワードのように扱い、秘密にしてください。 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
2-8-4. コマンドラインでトークンの使用方法
  1. トークンを入手したなら、HTTPS経由でGitの操作をする際にパスワードの代わりにそのトークンを入力できます。
  • Username:tech@raizin.net
  • Password:ghp_xxxx
    $ git clone https://github.com/username/repo.git
    Username: your_username
    Password: your_token
    
  • 以下のようになります。 代替テキスト
  1. リモート URL の SSH から HTTPS への切り替え
     #確認
    $ git remote -v
    origin  https://github.com/TechRZN/ast-js-elder.git (fetch)
    origin  https://github.com/TechRZN/ast-js-elder.git (push)
     #設定
    $ git remote set-url origin https://github.com/USERNAME/REPOSITORY.git
     #再確認
    $ git remote -v
     # Verify new remote URL
    > origin  https://github.com/USERNAME/REPOSITORY.git (fetch)
    > origin  https://github.com/USERNAME/REPOSITORY.git (push)
    
  2. Git に GitHub の認証情報をキャッシュする
  • Git pushでパスワード等が不要となります。
  • [Git に GitHub の認証情報をキャッシュ](Git に GitHub の認証情報をキャッシュ)
2-8-5. SSHのインストール(不要?)
  • ※コマンドラインからのGitHubへのアクセスが制限されましたので以下のSSHに係る設定は不要となります。
  • UbnuntuにSSHが既にインストールされているか確認します。SSH-Client,Serverともにインストールされている。
    /#SSHの確認
    $ dpkg -l | grep ssh
    ii  libssh-4:amd64                 0.9.3-2ubuntu2.2                      amd64        tiny C SSH library (OpenSSL flavor)
    ii  openssh-client                 1:8.2p1-4ubuntu0.3                    amd64        secure shell (SSH) client, for secure access to remote machines
    ii  openssh-server                 1:8.2p1-4ubuntu0.3                    amd64        secure shell (SSH) server, for secure access from remote machines
    ii  openssh-sftp-server            1:8.2p1-4ubuntu0.3                    amd64        secure shell (SSH) sftp server module, for SFTP access from remote machines
    ii  ssh-import-id                  5.10-0ubuntu1                         all          securely retrieve an SSH public key and install it locally
    
  • 最初から入っていると思うが,確認はターミナルで、以下のようにバージョン出てくれば大丈夫、、
    /# gitのバージョン管理
    $ git --version
    git version 2.34.1
    
    • 入っていない場合はインストールします。
    $ sudo apt install git
    
2-8-6. WSL-ubuntuとSSHによるgitの連携設定(不要)
  • WSLとGitHubサイトの両方で設定します。
  1. WSL上でSSHの公開鍵の生成
  • .sshフォルダーを作って、中に移動して鍵をつくる
  • IT:tech@raizi.net PW:xxxxxxxx
      /# 秘密鍵と公開鍵の生成
      mkdir .ssh
      cd .ssh
    ssh-keygen -t ed25519 -C "tech@raizin.net"
    /# 名前は変えないので、enterを押す。
    /# password: xxxxxxx 2回
    SHA256:zniEScBt+mu0JphwO/tJkbUxa8eznK1slRcaj4RI6Ss tech@raizin.net
    The key's randomart image is:
    +--[ED25519 256]--+
    |   ... .         |
    |    ..=          |
    |     ==. .       |
    |    .+oO. o .    |
    |    o.*.S. * .   |
    |. . Eo+B == o    |
    | o +.o.oB...     |
    |  =...=o..       |
    |  .+o+ .o        |
    +----[SHA256]-----+
    
    /# 鍵
    ~/.ssh$
    ed25519 /#秘密鍵
    ed25519.pub /# 公開鍵
    
  1. SSH秘密鍵をssh-agentに追加
  • 別の名前でキーを作成した場合、または別の名前の既存のキーを追加する場合は、コマンドのid_ed25519を秘密キーファイルの名前に置き換えてください。
    eval "$(ssh-agent -s)"
    Agent pid 3572
    
    ssh-add ~/.ssh/id_ed25519
      Enter passphrase for /home/matsu/.ssh/ed25519: //xxxxxxx
      Identity added: /home/matsu/.ssh/ed25519 (tech@raizi.net)
    
    cat TechRZN.pub
    ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIPGZZbhAxs/ipjOXv/M07JjjQ5No6LQi44hITOB4pa8c tech@raizin.net
    
  1. この公開鍵をGitHubのSSH keysへ設定
  2. wslの.sshフォルダーをコピーして、c:\Users\<username>\.sshのように貼り付けます。
  3. GitとSSH 接続のテスト
    /#接続テスト
    ssh -T git@github.com
    The authenticity of host 'github.com (13.114.40.48)' can't be established.
    ECDSA key fingerprint is SHA256:p2QAMXNIC1TJYWeIOttrVc98/R1BUFWu3/LiyKgUfQM.
    Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
    Warning: Permanently added 'github.com,13.114.40.48' (ECDSA) to the list of known hosts.
    Hi TechRZN! You've successfully authenticated, but GitHub does not provide shell access.
    
  • 結果のメッセージにユーザー名が含まれていることを確認してください。
  • 最後の行に「Hi TechRZN!」なのでユーザー名は「TechRZN」とわかります。

2-9. WSL2 でnpm installが遅い時のもう一つの対策

  • WSL2で、Linux側のファイルシステムにファイルが置いてあってもnpmがとても遅いときに試してみてほしいことです。 パッケージ配信サーバの名前解決ができてないことが原因の場合があります。 以下のコマンドでWSL2が利用するネームサーバーを8.8.8.8に変更すると改善するかもしれません
    # backup
    $ sudo mv /etc/resolv.conf /etc/resolv.conf_auto_by_wsl
    # setting update
    $ sudo rm /etc/resolv.conf
    $ sudo bash -c 'echo "nameserver 8.8.8.8" > /etc/resolv.conf'
    $ sudo bash -c 'echo "[network]" > /etc/wsl.conf'
    $ sudo bash -c 'echo "generateResolvConf = false" >> /etc/wsl.conf'
    $ sudo chattr +i /etc/resolv.conf
    
  • コマンド実行後、Powershellやコマンドプロンプトからwsl –shutdown を実行してWSL2を再起動する。

2-10. WSL で デフォルトユーザ を変更する方法

  1. 対象のLinuxにログインする。:ここでは(ubunutu22.04-v1)
  2. /etc/wsl.conf ファイルを作る
  • /etc/wsl.conf というファイルを作って、以下の内容で保存。
    $ cat << EOF > /etc/wsl.conf
    [user]
    default=user-name(matu)
    EOF
    
  1. 一旦仮想マシンを落とす
    $ exit
     # PowerShell
    >wsl --shutdown
    

3.VSCodeの操作

3-1. Remote WSLで接続

  • まずVScodeをWSL実行環境で使えるようにするが,拡張機能のタブから,「Remote development」をインストールするだけです。

  • 一度VScodeを再起動したら,画面右下の><ボタンを押して"RemoteWSL: New window"でOK

  • 初回接続時はいろいろDLでしているみたいなので接続に時間がかかる.気長に待ちます。

3-2. 作業ディレクトリへ

  • 上記で設定したリポジトリとの連携は作業フォルダ単位で取れるので,リポジトリ毎に作業フォルダ作るのが良い
  • 左タブのエクスプローラーから作業したいフォルダを作成・移動
  • WSLのターミナルで編集したいディレクトリに移動して、ターミナルで$ code .とするのでもOK

3-3.利用ユーザー,リポジトリをPC上で登録

  • GitHub,Bitbucket問わずメールアドレスとユーザーIDを登録する.
    以下のように実際に使用しているアドレスとIDを VCcode上のターミナルから 登録する.

    $ git config --global user.email "mail@host" 
    $ git config --global user.name "userid"  
    

    リポジトリと連携を取る(いちいちURLを設定しなくて良くする)
    以下のように,作成したリポジトリのURLを VCcode上のターミナルから 登録する.

    $ git remote add origin <GitHubで作成したリポジトリのURL>
    

    この状態ではまだリモート先を設定しただけでリモートのブランチ状況をローカルで把握していない. VSCode上のターミナルから fetchコマンドでリモートからブランチ情報を取得する

    $ git fetch
    

初めて接続する場合には,ここでIDとPasswordが聞かれるかもしれないので,Vscode上のウィンドウから打てばOK

3-4. VScode上でのgitの使用

  • 左のソース管理タブを見ると変更履歴などが表示される.
  • pull,commit,pushなどは少し右のボタンをクリックするといろいろ実行できる
  • なにがどういう機能か以下のURLなど参照. ※https://qiita.com/mnao305/items/b3c5f5943066a0bb8e2e

3-5. VScodeの拡張機能

  1. Thunder Client-https://github.com/rangav/thunder-client-support
  2. SQLite
  3. Python Extension Pack

4.Docker,composeのインストール

Ubuntu 20.04にDocker Community Edition (CE) をインストールして使用します。Docker自体をインストールし、コンテナとイメージを操作し、イメージをDockerリポジトリにプッシュします。

4-1. あったほうがよい条件

  • Docker Hubにプッシュする場合は、Docker Hubのアカウント。
  • Githubのアカウント

4-2. Dockeのインストール

  • 旧バージョンをアンインストールしておきます。
$ sudo apt remove docker docker-engine docker.io containerd runc
  • 既存のパッケージのリストを更新します。
$ sudo apt update
$ sudo apt install apt-transport-https ca-certificates curl gnupg-agent software-properties-common
  • Dockerの公式GPGキーを追加します。
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
  • フィンガープリントを確認します。
$ sudo apt-key fingerprint 0EBFCD88
pub   rsa4096 2017-02-22 [SCEA]
      9DC8 5822 9FC7 DD38 854A  E2D8 8D81 803C 0EBF CD88
uid           [ unknown] Docker Release (CE deb) <docker@docker.com>
sub   rsa4096 2017-02-22 [S]
  • Dockerの安定板のリポジトリを追加します。
$ sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
  • Dockerをインストールします。
$ sudo apt update
$ sudo apt install docker-ce docker-ce-cli containerd.io
$  docker -v
Docker version 20.10.12, build e91ed57

4-3.Docker composeのインストール

  • 必要なパッケージをインストールします。
$ sudo apt update
$ sudo apt install curl
  • Dcoker-Composeは、すでにV2が出ていますが、既存のアプリがあるためにv1とします。
  • Docker Composeをダウンロードします。 次のコマンドの「1.29.2」の部分は、インストールしたいバージョンに応じて適宜変更してください。Docker-compose:version
$ sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
  • 次に、docker-composeコマンドが実行可能になるように、正しい権限を設定します。
$ sudo chmod +x /usr/local/bin/docker-compose
 #バージョン確認:v1系最後
$ sudo docker-compose -v
docker-compose version 1.29.2, build 5becea4c

4-4.SudoなしでDockerコマンドを実行する(オプション)

  • root以外のユーザーとしてdockerを実行する場合は、dockerグループに追加する必要があります。 Dockerグループが存在しない場合は作成します
sudo groupadd docker
  • ユーザーをdockerグループに追加します。
sudo usermod -aG docker $USER
// sudo usermod -aG docker yamasaki
  • 次のコマンドを実行するか、ログアウトして再度ログインして実行します(機能しない場合は、最初にマシンを再起動する必要があります)。
newgrp docker

5.Python3,node.js,Go,pgAdminインストール

5-1.Linuixベースツール導入

 -- Ubuntu 20.04 on WSL2

 # Linuxシステムアップデート
$ sudo apt update && sudo apt upgrade -y

 /# Linuxbew の動作に必要な curl, git, ruby をインストール
 /## openjdk は android 開発を行う時など必要になるタイミングが多いため一応インストールしている
 /## zlib1g-dev, libssl-dev, libbz2-dev, libsqlite3-dev, libffi-dev, liblzma-dev は Python ビルドに必要
 /## add-apt-repository コマンドを使うために software-properties-common もインストールしておく
 /## https通信を可能にするために apt-transport-https, ca-certificates もインストールしておく
$ sudo apt install -y vim curl git ruby openjdk-17-jdk \
    zlib1g-dev libssl-dev libbz2-dev libsqlite3-dev libffi-dev liblzma-dev \
    software-properties-common apt-transport-https ca-certificates build-essential

 /# Linuxbrew (Linux版の Homebrew パッケージマネージャ) 導入
 /## Linuxbrew を使うことで最新の開発ツール等を導入しやすくなる
$ sh -c "$(curl -fsSL https://raw.githubusercontent.com/Linuxbrew/install/master/install.sh)"
 /## PATHを通す
$ echo 'export PATH="/home/linuxbrew/.linuxbrew/bin:$PATH"' >> ~/.bashrc
$ source ~/.bashrc

 /## Linuxbrew をアンインストールする場合
 /# $ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/uninstall)"
 /## 残ってしまった場合は直接ディレクトリ削除
 /# $ sudo rm -rf /home/linuxbrew/

 /# Linuxbrew で各種開発ツールを導入
 /## curl や git などは、最新版を使う方が良いため、改めて Linuxbrew で導入しなおす
$ brew install curl git wget gcc zlib libzip bzip2 readline openssl pkg-config autoconf
$sudo apt-get install tree

$ tree -L 2
.
├── go
│   └── 1.16.9
├── letsencrypt-nginx-proxy
│   ├── LICENSE
│   ├── README.md
│   ├── docker
│   ├── docker-compose.yml
│   └── web-data
└── my-workspace

5-2.Linuxbrew で anyenv 導入

  • 必要に応じてnodenvとnode、yarnのみをインストールします。5-2-6を参照
  • Goの環境構築はインストールするだけで終了となりました。よってgoenvは、不要です。
  • env系開発環境をまとめて管理できるツール
  • env系開発環境とは、pyenv, nodenv, goenvなど、各プログラミング言語の複数バージョンを切り替えて使用可能とする環境のこと
  • 独自に導入した env系開発環境がある場合は、それらを削除してから導入すること
5-2-1. anyenvの使い方
  • ※NodeとGoは、5-2-6へ行きます。 〇〇envのインストール
brew install anyenv
anyenv install --init
 ## Do you want to checkout ? [y/N]: <= y
 # anyenv 初期化スクリプトを .bashrc に記述
echo 'eval "$(anyenv init -)"' >> ~/.bashrc
source ~/.bashrc

 # anyenv update plugin の導入
mkdir -p $(anyenv root)/plugins
git clone https://github.com/znz/anyenv-update.git $(anyenv root)/plugins/anyenv-update
anyenv update
 # バージョン確認
anyenv -v
  anyenv 1.1.4
> インストールできる〇〇envを確認する
anyenv install --list
  goenv
  nodenv
  pyenv

> 必要な〇〇envをインストールする(後でインストールします)
anyenv install pyenv
anyenv install nodenv
anyenv install goenv

> シェルを再起動する
> 以前使っていた〇〇envはアンインストールするかpathを通らないようにしておくこと
exec $SHELL -l
5-2-2. Python 環境構築

Python は、AWS CLI や Ansible の他にも、Node.js の native-addon-build-tool などにも使われています。 Python 自体を開発言語として使わなくても、様々なツールの動作に必要になることが多いため、導入しておくこと。

 # -- Ubuntu 20.04 on WSL2

 # anyenv を使って pyenv 導入
 ## pyenv を使うことで、複数バージョンの Python 環境を構築できる
$ anyenv install pyenv
$ exec $SHELL -l

 # pyenv で Python 2.7.18 と 3.7.7 をインストール
$ pyenv install 2.7.18
$ pyenv install 3.7.7

 # pyenv では 2系 と 3系 を同時に指定できる
 ## python  => 2.7.18
 ## python3 => 3.7.7
$ pyenv global 2.7.18 3.7.7

 # 現在選択されているバージョンを確認
$ pyenv versions
* 2.7.18 (set by /home/user/.anyenv/envs/pyenv/version)
* 3.7.7 (set by /home/user/.anyenv/envs/pyenv/version)

$ python --version
2.7.18

$ python3 --version
3.7.7

 # pip パッケージマネージャを更新しておく
$ pip install --upgrade pip setuptools
$ pip3 install --upgrade pip setuptools

$ pip --version
pip 20.3.4 from /home/matsu/.anyenv/envs/pyenv/versions/2.7.18/lib/python2.7/site-packages/pip (python 2.7)

$ pip3 --version
pip 21.3.1 from /home/matsu/.anyenv/envs/pyenv/versions/3.7.7/lib/python3.7/site-packages/pip (python 3.7)
5-2-3. Node.js 環境構築

nodenv を使うことで、複数バージョンの Node.js 環境を構築できます。

 # -- Ubuntu 20.04 on WSL2

 # anyenv を使って nodenv 導入
 ## nodenv を使うことで、複数バージョンの Node.js 環境を構築できる
$ anyenv install nodenv
$ exec $SHELL -l
 ## nodenv-yarn-install プラグイン導入: nodenv install 時に yarn もインストールする/  
$ mkdir -p "$(nodenv root)/plugins  
$ git clone https://github.com/pine/nodenv-yarn-install.git "$(nodenv root)/plugins/nodenv-yarn-install"
$ echo 'export PATH="$HOME/.yarn/bin:$PATH"' >> ~/.bashrc
 /## Node.js 10.17.0 インストール
$ touch $(nodenv root)/default-packages
$ nodenv install 10.17.0
 # Node.js 10.17.0 に切り替え
$ nodenv global 10.17.0

 # 現在選択されているバージョンを確認
$ nodenv versions
* 10.17.0 (set by /home/user/.anyenv/envs/nodenv/version)

 # 一度シェルを再起動しないと Node.js が使えない
$ exec $SHELL -l

 # バージョン確認
$ node -v
v10.17.0

$ yarn -v
1.22.4

 # Yarn package manager で Gulp をグローバルインストール
$ yarn global add gulp

 # Gulp バージョン確認
$ gulp -v
CLI version: 2.3.0
Local version: Unknown

 #複数のNode.jsのバージョンのインストール
//インストールできるバージョンリスト
//最新の安定板:16.~
$ nodenv install --list
16.13.1

$ nodenv install 16.13.1
 #エラーが出る場合は対処が必要
$ npm install -g npm@8.3.0
$ nodenv rehash
$ nodenv versions
* 10.17.0 (set by /home/matsu/.anyenv/envs/nodenv/version)
  16.11.1

  (例)ローカル(カレントディレクトリ配下)で利用するNode.jsのバージョンを設定する
$ nodenv local 10.17.0

  グローバル(システム全体)で利用するNode.jsのバージョンを設定する
$ nodenv global 16.13.1

$ nodenv versions
  10.17.0
* 16.13.1 (set by /home/matsu/.anyenv/envs/nodenv/version)
5-2-4. Go環境構築
  • 次の節「5-3」で別のインストール方法を記述します。
  • goenvのインストール
anyenv install goenv
exec $SHELL -l /再起動
goenv -v
goenv 2.0.0beta11
goenv install -l
Available versions:
  1.17.5 
 # バージョン指定(グローバル)
goenv global 1.17.5
goenv rehash
goenv versions
* 1.17.5 (set by /home/matsu/.anyenv/envs/goenv/version)
go version
go version go1.17.5 linux/amd64

 #環境変数を設定します。
 # $HOME/go をワークスペースに指定します。
mkdir $HOME/go
 # 次に、~/.bash に、以下のように環境変数 GOHOME を追記します。
export GOENV_DISABLE_GOPATH=1
export GOPATH=$HOME/go
export PATH=$PATH:$GOPATH/bin

 # シェルの設定ファイルの内容を、ログインし直さず即座に反映させます。
source ~/.bashrc
 # これで、anyenv と goenv による Golang 開発環境の構築は完了です。
5-2-5. pgAdmin4 環境構築
  • 公式ページ
  • LocalSNS-Vol.3-2 56_3-DB構造とFrontWebの構造 を参照
5-2-6. nodenv, node, yarnのインストール
  1. nodenvのインストール

    $ git clone https://github.com/nodenv/nodenv.git ~/.nodenv
    Cloning into '/home/matsu/.nodenv'...
    remote: Enumerating objects: 4027, done.
    remote: Counting objects: 100% (24/24), done.
    remote: Compressing objects: 100% (22/22), done.
    remote: Total 4027 (delta 6), reused 10 (delta 1), pack-reused 4003
    Receiving objects: 100% (4027/4027), 734.40 KiB | 1.11 MiB/s, done.
    Resolving deltas: 100% (2637/2637), done.
    $ echo 'export PATH="$HOME/.nodenv/bin:$PATH"' >> ~/.bashrc
    $ echo 'eval "$(nodenv init -)"' >> ~/.bashrc
    $ source ~/.bashrc
    $ nodenv -v
    nodenv 1.4.0+5.acf64b3
    
  2. nodenv-yarn-install を導入して、 nodenv install コマンドの実行と同時に yarn もインストールします。

    $ git clone https://github.com/nodenv/node-build.git $(nodenv root)/plugins/node-build
    $ git clone https://github.com/pine/nodenv-yarn-install.git "$(nodenv root)/plugins/nodenv-yarn-install"
    $ nodenv install --list
    $ nodenv install 16.15.0
      #Output
      Installing Yarn...
      npm notice
      npm notice New minor version of npm available! 8.5.5 -> 8.12.2
      npm notice Changelog: https://github.com/npm/cli/releases/tag/v8.12.2
      npm notice Run npm install -g npm@8.12.2 to update!
      npm notice
      Installed Yarn 1.22.19
    $ nodenv global 16.15.0
     #確認
    $ curl -fsSL https://github.com/nodenv/nodenv-installer/raw/master/bin/nodenv-doctor | bash
    $ nodenv versions
    $ nodenv version
    $ yarn -v
    
  3. Strapiのインストール

  • yarn config set network-timeout 600000 -g && yarn install
  • timeoutで苦労するので**–network-timeout 5000000**を付けます。
  • 再インストール:rm -rf node_module , yarn cache clean –force yarn install –network-timeout 7000000
5-2-7. インスタンスが起動したら自動的にNode.jsアプリが起動するようにする
  1. PM2の導入
  • PM2を利用するとプロセスをデーモン化することで、アプリケーションを起動した状態に保つことができます。

  • PM2公式サイト

  • Node.jsやnpmは事前にインストールしておきます。

  • 参考URL

  • node -v 12.22.2をインストールしセット後PM2をインストールします。

    ~$ nodenv install 12.22.2
    ~$ nodenv local 12.22.2
    ~$ npm install pm2@latest -g
    ~$ pm2 -v
    #output
    5.2.0
    #nodeのバージョンをもとに戻します。
    ~$ nodenv local xx.xx.x(16.15.0)
    
  1. スタートアップスクリプトの生成
~$ pm2 startup

 #output
[PM2] Init System found: systemd
[PM2] To setup the Startup Script, copy/paste the following command:
sudo env PATH=$PATH:/home/ubuntu/.nodenv/versions/16.15.0/bin /home/ubuntu/.nodenv/versions/16.15.0/lib/node_modules/pm2/bin/pm2 startup systemd -u ubuntu --hp /home/ubuntu
  • メッセイジコマンドをコピーして実行します。
~$ sudo env PATH=$PATH:/home/ubuntu/.nodenv/versions/16.15.0/bin /home/ubuntu/.nodenv/versions/16.15.0/lib/node_modules/pm2/bin/pm2 startup systemd -u ubuntu --hp /home/ubuntu

 #output
Environment=PM2_HOME=/home/ubuntu/.pm2
PIDFile=/home/ubuntu/.pm2/pm2.pid
Restart=on-failure

ExecStart=/home/ubuntu/.nodenv/versions/16.15.0/lib/node_modules/pm2/bin/pm2 resurrect
ExecReload=/home/ubuntu/.nodenv/versions/16.15.0/lib/node_modules/pm2/bin/pm2 reload all
ExecStop=/home/ubuntu/.nodenv/versions/16.15.0/lib/node_modules/pm2/bin/pm2 kill

[Install]
WantedBy=multi-user.target

Target path
/etc/systemd/system/pm2-ubuntu.service
Command list
[ 'systemctl enable pm2-ubuntu' ]
[PM2] Writing init configuration in /etc/systemd/system/pm2-ubuntu.service
[PM2] Making script booting at startup...
[PM2] [-] Executing: systemctl enable pm2-ubuntu...
Created symlink /etc/systemd/system/multi-user.target.wants/pm2-ubuntu.service → /etc/systemd/system/pm2-ubuntu.service.
[PM2] [v] Command successfully executed.
+---------------------------------------+
[PM2] Freeze a process list on reboot via:
$ pm2 save

[PM2] Remove init script via:
$ pm2 unstartup systemd
  1. Strapiプロセスマネージャ
// path: `./server.js`

const strapi = require('@strapi/strapi');
strapi().start();
  • コマンド「pm2 start server.js」で起動します。
  1. PM2の構成ファイル
  • (注意)実行することで、アプリケーションで初期化されます。 pm2 init ecosystem.config.js 以下のファイルが作成されます。
module.exports = {
  apps : [{
    script: 'index.js',
    watch: '.'
  }, {
    script: './service-worker/',
    watch: ['./service-worker']
  }],

  deploy : {
    production : {
      user : 'SSH_USERNAME',
      host : 'SSH_HOSTMACHINE',
      ref  : 'origin/master',
      repo : 'GIT_REPOSITORY',
      path : 'DESTINATION_PATH',
      'pre-deploy-local': '',
      'post-deploy' : 'npm install && pm2 reload ecosystem.config.js --env production',
      'pre-setup': ''
    }
  }
};
  • ecosystem.config.js の作成
pm2 init simple
 #output
File /home/ubuntu/ecosystem.config.js generated
  • 内容の変更
module.exports = {
  apps : [{
    name   : "strapi-v4",
    script : "~/workspace/backend-strapi-v4/server.js"
  }]
}
  • 実行してpm2プロセスを開始します。pm2 start ecosystem.config.js
  1. サーバー再起動時に、pm2を自動的に起動する
5-2-8. Cronのインストール
  • 必要な場合にインストール
  • strapiやSveltekitをVPSで自動起動するためにCronをインストールします。(nohupではうまくいきません。)
  1. apt-get を使って cron をインストールする
sudo apt-get update
sudo apt-get -y install cron
  1. Ubuntu 22.04でcronをアンインストールする方法
sudo apt-get remove cron
 #依存関係をアンインストールする場合
sudo apt-get -y autoremove cron
 #cronの設定、データ、およびそのすべての依存関係を削除する
sudo apt-get -y autoremove --purge cron

5-3-1. Ubuntu 22.04にGo(Golang)をインストール

  • なんと簡単になりました
  • go env :こちらも現在はデフォルトから変える必要性はないです。
~$ sudo apt-get update
~$ sudo apt install golang-go
~$ go -v

5-3-2. Ubuntu 20.04にGo(Golang)をインストール

  • GoはGolangとも呼ばれ、Googleが開発したオープンソースのプログラミング言語です。 信頼性が高く効率的なアプリケーションを構築するために使用されます。
  1. Goをインストールします。
  • まず、次のコマンドを使用して、公式Webサイトから最新バージョンのGoをダウンロードします。
$ wget https://golang.org/dl/go1.16.5.linux-amd64.tar.gz
  • Goがダウンロードされたら、ダウンロードしたファイルを/usr/localディレクトリに解凍します。
$ sudo tar -xzf go1.16.5.linux-amd64.tar.gz -C /usr/local/
  • 次に、Goディレクトリのパスを/etc/profileディレクトリの$ PATH変数に追加する必要があります。
$ sudo vi /etc/profile
  • 次の行を追加します。
export PATH=$PATH:/usr/local/go/bin
  • ファイルを保存して閉じ、次のコマンドを使用してPATH環境変数をアクティブにします。
$ source /etc/profile
  • 次に、次のコマンドを実行して、インストールされているGoのバージョンを確認します。
$ go version
 # output
go version go1.16.5 linux/amd64
  • GROOT:Goのインストールパスのことです。
  • GOPATH:外部パッケイジなどを保存されるパス
  • 環境変数は、以下の場合、明示的に設定は不要です。
$ go env GOROOT
/usr/local/go
 ###
$ go env GOPATH
/home/<username>/go ⇒ /home/yamasaki/go
5-3-1. GO111MODULEがどこにでもある理由(Go 1.17で更新)
  1. GO111MODULE with Go 1.17 Go 1.17でバイナリ―をインスト―ルしようとすると以下のエラーになります。
$ GO111MODULE=on go get golang.org/x/tools/gopls@latest
go get: installing executables with 'go get' in module mode is deprecated.
     Use 'go install pkg@version' instead.
     For more information, see https://golang.org/doc/go-get-install-deprecation
     or run 'go help get' or 'go help install'.
  • GO111MODULE=onにしておきます。
$ go env -w GO111MODULE=on
$ go env
GO111MODULE="on"
  1. エラーの対策としては、go install@versionとなります。
$ go install golang.org/x/tools/gopls@latest
  1. 有効なプロジェクトからバイナリを実行している場合は、 実行するバイナリのバージョンを指定して実行します。 go run -mod=mod
 # Before Go 1.17:
go get github.com/golang/mock/mockgen@v1.3.1
go run -mod=mod github.com/golang/mock/mockgen

 # With Go 1.17:
go run github.com/golang/mock/mockgen@v1.3.1

5-4. Ubuntu 20.04にProtobufとgRPCをインストール

ここでは、マイクロサービスGo-Microの依存関係にあるProtobufgRPCインストールします。その後、Go-Microをインストールします。

5-4-1.Protobuf(3.19.2)の環境を構築します。
$ go get google.golang.org/grpc
$ go install google.golang.org/protobuf/cmd/protoc-gen-go@v1.26
$ go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@v1.1
$ export PATH="$PATH:$(go env GOPATH)/bin"
$ source .bashrc

$ protoc --version
  libprotoc 3.19.2

$ protoc-gen-go --version
 protoc-gen-go v1.26.0

$ protoc-gen-go-grpc --version
 protoc-gen-go-grpc 1.1.0
5-4-2. Get the example code

gRPCのServerを起動し、gRPCのClientからメッセージを通信します。

 #ここでは、$GOPATH/src/github.com検証します。
$ cd $GOPATH/src/github.com
$ git clone -b v1.43.0 https://github.com/grpc/grpc-go
$ cd grpc-go/examples/helloworld
$ go run greeter_server/main.go
$ go run greeter_client/main.go
Greeting: Hello world
 #Clientターミナルで実行します。
$ go run greeter_client/main.go
2022/02/14 01:49:28 Greeting: Hello world
 #Serverターミナルの表示
$  go run greeter_server/main.go
go: downloading google.golang.org/genproto v0.0.0-20200806141610-86f49bd18e98
2022/02/14 01:48:59 server listening at 127.0.0.1:50051
2022/02/14 01:49:28 Received: world

5-4-1.Protobuf(3.19.2)の環境を構築します。

ここは、前の章でインストールしているので省略します。

  • protobufは、protobufのリポジトリとgRPCのthird_party/protobufフォルダからもインストールできます。
  1. apt-getで既にインストールした場合、アンインストールします。
sudo apt-get remove protobuf-compiler
sudo apt-get remove libprotobuf-dev
sudo apt-get remove libprotobuf-lite10
  1. protobuf 3.19.2のインストール
sudo apt-get install autoconf automake libtool curl make g++ unzip -y
git clone https://github.com/google/protobuf.git
cd protobuf
git submodule update --init --recursive
./autogen.sh
./configure
make
make check
sudo make install
sudo ldconfig
protoc --version
 libprotoc 3.19.2
which protoc 
 /home/linuxbrew/.linuxbrew/bin/protoc

6. GitHubを使った開発

6-1. Gitを使ったバージョン管理

リポジトリとは、ファイルやディレクトリの状態を記録する場所です。保存された状態は、内容の変更履歴として格納されています。変更履歴を管理したいディレクトリをリポジトリの管理下に置くことで、そのディレクトリ内のファイルやディレクトリの変更履歴を記録することができます。

  1. リモートリポジトリとローカルリポジトリ

    • リモートリポジトリ 専用のサーバに配置して複数人で共有するためのリポジトリです。
    • ローカルリポジトリ ユーザ一人ひとりが利用するために、自分の手元のマシン上に配置するリポジトリです。
  2. リポジトリの作成

    • 自分の手元にローカルリポジトリを作成する方法は二種類あります。
    • 一つ目は全く新しいリポジトリを作成する方法、二つ目はリモートリポジトリをコピーして作成する方法です。
  3. 変更を記録するコミット

    • ファイルやディレクトリの追加・変更を、リポジトリに記録するにはコミットという操作を行います。
    • コミットを実行すると、リポジトリの内では、前回コミットした時の状態から現在の状態までの差分を記録したコミット(またはリビジョン)と呼ばれるものが作成されます。

6-2. Gitの基本操作

  1. リモートリポジトリを追加したい
$ git remote add <name> <url>
  1. リモートリポジトリの一覧を表示したい
$ git remote
  1. リモートリポジトリのブランチからローカルリポジトリのブランチを作成したい
$ git checkout <branch>
  • checkout コマンドの引数にリモートリポジトリに存在するブランチを指定すると、リモートリポジトリのブランチからローカルリポジトリ上にブランチを作成することができます。 バージョンが古いために作成できなかった場合は、下記のように branch コマンドでブランチを作成してください。
$ git branch <branchname> origin/<branch>
  1. リモートリポジトリにブランチを作成したい / ブランチに変更内容を反映したい
$ git push <repository> <refspec>

7. WSLでUSBポートをマウント

  • USBドライブがDの場合
sudo mkdir /mnt/d
sudo mount -t drvfs D: /mnt/d

sudo umount /mnt/d
以上