[Python] listの差分を知るには

Pocket

Pythonで、二つのリストの差分を知るには。
リストのままでは引き算ができない。
set()でset型にしてから引き算をする。
ただしset()すると、与えられたリストから重複した要素が除かれること、順序も保持されないことに注意
また、set()して要素を操作した結果はset型のまま。
list()でリストに戻す必要がある。

以下、サンプル。

>>> a = ["a"]
>>> b = ["b","c","d"]
>>> b - a
Traceback (most recent call last):
  File "", line 1, in 
TypeError: unsupported operand type(s) for -: 'list' and 'list'
>>> c = list(set(b) - set(a))
>>> c
['c', 'b', 'd']
>>> c.sort()
>>> c
['b', 'c', 'd']

[Python][memo] タイムスタンプの差を求める

Pocket

すぐ忘れるのでメモ。

文字列としてのタイムスタンプは、datetime.datetime.strptimeで、フォーマットを指定してdatetime.datetime型に変換。
そうしたら加減算ができる。datetime.timeでは出来ないので注意。
以下、IPythonでの例。

In [1]: from datetime import datetime

In [2]: t1 = datetime.strptime("14:36:02.0689", "%H:%M:%S.%f")

In [3]: t2 = datetime.strptime("14:36:03.0102", "%H:%M:%S.%f")

In [4]: print type(t1)


In [5]: delta = t2 - t1

In [6]: print str(delta)
0:00:00.941300

In [7]: print str(delta)[6:]
0.941300

In [8]: 

[Python] requestsとlxmlで京急の運行情報を抽出しよう

Pocket

botに京急の運行情報を調べさせて、Slackで発言させたい。
使用言語はPython。
さあどうしようかと思ったら、さいきんは、どんなものでもライブラリが揃っていて、あっという間になんでも出来てしまうのな。

ページの取得はrequests、解析はlxmlを使う。

Webページの事前解析

ページのソースから、狙いの箇所を特定するようなキーワードを見つける。
あるいは、たとえばChromeなら、デベロッパーツールで探してもよい。
京急のページであれば、以下のように。

keikyuanalyze
手がかりは”div.unko-panel”。
これをもとにコードを書く。

抽出コード

stackoverflowを調べればサンプルコードなんかいくらでもあるよねー。

import lxml.html
import requests

def getKeikyuStatus():
    target_url = "http://unkou.keikyu.co.jp/"
    target_html = requests.get(target_url).text
    root = lxml.html.fromstring(target_html)

    divs = root.xpath("//div[contains(@class, 'unko-panel')]")
    for div in divs:
        unkouinfo = div.text_content().encode("UTF-8")

    return unkouinfo.strip()

requestsでwebページ取得。
lxmlで読み込んで、class “unko-panel”のdivタグを見つければよい。

[参考]slackへの投稿

ここはサラッと。
詳細はslackのサイトを見る。
前章の関数の戻り値を引数に取る関数。

def noticeSlack(keikyuStatus):
    url ="https://slack.com/api/chat.postMessage"
    msg = keikyuStatus + " #keikyu"

    payload_dic = {
        "token": "xoxb-xxxx-xxxx",
        "type": "message",
        "channel":"#general",
        "text":msg,
        "username":"keikyubot",
        "icon_emoji":":bird:",
        }

    headers = {'Content-type': 'application/json', 'Accept': 'text/plain'}
    r = requests.post(url, params=payload_dic, headers=headers)

    return r

[slack][hubot][jail][メモ] FreeBSD Jailでhubotを飼う

Pocket

slackにhubotを住まわせる記事は山のようにあるが、それを「hubotを自前サーバ」「それもFreeBSDに」という条件にすると記事数が激減する。

そんななか、四苦八苦してなんとか達成したのでここに採録。
なお、そっけなく不親切に見えるのは、ここまでたどり着くのに疲労困憊したから。
ではどうぞ。

jailの作成

フッツーに。
以下ではqjailを使っているがezjailでもなんでも、好きなのを使いたまえ。

sudo qjail create hubot -4 192.168.200.1

 

npmのインストール

まずjailをスタートさせて中に入ろうか。
そしてnpmのインストール。

sudo qjail console ex02
pkg install npm

node, npmのバージョンを確認しておく。
問題なくインストールされているかの確認でもある。

node -v
npm -v

 

generatorのインストール

npm install -g yo generator-hubot

 

hubot用ユーザの作成

jailの中でadduserし、お好きなユーザを作る。
以下では「bot」というユーザ。

adduser bot

 

hubot用ユーザでhubotレポジトリ作成

su - bot
mkdir hubot
cd hubot
yo hubot --adapter slack

botホストの作業はいったんはここまで。
以降、slack側で。

 

slackにhubotのインストール

slackのteamメニューからApp&Integrations > Hubotをインストール
表示されるAPI Tokenを記録する。
hubotがslackへアクセスするためのトークン。

 

botホストで起動スクリプトの作成

再びbotホスト
/usr/local/etc/rc.d/hubotとして以下を作成。
試行錯誤で作ったから雑なスクリプトであることに注意。
それから実行権限付けるのを忘れないこと。

#! /bin/sh
#
#
# PROVIDE: hubot
# REQUIRE: DAEMON
# KEYWORD: shutdown
# $Id: hubot,v 1.3 2016/04/16 12:57:03 root Exp $

. /etc/rc.subr

name=hubot
rcvar=hubot_enable

command=/usr/home/bot/hubot/bin/hubot
command_args="--adapter slack"

hubot_user=bot

pidfile="/var/run/${name}.pid"
procname=node

start_cmd="${name}_start"

hubot_start()
{
        export HUBOT_SLACK_TOKEN=xoxb-xxxx-xxxxx
        export PATH="$PATH:/usr/home/bot/hubot/bin:/usr/local/bin"
        cd /usr/home/bot/hubot
        echo "starting hubot"
        /usr/sbin/daemon -p ${pidfile} -u ${hubot_user} ${command} ${command_args}
}

load_rc_config $name
run_rc_command "$1"

 

起動確認

/etc/rc.confにhubot_enable=YESを記載。
service -l でhubotがリストされることを確認したら、service hubot startで起動。

以下のような表示が出ればOK。

[Sat Apr 16 2016 21:55:52 GMT+0900 (JST)] INFO Connecting...
[Sat Apr 16 2016 21:55:53 GMT+0900 (JST)] INFO Logged in as xxx of xxxxxx, but not yet connected
[Sat Apr 16 2016 21:55:54 GMT+0900 (JST)] INFO Slack client now connected
[Sat Apr 16 2016 21:55:55 GMT+0900 (JST)] ERROR hubot-heroku-alive included, but missing HUBOT_HEROKU_KEEPALIVE_URL. `heroku config:set HUBOT_HEROKU_KEEPALIVE_URL=$(heroku apps:info -s  | grep web-url | cut -d= -f2)`
[Sat Apr 16 2016 21:55:55 GMT+0900 (JST)] INFO hubot-redis-brain: Using default redis on localhost:6379

 

ポートフォワーディングの設定。

前章の起動時メッセージ、「INFO hubot-redis-brain: Using default redis on localhost:6379」に注目。
6379でポート待ち受けている。
ご家庭のサーバで動かしている場合には、ルータでのポートフォワーディング設定を忘れずに。
なお2016/4/16現在、slackの側でサーバのIPアドレスを指定したりするような設定は不要。

 

slack側の確認

slackでbotを住まわせたいchannelにInvite。
botの名前の左側に在席マークが点いているのを確認し、「@<bot名> ping」とし、botからPONGと帰ってきたら成功。
もし起動時メッセージが不要であれば、以下のように/usr/sbin/daemonのオプションに-fを加えるとよい。

/usr/sbin/daemon -f -p ${pidfile} -u .....

[coreos]CoreOSインストール時に使ったcloud-configはどこに行ったの?

Pocket

自分でCoreOSをインストールするときには、初期設定を書き込んだcloud-configを読み込ませる。
ファイル一つでOSの設定を全部、賄えるとは、なんてお手軽なんだろう。

あれ?
ではインストール後に、そういった設定を変更したい場合にはどうしたらよいのだろう。
もちろん、CoreOSだってLinuxなんだから、/etc下に設定ファイルが転がっているのは百も承知。
しかしCoreOSなんだから、一つのファイルで全部、管理したいじゃないか。

インストール後のcloud-configの場所

答え:
インストール時に使用したcloud-configは、/var/lib/coreos-install/user_dataに保存されているので、これを書き換えればよい。

例。
インストール後に、CoreOSの更新方法を変える。
更新方法は/etc/coreos/update.confでも設定できるが、上述の理由から、敢えてuser_dateで操作する。

では早速。
/var/lib/coreos-install/user_dataに以下の行を加えればよい。
※以下の例ではreboot-strategyにbest-effortを指定している。

 coreos:
   update:
     reboot-strategy: best-effort

CoreOSをリブートすると、/etc/coreos/update.confに以下の通り、最後の一行が増えている。

$ cat update.conf
GROUP=stable
REBOOT_STRATEGY=best-effort

なお、CoreOSのバージョンは/etc/os-releaseに記載あり。

$ cat /etc/os-release
NAME=CoreOS
ID=coreos
VERSION=835.11.0
VERSION_ID=835.11.0
BUILD_ID=
PRETTY_NAME="CoreOS 835.11.0"
ANSI_COLOR="1;32"
HOME_URL="https://coreos.com/"
BUG_REPORT_URL="https://github.com/coreos/bugs/issues"

参考
https://github.com/coreos/coreos-cloudinit/blob/master/Documentation/cloud-config.md#update
https://coreos.com/os/docs/latest/update-strategies.html

https://coreos.com/os/docs/latest/cloud-config-locations.html
On every boot, coreos-cloudinit looks for a config file to configure your host. Here is a list of locations which are used by the Cloud-Config utility, depending on your CoreOS platform:

/var/lib/coreos-install/user_data
When you install CoreOS manually using the coreos-install tool. Usually used in bare metal installations.

[docker]dockerのimageを更新し、不要なimageを削除する

Pocket

docker pullしてimageを更新し、結果として山ほどできるnoneなimageを削除するのが面倒くさいのでシェルスクリプトにした。

upimage.sh
#!/bin/sh

docker images | grep -v REPO | cut -f1 -d" " | uniq | xargs -n1 docker pull
docker images -f dangling=true -q | docker rmi

タスク管理ツールWekan(Trelloクローン)+VirtualBox+CoreOS+docker

Pocket

WekanとはTrelloクローン。
鉄壁のセキュリティに守られて、インターネッツに出て行けず、世の中のイケてるサービスを使えないせいで、「サービス名」+「alternative」というキーワードで検索するのが癖になっている今日この頃です。
Trelloのalternativeで見つけたのがWekan。
これをCoreOSにインストールする。

VirtualBox上のCoreOSにはdockerまでインストール済みの前提。
以下の手順に沿ってインストールする。
https://github.com/wekan/wekan/wiki/Install-Wekan-Docker-for-testing
https://docs.docker.com/compose/install/

URLの示す通り、テスト目的。
大量のユーザを相手にするのでなければ、これでも大丈夫でしょう。
参考までに書いておくと、テスト目的と、下記の本番用で示される構成の違いは、フロントエンドにApacheがあること。
テスト目的の方の手順だと、ユーザがいきなりWekanに接続する。

https://github.com/wekan/wekan/wiki/Install-Wekan-Docker-in-production

繰り返すが、本稿ではWekanに直接、繋げさせる構成でセットアップする。

docker-composeのインストール。

まず、docker-composeのインストール。
docker-composeはdockerの管理ツール。
インストール済みならこの章は飛ばしてよい。
公式サイトの手順だと、/usr/local/bin下にインストールすることになっているが、CoreOSだと読み取り専用なので、そこ以外の、たとえばホームディレクトリのbin下等に置く。
実行権限の付与も忘れないように。

$ curl -L https://github.com/docker/compose/releases/download/1.5.2/docker-compose-`uname -s`-`uname -m` > ~/bin/docker-compose
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   600    0   600    0     0    687      0 --:--:-- --:--:-- --:--:--   697
100 7739k  100 7739k    0     0  1458k      0  0:00:05  0:00:05 --:--:-- 1840k
$ chmod +x ./bin/docker-compose
$ ls -la ./bin/
total 7760
drwxr-xr-x 2 nobwak nobwak    4096 Jan  1 12:17 .
drwxr-xr-x 5 nobwak nobwak    4096 Dec  7 14:05 ..
-rwxr-xr-x 1 nobwak nobwak 7925655 Jan  1 12:17 docker-compose

docker-compose.ymlの作成。

wekanをインストールするディレクトリにdocker-compose.ymlを作成する。
以下の例では、ホストOS、つまりCoreOSのポート8081で待ち受ける。

wekan:
  image: mquandalle/wekan
  links:
    - wekandb
  environment:
    - MONGO_URL=mongodb://wekandb/wekan
    - ROOT_URL=http://localhost:80
  ports:
    - 8081:80

wekandb:
   image: mongo
   volumes:
     - /home/wekan/data:/data/db

もし、ホストOSの起動時に自動的にWekanも起動させたい場合には、冒頭部分を以下のように書き換える。

  wekan:
    image: mquandalle/wekan
    restart: always

Wekanの起動

docker-composeから立ち上げる。
まずdocker-compose –helpとして使い方を一覧しておこう。
初回起動時はupだが、二回目以降はstartで良さそうだ。

 $ docker-compose --help
Define and run multi-container applications with Docker.

Usage:
  docker-compose [-f=...] [options] [COMMAND] [ARGS...]
  docker-compose -h|--help

Options:
  -f, --file FILE           Specify an alternate compose file (default: docker-compose.yml)
  -p, --project-name NAME   Specify an alternate project name (default: directory name)
  --x-networking            (EXPERIMENTAL) Use new Docker networking functionality.
                            Requires Docker 1.9 or later.
  --x-network-driver DRIVER (EXPERIMENTAL) Specify a network driver (default: "bridge").
                            Requires Docker 1.9 or later.
  --verbose                 Show more output
  -v, --version             Print version and exit

Commands:
  build              Build or rebuild services
  help               Get help on a command
  kill               Kill containers
  logs               View output from containers
  pause              Pause services
  port               Print the public port for a port binding
  ps                 List containers
  pull               Pulls service images
  restart            Restart services
  rm                 Remove stopped containers
  run                Run a one-off command
  scale              Set number of containers for a service
  start              Start services
  stop               Stop services
  unpause            Unpause services
  up                 Create and start containers
  migrate-to-labels  Recreate containers to add labels
  version            Show the Docker-Compose version information

実際に作成&起動。

$ sudo ~/bin/docker-compose up
Creating wekan_wekandb_1
Creating wekan_wekan_1
Attaching to wekan_wekandb_1, wekan_wekan_1
wekan_1   | => Starting meteor app on port:80
(略)

もしうまくいかない場合には、imagesをいったん削除してやり直してみよう。
エラーなど無さそうなら次のステップへ。
なお、問題なく動作することを確認できたら、Ctrl+Cで停止。
次回以降は

docker-compose -d start

でよし。

VirtualBoxでポートフォワーディングの設定

上記で設定したCoreOSの待ち受けポートへの、VirtualBox上でのフォワーディングを設定する。
以下の例ではVirtualBoxを動かしているホストの8082が、VirtualBox上CoreOSの8081にフォワーディングされる。

13

接続確認

前章で設定したポートにブラウザで繋ぐ。
本稿の例で言えば、http://127.0.0.1:8082へ繋ぐ。
以下の画面になればOK
9
ユーザを新規登録し、もし英語が嫌なら設定を変える。
12

ボードとリストの設定。

ボードは適当に、リストは http://www.sekai-lab.com/times/?p=473 を参考に作成。
というか、どういうリストを作ればよいか、って結構なノウハウだと思うのだが、ありがたや。

 1. Tasks:タスクリスト(アサインと期日が定まっていないタスク)
 2. Todo:やることリスト(アサインと期日が定まったタスク, 優先順位を手動で並べ替える)
 3. Today:今日やることリスト
 4. Doing:作業中のタスク
 5. In review:他人がレビュー中のタスク(アサインをレビュー者に変更!)
 6. Done:完了したタスク

以上

No tags for this post.

[memo] CoreOSのインストール

Pocket

CoreOSを自分でインストールする。
目的は、VirtualBoxや、VMWarePlayer, vSphere(ESXi)等で動かす自前のCoreOSイメージを作成するため。

CoreOSの初期設定

CoreOSはユーザアカウント等の初期設定をインストール時に一括で行う。
「一括で」とわざわざ書いたのには理由がある。
通常、LinuxやFreeBSDなどのインストールでは、インストール時に対話インタフェースが実行され、質問に答える形で各種設定を行う。
しかしCoreOSでは、あらかじめ準備した設定ファイルを、インストール時に指定する方法を採る。
つまり設定ファイルさえ書いておけば、コマンド一発でインストールができるということ。

その設定ファイルがCloud-Config。

Cloud-Configの書き方

ここに記載がある。
https://coreos.com/os/docs/latest/cloud-config.html

いきなりここにあるすべての設定を書き込むのは、後述の手順を見てもかなり大変。
よって、必要最低限のものしか書かない。
具体的には、CoreOSにターミナルログインするユーザ設定のみ。
そこから先は、OSインストール後に実施する。

ISOイメージでブート

https://coreos.com/os/docs/latest/booting-with-iso.html
上記からダウンロード。
VirtualBoxでもなんでも、すきな仮想ソフトウェアに読み込ませて起動する。
なお、仮想マシン作成時、OSを選ぶ際には64bit Linuxを選んでおけばよい。

Cloud-Configを書く前に

必要なのは、作業用アカウントの設定だけ。
したがって、ID、パスワード、作業用アカウントの権限くらいでよい。
当然のことながらパスワードを平文で保存するわけにはいかないから、mkpasswdを使ってハッシュ化したものを書き込むこと。

パスワードハッシュの生成

作業用アカウントのパスワードハッシュを生成する。
もちろん、SSHの公開鍵でもいいのだが、パスワードハッシュの方が楽。

mkpasswdの使い方はmkpasswd -hで得られる。

 $ mkpasswd -h
Usage: mkpasswd [OPTIONS]... [PASSWORD [SALT]]
Crypts the PASSWORD using crypt(3).

      -m, --method=TYPE     select method TYPE
      -5                    like --method=md5
      -S, --salt=SALT       use the specified SALT
      -R, --rounds=NUMBER   use the specified NUMBER of rounds
      -P, --password-fd=NUM read the password from file descriptor NUM
                            instead of /dev/tty
      -s, --stdin           like --password-fd=0
      -h, --help            display this help and exit
      -V, --version         output version information and exit

If PASSWORD is missing then it is asked interactively.
If no SALT is specified, a random one is generated.
If TYPE is 'help', available methods are printed.

ハッシュ生成方法についてはmkpasswd -m helpで得られる。

$ mkpasswd -m help
Available methods:
des     standard 56 bit DES-based crypt(3)
md5     MD5
sha-256 SHA-256
sha-512 SHA-512

SHA-512までいけますね。
では、ハッシュ生成。
いったんテストして問題ないようなら、テキストファイルに書き込む。

$ mkpasswd -m sha-512 avedakedavra
$6$hIKFY6fnAE$gfpPpQu3rAcJMCeO3t93/3jUxVKBe7W/hC1.n5kwge3nnqsQngVnnoM8.jyWv/jYKbsJZoBm/6SSO7Ge4Zx/B0
$ mkpasswd -m sha-512 avedakedavra > cloud-config
$

以上でカレントディレクトリのcloud-configが生成された。
あとはこのcloud-configに必要な設定を書き加えるだけ。

Cloud-configの作成

設定ファイルの書式はYAML
YAMLは人間の眼には易しいが、フォーマットが合っているか不安になる。
その場合はatom等で書いておいてもよい。ハイライトしてくれるパッケージもある

そこで先述の通り必要最低限の記載だけする。
hostnameでホスト名、追加したいユーザと、そのユーザがsudoとdockerを使えるよう、groupに追加する。
以下のように。

#cloud-config

  hostname: "coreos"
  users:
    - name: "nobwak"
      passwd: $6$hIKFY6fnAE$gfpPpQu3rAcJMC....
      groups:
        - "sudo"
        - "docker"

 

CoreOSのインストール

作成したcloud-configを指定してインストールすればよい。
-dでインストール先デバイスを、-Cでチャネルを、-cで先ほど作成したcloud-configを指定する。

sudo coreos-install -d /dev/sda -C stable -c cloud-config

起動したら、作成したユーザでログインすることを確認する。
 

No tags for this post.

[メモ][FreeBSD] owncloud + nginx + php-fpm + MySQLのインストール

Pocket

owncloudは自家製dropboxのようなもの。
以下、メモ。

owncloudの構成

owncloudはphpで作られている。
そしてインタフェースはhttps。
したがって、動作にはowncloudのほかに、php, webサーバが必要。
さらにバックエンド用のデータベースソフトウェアも必要である。

packageのowncloud

owncloudはバックエンドのDBにMySQL, SQLiteなどが選べる。
個人用ならSQLiteでも大丈夫そうだが、packageに用意されているowncloudはMySQLが有効、SQLiteが無効になっている。
SQLite版owncloudが欲しければportsからコンパイルする必要がある。
これまた面倒なのでpackageのものを使った。
packageからowncloudをインストールすると、phpは勝手に入るが、webサーバ、MySQLは別にインストールする必要がある。
ここではwebサーバにnginxを選んだ。
ではMySQLは。

MySQLのバージョン選定

いや、MySQLはMySQLに決まっているんだが、実はpackageを探すと、5.1, 5.5, 5.6の三つがあるのだ。

$ pkg search "^mysql.*server"
mysql51-server-5.1.73_2
mysql55-server-5.5.43
mysql56-server-5.6.24

果たしてどれを選べばよいのであろうか。
http://www.liquidweb.com/kb/mysql-5-1-vs-5-5-vs-5-6-performance-comparison/
以上のURL他を見たところ、最新の5.6で良さそうなのでmysql56-server-5.6.24をインストールしておいた。

owncloudのインストール

packageで入れるだけ。
いっしょにnginx, mysql5.6も入れる。

# pkg install owncloud nginx mysql56-server

MySQLの設定

owncloudのデータベースを受け持つMySQLの設定
システム起動時にMySQLも自動的に起動するように設定。

# sysrc mysql_enable=YES
mysql_enable:  -> YES

すぐ起動

# service mysql-server start
Starting mysql.

mysql_secure_installationでセキュリティを高めておくと同時にスーパーユーザのパスワードも設定。

# mysql_secure_installation

データベースの作成
USERはユーザ名に、CHANGE_THIS_PASSWORDはパスワードに書き換えること。

# mysql -p -e "create user 'USER'@'localhost' identified by 'CHANGE_THIS_PASSWORD';"
# mysql -p -e "create database if not exists owncloud;"
# mysql -p -e "grant all on owncloud.* to 'USER'@'localhost' identified by 'CHANGE_THIS_PASSWORD';"
# mysql -p -e "flush privileges;"

phpの設定

owncloudはphpで書かれている。そのphpの設定。
とはいえ、特別、何かすることはない。

/usr/local/etcにあるphp.ini-production を、php.ini としてコピー

次に/usr/local/etc/php/extensions.ini に以下の記載があることを確認する(デフォルトで記載があるはず)

extension=pdo.so
extension=mysql.so

php-fpmの設定

そのままでは静的コンテンツしか扱わないnginxが、phpを実行できるようにするための設定。
php-fpmがデーモンとして動作し、nginxからの要求に応じてphpを実行して結果を返す。
したがってphp-fpmとnginxがどう通信するかを規定したり、システム起動時にphp-fpmが自動的に起動するような指定が必要。

まずはphp-fpmの設定。
/usr/local/etc/php-fpm.confに以下があればよい。
それ以外はむしろ冗長だし、見にくくなるので削ってしまってよい。

[global]
pid = run/php-fpm.pid
error_log = log/php-fpm.log

[owncloud]
listen=/var/run/php-fpm.socket
listen.owner=www
listen.group=www
listen.mode=0666
listen.backlog=-1
listen.allowed_clients=127.0.0.1
user=www
group=www
pm=dynamic
pm.max_children=4
pm.start_servers=1
pm.min_spare_servers = 1
pm.max_spare_servers = 2
pm.max_requests = 500
env[HOSTNAME] = $HOSTNAME
env[PATH] = /usr/local/bin:/usr/bin:/bin
env[TMP] = /tmp
env[TMPDIR] = /tmp
env[TEMP] = /tmp

システム起動時のphp-fpm起動設定
/etc/rc.conf内ではphp-fpmではなくphp_fpmとなることに注意(ハイフンではなくアンダースコア)

sysrc php_fpm_enable=YES
php_fpm_enable: -> YES

nginxの設定…の前に、SSLの準備

SSLのためにはサーバの鍵が必要。
手前味噌だが、ここにあるスクリプトを使ってくれい。

秘密鍵、証明書、DHパラメータ、三つのファイルを作成して、/usr/local/etc/sslあたりに入れる。

nginxの設定

以下、二つのサイトを参考にしつつ作成。

https://mozilla.github.io/server-side-tls/ssl-config-generator/?server=nginx-1.8.0&openssl=1.0.1l&hsts=yes&profile=intermediate
https://doc.owncloud.org/server/7.0/admin_manual/installation/nginx_configuration.html

出来たのが以下。

#user  nobody;
worker_processes  1;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       mime.types;
    default_type  application/octet-stream;

    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    #                  '$status $body_bytes_sent "$http_referer" '
    #                  '"$http_user_agent" "$http_x_forwarded_for"';

    #access_log  logs/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on;

    server {
        listen       80;
        server_name  localhost;

        return 301 https://$server_name$request_uri;
    }

    upstream php-handler {
        #server 127.0.0.1:9000;
        #server unix:/var/run/php5-fpm.sock;
        server unix:/var/run/php-fpm.socket;
    }

    server {
        listen       443 ssl;
        server_name  localhost;
        #
        # Generated with;
        # https://mozilla.github.io/server-side-tls/ssl-config-generator/?server=nginx-
1.8.0&openssl=1.0.1l&hsts=yes&profile=intermediate
        #

        # certs sent to the client in SERVER HELLO are concatenated in ssl_certificate
        ssl_certificate /usr/local/etc/ssl/server.crt;
        ssl_certificate_key /usr/local/etc/ssl/server.key;
        ssl_session_timeout 1d;
        ssl_session_cache shared:SSL:50m;

        # Diffie-Hellman parameter for DHE ciphersuites, recommended 2048 bits
        ssl_dhparam /usr/local/etc/ssl/dhparam.pem;

        # intermediate configuration. tweak to your needs.
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RS
A-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES
128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-
AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECD
HE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-D
SS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:ECDHE-RSA-
DES-CBC3-SHA:ECDHE-ECDSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256
:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!D
ES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA
';
        ssl_prefer_server_ciphers on;

        # HSTS (ngx_http_headers_module is required) (15768000 seconds = 6 months)
        add_header Strict-Transport-Security max-age=15768000;

        # OCSP Stapling ---
        # fetch OCSP records from URL in ssl_certificate and cache them
        ssl_stapling on;
        ssl_stapling_verify on;

        ## verify chain of trust of OCSP response using Root CA and Intermediate certs
        ssl_trusted_certificate /usr/local/etc/ssl/cert.pem;

        # end of generated


        #
        # copyed from https://doc.owncloud.org/server/7.0/admin_manual/installation/ngi
nx_configuration.html
        #

        # Path to the root of your installation
        root /usr/local/www/owncloud/;
        # set max upload size
        client_max_body_size 10G;
        fastcgi_buffers 64 4K;

        # Disable gzip to avoid the removal of the ETag header
        gzip off;

        # Uncomment if your server is build with the ngx_pagespeed module
        # This module is currently not supported.
        #pagespeed off;

        rewrite ^/caldav(.*)$ /remote.php/caldav$1 redirect;
        rewrite ^/carddav(.*)$ /remote.php/carddav$1 redirect;
        rewrite ^/webdav(.*)$ /remote.php/webdav$1 redirect;

        index index.php;
        error_page 403 /core/templates/403.php;
        error_page 404 /core/templates/404.php;

        location = /robots.txt {
                allow all;
                log_not_found off;
                access_log off;
        }

        location ~ ^/(?:\.htaccess|data|config|db_structure\.xml|README){
                deny all;
        }

        location / {
                # The following 2 rules are only needed with webfinger
                rewrite ^/.well-known/host-meta /public.php?service=host-meta last;
                rewrite ^/.well-known/host-meta.json /public.php?service=host-meta-json
 last;

                rewrite ^/.well-known/carddav /remote.php/carddav/ redirect;
                rewrite ^/.well-known/caldav /remote.php/caldav/ redirect;

                rewrite ^(/core/doc/[^\/]+/)$ $1/index.html;

                try_files $uri $uri/ /index.php;
        }

        location ~ \.php(?:$|/) {
                fastcgi_split_path_info ^(.+\.php)(/.+)$;
                include fastcgi_params;
                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                fastcgi_param PATH_INFO $fastcgi_path_info;
                fastcgi_param HTTPS on;
                fastcgi_pass php-handler;
        }

        # Optional: set long EXPIRES header on static assets
        location ~* \.(?:jpg|jpeg|gif|bmp|ico|png|css|js|swf)$ {
                expires 30d;
                # Optional: Don't log access to assets
                access_log off;
        }
    }

nginxの起動設定とサービススタート

# sysrc nginx_enable=YES
nginx_enable: -> YES

nginx, php-fpmを起動し、https://<サーバアドレス>にブラウザで繋げばOK

# service php-fpm start
# service nginx start

その他参考

https://doc.owncloud.org/server/7.0/admin_manual/configuration/database_configuration.html

No tags for this post.

[メモ]mysql_secure_installtaionは何をやっているの?

Pocket

https://dev.mysql.com/doc/refman/5.6/en/mysql-secure-installation.html

mysql_secure_installationは、perlで書かれたスクリプトで、MySQLのセキュリティを向上させることができる。
具体的には;
(MySQLの)rootのパスワード設定
localhost外からアクセス可能なrootアカウントの削除
anonymousユーザアカウントの削除
anonymousユーザ含め誰でもアクセス可能な「test」データベースの削除
test_から始まるデータベースへの接続権限の削除(デフォルトでは誰でもアクセスできる)

MySQLが動いている状態で、引数なしで実行すればよい。

sysrc mysql_enable=YES
mysql_enable:  -> YES

service mysql-server start
Starting mysql.

立ち上げておいて。

mysql_secure_installationを引数なしで実行。
rootパスワード以外はリターンキー連打でよし。

# mysql_secure_installation



NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MySQL
      SERVERS IN PRODUCTION USE!  PLEASE READ EACH STEP CAREFULLY!

In order to log into MySQL to secure it, we'll need the current
password for the root user.  If you've just installed MySQL, and
you haven't set the root password yet, the password will be blank,
so you should just press enter here.

Enter current password for root (enter for none):
OK, successfully used password, moving on...

Setting the root password ensures that nobody can log into the MySQL
root user without the proper authorisation.

Set root password? [Y/n] Y
New password:
Re-enter new password:
Password updated successfully!
Reloading privilege tables..
 ... Success!


By default, a MySQL installation has an anonymous user, allowing anyone
to log into MySQL without having to have a user account created for
them.  This is intended only for testing, and to make the installation
go a bit smoother.  You should remove them before moving into a
production environment.

Remove anonymous users? [Y/n] Y
 ... Success!

Normally, root should only be allowed to connect from 'localhost'.  This
ensures that someone cannot guess at the root password from the network.

Disallow root login remotely? [Y/n] Y
 ... Success!

By default, MySQL comes with a database named 'test' that anyone can
access.  This is also intended only for testing, and should be removed
before moving into a production environment.

Remove test database and access to it? [Y/n] Y
 - Dropping test database...
 ... Success!
 - Removing privileges on test database...
 ... Success!

Reloading the privilege tables will ensure that all changes made so far
will take effect immediately.

Reload privilege tables now? [Y/n] Y
 ... Success!




All done!  If you've completed all of the above steps, your MySQL
installation should now be secure.

Thanks for using MySQL!


Cleaning up...
No tags for this post.