vz-shark:Dive2Deep

低予算を念頭にした「AI勉強/開発」「サービス開発/運用」。また記事に関連する「DIY」「備忘録」など。

『postfix』 外部smtpサーバ(gmail)経由でメール送信する

動機

①運用しているWebサーバからメール送信したい ⇛ ②自前でsmtpサーバを立てる ⇛ ③gmail宛にメール送信すると、お前のsmtpサーバは信用ならないから中継しないと断れれる ⇛ ④困った ⇛ ⑤gmailアカウントでsmtp認証してそこからメール送信する。

※最近はセキュリティーが厳しく③のようにはじかれたりする。以下は関係してそうなwiki
Sender Policy Framework - Wikipedia

環境

普段DockerベースでWebサーバを運用しており、ベースイメージがDebian(Stretch)を使っているので、今回はこれがターゲットです。

Debian + postfix

Debian(Stretch) 9.6
Postfix 3.1.8-0+deb9u1

Dockerイメージ

使ったのは、php:7.1.24-apache-stretch です。元イメージは、debian:stretch-slim です。

gmailの設定

gmailアカウントでは、デフォルト設定だと OAth2認証のみ有効になっているようです。他の認証方式だとエラーになります。 gmailアカウントでログイン⇒ログインとセキュリティ⇒アカウントにアクセスできるアプリ⇒安全性の低いアプリの許可 を「有効」にする。 https://myaccount.google.com/security

f:id:vz-shark:20181210222049p:plain
安全性の低いアプリの許可を有効にする図

上記を許可しないと以下のようなmailログを吐いてエラーになりました。また使ったgmailアカウント宛に、「ログインをブロックしました」とメールが飛んできました。

Dec 10 12:58:45 e08929302e84 postfix/smtp[1743]: 1A08426107E: to=<your@gmail.com>, relay=smtp.gmail.com[108.177.97.108]:587, delay=2.4, delays=0.02/0.01/2.3/0, dsn=4.7.14, status=deferred (SASL authentication failed; server smtp.gmail.com[108.177.97.108] said: 534-5.7.14 <https://accounts.google.com/signin/continue?sarp=
~(中略)~
 Please log in via?534-5.7.14 your web browser and then try again.?534-5.7.14  Learn more at?534 5.7.14  https://support.google.com/mail/answer/78754 h19sm14266437pfn.114 - gsmtp)

sasl2

sasl2のインストール

apt install libsasl2-2 sasl2-bin libsasl2-modules

sasl2がインストールされていないと、mailログに

warning: SASL authentication failure: No worthy mechs found

と表示されてエラーになる。

postfix

postfixインストール

インストール途中で、設定を聞かれますが、後で設定ファイルを編集するので、ここでは「1の設定なし」を選択。

$ apt update -y
$ apt install -y postfix
Postfix Configuration
---------------------

Please select the mail server configuration type that best meets your needs.

 No configuration:
  Should be chosen to leave the current configuration unchanged.
 Internet site:
  Mail is sent and received directly using SMTP.
 Internet with smarthost:
  Mail is received directly using SMTP or by running a utility such
  as fetchmail. Outgoing mail is sent using a smarthost.
 Satellite system:
  All mail is sent to another machine, called a 'smarthost', for delivery.
 Local only:
  The only delivered mail is the mail for local users. There is no network.

  1. No configuration  2. Internet Site  3. Internet with smarthost  4. Satellite system  5. Local only
General type of mail configuration:  1 <リターン>

postfix設定ファイル

postfixの設定ファイル/etc/postfix/main.cfを編集。cp main.cf.prot main.cfで雛形をコピーして使います。いろいろ書いてあるけど、修正したのは以下の箇所

#自分の環境に合わせて書き換え
myhostname = host.mydomain
mydomain = mydomain
myorigin = $mydomain
 
#パス等の指定
sendmail_path = /usr/sbin/postfix
newaliases_path = /usr/bin/newaliases
mailq_path = /usr/bin/mailq
setgid_group = postdrop

#つかわないのでコメントアウト化
#html_directory =
#manpage_directory =
#sample_directory =
#readme_directory =

#relayとsaslの設定追記
# smtp server relay with sasl_auth
relayhost = [smtp.gmail.com]:587
smtp_use_tls = yes
smtp_sasl_auth_enable = yes
smtp_tls_security_level = encrypt
smtp_sasl_tls_security_options = noanonymous
smtp_sasl_mechanism_filter = plain
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
smtp_tls_CApath = /etc/pki/tls/certs/ca-bundle.crt

アカウント情報の設定

main.cfのsmtp_sasl_password_mapsに指定したファイルにアカウント情報を記述します。
経由するsmtpサーバ アカウント:パスワード
と記述します。

/etc/postfix/sasl_passwdを編集

$ touch /etc/postfix/sasl_passwd
$ chmod 600 /etc/postfix/sasl_passwd
$ vi /etc/postfix/sasl_passwd
smtp.gmail.com your_account@gmail.com:your_password

アカウント情報をハッシュ

$ postmap /etc/postfix/sasl_passwd

postfix再起動

$ /etc/init.d/postfix reload

テスト

mailコマンドとログ確認用のrsyslogの準備

このdockerイメージには、mailコマンドが入っていないので、mailutilsパッケージをインストールします。 また、syslogも入ってないので、インストールしてmailログが出れるよしておきます。

$ apt install -y mailutils rsyslog
$ /etc/init.d/rsyslog start

mail送信テスト

$ mail hogehoge@fugafuga.com
CC:
Subject: test mail sub
honnbunn1
honnbunn2
<CTL-D>

これでメールが届けばOK。
うまく送信できたら以下のようなログがでる・・・

to=<hoge@fuga.com>, relay=smtp.gmail.com[108.177.97.109]:587, delay=2.2, delays=0.01/0.01/1.1/1, dsn=2.0.0, status=sent (250 2.0.0 OK  - gsmtp)

うまくいかないときのログ強化

main.cfに以下を指定するとmail.logにデバック用の詳細な情報がでるのでこれで原因を確認。

debug_peer_list = smtp.gmail.com

Let's Encrypt! 〜無料でSSL化〜

背景

運用しているWebサーバを無料で、独自/常時SSL化する。
よくWordPress等のCMSが使えるマネージド型レンタルサーバを借りていれば無料でSSL化するサービスが提供されていますが、自分が借りているのは格安高性能クラウドのVultrです。SSLも自前で導入する必要があります。

Let's Encrypt!

云わずと知れた、無料で使えるSSL認証局 (Certification Authority (CA) )です。 日本語ポータルもあるのが助かりますね・・・ letsencrypt.jp

環境

普段DockerベースでWebサーバを運用しており、ベースイメージがDebian(Stretch)+Apache2を使っているので、今回はこれがターゲットです。
※いつもはUbuntuユーザーなのです。DebianでもUbuntuでも手順はあまりかわらないはず。aptつかえるし・・・

Debian + Apache2 + certbot

Dockerイメージ

使ったのは、php:7.1.24-apache-stretch です。元イメージは、debian:stretch-slim です。

certbotで証明書発行してApacheに登録

インストール

$ apt install -y certbot

$ certbot --version
certbot 0.10.2

certbotで証明書発行

  • certonly で証明書発行のみ
  • --webrootオプション
    certbotは、webサーバーを内包していて、内容しているwebサーバを使って証明書を発行する時は、standaloneモード。使わない場合(ApacheやNginxを使う時)はwebrootモードを使用する。
  • -d でドメインを指定する
    -d example.com -d test.example.comのように複数指定できる。最初に記述したドメインがコモンネームになる。
  • -w でドキュメントルートを指定
    ドメインごとに別のドキュメントルートディレクトリを指定したいときには、-dオプションの直前に-wオプションを書く。 
  • --rsa-key-size 4096 で鍵長4096bitに指定
  • -m で連絡用メアドを指定。(期限切アラート等が送られてくる)
certbot certonly --agree-tos --webroot --rsa-key-size 4096 -w /var/www/html -d www.hogehoge.com -m webmaster@hogehoge.com 

Saving debug log to /var/log/letsencrypt/letsencrypt.log
Obtaining a new certificate
Performing the following challenges:
http-01 challenge for www.hogehoge.com
Using the webroot path /var/www/html for all unmatched domains.
Waiting for verification...
Cleaning up challenges
Generating key (4096 bits): /etc/letsencrypt/keys/0000_key-certbot.pem
Creating CSR: /etc/letsencrypt/csr/0000_csr-certbot.pem

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at
   /etc/letsencrypt/live/www.hogehoge.com/fullchain.pem. Your cert will
   expire on 2019-02-25. To obtain a new or tweaked version of this
   certificate in the future, simply run certbot again. To
   non-interactively renew *all* of your certificates, run "certbot
   renew"
 - If you lose your account credentials, you can recover through
   e-mails sent to webmaster@hogehoge.com.
 - Your account credentials have been saved in your Certbot
   configuration directory at /etc/letsencrypt. You should make a
   secure backup of this folder now. This configuration directory will
   also contain certificates and private keys obtained by Certbot so
   making regular backups of this folder is ideal.
 - If you like Certbot, please consider supporting our work by:

   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le

/etc/letsencrypt/live/www.hogehoge.com/ 以下に鍵ファイルが生成されている。これらをWebサーバに設定する。

Apache設定

SSL設定ファイルは/etc/apache2/sites-available/default-ssl.conf これを編集する。
必要なのは以下の設定。

ServerName www.hogehoge.com
DocumentRoot /var/www/html
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/www.hogehoge.com/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/www.hogehoge.com/privkey.pem
SSLCertificateChainFile /etc/letsencrypt/live/www.hogehoge.com/chain.pem

Apacheに設定反映させてリロードする。

$ a2enmod rewrite
Enabling module rewrite.
To activate the new configuration, you need to run:
  service apache2 restart

$ a2enmod ssl
Considering dependency setenvif for ssl:
Module setenvif already enabled
Considering dependency mime for ssl:
Module mime already enabled
Considering dependency socache_shmcb for ssl:
Enabling module socache_shmcb.
Enabling module ssl.
See /usr/share/doc/apache2/README.Debian.gz on how to configure SSL and create self-signed certificates.
To activate the new configuration, you need to run:
  service apache2 restart

$  a2ensite default-ssl.conf
Enabling site default-ssl.
To activate the new configuration, you need to run:
  service apache2 reload

$ service apache2 reload
[ ok ] Reloading Apache httpd web server: apache2.

テスト

Webブラウザhttps://www.hogehoge.com/にアクセスしてつながるか確認。ブラウザの鍵マークが表示されればOK。  
また、以下のサイトでSSL証明書のテストができるのでこれで確認する。サイトにホスト名を入力して実行する。 https://www.ssllabs.com/ssltest/

ちなみに、B判定でした。なんでだろ・・・。今日は時間ないので、あとでA判定目指そう・・・

f:id:vz-shark:20181127152533p:plain
SSLテスト結果の図

常時SSL化

せっかくSSL対応したので、httpをhttpsにリダイレクトして常時SSL化にします。 /etc/apache2/apache2.conf を編集します。今回は / 以下すべて対象。

<Directory />
〜中略〜
    #### forword http -> https ----add start
    <IfModule mod_rewrite.c>
          RewriteEngine On
          LogLevel alert rewrite:trace3
          RewriteCond %{HTTPS} off
          RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R,L]
    </IfModule>
    #### forword http -> https ----add end
〜中略〜
</Directory>

これで、ブラウザでアクセスして、http://www.hogehoge.com/https://www.hogehoge.com/ にリダイレクトされればOK。

SSL証明書自動更新

Let's Encrypt!では、証明書が90日間の期限で、期限切れの30日前から更新できます。わすれないようにcronに登録しておきます。

certbotで更新

  • certbot renewですべての証明書が更新される。
  • --post-hook "command"
    で、renew後に、commandが実行される。renewは更新期限が迫らないうちは実行がスキップされる。その場合はpost-hookも実行されない。以下のように、apache2にリロードする等の使い道。
  • --force-renew
    更新期間外でも強制的に更新できるが、何回もやると弾かれるらしい・・・。動作確認時や鍵長変更など期限をまたずに更新したい時だけ使うようにする。
certbot renew --post-hook "service apache2 reload"

cron に登録

3ヶ月期限で、1ヶ月前から更新できるので、2ヶ月に1度の実行でよいはず。だが、ここでは、念のため1周間に1度実行するように設定する。

自作GPUマシン完成(フェーズ1)

『手元にGPUマシンを』~シリーズ第5回~

やっとGPUを買いました。最終的にGTX1080tiにしました。10月中旬に買ってとりあえずGPUマシンは完成していたのですがなにかと時間がなく、ブログにも少し飽きてたのでほったらかし状態でした。やっとモチベーション戻ってきたので再開したいとおもいます。


前回までのあらすじと本シリーズについて

vz-shark.hatenablog.com


迷ったあげくPalitの1080tiに

RTX2080tiですがMSIのGaming X Trioがコアクロックも高めで静寂でよく冷えると評判が良いので狙っていたのですが、10月中旬の時点で在庫が劇薄でなかなか手に入りそうではありませんでした。現在でも品薄です・・・。2080tiの値段を考えると1080tiの2倍ぐらいするので、普通にFP32演算ベースだとコスパが悪すぎます。そうなると2080tiの魅力は、①FP16演算、②TensorCore(4x4テンソルのFP16演算)、③NVLINK SLI(見かけ上複数のGPUが1つのGPUとして振舞う)といった感じでしょうか・・・。左記①②はどちらかというと推論向きです。もともとNVIDIAはグラフィックのAI強化目的(推論)でTensorCoreを載せてるので当たり前といえば当たり前です。③はで2枚構成で35万円ぐらいになってしまいます。またパフォーマンス的に未知なので人柱感が強いです(それでも11GBx2枚で、22GBのGPUカーネルコードを実行できるのは魅力的・・・)。
以上を考慮して、1080tiを買うことにしました。1080tiは一時期のマイニングブームのころより大分値段が落ち着いていますし在庫も豊富です。口コミも多いので参考にさせてもらい、定評があったPalitの「GTX 1080ti Super Jet Strem 風」を買いました。このグラボはドスパラPalitのコラボモデルで、ドスパラで8.4万円ぐらいで買えます。ヤフオクでもUsed品探してみましたが落札相場が6.4万円ぐらいでした。グラボは使用環境(オーバークロックなど)で寿命が短くなる等聞いたこともあり保証なしの中古品で2万差なので新品を購入しました。


取り付つ

ハイエンドグラボは初めてかったのですが、大きさにビックリしました。これでも2連ファンで控えめなほうです。ちなみに、MSI 2080ti Gaming X Trioは3連ファンでこのPalitよりさらに大きく330mmもあります。 MSIはケースに収まるかな・・・と、そんなことを思いつつ取り付けました。流用したSilverStoneのPCIeケーブル(自作GPUマシンのPCIe補助電源ケーブルを流用してみた - vz-shark:Dive2Deep)もバッチリで問題なく動きました。

f:id:vz-shark:20181111201318p:plain
Palit1080ti風が青く光っているの図


ベンチマーク&消費電力確認

  • Win10のNiceHash
    NiceHashでマイニングすると、333ワット、アルゴリズムX16Rで18.885M H/s。。
    GTX700ti(2GB)で、137ワット、2.146M H/sだったのでほぼ想定通りの結果。

f:id:vz-shark:20181111200357p:plain
1080tiでNiceHashの図


これまでにかかった費用(パーツ第のみ計上)

~<今回購入分詳細> ~

~<シリーズ通した全体>~

  • 第1回分 : 0円
  • 第2回分 : 70,000円
  • 第3回分 : 4,415円
  • 第4回分 : 991円
  • 第5階分 : 83,980円
  • 合計   : 159,386円


最後に

とりあえず完成です。これをフェーズ1として、しばらく運用します。あとは、2080tiの情報や相場などを見つつ臨機応変にをグレードアップなどしていこうと思います。これが自作のだいごみですね。GPUメモリ8Gの1080/1070ti/1070当たりがヤフオクで大分安くでてます・・・。そのへんを増設してマルチGPUをフェーズ2にしようかな・・・。Chainer v5にChainerMNが統合されたらしいので、マルチGPUが扱いやすくなってそう・・・

-続くー

「手元にGPUマシンを」シリーズインデックス

『手元にGPUマシンを』シリーズ投稿のインデックスページです。
動機。今までのあらすじ。まとめなど。(随時更新中・・・)


動機

今まで初期コスト0で始められるクラウドGPUインスタンスを使用していました。しかし開発中はコーディング/デバック/休憩/ご飯/犬の散歩/雑用etcで何かとアイドル時間が長く、クラウドVM上で開発するのはコスト的に効率が悪いという結論に至りました(まあ初めから分っていた事ですが)。こまめにインスタントを起動/終了して節約するのも悪くないですが何しろ面倒くさいです。なので今後は手元にGPUマシンを置き、時間課金を気にすることなく開発/デバック/犬の散歩を行い、GPUパワーが必要な時はクラウドGPU(特に割安なGCPのプリエンプティブインスタンスAWSのスポットインスタンス)でトレーニングを行う。というスタイルに変えようと思います。本シリーズは、この思惑を実現するために行った環境構築作業・費用などを記録したシリーズ投稿です。


現在までのあらすじ


現在までに掛かった費用

  • 第1回分      : 0円
  • 第2回分      : 70,000円
  • 第3回分      : 4,415円
  • 第4回分      : 991円
  • 第5階分      : 83,980円
  • フェーズ1完成時  : 159,386円
  • シリーズ通した合計 : 159,386円


GPUマシン(フェーズ1)構成

  • ケース    : 普通のミドルタワー
  • マザーボード : ASRock Fatal1ty X299 Gaming K6
  • CPU     : Intel Core i7  7800X (6コア12スレッド) 
  • メモリ    : DDR4-2400 16GB x 1 (Singleチャンネル動作)
  • GPU     : Palit Geforce GTX 1080Ti Super JetStream 風(Palit NEB108TS15LC-1020J )
  • ストレージ1 : M.2 SSD (512GB) ※Ubuntuインストール
  • ストレージ2 : SATA3 SSD(512GB) ※Win10インストール
  • ストレージ3 : USB3.0 外付けHDD (2TB) ※非冗長
  • 電源     : Stronger 700W 80PLUSスタンダート ※PCIe補助ケーブル(SiliverStone製)流用


最後に一言

とりあえずGPUマシン完成しました。しばらくこれで運用します。

-続くー

スマートビジネス~01「モチベーション」

ECビジネスをはじめることにした。

動機

自由な時間、自由なお金を手にし、これを原資にして新たな挑戦を行う。

ECビジネス

上記の動機に、ECビジネスが向いていると考えている。以下はその理由。

原資を必要としない

スマートであることが必須条件。
原資をあまり必要とせず小さいリスクで始められる。そのため、撤退も掛け持ちもしやすく機動力に優れている。

  • 資金0からできる
    在庫を抱えなければ、ほぼ資金0から始められる。

  • 地理的制約がない
    都心じゃないとダメなどの制約がなく、インターネット環境とPCやスマフォなどがあれば何処でもできる。

  • 時間的制約がない
    決められた勤務時間などがない。

再現性がある

再現性があることが必須条件。
うまくいけばスケールしやすい(その逆も可)。特別な能力に頼ることなく地道な作業の積み重ねで結果を出しやすい。

  • 特別な能力を必要としない
    特別なスキル(例えば、英会話やコンピュータ技術など)が必要でない。そのため、多忙時のヘルプも頼みやすい。

  • 難易度が低い
    ある程度単純な作業がありルーチンワークを築くことが可能である。ルーチンワークの構築に時間を費やし、ルーチンワークの本数と、1本あたりのスケールの拡大・縮小により柔軟に構成できる。

  • 成功する確率が高い
    周りに成功している人が多く。成功確率が高い。成功率が50%を超える見込みがある。

シンプルなビジネスモデル

  • キャッシュポイント(収入源)が明確である
    仕入れる⇒売る⇒差額で稼ぐ」というシンプルなビジネスモデルなので簡潔でキャッシュフローも明確。

GCP認定~01「Google Cloud Platform」

GCP (Google Cloud Platform) 概要

現在Googleが提供しているクラウドサービスのブランドと特徴

GCPで提供している主なサービス

カテゴリ GCPサービス名 サービス概要
管理・運用 Cloud Console ブラウザ上の総合管理ツール(GUI)
Cloud Shell ブラウザ上で実行するコマンドラインインターフェース
Stackdriver 統合監視サービス
Cloud IAM ユーザーアクセス管理
コンピュート Compute Engine (GCE) 仮想マシンサービス
Container Engine (GKE) マネージドKubernetsサービス
App Engine (GAE) アプリケーションプラットフォーム
ストレージ Cloud Storage オブジェクトストレージ
データベース Cloud SQL マネージドRDBMSサービス
Cloud DataStore NoSQLデータベース
ネットワーク Cloud Virtual Network 仮想ネットワーク
Cloud Load Balancing ロードバランサ
Cloud DNS DNSサービス
Cloud CDN
ビックデータ Big Query
Cloud BigTable
Cloud Spanner
Cloud Dataflow
Cloud Dataproc マネージド Hadoop / Spark サービス
Cloud Pub/Sub
機械学習 Cloud Vision API 画像分析サービスAPI
Cloud Speech API 音声のテキスト変換サービスAPI
Cloud Translation API テキスト翻訳サービスを提供するAPI
Cloud Natual Language API 自然言語分析サービスを提供するAPI
Machine Learning Engine Tensorflowを使った機械学習環境。GPU/TPUを使用した大規模なトレーニングが行える

コマンドラインで回線スピード測定(speedtest-cli)

www.speedtest.net

上記Speedtest.netはWeb版だけでなくコマンドライン版の測定ツールも提供しています。

インストール

$ sudo pip install speedtest-cli

使い方

実行

speedtest-cliを実行するだけでping応答が早いサーバーを選びスピードテスト(Down/Up)をしてくれます。

$ speedtest-cli
Retrieving speedtest.net configuration...
Testing from my_whois_info(xxx.xxx.xxx.xxx)...
Retrieving speedtest.net server list...
Selecting best server based on ping...
Hosted by softlayer (Tokyo) [12.55 km]: 1.586 ms
Testing download speed................................................................................
Download: 3287.10 Mbit/s
Testing upload speed................................................................................................
Upload: 3437.04 Mbit/s

サーバーのリストを表示する

--listオプションで以下ののようにサーバーの番号と名前や距離がでてきます。

$ speedtest-cli --list
Retrieving speedtest.net configuration...
15757) Speedtest.net (Tokyo, Japan) [12.55 km]
20437) softlayer (Tokyo, Japan) [12.55 km]
18838) BGP Network (Tokyo, Japan) [12.55 km]
・・・

サーバーを指定して実行

以下のように、--server サーバ番号 を指定。

$ speedtest-cli --server 18838

他にも結果をJSONにしたり

$ speedtest-cli --json | jq .
{
  "client": {
    "rating": "0",
    "loggedin": "0",
    "isprating": "3.7",
    "ispdlavg": "0",
    "ip": "xxx.xxx.xxx.xxx",
    "isp": my_whois_info",
    "lon": "139.7459",
    "ispulavg": "0",
    "country": "JP",
    "lat": "35.5826"
  },
  "bytes_sent": 142606336,
  "download": 4378817077.851554,
  "timestamp": "2018-10-15T15:37:06.011757Z",
  "share": null,
  "bytes_received": 409373932,
  "ping": 1.591,
  "upload": 3435199298.8147144,
  "server": {
    "latency": 1.591,
    "name": "Tokyo",
    "url": "http://speedtest.tok02.softlayer.com/speedtest/speedtest/upload.php",
    "country": "Japan",
    "lon": "139.6833",
    "cc": "JP",
    "host": "speedtest.tok02.softlayer.com:8080",
    "sponsor": "softlayer",
    "lat": "35.6833",
    "id": "20437",
    "d": 12.54541717459312
  }
}

結果をCSVにしたり

$ speedtest-cli --csv 

ー以上ー