2023/1/10 owncloud 復活
過去に運営していた owncloud を、インターネット閲覧可能な状態で復活させる。
前の構成
さくらのレンタルサーバ + 付属の MySQL
バージョンは忘れてしまった。
dump は手元にある
次期構成
AWS
ECS / RDS(Aurora Serverless v2) / ALB(+ Cognito)
前の構成を手元で復元する
まず wsl が遅い
とりあえず docker で起動出来たらよい
owncloud のイメージがあったので latest で起動できるか試す。
権限で怒られたので、実行時ユーザを合わせた。
mysql の最終 dump を init.d に突っ込んで import トライ
code:log
nextcloud-iac-mysql-1 | /usr/local/bin/docker-entrypoint.sh: running /docker-entrypoint-initdb.d/do-su-server_owncloud-db.sql
nextcloud-iac-mysql-1 | ERROR 1046 (3D000) at line 28: No database selected
どうやら当時の dump に CREATE DATABASE などがなかったらしい。
CREATE / USE SCHEMA を記載した。
ハイフン付きの {DATABASE,SCHEMA} の時は、バッククオートで名前をかこってあげる必要がある
起動はできた。次のエラー
あなたのデータディレクトリが無効です
データディレクトリに ".ocdata" ファイルが含まれていることを確認してください。
"データ" ディレクトリを作成できません
あるんだけどなぁ
-rw-r--r-- 1 do-su-0805 do-su-0805 0 Jan 10 21:35 owncloud/data/.ocdata
いったん退避させてみるも変わらず
apache のエラーログを見てみると以下のようなものが
code:error
試しに言われたように LimitInternalRecursion するか。その前に LogLevel debug にしてみる
よくわからない
試しに owncloud の設定ファイルを見てみると、どうやらビンゴな設定があった
code:config.php
# 'datadirectory' => '/home/do-su-server/www/owncloud/data',
'datadirectory' => '/var/www/html/data',
レンタルサーバの時のパスになっていたので併せて修正した
以下のエラーは消えた
>"データ" ディレクトリを作成できません
次のエラー
>あなたのデータディレクトリが無効です
>データディレクトリに ".ocdata" ファイルが含まれていることを確認してください。
一度退避させていたので元に戻す
code:戻した
root@1d6d8c3d5da3:/var/www/html# ls -l data/.ocdata*
-rw-r--r-- 1 www-data www-data 0 Jan 10 12:35 data/.ocdata
-rw-r--r-- 1 www-data www-data 0 Jan 10 12:35 data/.ocdata.backup
エラーは消えたが 500 になった
次のエラー : ただの 500
なんかエラーログから (勘で)異様に rewrite されている気がした。
設定ファイルを見ると怪しいのがあった
code:config.php
'htaccess.RewriteBase' => '/owncloud',
設定ファイルからコメントアウトしたが変わらず。
設定項目から、「もしかしてこれ動的に .htaccess 作る機能があったのでは?」と思って確認したらドンピシャ
code:/owncloud/.htaccess 末尾
#### DO NOT CHANGE ANYTHING ABOVE THIS LINE ####
ErrorDocument 403 /owncloud/core/templates/403.php
ErrorDocument 404 /owncloud/core/templates/404.php
<IfModule mod_rewrite.c>
Options -MultiViews
RewriteCond %{REQUEST_FILENAME} !\.(css|js|svg|gif|png|html|ttf|woff|ico|jpg|jpeg)$
RewriteCond %{REQUEST_FILENAME} !core/img/favicon.ico$
RewriteCond %{REQUEST_FILENAME} !/remote.php
RewriteCond %{REQUEST_FILENAME} !/public.php
RewriteCond %{REQUEST_FILENAME} !/cron.php
RewriteCond %{REQUEST_FILENAME} !/core/ajax/update.php
RewriteCond %{REQUEST_FILENAME} !/status.php
RewriteCond %{REQUEST_FILENAME} !/ocs/v1.php
RewriteCond %{REQUEST_FILENAME} !/ocs/v2.php
RewriteCond %{REQUEST_FILENAME} !/updater/
RewriteCond %{REQUEST_FILENAME} !/ocs-provider/
RewriteCond %{REQUEST_URI} !^/.well-known/acme-challenge/.*
RewriteBase /owncloud # ここ
<IfModule mod_env.c>
SetEnv front_controller_active true
<IfModule mod_dir.c>
DirectorySlash off
</IfModule>
</IfModule>
</IfModule>
RewriteBase を /owncloud から / に書き換えたらログイン画面が出てきた!
ログインして動作を確かめる
なんかファイルが見れない
試しにユーザーテーブルとか見るとファイルのパスがおかしくなっている気がする
ログを見る
code:404
nextcloud-iac-nextcloud-1 | 172.19.0.1 - - 11/Jan/2023:15:41:50 +0000 "GET /remote.php/webdav/Documents/Example.odt HTTP/1.1" 404 8632 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36" 調べていたらモロなページがヒットした!
どうやらファイルパスの変更が必要らしい
Update the oc_storages Table 対応
すでに新しく切り替えたほうの local が存在しちゃってるけど、特にファイルはおいてないので delete / update しよう
code:log
mysql> select * from oc_storages where id like '%local::%';
+----------------------------------------------+------------+-----------+--------------+
| id | numeric_id | available | last_checked |
+----------------------------------------------+------------+-----------+--------------+
| local::/home/do-su-server/www/owncloud/data/ | 2 | 1 | NULL |
| local::/var/www/html/data/ | 51 | 1 | NULL |
+----------------------------------------------+------------+-----------+--------------+
2 rows in set (0.00 sec)
mysql> DELETE FROM oc_storages where id = 'local::/var/www/html/data/';
Query OK, 1 row affected (0.01 sec)
mysql> select * from oc_storages where id like '%local::%';
+----------------------------------------------+------------+-----------+--------------+
| id | numeric_id | available | last_checked |
+----------------------------------------------+------------+-----------+--------------+
| local::/home/do-su-server/www/owncloud/data/ | 2 | 1 | NULL |
+----------------------------------------------+------------+-----------+--------------+
1 row in set (0.01 sec)
mysql> UPDATE oc_storages SET id='local::/var/www/html/data/' WHERE id='local::/home/do-su-server/www/owncloud/data/';
Query OK, 1 row affected (0.01 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> select * from oc_storages where id like '%local::%';
+----------------------------+------------+-----------+--------------+
| id | numeric_id | available | last_checked |
+----------------------------+------------+-----------+--------------+
| local::/var/www/html/data/ | 2 | 1 | NULL |
+----------------------------+------------+-----------+--------------+
1 row in set (0.00 sec)
Update the oc_accounts Table 対応
select * from oc_accounts してみると、確かに home が古いパス
code:全体置換
mysql> UPDATE oc_accounts SET home = REPLACE(home,'/home/do-su-server/www/owncloud','/var/www/html');
Query OK, 47 rows affected (0.01 sec)
Rows matched: 47 Changed: 47 Warnings: 0
Update the oc_jobs Table 対応
対応するもの ( arguments にパスが入っているもの ) はなかった。
見れるようになった!
継続的に見れるようにするための Todo
mysql の dump data の修正
した。
公開構成を考える
must いかんせんセンシティブなものなので、多少セキュリティには気を使いたい。
HTTPS
単一のパスワード認証に頼らない
should つぶしやすい仕組み
RDB : Aurora Serverless v2
snapshot くらいの料金は目をつぶる。普段は何もしなくてもいいのがよい。
幸い dump しても小さいので、最終 dump をとるでもよい
データストレージ : いったんは EFS で、後々は S3 に移行したい
code:今のファイルサイズ
$ sudo du -hd 0 ./owncloud/data
22G ./owncloud/data
EFS の料金体系調査
ゾーン冗長なんていらない。1ゾーンでよい。
低頻度アクセスストレージには自動で移動してもらったらいい。
最初 : 0.192USD * 22
放置 : 0.0145USD * 22
S3 の料金体系調査
最初 : 0.025USD * 22
放置 : 0.0138USD * 22
放置したらさほど変わらないなら、いったん EFS でいいか。
稼働環境 : どうしようかなぁ
ECS Fargate で考える。
CPU はいいとして、メモリはちょっと増やしたと仮定する
Fargate Spot で 256 CPU / 512MB Mem だと、毎月 481 円くらいらしい
IaC : しておくとつぶしやすいね
とりあえずはAWSで動かす
公開構成構築
VPC たちを準備
コンソールからだと一括で作れて便利。
いったん NATGW も作っておく。mackerel とかをあきらめたら正直いらない気はする...?
ECR public への取得時にさすがに必要かな
EFS 準備
とりあえず作った。
適当な EC2 を起動させて、EFS をマウントし、手元のデータを転送する
Aurora Serverless v2 準備
調べてみると、v2 には放置時に ACU を 0 まで落とす機能がない。
初回アクセス時には待ってくれ、ということで v1 にする。
1AZ しか作ってなかったけど、2AZ 要求されたのでもう一つ作る
起動成功して、dumpfile の流し込みまでできた。
Route53 / ALB / Cognito 準備
Route53 : 久々にとるかーと適当にドメインを1つとった
ALB : とりあえず作ればよい
ACM で証明書を取得した。
適当なターゲットグループを作成し、80/443 の Listener を作成
80 は 443 へ redirect させた
Cognito : ユーザプールを作成
ECS 準備
といっても手元の docker-compose ほぼそのままでよい
ストレージ周りに注意
EFS の DNS 名呼び出しには、VPC の設定が有効になっている必要がある
バックアップ移植中に起動させると、ECS から読みだした際に権限が nfsnobody に全部置き換わって崩壊する