技術屋見習いのメモ帳

技術屋見習いのメモ帳です。

@nuxtjs/pwaが3.2.1でstart_urlをpreCachingに勝手に追加するようになる

Nekotter開発中、/latestページの挙動が変になったので検証した所、preCacheが悪さをしていることがわかった。

でも何か設定した覚えはないのでバージョンアップしたライブラリのchengelogを眺めていたら原因がわかった。

f:id:takashun_0704:20201023113837p:plain

f:id:takashun_0704:20201023113914p:plain

結構大胆な仕様変更だけど他に影響出てないのかな...?って思ってissue見てみると何件か建っているので、動向を見守りつつダウングレードして対応。

PM2+GitHub ActionsでNodeアプリを本番環境で運用する。

f:id:takashun_0704:20200701191245p:plain

 前回までの記事でサーバーの構築とSSL通信関係の設定は終わっているので、本題のNodeアプリの動作環境を構築します。ついでにGithub Actionsを使って自動デプロイできるようにします。

 

前回記事はこちら

 

takashun.hatenablog.com

 

PM2をインストール

# npm install -g pm2

Nodeアプリ準備してPM2で起動する

github.com

# mkdir /etc/nodeapps
# cd /etc/nodeapps
# git clone https://github.com/takashun/Nekotter
# cd Nekotter
# npm install
# npm run build
# pm2 start npm --name Nekotter -- start

f:id:takashun_0704:20200701201413p:plain

ヨシ!

Github Actionsの設定

デプロイの方法にも色々ありますが、今回はGithub Actionsを使います。

仕組みとしては簡単で、自動でSSHにログインして所定のコマンドを実行させるだけです。

.github/workflowsにdeploy.ymlを作成して以下の内容を書き込みます。

name: Deploy
on:
  push:
    branches: [ master ]
jobs:
  build:
    runs-on: ubuntu-latest
    steps:
    - name: ssh
      env:
        SECRET_KEY: ${{ secrets.SECRET_KEY }}
        SSH_USER: ${{ secrets.SSH_USER }}
        SSH_ADDR: ${{ secrets.SSH_ADDR }}
        SSH_PORT: ${{ secrets.SSH_PORT }}
        SSH_COMMAND: ${{ secrets.SSH_COMMAND }}
      run: |
        echo "$SECRET_KEY" > secret_key  
        chmod 600 secret_key
        ssh -oStrictHostKeyChecking=no ${SSH_USER}@${SSH_ADDR} -p $SSH_PORT -i secret_key "$SSH_COMMAND"

(-oStrictHostKeyChecking=noオプションは中間者攻撃を可能にしてしまうので注意)

そしてGitHubでSettings > Secrets > New Secretから環境変数を設定してください。必要なのは上記のenv下にある5つで、SSH_COMANDには下記の内容を設定しました。

sudo pm2 stop Nekotter && cd /etc/nodeapps/Nekotter && git pull && npm install && npm run build && sudo pm2 start npm --name Nekotter -- start

適切に設定できていれば、下記のようにデプロイが成功するはずです。

f:id:takashun_0704:20200702010829p:plain

3回失敗してるやん

まとめ

Github Actionsすごい便利。

 -oStrictHostKeyChecking=noオプションを使わない方法を今度試してみようと思います。

CentOS8+Let's Encrypt(certbot)でCloudflareで管理しているドメインのワイルドカード証明書を取得する。

f:id:takashun_0704:20200622022900p:plain

前回までの記事でサーバーの導入は終了しているので、今回は証明書の取得とNginxへのドメインの設定を行います。

 

 前回記事はこちら

takashun.hatenablog.com

余談:Cloudflareの設定

Cloudflareの設定を見てみると、暗号化モードの中に「フル」というものがあります。これはサーバーの証明書が所謂オレオレ証明書(もしくは期限切れ)でもエラーが出ずに接続することができるモードですが、今回は「フル(厳密)」に設定して証明書を更新し続ける環境を目指します。

f:id:takashun_0704:20200622023452p:plain

certbotの導入

Let's Encryptのクライアントはいくつかありますが(acme.shとか)、今回は公式のオススメクライアントである「certbot」を使用します。

letsencrypt.org

# dnf install python38 git -y #Python3.8とgitをインストール
# cd /usr/local/src/ #適当なディレクトリに移動
# git clone https://github.com/certbot/certbot.git
# cd /usr/local/src/certbot/certbot
# python3 setup.py install #インストールを実行

certbot-dns-cloudflareの導入

# cd /usr/local/src/certbot/certbot-dns-cloudflare
# python3 setup.py install

Global API Keyをhttps://www.cloudflare.com/a/profileから取得して保存します。

# mkdir /root/.cloudflare
# chmod 700 /root/.cloudflare
# echo "dns_cloudflare_email = (メールアドレス)" > /root/.cloudflare/credentials
# echo "dns_cloudflare_api_key = (Global API Key)" >> /root/.cloudflare/credentials
# chmod 600 /root/.cloudflare/credentials

コマンドを実行して証明書を取得します。色々聞かれるので適切な回答をしてください。

# certbot certonly \
  --dns-cloudflare \
  --dns-cloudflare-credentials /root/.cloudflare/credentials \
  --dns-cloudflare-propagation-seconds 30 \
  -d example.com \
  -d *.example.com

 成功したら/etc/letsencrypt/live/example.comに証明書が保存されています。

Nginxの設定

あとはNginxの設定を書くだけです。

 ※/etc/nginx/conf.dにdefault.confが存在しますが、削除するか下記内容で上書きすることをおすすめします。

#cd /etc/nginx/conf.d
#vim example.com.conf
server {
    listen 80;
    server_name example.com;
    return 301 https://$host$request_uri;
}

server {
    listen              443 ssl http2;
    server_name         example.com;
    ssl_certificate     /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_prefer_server_ciphers on;
    ssl_ciphers TLS13-AES-256-GCM-SHA384:TLS13-CHACHA20-POLY1305-SHA256:TLS13-AES-128-GCM-SHA256:TLS13-AES-128-GCM-SHA256:TLS13-AES-128-CCM-8-SHA256:TLS13-AES-128-CCM-SHA256:EECDH+ECDSA+AESGCM:EECDH+aRSA+AESGCM:EECDH+ECDSA+SHA512:EECDH+ECDSA+SHA384:EECDH+ECDSA+SHA256:ECDH+AESGCM:ECDH+AES256:DH+AESGCM:DH+AES256:!aNULL:!eNULL:!LOW:!RC4:!3DES:!MD5:!EXP:!PSK:!SRP:!DSS;

    location / {
        root   /usr/share/nginx/html/;
        index  index.html index.htm;
    }
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}

firewallの設定を忘れずに。

#firewall-cmd --add-service=https --zone=public --permanent
# firewall-cmd --add-service=http --zone=public --permanent
firewall-cmd --reload

動作確認

f:id:takashun_0704:20200622043206p:plain

ヨシ!

自動更新の設定

# crontab -e
00 05 01 * * /usr/local/bin/certbot renew && /usr/bin/systemctl restart nginx

まとめ

設定しながら書いたのでなぐりがきにもほどがありますが許して下さい。

次回はnodeアプリを実行してnginxをリバースプロキシとして動作させます。

CentOS8でNginx+MariaDB環境を構築する。

 nodeアプリを実行するサーバーを用意したいので新しく構築してみる。

リバースプロキシとしてnginx、DBはMariaDBを導入します。

KAGOYA VPSインスタンス作成

f:id:takashun_0704:20200617041111p:plain

 今回は2コア/2GB/30GBを選択しときます。

 

構築作業

 CentOS8からはyumではなくdnfというパッケージ管理システムが用いられている...が、基本的にyumを置き換えるだけで動く。(というかエイリアスが設定されてるので置き換えなくても動く)

# dnf update -y #いつもの
 Nginxを公式リポジトリからインストールする。

 Nginxはバージョンが奇数だと開発版、偶数だと安定版ということになっています。

CentOS8.2のAppStreamからインストールされるのは1.14.1ですが、今回は公式リポジトリから1.18.xをインストールします。

# vi /etc/yum.repos.d/nginx.repo
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key

[nginx-mainline]
name=nginx mainline repo
baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
gpgcheck=1
enabled=0
gpgkey=https://nginx.org/keys/nginx_signing.key
dnf --disablerepo=AppStream install -y nginx
 Nginx起動・確認
# systemctl start nginx
# systemctl enable nginx #自動起動設定
# nginx -v nginx version: nginx/1.18.0
# dnf info nginx Last metadata expiration check: 0:03:54 ago on Thu Jun 18 17:11:00 2020. Installed Packages Name : nginx Epoch : 1 Version : 1.18.0 Release : 1.el8.ngx Architecture : x86_64 Size : 3.6 M Source : nginx-1.18.0-1.el8.ngx.src.rpm Repository : @System From repo : nginx-stable Summary : High performance web server URL : http://nginx.org/ License : 2-clause BSD-like license Description : nginx [engine x] is an HTTP and reverse proxy server, as well as : a mail proxy server.
 MariaDBを公式リポジトリからインストール

Nginxと同様こちらも公式リポジトリからインストールしてみます。

# vi /etc/yum.repos.d/MariaDB.repo
[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/10.4/centos8-amd64
module_hotfixes=1
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1
dnf install -y MariaDB-server
 MariaDB起動・確認
# systemctl start mariadb
# systemctl enable mariadb #自動起動設定
# rpm -qa | grep -i mariadb MariaDB-common-10.4.13-1.el8.x86_64 MariaDB-shared-10.4.13-1.el8.x86_64 MariaDB-client-10.4.13-1.el8.x86_64 MariaDB-server-10.4.13-1.el8.x86_64
# dnf info MariaDB-server Installed Packages Name : MariaDB-server Version : 10.4.13 Release : 1.el8 Architecture : x86_64 Size : 124 M Source : MariaDB-server-10.4.13-1.el8.src.rpm Repository : @System From repo : mariadb Summary : MariaDB: a very fast and robust SQL database server URL : http://mariadb.org License : GPLv2 Description : MariaDB: a very fast and robust SQL database server : : It is GPL v2 licensed, which means you can use the it free of : charge under the conditions of the GNU General Public License : Version 2 (http://www.gnu.org/licenses/). : : MariaDB documentation can be found at https://mariadb.com/kb : MariaDB bug reports should be submitted through : https://jira.mariadb.org
 MariaDBの文字セットをutf8mb4に設定する

記事冒頭で書いたnodeアプリはTwitterのツイートを表示する機能があるのですが、文字セットの設定を適切に行わないと絵文字の表現に失敗して情報が欠落してしまうので対処します。(寿司ビール問題とか言われているらしい)

# vi /etc/my.cnf.d/server.cnf
[mariadb]
character-set-server = utf8mb4
[client-mariadb]
default-character-set = utf8mb4

上記のように設定して保存します。
※10.4.13インストール時点では[mariadb]項には何も書かれておらず、[client-mariadb]項はそもそも存在しなかったので追加しました。

# systemctl restart mariadb
# mysql -u root -p
Enter password:
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 8
Server version: 10.4.13-MariaDB MariaDB Server

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> show variables like 'char%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8mb4                    |
| character_set_connection | utf8mb4                    |
| character_set_database   | utf8mb4                    |
| character_set_filesystem | binary                     |
| character_set_results    | utf8mb4                    |
| character_set_server     | utf8mb4                    |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.002 sec)

MariaDB [(none)]>  show variables like 'coll%';
+----------------------+--------------------+
| Variable_name        | Value              |
+----------------------+--------------------+
| collation_connection | utf8mb4_general_ci |
| collation_database   | utf8mb4_general_ci |
| collation_server     | utf8mb4_general_ci |
+----------------------+--------------------+
3 rows in set (0.001 sec)

MariaDB [(none)]> exit;
Bye

動作確認OK

まとめ

設定ファイルを書き換えるときはバックアップを取ってからの方が事故が防げて良いかも。

次回はドメインとLet's Encryptの設定を行う予定です。

Synergy v1.10.x を日本語キーボードに対応させる(サーバーがWindowsの場合)

マウスとキーボードを異なるOS間で共有するソフトウェアKVMである「Synergy」ですが、JISキーボードに優しくない設計になっています。

幸いにもSynergyはGPLv2でライセンスされているオープンソースソフトウェアなので自分で対応させてみました。

github.com

変更箇所は以下の通りです。

  • 変換キーをかなキー、無変換キーを英数キーに割り当てました
  • 半角・全角キーでWinっぽく入力モードを切り替えられるようにしました

利用方法

ビルドした物の配布は後日やります。

ビルド方法は本家リポジトリWikiのこのページに従って下さい。

また、ビルド時はv1.10.2-patchedというブランチになっているか確認して下さい。

備考:Qtのバージョンは両OSとも5.9.5で統一しました。また、Win版はVisual Studio 2017 Communityでもビルドできました。

github.com

注意事項

  • 言うまでもありませんが、ご利用は自己責任でお願い致します。
  • Mac側がサーバーの場合やLinux環境での使用、3PC以上での利用の動作は未確認です。
  • 他の方が日本語対応されているSynergyとは違い、こちらはWin側も上記の物に差し替える必要があります。