basyura's blog

あしたになったらほんきだす。

Docker - ToolBox で動いてる dokuwiki のバックアップ

やっつけ。

C:\Program Files\Docker Toolbox\start.sh をコピーして backup.sh にリネームして編集。

                           ##         .
                     ## ## ##        ==
                  ## ## ## ## ##    ===
              /"""""""""""""""""\___/ ===
         ~~~ {~~ ~~~~ ~~~ ~~~~ ~~~ ~ /  ===- ~~~
              \______ o           __/
                \    \         __/
                 \____\_______/
   
   EOF
   echo -e "${BLUE}docker${NC} is configured to use the ${GREEN}${VM}${NC} machine with IP ${GREEN}$(${DOCKER_MACHINE} ip ${VM})${NC}"
   echo "For help getting started, check out the docs at https://docs.docker.com"
   echo
   cd
   
+  cd ワークディレクトリに移動
+  rm -rf backup
+  mkdir backup
+  cd backup
+  docker cp dokuwiki:/var/www/wiki/conf .
+  docker cp dokuwiki:/var/www/wiki/data .
+  docker cp dokuwiki:/var/www/wiki/lib/tpl .
+  cd ..
+  tar cvfz backup.targ.gz backup
+  rm -rf backup
+  
+  exit

backup.bat を作成。

cd "C:\Program Files\Docker Toolbox"
"C:\Program Files\Git\bin\bash.exe" --login -i "C:\{パス}\backup.sh"

タスクスケジューラに登録。

リストアする際は data フォルダを置き換えた後に chown -R nobody:nobody で変更。

Docker - DokuWiki をサブディレクトリ運用

DokuWiki が便利なので Docker で立ててみる。

インストール

コンテナを取得して起動 (nginx 版)

$ docker pull vimagick/dokuwiki
$ docker run -d -p 8000:80 --name dokuwiki

初期設定

サイトの設定

  • http://localhost:8000/doku.php?id=start&do=admin&page=config
  • ✓ を入れる → URL上の名前空間の区切りにスラッシュを使用
  • ✓ を外す
    • DokuWikiの更新とセキュリティに関する情報をチェックしますか?
    • 最初の見出しをページ名とする → 常に使用する
  • .htaccess を使用する

コンテナにログイン

$ docker exec -it dokuwiki sh

ディレクトリ名を変更

$ cd /var/www
$ mv html dokuwiki " ディレクトリが消えないけど放置

/etc/nginx/nginx.conf を編集

  • location ~* .(js ・・・ のところを消さないと画像が出ないのがよく分からない
/etc/nginx # diff nginx.conf.org nginx.conf
--- nginx.conf.org
+++ nginx.conf
@@ -17,7 +17,7 @@
  server_name             _;
  client_max_body_size    4M;
  client_body_buffer_size 128k;
- root                    /var/www/html;
+ root                    /var/www;
  index                   doku.php;
 
  location ~ /(data/|conf/|bin/|inc/) {
@@ -31,19 +31,19 @@
    log_not_found       off;
  }
 
- location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
-   expires  31536000s;            
-   add_header  Pragma "public";      
-   add_header  Cache-Control "max-age=31536000, public, must-revalidate, proxy-revalidate";
-   log_not_found  off;                                                                        
- }                                                                                                   



- location / {
+ location /dokuwiki {
    try_files     $uri $uri/ @dokuwiki;
  }
 
   location @dokuwiki {
-    rewrite   ^/_media/(.*) /lib/exe/fetch.php?media=$1 last;
-    rewrite   ^/_detail/(.*) /lib/exe/detail.php?media=$1 last;
-    rewrite   ^/_export/([^/]+)/(.*) /doku.php?do=export_$1&id=$2 last;
-    rewrite   ^/(.*) /doku.php?id=$1&$args last;
+    rewrite   ^/dokuwiki/_media/(.*) /dokuwiki/lib/exe/fetch.php?media=$1 last;
+    rewrite   ^/dokuwiki/_detail/(.*) /dokuwiki/lib/exe/detail.php?media=$1 last;
+    rewrite   ^/dokuwiki/_export/([^/]+)/(.*) /dokuwiki/doku.php?do=export_$1&id=$2 last;
+    rewrite   ^/dokuwiki/(.*) /doku.php?id=$1&$args last;
   }
      
   location ~ \.php$ {
-    try_files           $uri $uri/ /doku.php;
+    try_files           $uri $uri/ /dokuwiki/doku.php;
     include             fastcgi_params;
     fastcgi_param       SCRIPT_FILENAME $document_root$fastcgi_script_name;
     fastcgi_param       REDIRECT_STATUS 200;

nginx を再起動

$ nginx -s reload

Apache でリバースプロキシ

—link を指定してコンテナを作成する

docker run -d -p 80:80 --name apache \
                       --link dokuwiki:dokuwiki \
                       jmferrer/apache2-reverse-proxy

コンテナに入って設定を変える

$ docker exec -it apache bash
$ apt-get update
$ apt-get install vim
$ vi /etc/apache2/apache2.conf 

以下を追記

ServerName localhost
ProxyPass /dokuwiki http://dokuwiki/dokuwiki
ProxyPassReverse /dokuwiki http://dokuwiki/dokuwiki

再起動

$ apache2ctrl -k restart

Timezone の変更

dokuwiki/inc/init.php L88

// set timezone (as in pre 5.3.0 days)
// date_default_timezone_set(@date_default_timezone_get());                 
date_default_timezone_set('Asia/Tokyo'); 

Plantuml Plugin

プラグインをインストール

必要なソフトウェアをインストール

  • proxy 内からの場合は設定が必要
# apk update
# apk add fontconfig  // 結果いらなかったと思われ
# apk add ttf-dejavu  // 結果いらなかったと思われ
# apk add openjdk7
# apk add graphviz

日本語 (IPA) フォントを入れる

# wget http://ipafont.ipa.go.jp/old/ipafont/ipag00303.php
# unzip ipag00303.php
# mkdir -p /usr/share/fonts/ipa
# cp ipag00303.php/ipag.ttf /usr/share/fonts/ipa
# fc-cache -fv

plantuml.jar をダウンロードして配置

  • http://plantuml.com/download
    • wget でのとり方がよく分からんのでホストにダウンロードしてから docker cp で配置

サイトの設定

  • Render localy にチェック
  • jar のパスを指定 (dokuwiki が見える位置に置く)

Proxy

パッケージを更新しようとすると proxy 判定で失敗する。

~ # apk update
fetch http://dl-cdn.alpinelinux.org/alpine/v3.5/main/x86_64/APKINDEX.tar.gz
ERROR: http://dl-cdn.alpinelinux.org/alpine/v3.5/main: Permission denied
WARNING: Ignoring APKINDEX.c51f8f92.tar.gz: No such file or directory
fetch http://dl-cdn.alpinelinux.org/alpine/v3.5/community/x86_64/APKINDEX.tar.gz
ERROR: http://dl-cdn.alpinelinux.org/alpine/v3.5/community: Permission denied
WARNING: Ignoring APKINDEX.d09172fd.tar.gz: No such file or directory

proxy 設定を変更。かなりハマってここだけで半日ぐらい消費。

export http_proxy=http://{host}:8080
export HTTP_PROXY_AUTH=basic:*:proxyuser:proxypass

まとめ

次はコンテナを作ってみる。

Docker Toolbox + Windows8 のインストール

windows 上で docker を使って dokuwiki を動かしたくて環境を作る。php だし windows で動かすのは難しくないのだけど、何事も試してみたいしうまく行けば他にも動かしたいものがある。パフォーマンスがもっさりなのか、それなりに速いのかも実際どうなのか気になる。

インストール

windows8 では Docker for Windows が動かないので、Docker Toolbox をダウンロード (docker.io でダウンロードできるのは古そう) してインストール

ConEmu で動かしたいので Task を登録。

"C:\Program Files\Git\bin\bash.exe" --login -i "C:\Program Files\Docker Toolbox\start.sh" "-new_console:d:C:\Program Files\Docker Toolbox"

プロキシ

.bashrc に proxy と no_proxy を設定する

export no_proxy=192.168.99.100
export http_proxy=・・・

VirutalBox のイメージに直接入って proxy を設定する

  • var/lib/boot2docker/profile に http_proxy= を追記
  • us キーボードなので注意
  • イメージを再起動

ポートフォワーディング

dokuwiki を立てるとして、docker を動かしている端末から localhost (127.0.0.1) でアクセスする場合と、外からアクセスする場合を定義。localhost はいらないと思う。

f:id:basyura:20170504210247p:plain

VirutalBox のイメージに入って proxy を設定するところがずっと分からずはまってた。知ってる人に聞けたから良かったけど web を漁ってるだけで見つけられたかなぁ。それっぽい記述は見るのだけど繋がらなかった。

いろいろハマったので以下にメモ。

Docker 立ち上がりでエラー

もともと Virtual Box が入ってたのか記憶が定かではないけど Docker の立ち上がりでエラーが出る

Starting "default"...
(default) Check network to re-create if needed...
Unable to start the VM: C:\Program Files\Oracle\VirtualBox\VBoxManage.exe startvm default --type hea
dless failed:
VBoxManage.exe: error: Failed to open/create the internal network 'HostInterfaceNetworking-VirtualBo
x Host-Only Ethernet Adapter #2' (VERR_INTNET_FLT_IF_NOT_FOUND).
VBoxManage.exe: error: Failed to attach the network LUN (VERR_INTNET_FLT_IF_NOT_FOUND)
VBoxManage.exe: error: Details: code E_FAIL (0x80004005), component ConsoleWrap, interface IConsole

Details: 00:00:01.315564 Power up failed (vrc=VERR_INTNET_FLT_IF_NOT_FOUND, rc=E_FAIL (0X80004005))
Looks like something went wrong in step ´Checking status on default´... Press any key to continue...

パラメータ指定で VirtualBox を入れたら動いた

VirtualBox-5.1.14-112924-Win.exe -msiparams NETWORKTYPE=NDIS5

バージョン違い

$ docker version
time="2017-04-23T20:40:06+09:00" level=info msg="Unable to use system certificate pool: crypto/x509: system root pool is not available on Windows"
Client:
 Version:      17.03.1-ce
 API version:  1.27
 Go version:   go1.7.5
 Git commit:   c6d412e
 Built:        Tue Mar 28 00:40:02 2017
 OS/Arch:      windows/amd64

Server:
 Version:      17.04.0-ce
 API version:  1.28 (minimum version 1.12)
 Go version:   go1.7.5
 Git commit:   4845c56
 Built:        Wed Apr  5 18:45:47 2017
 OS/Arch:      linux/amd64
 Experimental: false

あまり検証できてないけど、Client と Server のバージョンが一致しなかったので Docker と VirtualBox 両方を消してからインストールし直した。

go 製コマンドラインツールを配布

日々の開発で非効率だなと前々から思っていた件を解決するためのコマンドラインツールを go で作成して配布した。チーム内では予想以上に反応が良かったのでみんな思うことは一緒だったんだろう。我慢強い。てんこ盛りになりそうだけど当面はサブコマンドを増やしていきつつ様子を見る。

go を書くこと自体は初めてではないけれど、明確な目的を持って書いた事はなかった。どう実現するか頭を捻るので吸収しやすい。

みんなのGo言語[現場で使える実践テクニック]

みんなのGo言語[現場で使える実践テクニック]

  • 作者: 松木雅幸,mattn,藤原俊一郎,中島大一,牧大輔,鈴木健太
  • 出版社/メーカー: 技術評論社
  • 発売日: 2016/09/09
  • メディア: Kindle版
  • この商品を含むブログを見る

いざはじめようとすると環境をどう作ったらいいのか困る。「第 1 章 Go によるチーム開発のはじめ方とコードを書く上での心得」が非常に参考になった。環境ができてしまえば進められる。

途中まで読んで作り始めてしまったのだけど、「4.4 サブコマンドを持った CLI ツール」とそれほどズレてなかったので一安心。

スターティングGo言語 (CodeZine BOOKS)

スターティングGo言語 (CodeZine BOOKS)

これも読んでいたんだけど、あまり頭に入ってなかった。復習を兼ねて基礎的なところを読み直し中。

まだ慣れて無くてお作法を勉強中。思ってたほど違和感は感じないので 先駆者の記事を有りがたく読ませていただきつつ、API リファレンスを読みつつすれば書いていけそう。C を挫折した 勢なので * とか & がモヤっとしてるけど。あと、exe をポンと渡して「使って」と言うだけで済むのが楽。

仕事で使った?はグレーゾーンだけど、ひとまず投入成功。

Vivaldi - 1.8.770.54

ブラウザの設定をいじりまくるの久しぶりだから楽しい。

  • クイックコマンドを使うとフォーカスがどこにいくのか cVim で操作を継続できない。
  • マウスジェスチャーがシビア。きっちりジェスチャーしないと反応しない。
  • タブ移動は cVim で <C-f> <C-b> にあてているけど、ie-tab なダブからは移動できない。Vivaldi 本体の設定であてている <C-.> <C-,> なら移動できて便利。
  • タブを閉じるを cVim で <C-w> に当ててるけどたまに効かなくなったり、拡張などの効かないページもある。Vivaldi 本体の設定であてている <C-q> で閉じれる。こっちで閉じるほうが多くなってきてるかも。q だけの方が押しやすそうに思えるけど、<C-q> の方が押しやすい不思議。
  • 1.8 のパッチバージョンが当たってから?別タブを開いて描画されるまでに 2, 3 秒の謎の待ち時間が発生するようになった。プラグインのせい?
  • Adblock Plus を入れた。
  • Instapaper を入れた。
  • Keyboard Control for Chrome を入れた。”open history entry in new tab” を <C-1> にマッピング。cVim にもあるっぽいけどこっちの方が使いやすい。ただ、/ を一回押さないと絞り込みができないのが微妙。最初から絞り込めたらいいのに。他にも設定があるけど history だけ使ってる。

Vivaldi - 新しいタブでブックマークを開く

f:id:basyura:20170404213050p:plain:w600

設定にあった。便利。アドレスバーかららも常に新規タブにしてほすぃ。

cVim のコマンドバーからの実行も別タブで開きたい

key.js をいじる。

  var tab = {
    active: true,
    newWindow: false,
    isURL: false,
    isLink: false,
    pinned: false,
-   tabbed: false,
+   tabbed: true,
    incognito: false,
  };

cVim のコマンドバーでも C-p 、C-n で選択肢を上下移動したい

set cncpcompletion すればいいんだけど、アドレスバーでも C-p C-n するために Karabiner or AutoHotkey で Up Down にマッピングしてるので発動しない。key.js をいじる。

      case '<Up>': // Command history navigation/search
      case '<Down>':
+
+       if (Command.type === 'action' && settings.cncpcompletion) {
+         event.preventDefault();
+         if (key === '<Up>') {
+           Mappings.actions.previousCompletionResult();
+         }
+         else  {
+           Mappings.actions.nextCompletionResult();
+         }
+         return;
+       }

        event.preventDefault();
        Command.history.cycle(Command.type, (key === '<Up>'));
        break;

Vivaldi + cVim

長らく Firefox + keysnail を使っていたけど Vivaldi + cVim に乗り換えられそう。まだまだ気になるところがあるけど。Chrome と違って Vivaldi だと本体のショートカットキーを変えたり消したりできるので便利。

まだ?できないこと&微妙な所

  • テキストボックスでの undo redo をマッピングできない
  • アドレスバーでのキーマッピングができない (windows でのカーソル移動がつらい)
  • コマンドラインで日本語入力確定のための enter を押すと入力が確定されてしまう。<Ctrl-Enter> も反応する。Mac 版のみで Windows では大丈夫そう。 → インストール済みプラグインの js をいじって Ctrl+Enter は回避。
  • アドレスバーから検索した時に文字化けする時がある。
  • アドレスバーで url 確定した時に新しいタブで開けない。
  • Windows だとアドレスバーで c-e といったキーバインディングが使えない
    • アドレスバーでだけ発動するキー設定はどうやったらいいんだ?
  • Ctrl+p Ctrl+n で選択肢も含めて上下に移動したいけどデフォルトではできそうにない&バッティングしそうなので、AutoHotkey または Karabiner でリマップして対応。

Firefox に比べて全てがキビキビしているし、長時間使っている場合のメモリが増加したまま開放されないとか、それによる動作のもっさり感も無い。Firefox には戻れないかもしれない。タブのプロセス化にあたって拡張が Chrome と一緒になるし、積極的に使うメリットが無くなる気がする。期待はしているけど。

いまのところの設定ファイル