Node.js 更新したデータを定期的にGitにバックアップする

お題

cmsで作られた様々なjsonデータや画像データを毎日バックアップする

cmsをNode.jsで実装していたので、サクッとNode.jsだけで簡単に終わらせたい。検討した方法は2つ

  1. zipしてGoogle driveに保存
  2. gitにプッシュ

1.zipしてGoogle driveに保存

node.jsでzipできるarchiverを入れる

yarn add archiver
const archiver = require("archiver");
const fs = require("fs");

const date = new Date();
//日付からファイル名を作成
const file_name = `${date.getFullYear()}${date.getMonth()}${date.getDate()}.zip`;

//ファイル
const output = fs.createWriteStream(`./archives/${file_name}.zip`);

//アーカイブ
const archive = archiver("zip", {
    zlib: { level: 5 } //圧縮レベル
});

//完了のコールバック
output.on("close", function() {
  var archive_size = archive.pointer();
  console.log(
    `complete! total size : ${archive_size} bytes(${config.upload_path})`
  );
});

//実行
archive.pipe(output);
archive.directory("./data", false);
archive.glob(`./data/**/*`);
archive.finalize();

ただこの後Google Driveにファイルを保存する方法を調べててちょっと面倒臭くなったのと、毎回丸ごと保存するのは容量食うし良くないなと、あとあまりサクッと感がないなと思って、この1番は却下。

2.gitにプッシュ

そもそもソースコードはbitbucketで管理しているので、新しいリポジトリ作ってそこに定期的にプッシュしていけば簡単なことに気づいた。保存されるのは差分だけだし、ロールバックも楽だし。

simple-gitを入れる

yarn add simple-git

./dataディレクトリの中に新しいリポジトリを作成。サブツリーでもOKだけど、.gitignoreしているディレクトリに普通に作ってしまったので、そのまま。

cd ./data
git init
git remote add origin xxx.git
git pull origin master

nodeからgitの操作をできるsimple-gitを入れる

yarn add simple-git

git_commit_and_push.js

const simpleGit = require("simple-git")("./data");
const git_commit_and_push = ()  =>{
  const date = new Date();
  const commit_log = `${date.getFullYear()}${date.getMonth()}${date.getDate()}`;
  simpleGit
    .add("./")
    .commit(`${commit_log}`)
    .push("origin", "master");
}
export module = { git_commit_and_push }

これだけ

node-cronとforeverで定期実行&永続化

永続化=forever、定期実行=node-cronを入れる

yarn global add forever
yarn add node-cron

commit_everyday.js

const cron = require("node-cron");
const { git_commit_and_push } from "./git_commit_and_push";
//毎日4時にコミット
cron.schedule("0 0 4 * * *", () => {
  git_commit_and_push();
});

foreverで永続化

forever start commit_everyday.js

Facebookページとホームページを連携の準備

Facebookページの情報をWebページで表示するためには、まずアプリ登録をしてからアプリIDをゲットする必要がある。Webとアプリを紐付ける時には、httpsの接続元のURLを入力する必要がある。

  1.  まずアプリを作る https://developers.facebook.com/
  2. プラットフォームを追加  > ページタブ
  3. セキュアページタブのURLにhttpsの接続元urlを入れるスクリーンショット 2017-03-22 10.10.25
  4. 紐付け,ブラウザに直接以下を入れるhttp://www.facebook.com/dialog/pagetab?app_id=アプリID&next=httpsの接続元url

Blenderから.objをエキスポートしてthree.jsで読み込む時

Blenderから.objをエキスポートすると.mtl内に

map_Kd floor.png

みたいな感じでテクスチャ名が書かれている。three.js上で別にテクスチャを読み込むので、ここの記述は1行いらなく、残しておくとエラーが出る。

 

さらに.obj内の記述で

usemtl Material.001

とマテリアル名が書かれている部分を,

usemtl floor

のようにfloor.mtlの名前の部分に書き換える。ここはBlender側でついてたマテリアル名がデフォで記述されているんだけど、three.js側は.mtlファイル名が必要っぽい。調べてないから詳しくはわからないけど。ここはブラウザでエラーも出ないのできづきにくい。

Google API OAuth 2.0 の認証でハマった

<script type="text/javascript">

var client_id = "クライアントID";
var scopes = 'https://www.googleapis.com/auth/drive';

function checkAuth() {
	gapi.auth.authorize(
	{
	    'client_id':client_id,
	    'scope':scopes,
	    'immediate':true
	},
	function(authResult){
		console.log(arguments);
	}); 
}
</script>
<script type="text/javascript" src="https://apis.google.com/js/client.js?onload=checkAuth"></script>

こんな感じで認証部分を記述しても何度やってもこのエラーが。。

これ位のコードだとGoogle APIの設定を疑うくらいしかないのだが、Google のdeveloper consoleとかapiとかは膨大すぎてカオスで無駄に時間を取られた。

最終的には、API Managerの中の認証情報から、0Auth 2.0 クライアント IDのwebclientのところをクリック

制限事項のURLにローカルの8888ポートを指定していないということでした。。

 

これに気づくまで数時間も時間を無駄にしてしまいました。。

Googleにページをすぐにインデックスさせる方法

ブログが全くインデックスされないので、Search ConsoleでURLを単位でリクエストを送ったらすぐにインデックスされました。

search console

 

Search Console > クロール > Fetch as Google

であとはページのURLを入れてくだけで、その場で処理されていきます。

送信したあとに「インデックス登録をリクエスト」ボタンが表示されますのでおすとダイアログが表示されます。

もろもろチェックしてから送信を押して終わりです。

簡単すぎてちゃんとインデックスされているのか疑いたくなります。