徒然なるままに プログラミングメモや日々の生活などつれづれとつづっていくblog

2018年4月22日

1つのサーバーでMastodonとPleromaを運用すると相互にフォローできない件

Filed under: Docker,Mastodon,OSS,オープンソース — ranpei @ 8:31 PM

うちの鯖ではDockerで構築したMastodonとPleromaとMisskeyの各インスタンスをVirtualHostでドメインごとに振り分ける運用をしています。

 

ただ、外部のインスタンスとはフォローし合えるのに内部のインスタンス同士ではフォローできずに困っておりました。

 

で、原因を探ったら以下の手順を踏むことで回避できました。

■回避方法

  1. DNSやhostsを使って名前解決できるようにする。
  2. Mastodonのソースをいじる。

 

順に説明していきます。

 

1.DNSやhostsを使って名前解決できるようにする。

まあ、これは真っ先に疑うことですよね^^;

LAN内部からドメインでアクセスするためには内部DNSを構築するかhostsを書き換えなければいけません。

うちは内部DNSを構築済みだったためこいつに設定を追加するだけで済みました。

そして、相互に名前解決できるようになったのですがこれだけでは不十分という・・・・

(一応Mastodonの検索欄で”@名前@ドメイン”で検索した際のエラーが「503 Remote data could not be fetched」→「422 Mastodon::HostValidationError on ドメイン」と変化しました)

 

 

2.Mastodonのソースをいじる。

この「422 Mastodon::HostValidationError」ってエラーについて調べてみてもよくわかんない(422ってWebDav拡張のステータスらしいですが・・・)

しょうがないのでMastodonのソースを見て「Mastodon::HostValidationError」がスローされている箇所を見てみると

app/lib/request.rb(135行目)に気になる部分を発見。

[ruby]
Addrinfo.foreach(host, nil, nil, :SOCK_STREAM) do |address|
begin
raise Mastodon::HostValidationError if PrivateAddressCheck.private_address? IPAddr.new(address.ip_address)
return super address.ip_address, *args
rescue => e
outer_e = e
end
end
[/ruby]

これはプライベートアドレスの場合は問答無用にHostValidationErrorにしている??

 

で、PrivateAddressCheckについて調べてみるとconfig/environments/development.rbでわざわざfalseを返すように書き換えを行っていました。

ということはここのチェックでfalseとなるようにすればいいのでは??っと思いconfig/environments/production.rb側に以下の記載を追記。

[ruby]
module PrivateAddressCheck
def self.private_address?(*)
false
end
end
[/ruby]

 

そしてDockerコンテナをビルドしなおしてみると・・・・

[shell]

$ docker-compose build web
$ docker-compose up -d

[/shell]

無事検索欄で”@名前@ドメイン”で検索してもちゃんとアカウントが表示されるようになりましたv^^v

 

 

とりあえずフォローできない問題は解決したんですが以下の2つが気になる。。。

  1. Mastodonはなぜわざわざプライベートアドレスをはじくようにしているのか?
  2. この対応の仕方で不都合が起きることはないのか?

そんなわけでこの対処方法は自己責任で行ってください。

2018年2月9日

Mastodonでリモートフォローが「承認待ち」になる場合の対処方法

Filed under: apache,Docker,Mastodon — ranpei @ 9:58 PM

2月初めごろからかな?(実はもっと前からあって表面化したのかそれぐらいかもしれませんが)

フォローすると「承認待ち」のステータスになり、

連合にも相手の最新のトゥートが出てこないなどの弊害が多数発生していました。

 

デバッグモードでログを追ったり、Mastodonのソースを読んだりしていろいろ調べましたましたが

結局Nginxの設定の問題だと分かったため、情報共有の目的でここに書かせていただきます。

 

 

■問題の設定

・変更前

[shell]
ssl_certificate /etc/letsencrypt/live/mstdn-jp.site/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/mstdn-jp.site/privkey.pem;
ssl_trusted_certificate /etc/letsencrypt/live/mstdn-jp.site1/chain.pem;
[/shell]

・変更後

[shell]
ssl_certificate /etc/letsencrypt/live/mstdn-jp.site/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/mstdn-jp.site/privkey.pem;
#ssl_trusted_certificate /etc/letsencrypt/live/mstdn-jp.site1/chain.pem;
[/shell]

ssl_trusted_certificateの設定をなくしただけですね。

(そもそもssl_trusted_certificateに指定する証明書間違ってるって突っ込みはなしでお願いします;;)

 

■なぜこれで治ったのか?

実は明確な原因はわかっていません;;

 

ただソースを見る限りActivityPubはSSLを基盤としているため証明書の評価を行っているようなんです。

その評価の過程でActivityPubでのやり取りが途中で止まってしまっていたのでは?と疑っています。

 

 

何はとも本来非公開ユーザーをフォローした場合にしかありえない「承認待ち」が

公開ユーザーでも発生するって場合はSSL証明書を疑って見た方がいいみたいです。

 

2017年4月20日

Mastodonで現在接続中のインスタンス一覧を取得する

Filed under: Docker,Mastodon — ranpei @ 1:33 AM

aboutなら接続中インスタンスの”数”ならわかるんですが、

実際どんなドメインと接続しているか知りたい場合に調べる方法です。
うちはdocker環境で運用していますが、PostgreSQLに接続してSQL叩ければOKです。

■ 接続ドメインの一覧を取得

[shell]
# docker exec -it mastodon_db_1 bash
# psql -U postgres
# select * from (select distinct domain from accounts) as domains;
domain
—————————
social.targaryen.house

mastodon.potproject.net
gs.yvt.jp
cksv.jp
mstdnjp.wipiano.net
mastodon.noraworld.jp
pawoo.net
z-socialgame.mstdn.cloud
mstdn.h3z.jp
mstdn.techdrive.top
mstdn.hakai-macaron.com
js4.in
yontengop.com
unnerv.jp
mstdn.club
md.ggtea.org
friends.nico
7144.party
ostatus.ikeji.ma
gnusocial.cardina1.red
octodon.social
cybre.space
mastodon.social
im-in.space
mstdn-workers.com
kero.ccsakura.jp
m6n.onsen.tech
mstdn.maud.io
mstdn.kemono-friends.info
mstdn.social
boitam.eu
mstdn.io
mstdn.sanin.club
mastodon.2502.net
mastodon.paas.jp
mstdn.nere9.help
mstdn.nukaya.net
mastodon.juggler.jp
mstdn.mobilehackerz.jp
mastodon.motcha.tech
m.sighash.info
jp-mstdn.com
mastodon.cloud
mstdn.aoitofu.net
toot.mst-dn.me
mdn.hinaloe.net
mastodon.yumulab.org
mstdn.jp
mstdn.7kry.net
ostatus.isidai.com
pao.moe
toot.kashishokunin.com
mstdn.uec.tokyo
oransns.com
mstdn.haun.jp
gs.smuglo.li
mastodon.oresys.nagoya
toot.yukimochi.jp
(59 rows)
[/shell]

空行が出てますがこれはローカルユーザーですので 59 – 1 = 58で接続インスタンス数にマッチしました。

 

追記)

v1.2.2で管理画面にUIが追加になりました。

https://github.com/tootsuite/mastodon/releases

  • List of known instances in admin UI (#2095)

 

2017年4月18日

Mastodonインスタンスの立て方おさらい

Filed under: Docker,Mastodon — ranpei @ 8:04 PM

前回はさらっと流したけど、設定の足りていない部分などもあって

ちょくちょくいじっていたので整理も含めておさらいしてみます。

なお、構築環境は CentOS 7.0 (64bit)で以下はすでにあるものとして話しを進めます。

  • 外部送信可能なメールサーバー
  • 独自ドメイン

 

■Mastodonインスタンスの構築

・前提条件

Docker、Docker-Compose、Gitがインストール済みであること(なければここを参考にインストールしてください。)

・構築手順

1. 任意の場所にGitリポジトリをClone

[shell]

# git clone https://github.com/tootsuite/mastodon.git

[/shell]

2. データ永続化

[shell]
# cd mastodon
# vi docker-compose.yml
———————————————————–
# volumes:
# – ./postgres:/var/lib/postgresql/data
  ↓ コメントを外す
volumes:
– /opt/mastodon/postgres:/var/lib/postgresql/data

# volumes:
# – ./redis:/data
  ↓ コメントを外す
volumes:
– /opt/mastodon/redis:/data
———————————————————–
[/shell]

単にコメントを除去するだけでも良いのですが、
事故防止のためリポジトリの外に保存するようにしています。

 

3. 本番設定ファイルを編集

[shell]

# cp .env.production.sample .env.production
# vi .env.production

———————————————————–
LOCAL_DOMAIN=[独自ドメイン]
LOCAL_HTTPS=false ← いったんHTTPとしておきます(Nginx設定時に書き換えます)

PAPERCLIP_SECRET=[docker-compose run –rm web rake secretの実行結果(1回目)]
SECRET_KEY_BASE=[docker-compose run –rm web rake secretの実行結果(2回目)]
OTP_SECRET=[docker-compose run –rm web rake secretの実行結果(3回目)]

SMTP_SERVER=[SMTPサーバー]
SMTP_PORT=[SMTPポート]
SMTP_LOGIN=[SMTP認証ユーザー]
SMTP_PASSWORD=[SMTP認証パスワード]
SMTP_FROM_ADDRESS=[送信メールアドレス] ← このアドレスで通知メールが送られます
———————————————————–
[/shell]

※ PAPERCLIP_SECRET、SECRET_KEY_BASE、OTP_SECRETに注意が必要です。
それぞれに別々のキーが必要なため生成コマンドを計3回実行して別々のキーを設定してください。

 

4. Dockerコンテナのビルド

[shell]
# docker-compose build
[/shell]

 

5. 初期データ構築(DBテーブルや静的ファイルなど)

[shell]
# docker-compose run –rm web rails db:migrate ← DB構築(正確にはDBマイグレーションというらしい)
# docker-compose run –rm web rails assets:precompile ← 静的ファイル作成みたい
[/shell]

6. Dockerコンテナ群の起動

[shell]
# docker-compose up -d
[/shell]

“# docker ps -a”で5つのコンテナすべてが「UP」となっていることを確認後、
ブラウザを開き http://[ドメイン or IP]:3000 で画面が表示されることを確認しましょう。

 

■Nginxの設定(SSL対応)

・前提条件

Nginx、Gitがインストール済み

・構築手順

1. Let’s Encryptのインストール

[shell]
# git clone https://github.com/letsencrypt/letsencrypt.git
# cd letsencrypt
# ./letsencrypt-auto –help ← これで必要なパッケージがインストールされる
[/shell]

 

2. 証明書作成

[shell]
# git clone https://github.com/letsencrypt/letsencrypt.git
# cd letsencrypt
# ./letsencrypt-auto –help ← これで必要なパッケージがインストールされる
※初めての場合は途中で規約同意とメールアドレスを求められますので入力します。
[/shell]

生成が完了すると /etc/letsencrypt/archive/[独自ドメイン]/ 配下に必要ファイルが生成されています。

3. Nginxの設定(VirtualHost)

[shell]
# cd /etc/nginx/conf.d
# vi [独自ドメイン].conf
 ———————————————————–
 server {
  listen 80;
  listen [::]:80;
  server_name [独自ドメイン];
  return 301 https://$host$request_uri;
 }
 server {
  listen 443 ssl;
  listen [::]:443 ssl;
  server_name [独自ドメイン];

  ssl_certificate /etc/letsencrypt/archive/[独自ドメイン]/fullchain1.pem;
  ssl_certificate_key /etc/letsencrypt/archive/[独自ドメイン]/privkey1.pem;

  proxy_set_header X-Real-IP $remote_addr;
  proxy_set_header X-Forwarded-Proto $scheme;
  proxy_set_header X-Forwarded-Host $http_host;
  proxy_set_header X-Forwarded-Server $host;
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  proxy_read_timeout 600s;
  proxy_connect_timeout 10s;

  location / {
   proxy_set_header Host $host;

   proxy_pass http://127.0.0.1:3000/;
   proxy_redirect http://127.0.0.1:3000/ https://$host/;

   proxy_redirect default;
  }
  location /api/v1/streaming { ← 初期の手順では抜けてることが多いです。
   proxy_set_header Host $host;
   proxy_set_header Proxy "";
   proxy_http_version 1.1;
   proxy_set_header Upgrade "upgrade";
   proxy_set_header Connection $connection_upgrade;

   proxy_pass http://127.0.0.1:4000;
   proxy_redirect http://concrete https://$host;

   tcp_nodelay on;
  }
 }
 ———————————————————–

[/shell]

あくまでメモなので最小限ですが公式に設定ファイルのサンプルがありますので、
そちらを編集した方がよいでしょう。

 

4. 本番設定ファイルを編集

[shell]
# vi .env.production
 ———————————————————–
 //確認のためHTTPとしていた箇所をHTTPSオンリーに変更します。
 LOCAL_HTTPS=false
  ↓
 LOCAL_HTTPS=true
 ———————————————————–
[/shell]

 

5. 設定反映

[shell]
# docker-compose up -d ← これで.env.productionファイルが反映されます(再ビルドの必要はありません)
# service nginx restart
[/shell]

ブラウザを開き https://[独自ドメイン] で画面が表示されることを確認しましょう。

 

以上が今までやってきたことのまとめになります。

2017年4月15日

Mastodonインスタンス(サーバー)を構築してみる

Filed under: Docker,Mastodon — ranpei @ 8:53 PM

ここ数日何やらMastodonというのが話題となっているらしく、

新しいもの好きとして早速試してみました。

 

 

当サーバーはDocker導入済みのため、

GitHubからCloneして、GitHub上説明をもとに構築するとサーバー構築自体はあっさりと終わりました。

やはりこういうところがDockerの強みだな・・と改めて思いましたね。(唐突な所感w)

 

ただ、アカウントを作成しようとしたところで少し躓きましたのでメモ。

 

■発生した問題

Mastodonにアカウントを登録すると確認メールが送信されてくるのですが、

なぜかそのメールがいくら待っても送られてこないのです。

 

自前のメールサーバーに問題があるのか?と思い調べてみても

コマンドやメールクライアントからの送信は普通にできるため

何が原因だろうと思っていたら以外な方法で解決してしまいました。

 

■解決した方法

この問題、メールサーバーをIPアドレスで指定せず、ドメインで指定することで送られるようになりましたw

 

実装がどうなっているかわかりませんが、

設定ファイルのコメントで外部メールサーバー(https://sparkpo.st/smtp)の利用を推奨しているので

IPアドレスで接続するのはそもそも想定していない?のか??

 

まあ、何はともあれこれで利用できるようになったのでいいとしますか。(内部DNS作っててよかった~)

 

以下のドメインで公開しておりますので試しに触ってみたいという方はどうぞ

https://mstdn-jp.site/

 

 

P.S

メールに関して少し調べると「メール送信の遅延」が確認されているとのことですが、

私の勝手な想像ですが、みんなsparkpo.stを使うもんだからアクセス数が増大して

遅延してるんじゃないんですかね・・・

2016年11月7日

Docker + LDAP+ MailServer(Postfix + dovecot) + Roundcubeを構築する

Filed under: Docker,Linux,OSS,postfix,Roundcube,オープンソース — ranpei @ 3:11 AM

ちょっと流れから脱線しますが、

Dockerを使ってのメールサーバー構築に成功したため

その内容をメモとして残します。

 

1.メールサーバーの要件

現在のメールサーバーの使い方なのですが、

以下の2つがあるためこれらを満たす必要があります。

・サービス毎のメールアカウント管理

・フリーメールの集約

サービス毎のメールアカウントを管理するのは前にも言ったようにLDAPL+バーチャルメールボックスで行けるのですが、

フリーメールの集約はFetchmailを使っているためこれが動作する環境である必要があります。

ではできるのか?というとRoundcubeにはFetchmailの設定をWeb上で行えるプラグインが存在します。

ですが、Fetchmailは取得したメールをローカルのMDAにフォーワードすることしかできないのできません。

つまりRoundcube自身にプラグインが入った状態でなおかつローカルにMDAが存在する必要があるのです。

 

2.考えられる構成は?

考えられる構成は2種類あります。

1つは以下のようにすべてを1つのContainerにまとめること。

%e3%83%a1%e3%83%bc%e3%83%ab%e3%82%b5%e3%83%bc%e3%83%90%e3%83%bc_%e5%8d%98%e4%b8%80%e3%82%b3%e3%83%b3%e3%83%86%e3%83%8a

もう1つは以下のように転送用のメールサーバーを構築してメインのメールサーバーにメールを転送すること。

%e3%83%a1%e3%83%bc%e3%83%ab%e3%82%b5%e3%83%bc%e3%83%90%e3%83%bc_%e5%88%86%e9%9b%a2%e5%9e%8b

 

今回はどうしてもメールサーバーとRoundcubeは別に構築したかったため後者で構築を行いました。

 

3.メールサーバーを構築する

これらのContanerについては要件を満たすものがなかったため

DockerHub上のものを改造する形で自分で作りました。

GitHubに挙げてますのでダウンロードしてください。

 

[shell]
// メールサーバーのチェックアウト
$ git clone https://github.com/gittrname/mailserver-ldap.git
// Roundcube + Fetchmailサーバーのチェックアウト
$ git clone https://github.com/gittrname/roundcube-fetchmail.git
[/shell]

・docker-compose.yml

[shell]
version: ‘2’
services:
mail:
build: mailserver-ldap
ports:
– "25:25"
– "465:465"
– "587:587"
– "110:110"
– "143:143"
– "995:995"
– "993:993"
links:
– ldap
extra_hosts:
– "mail.example.com:127.0.0.1"
environment:
– "LDAP_SERVER=ldap"
– "DOMAIN=example.com"
– "HOSTNAME=mail.example.com"
– "LDAP_BASE=ou=People,dc=example,dc=com"
– "LDAP_USER_FIELD=uid"
roundcube:
build: roundcube-fetchmail
ports:
– "80:80"
links:
– ldap
– mail
extra_hosts:
– "fetch.example.com:127.0.0.1"
environment:
– "ROUNDCUBE_DEFAULT_HOST=mail"
– "ROUNDCUBE_SMTP_SERVER=mail"
– "ROUNDCUBE_USERNAME_DOMAIN=example.com"
– "HOSTNAME=fetchmail.example.com"
ldap:
image: sharaku/ldap
ports:
– "8080:80"
environment:
– "LDAP_DOMAIN=example.com"
– "LDAP_ADMIN_PWD=password"
– "LDAP_ORGANISATION=LDAP for docker."

[/shell]

 

※ RoundcubeとLdapAdminのポートが被らないようにしてください。

後はLdapAdmin上でユーザーを作成すればメールアカウントの作成は完了します。

 

 

定期的なメールの取得はログインした後「設定」⇒「Fetchmail]で設定します。

取得先のドメイン、ユーザー、パスワードを設定すると15分間隔でメールを取得し、

ログインユーザー@ドメインにメールを転送します。

 

ちょっとデータの永続化に多少の不安がありますが

一応、やりたいことはできたので公開してます。

2016年10月28日

Docker + PowerDNS + Sqlite + PowerDNS AdminでDNSサーバーを作る

Filed under: Docker,ESXi,OSS,オープンソース — タグ: — ranpei @ 12:00 AM

内部ツール系サーバーを構築するに当たり

内部DNSサーバーにはBindでは無くPowerDNSを使用していきます。

 

PowerDNSを使うことにしたのは単にGUIツールが存在しており

ファイルをいじって設定する手間が省けるな~とおもたっからですw

 

1.Dockerイメージを作成する

管理するドメインは大した量ではないのでDBにはSqliteをチョイス

管理GUIはSqliteに対応した物が無いため、API駆動のPowerDNS Adminを選んでみました。

PowerDNS + SqliteのDockerイメージは見つかったものの、

PowerDNS AdminのDockerイメージは見つからないし・・・・

そもそもこれぐらいならひとまとめにしてもいいじゃない!

ってことでPowerDNS + Sqliteをベースに自分で作ってみました。

[github]

PowerDNS Adminが80番ポートを使用するため、

PowerDNS標準のWebサーバーが8080番ポートに変更になっています。

また、内部運用するに当たり「DNSフォワーダ」の設定が追加されたので

管理外ドメインの問い合わせを外部にフォーワードしてくれます。

2.Dockerコンテナを起動する

[shell]
$ git clone https://github.com/gittrname/powerdns-sqlite3-gui.git
$ docker build -t powerdns-sqlite3-gui powerdns-sqlite3-gui
$ docker run -p 53:53/tcp -p 53:53/udp -p 80:80 powerdns-sqlite3-gui
[/shell]

起動したらブラウザでGUIにアクセスしまずは管理用アカウントを新規に作成してください。

powerdnsadmin%e3%83%ad%e3%82%b0%e3%82%a4%e3%83%b3%e7%94%bb%e9%9d%a2 powerdnsadmin_%e3%82%a2%e3%82%ab%e3%82%a6%e3%83%b3%e3%83%88%e7%99%bb%e9%8c%b2

作成したアカウントでログインしたらドメインを追加しレコードの設定を行います。

powerdnsadmin_%e3%83%80%e3%83%83%e3%82%b7%e3%83%a5%e3%83%9c%e3%83%bc%e3%83%89 powerdnsadmin_%e3%83%89%e3%83%a1%e3%82%a4%e3%83%b3%e8%bf%bd%e5%8a%a0

digコマンドで動作の確認ができればDNSサーバーの構築は完了です。

[shell]

$ dig www.ranran.mydns.jp @[DNSサーバーのIP]

; <<>> DiG 9.10.3-P4-Ubuntu <<>> www.ranran.mydns.jp @[DNSサーバーのIP]
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 35567
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1680
;; QUESTION SECTION:
;www.ranran.mydns.jp. IN A

;; ANSWER SECTION:
www.ranran.mydns.jp. 3600 IN A [対象サーバーのIP]

;; Query time: 43 msec
;; SERVER: 192.168.11.102#53(192.168.11.102)
;; WHEN: Thu Oct 27 23:59:11 JST 2016
;; MSG SIZE rcvd: 64

[/shell]

2016年10月20日

既存サーバーのConcrete5データをDockerコンテナに移設する

Filed under: Concrete5,Docker,Linux,OSS,オープンソース — ranpei @ 6:09 AM

Concrete5のデータを移行していきましょう。

やり方はConcrete5公式の「concrete5 サイトを復旧(リストア)する方法」を参考にすればすんなりいきます。

 

1.移設元サーバーから移設データを取り出す

[shell]
# cd /var/www/html/concrete
// データ格納フォルダをtarで固める
# tar cvf concrete-content.tar blocks/ css/ elements/ files/ helpers/ jobs/ js/ languages/ libraries/ mail/ modules/ packages/ page_types/ single_pages/ sitemap.xml themes/ tooles/ updates/
//SQLデータをエクスポート
# mysqldump -u {ユーザー名} -p {パスワード} {データベース名} >> concrete-export.sql
[/shell]

2.Dockerコンテナに反映させる

コンテンツファイルをDockerコンテナに反映させる。

※ コンテナ名:concrete

[shell]
// SCPでファイルを移動
# cd /tmp
# scp {移設元サーバーIP}:/var/www/html/concrete/concrete-content.tar concrete-content.tar
// concreteコンテナ内にconcrete-content.tarをコピー
# docker cp concrete-content.tar concrete:/var/www/html
// tarファイルを展開
# docker exec concrete tar xvf concrete-content.tar
# docker exec concrete /bin/bash -c "chown www-data:www-data -R /var/www/html"
[/shell]

記事データをMySQLコンテナにインポートする。

※ コンテナ名:mysql

[shell]
// SCPでファイルを移動
# cd /tmp
# scp {移設元サーバーIP}:/var/www/html/concrete/concrete-export.sql concrete-export.sql
// mysqlコンテナ内にconcrete-export.sqlをコピー
# docker cp concrete-export.sql mysql:/tmp/
// インポート
# docker exec mysql /bin/bash -c "mysql -h mysql -u {ユーザー名} -p {パスワード} {データベース名} < /tmp/concrete-export.sql"
[/shell]

もしかしたらディレクトリのパーミッション設定をいじる必要があるかもしれませんが・・・

ブログと違ってまだ新規のページを作成していないので何かあれば追記します。

次回、から内部ツール系サーバーの構築を行っていきます。

既存サーバーのWordPressデータをDockerコンテナへ移設する

Filed under: Docker,Linux,OSS,Wordpress,オープンソース — ranpei @ 4:27 AM

Dockerコンテナ環境の構築が完了しましたので、

既存サーバーのデータをDockerコンテナへ移設します。

※ なお、初期インストール画面での設定は終えているものとして話を進めていきます。

1.移設元サーバーから移設データを取り出す

移設するデータは記事データである”MySQLのdumpファイル”、

画像などのメディアファイルやプラグインなどが格納されている”wp-contentディレクトリ”の2つ。

[shell]
// WordPress配置ディレクトリに移動 (各々のサーバー環境に合わせて読みかえてください)
# cd /var/www/html/wordpress
// wp-contentフォルダをtarで固める
# tar cvf wp-content.tar wp-content
// SQLデータをエクスポート
# mysqldump -u {ユーザー名} -p {パスワード} {データベース名} >> wordpress-export.sql
[/shell]

2.Dockerコンテナに反映させる

wp-contentディレクトリをDockerコンテナに配置する

※ Dockerコンテナ名:wordpress

[shell]
// SCPでファイルを移動
# cd /tmp
# scp {移設元サーバーIP}:/var/www/html/wordpress/wp-content.tar wp-content.tar
// wordpressコンテナ内にwp-content.tarをコピー
# docker cp wp-content.tar wordpress:/var/www/html
// tarファイルを展開
# docker exec wordpress tar xvf wp-content.tar
# docker exec wordpress /bin/bash -c "chown www-data:www-data -R /var/www/html/wp-content"
// ディレクトリのパーミッションを変更
# docker exec wordpress /bin/bash -c "chmod 777 -R /var/www/html/wp-content/cache && chmod 777 -R /var/www/html/wp-content/uploads"
[/shell]

記事データをMySQLコンテナにインポートする。

※ Dockerコンテナ名:mysql

[shell]
// SCPでファイルを移動
# cd /tmp
# scp {移設元サーバーIP}:/var/www/html/wordpress/wordpress-export.sql wordpress-export.sql
// mysqlコンテナ内にwordpress-export.sqlをコピー
# docker cp wordpress-export.sql mysql:/tmp/
// インポート
# docker exec mysql /bin/bash -c "mysql -h mysql -u {ユーザー名} -p {パスワード} {データベース名} < /tmp/wordpress-export.sql"
[/shell]

で、ブラウザでアクセスするときちんとデータが反映されていたので

これで、移設完了・・・・・と思っていたらブログの記事を書いているときに

画像をアップロードできない問題が発生しまして・・・・・

調べたところ今回の移設でwordpressの配置パスが変わったため

それに合わせて「メディア設定」>「アップロードするファイルの保存場所」のパス設定を

変更する必要がありましたのでメモしておきます。

アップロードパスの変更

 

これでWordpressデータの移設が完了しました。

2016年10月9日

Nginxをゲートウェイとした構成を構築する。

Filed under: apache,Concrete5,Docker,OSS,Roundcube,Wordpress — ranpei @ 12:43 AM

Nginxをゲートウェイにして「Concrete5」「Wordpress」「Roundcube」を構築していきます。

1.docker-compose.ymlを作ってみる

[shell]
version: ‘2’
services:
######################
# gateway-proxy
######################
gateway-proxy:
image: nginx
container_name: gateway-proxy
ports:
– "80:80"
volumes:
– /var/run/docker.sock:/tmp/docker.sock
– ${PWD}/gateway_proxy/conf.d:/etc/nginx/conf.d
– ${PWD}/gateway_proxy/htdocss/index.html:/usr/share/nginx/html/index.html
links:
– concrete
– wordpress
– roundcube
environment:
– NGINX_HOST={ホストのドメイン}
#####################
# concrete
#####################
concrete:
build: concrete56-ja
container_name: concrete
links:
– mysql
#####################
# wordpress
#####################
wordpress:
image: wordpress
container_name: wordpress
links:
– mysql
environment:
– WORDPRESS_DB_HOST=mysql:3306
– WORDPRESS_DB_NAME=blog
– WORDPRESS_DB_USER=blog
– WORDPRESS_DB_PASSWORD=blog
#####################
# roundcube
#####################
roundcube:
image: robbertkl/roundcube
container_name: roundcube
environment:
– ROUNDCUBE_DEFAULT_HOST={IMAPサーバーIP or ドメイン}
– ROUNDCUBE_DEFAULT_PORT=143
– ROUNDCUBE_SMTP_SERVER={SMTPサーバーIP or ドメイン}
– ROUNDCUBE_SMTP_PORT=25
– ROUNDCUBE_SMTP_USER=%u
– ROUNDCUBE_SMTP_PASS=%p
#####################
# mysql
#####################
mysql:
image: mysql/mysql-server
container_name: mysql
volumes:
– /var/run/docker.sock:/tmp/docker.sock
– mysqldata:/var/lib/mysql
– ${PWD}/mysql/initdb.d:/docker-entrypoint-initdb.d
environment:
– MYSQL_ROOT_PASSWORD={MySQLルートパスワード}
– MYSQL_ALLOW_EMPTY_PASSWORD=true

volumes:
mysqldata:
driver: local
[/shell]

/etc/nginx/conf.dをDockerホストからマウントするようにして
ホスト上のファイルを修正することで変更を容易にするようにしています。

ファイルの配置と設定は以下

[shell]
作業Root/
├ docker-compose.yml
|
├ /gateway_proxy
| ├ config.d/
| | └ example.com.conf
| └ htdocss
| └ index.html
|
├ concrete56-ja/
| └ Dockerfile
|
└ mysql/
└ initdb.d/
└ create_database.sql
[/shell]

・example.com.conf

[shell]
server {
listen 80 default_server;
server_name example.com;

client_max_body_size 512M;

#
# Log
#
access_log /var/log/nginx/example.com_access.log;
error_log /var/log/nginx/example.com_error.log;

#
# Header
#
#proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Host $http_host;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_read_timeout 600s;
proxy_connect_timeout 10s;

#
# Setting
#
#############################
# Nginxドキュメントルート
#############################
location / {
root /usr/share/nginx/html;
index index.html;
}
#############################
# Concrete5
#############################
location /concrete/ {
proxy_set_header Host $host;
proxy_pass http://concrete/;
proxy_redirect http://concrete/ http://$host/;
proxy_redirect default;
}
#############################
# WordPress
#############################
location /blog/ {
proxy_set_header Host $host;
proxy_pass http://wordpress/;
proxy_redirect http://wordpress/ http://$host/;
proxy_redirect default;
}
#############################
# Roundcube
#############################
location /webmail/ {
proxy_cookie_path /webmail/ /;
proxy_pass http://roundcube/;
proxy_redirect / /webmail/;
proxy_redirect default;
}
}
[/shell]

・index.html
~省略~

・create_database.sql

[shell]
— WordPress
CREATE DATABASE IF NOT EXISTS blog CHARACTER SET utf8;
GRANT all ON concrete.* TO ‘blog’@’%’ identified by ‘blog’;
— Concrete5
CREATE DATABASE IF NOT EXISTS concrete CHARACTER SET utf8;
GRANT all ON concrete.* TO ‘concrete’@’%’ identified by ‘concrete’;
[/shell]

buildすれば各コンテナが配置されます。

[shell]

$docker-compose up -d

[/shell]

で、起動するわけなんですが
ブラウザでアクセスしてみるとこんな感じに・・・・

alias%e8%a8%ad%e5%ae%9a%e5%89%8d_concrete5 alias%e8%a8%ad%e5%ae%9a%e5%89%8d_wordpressalias%e8%a8%ad%e5%ae%9a%e5%89%8d_roundcube

 

※ 左から「Concrete5」「Wordpress」「Roundcube」です。

Roundcube以外がうまく行ってませんね。。。。

 

 

 

2.問題へ対応する

調べてみたところ”/blog/”を”/”にリバースしているため「Concrete5」「Wordpress」は”/”にアクセスが来たと解釈しURL生成していました。

そのためリダイレクト先やCSS、JSのURLが正確なパスではないためブラウザからはアクセスできなくなってしまっているわけです。

で、結局どうしたかというと・・・・・・・

「Concrete5」「Wordpress」のApacheに強引にAliasを切って対応しましたwww

いやね、Proxyの設定見直せばいけるかなと思ったんですが

調べれば調べるほど全然ダメみたいで・・・

結局、最終構成は以下となりました。

[shell]
version: ‘2’
services:
######################
# gateway-proxy
######################
gateway-proxy:
image: nginx
container_name: gateway-proxy
ports:
– "80:80"
volumes:
– /var/run/docker.sock:/tmp/docker.sock
– ${PWD}/gateway_proxy/conf.d:/etc/nginx/conf.d
– ${PWD}/gateway_proxy/htdocss/index.html:/usr/share/nginx/html/index.html
links:
– concrete
– wordpress
– roundcube
environment:
– NGINX_HOST={ホストのドメイン}
#####################
# concrete
#####################
concrete:
build: concrete56-ja
container_name: concrete
volumes:
– ${PWD}/concrete/concrete-alias.conf:/etc/apache2/sites-enabled/concrete-alias.conf
links:
– mysql
#####################
# wordpress
#####################
wordpress:
image: wordpress
container_name: wordpress
volumes:
– ${PWD}/wordpress/wordpress-alias.conf:/etc/apache2/sites-enabled/wordpress-alias.conf
links:
– mysql
environment:
– WORDPRESS_DB_HOST=mysql:3306
– WORDPRESS_DB_NAME=blog
– WORDPRESS_DB_USER=blog
– WORDPRESS_DB_PASSWORD=blog
#####################
# roundcube
#####################
roundcube:
image: robbertkl/roundcube
container_name: roundcube
environment:
– ROUNDCUBE_DEFAULT_HOST={IMAPサーバーIP or ドメイン}
– ROUNDCUBE_DEFAULT_PORT=143
– ROUNDCUBE_SMTP_SERVER={SMTPサーバーIP or ドメイン}
– ROUNDCUBE_SMTP_PORT=25
– ROUNDCUBE_SMTP_USER=%u
– ROUNDCUBE_SMTP_PASS=%p
#####################
# mysql
#####################
mysql:
image: mysql/mysql-server
container_name: mysql
volumes:
– /var/run/docker.sock:/tmp/docker.sock
– mysqldata:/var/lib/mysql
– ${PWD}/mysql/initdb.d:/docker-entrypoint-initdb.d
environment:
– MYSQL_ROOT_PASSWORD={MySQLルートパスワード}
– MYSQL_ALLOW_EMPTY_PASSWORD=true

volumes:
mysqldata:
driver: local
[/shell]

 

・ファイル配置

[shell]
作業Root/
├ docker-compose.yml
|
├ /gateway_proxy
| ├ config.d/
| | └ example.com.conf
| └ htdocss
| └ index.html
|
├ wordpress/
| └ wordpress-alias.conf
|
├ concrete56-ja/
| ├ Dockerfile
| └ concrete-alias.conf
|
└ mysql/
└ initdb.d/
└ create_database.sql
[/shell]

・example.com.conf

[shell]
server {
listen 80 default_server;
server_name example.com;

client_max_body_size 512M;

#
# Log
#
access_log /var/log/nginx/example.com_access.log;
error_log /var/log/nginx/example.com_error.log;

#
# Header
#
#proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Host $http_host;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_read_timeout 600s;
proxy_connect_timeout 10s;

#
# Setting
#
#############################
# Nginxドキュメントルート
#############################
location / {
root /usr/share/nginx/html;
index index.html;
}
#############################
# Concrete5
#############################
location /concrete/ {
proxy_set_header Host $host;
proxy_pass http://concrete/concrete/;
proxy_redirect http://concrete/ http://$host/;
proxy_redirect default;
}
#############################
# WordPress
#############################
location /blog/ {
proxy_set_header Host $host;
proxy_pass http://wordpress/blog/;
proxy_redirect http://wordpress/ http://$host/;
proxy_redirect default;
}
#############################
# Roundcube
#############################
location /webmail/ {
proxy_cookie_path /webmail/ /;
proxy_pass http://roundcube/;
proxy_redirect / /webmail/;
proxy_redirect default;
}
}
[/shell]

・concrete-alias.conf

[shell]
alias /concrete /var/www/html
[/shell]

・wordpress-alias.conf

[shell]
alias /wordpress/var/www/html
[/shell]

・index.html
~省略~

・create_database.sql

[shell]
— WordPress
CREATE DATABASE IF NOT EXISTS blog CHARACTER SET utf8;
GRANT all ON concrete.* TO ‘blog’@’%’ identified by ‘blog’;
— Concrete5
CREATE DATABASE IF NOT EXISTS concrete CHARACTER SET utf8;
GRANT all ON concrete.* TO ‘concrete’@’%’ identified by ‘concrete’;
[/shell]

volumeがファイル単体もマウントできるんでできた荒業ですw

完全にバッドノウハウですよね・・・・

まあ、今後の課題ですかな・・・

Older Posts »

Powered by WordPress