メールサーバーをDockerで建ててみました。

imageとか

全部入りなimageを利用しました。

tomav/docker-mailserver: A fullstack but simple mailserver (smtp, imap, antispam, antivirus, ssl...) using Docker.

建て方はREADME.mdを参照

ハマったこと

接続できなくなる

接続に失敗1しすぎて、fail2banというソフトからBANされてました。

/var/log/fail2ban.log

2017-04-29 13:01:33,060 fail2ban.filter         [1022]: INFO    [dovecot] Found 203.0.113.0
2017-04-29 13:02:15,153 fail2ban.filter         [1022]: INFO    [dovecot] Found 203.0.113.0
2017-04-29 13:04:02,309 fail2ban.filter         [1022]: INFO    [dovecot] Found 203.0.113.0
2017-04-29 13:04:03,302 fail2ban.actions        [1022]: NOTICE  [dovecot] Ban 203.0.113.0

Let's Encryptの設定

推奨されているLet's EncryptをSSLに使う場合、wikiに書かれている通りLet's Encrypt関連の全体を含むパスの指定がdocker-compose.ymlに必要でした。ここを間違うと、つながるけど不正な証明書が届いたりしました。

volumes:
- /etc/letsencrypt:/etc/letsencrypt:ro

できあがったdocker-compose.yml

docker-compose.yml.distとの差分は以下のようになりました。

--- a/docker-compose.yml.dist
+++ b/docker-compose.yml
@@ -2,9 +2,9 @@ version: '2'
 
 services:
   mail:
-    image: tvial/docker-mailserver:2.1
+    image: tvial/docker-mailserver:latest
     hostname: mail
-    domainname: domain.com
+    domainname: netaka.net
     container_name: mail
     ports:
     - "25:25"
@@ -15,12 +15,14 @@ services:
     - maildata:/var/mail
     - mailstate:/var/mail-state
     - ./config/:/tmp/docker-mailserver/
+    - /etc/letsencrypt:/etc/letsencrypt:ro
     environment:
     - ENABLE_SPAMASSASSIN=1
     - ENABLE_CLAMAV=1
     - ENABLE_FAIL2BAN=1
     - ONE_DIR=1
-    - DMS_DEBUG=0
+    - DMS_DEBUG=1
+    - SSL_TYPE=letsencrypt
     cap_add:
     - NET_ADMIN
     restart: always

そしてuser@exmaple.comのメールアカウントを作成した場合、メールクライアント2での設定は以下のようになりました。


  1. 単純にユーザー名等を間違えてただけでした。 
  2. 図はmacOSのメール バージョン10.2 (3259) 

April 30, 2017 作成

Docker + nginx + WordPressに移行した際にハマったときのメモです。

Dockerの公式WordPressイメージで不足なPHPライブラリ 最初は公式のWordPressイメージ1をそのまま使いました。しかし、Duplicator2というWordPressプラグインが"Zip Archive Enabled"を要求していたので、Dockerfileを修正して必要なライブラリを追加しました。

https://github.com/docker-library/wordpress/blob/master/php5.6/apache/Dockerfile

        apt-get install -y \
                libjpeg-dev \
                libpng12-dev \
+               zip \
+               unzip \
        ; \
        rm -rf /var/lib/apt/lists/*; \
        \
        docker-php-ext-configure gd --with-png-dir=/usr --with-jpeg-dir=/usr; \
-       docker-php-ext-install gd mysqli opcache
+       docker-php-ext-install gd mysqli opcache zip

管理画面がリダイレクトループする nginxで内部のhttp://127.0.0.1:8080/に対してリバースプロキシをおこなっていましたが、管理画面がリダイレクトループしてしまいました。wp-config.phpFORCE_SSL_ADMINの定義が必要でした。

管理画面での SSL 通信 - WordPress Codex 日本語版

管理画面が真っ白になる 上記のFORCE_SSL_ADMINの記載場所が間違っていたようです。

WordPress + HTTPS + リバースプロキシ = このページにアクセスする権限がありません。 | yohgaki's blog

April 26, 2017 作成

Node.jsを使ってネットワークレコーダーのnasneの録画本数を取得してみました。

こちらのpackageを利用しています。

upnp-device-client

実装とか

packageをインストールします。

$ npm install upnp-device-client

コードはこちらです。

var Client = require('upnp-device-client');
var fs = require('fs');
// nasneの名称とdevice description URLが記述されたJSONファイル
var obj = JSON.parse(fs.readFileSync('./nasne_list.json', 'utf8'));

obj.forEach(function(nasne) {
  var client = new Client(nasne.url);

  // "ビデオ/すべて"にぶら下がるオブジェクトを取得する。
  // 今回は録画本数として'TotalMatches'をそのまま利用している。
  client.callAction('ContentDirectory', 'Browse', { ObjectID: '0/video/all', BrowseFlag: 'BrowseDirectChildren', Filter: '', StartingIndex: 0, RequestedCount: 0, SortCriteria: '' }, function(err, result) {
    if(err) throw err;
    console.log(nasne.name + ": " + result.TotalMatches);
  });
});

コード中の'nasne_list.json'はこちらです。

[
  {
    "name": "nasne-1",
    "url": "http://192.168.1.11:58888"
  },
  {
    "name": "nasne-2",
    "url": "http://192.168.1.12:58888"
  }
]

結果

結果はこちらです。

$ node nasne.js
nasne-1: 873
nasne-2: 973

参考サイト

こちらを参考にしました。

January 30, 2017 作成

Tumblrの新着ポストが気になってしまい、ついついDashboardを見てしまいます。そこで新着ポスト数を示せれば、数ポストのために頻繁に見ることも防げるのではないかと思いました。今回はTumblrのDashboard新着ポスト数をLaMetric Timeに表示してみました。

新着ポスト数の定義は、Dashboardの最新のポストから自分がリブログしたポストまでの数としました。Dashboardみてリブログしないなんてことはまずないので、つまり最後のリブログ以降は新着ということに。

Dashboardの新着ポスト数を取得する

こちらの記事を参考にTumblr用にアプリを作成してみました。

Tumblr APIでwebサービスを作りたい全ての人に向けて書きました

次に、指定した"blog_name"のポストが取得したDashboardのうち何番目のポストか調べます。最大取得ポストは20件ということなので、もし該当するポストが含まれていなかったら、オフセットを指定して次の20件を試みます。インデックスを返すコードは以下のような感じです。自分がリブログしたポストが出てきたら、そこまでのオフセットが新着ポスト数になります。

<?php
require './tumblr-oauth-library.php'; // OAuth関連は上の記事から流用

function getDashboardIndex($name, $offset) {
    $access_token = '';
    $access_token_secret = '';
    $request_url = 'https://api.tumblr.com/v2/user/dashboard';
    $request_method = 'GET';
    $params = array(
        'oauth_token' => $access_token ,
        'oauth_token_secret' => $access_token_secret ,
        'offset' => $offset ,
    );

    $json = tumblr_oauth($request_url, $request_method, $params);
    $array = json_decode($json, true);
    $posts = $array["response"]["posts"];
    $count = 0;
    foreach($posts as $post) {
        if($post["blog_name"] == $name) {
            return $count;
        }
        $count++;
    }
    return -1;
}
?>

新着ポスト数をLaMetric Timeに表示する

最後に新着ポスト数をLaMetric Timeに表示します。次の記事を参考に、LaMetric用アプリを作成しました。

ネットとつながる LED 時計の LaMetric を手に入れたので遊んでみた - 凹みTips

Indicator AppでPollで設定して、JSON形式で新着ポスト数を返します。

PHPでJSONのデータを処理する方法

できました

今回は256件までを上限としました。それ以上のポストを取得しても自分のリブログが見つからなかったら打ち切りとし、「256+」と表示するようにしています。

Dashboard_LaMetric

June 25, 2016 作成

Pythonでプロフィールの説明を更新してみました。

以下を参考にしました。

コードはこちらです。別ファイルのtwitter_oauth.pyにOAUTHに必要なトークン等が記載されています。

# -*- coding: utf-8 -*-
from twython import Twython
import twitter_oauth

def update_profile(text):

    twitter = Twython(
        twitter_oauth.CONSUMER_KEY,
        twitter_oauth.CONSUMER_SECRET,
        twitter_oauth.ACCESS_KEY,
        twitter_oauth.ACCESS_SECRET
        )

    twitter.update_profile(description=text)

def main():
    text = 'A long time ago, in a galaxy far, far away...'
    update_profile(text)

if __name__ == '__main__':
    main()

とりあえずこのコードを使って、1日おきにプロフィールの説明を更新するようにしています。

July 1, 2015 作成

さくらのVPSがメンテナンスで再起動させられてたので、netaka.netが動かなくなっていました。おそらく、php-fastcgiが止まっています。下記コマンドで起動させました。

sudo /etc/init.d/php-fastcgi start

また再起動したときに手間なので自動起動するように設定します。詳しくはLinux - chkconfigまとめ - Qiita

$ sudo chkconfig php-fastcgi on
サービス php-fastcgi は、chkconfig をサポートしていません。

あれれ。chkconfigに関する設定がphp-fastcgiに記述されてないといけないようでした。詳しくはWordPress サイトに nginx を導入する | dogmap.jp。以下を追加して、

# chkconfig:   - 80 20

リトライしたらうまく登録出来ました。めでたしめでたし。

$ chkconfig --list
php-fastcgi     0:off   1:off   2:on    3:on    4:on    5:on    6:off

June 28, 2015 作成

さくらのレンタルサーバーで動かしていたWordPressをさくらVPSに移してみました。

参考にした記事

こちらを参考に移行しました。

移行ではまった点

はまった点をいくつか記載します。

NginxでPHPを設定した後、Not Foundになる

rootの設定が間違っていました。

nginx + php-fpm で設定したが index.php にアクセスするとNOT FOUND(404)になってしまう : saba nano - へっぽこ管理者のサーバ管理日誌(LV.2)

WordPressインストール後、プラグインがインストール出来ない トップページが表示され一見問題がなさそうでしたが、プラグインがインストール出来ませんでした。

「要求されたアクションを実行するには、WordPress が Web サーバーにアクセスする必要があります。 」って怒られた - Qiita

パーマリンク設定後、404 Not Found になる index.phpへrewriteする必要があるようです。

WordPressのパーマリンクを投稿名にする方法(nginx) » EC2にWordPressをNginxで! - Tommy Sys

.phpがダウンロードされる

.phpファイル本体がそのままダウンロードされていました。

nginxでバーチャルホスト設定したらphpがダウンロードされる件 « Demence/Cup

April 30, 2015 作成

PebbleにTwitterのアイコンを表示してみました。

以下を参考にしました。

CloudPeppleにあるサンプルを組み合わせて、Twitterのアイコンを出してみました。まずはテンプレートのExamples->Draw Bitmapを選びます。

Create Draw Bitmap

あとは適当に画像の位置を調整して、同じくテンプレートのSDK demos->HelloWorldも参考にしてテキスト表示させたコードが以下になります。

#include "pebble.h"

static GBitmap *image;
static TextLayer *text_layer;

void text_init(Window *window) {
    text_layer = text_layer_create( GRect(0, 128, 144, 32) );

    text_layer_set_text(text_layer, "@netaka");
    text_layer_set_font(text_layer, fonts_get_system_font(FONT_KEY_GOTHIC_28_BOLD));
    text_layer_set_text_alignment(text_layer, GTextAlignmentCenter);

    layer_add_child(window_get_root_layer(window), text_layer_get_layer(text_layer));
}

static void layer_update_callback(Layer *me, GContext* ctx) {
    GRect bounds = image-&gt;bounds;
    graphics_draw_bitmap_in_rect(ctx, image, (GRect) { .origin = { 8, 0 }, .size = bounds.size });
}

int main(void) {
    Window *window = window_create();
    window_stack_push(window, true);

    Layer *window_layer = window_get_root_layer(window);
    layer_set_update_proc(window_layer, layer_update_callback);

    image = gbitmap_create_with_resource(RESOURCE_ID_IMAGE_TWITTER);

    text_init(window);

    app_event_loop();

    text_layer_destroy(text_layer);
    gbitmap_destroy(image);
    window_destroy(window);
}

そして表示したい画像をメニューにあるRESOURCESからアップロードしましょう。最後にビルドしてPebbleにインストールすると写真のようになりました。

pebble_image

はじめ、Watch Faceにしたかったのに、どうしてもWatch Appでビルドされてしまうのでどうしてなのかと小一時間悩みましたが、メニューにあるSETTINGSから切り替えられました。

ChangeWatchface

ほんとはTwitterのAPIにアクセスしてアイコン取り寄せるとかそこまでしたいですね。それにしても簡単に画像が表示できるので、LINEのQRコードとかを表示したりすると友達追加の時に便利そうです。

December 29, 2014 作成