golang sshでdbのバックアップ

サーバーにあるwordpressのDBをバックアップしようと思い、sshを調べた。
ファイルの転送に手軽な方法がなかったため標準出力をファイルへ書き出すことに。

 

golang色々

静的ファイル配信。jsonパース

 

golang+MongoDB+Vue.js 色々

サーバーをgolang+MongoDBでフロントをVue.js
基本的な処理を色々メモ。

 

MongoDB基礎

インストール

/etc/yum.repos.d/mongodb-org-4.0.repo

[mongodb-org-4.0]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/4.0/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-4.0.asc

を記載し、

yum install -y mongodb-org

起動
systemctl start mongod

停止
systemctl stop mongod

再起動
systemctl restart mongod

自動起動
systemctl enable mongod

シェル起動
mongo

シェル終了
exit

Mongoシェルコマンド

db切り替え(作成)
use DB

db削除
db.dropDatabase()

利用中db
db

db一覧
show dbs

コレクション一覧
show collections

コレクション作成
db.createCollection(“コレクション名”)
※Cは大文字

コレクション削除
db.コレクション名.drop()

ドキュメント作成
db.コレクション名.insert({“name”:”taro”,”age”:1})
db.コレクション名.insert({“name”:”taro”,”age”:1, “addr”:”tokyo”})

ドキュメント検索
db.コレクション名.find()
※すべて

db.コレクション名.findOne()
※一つのみ

db.コレクション名.find({“name”:”taro”})
※条件

ドキュメント更新
db.コレクション名.update(検索内容、更新内容)
db.コレクション名.update({“name”,”taro”},{“name”:”jiro”})

通常はフィールドが全て上書きされる。
更新したい場合$setを使う。
フィールドが存在すれば更新、しないと新しいフィールドとして追加される。

db.コレクション名.update({“name”,”taro”},{$set:{“name”:”jiro”}})

ドキュメント削除
db.コレクション名.remove()
※すべて

db.コレクション名.remove(検索内容)

ユーザー

ユーザーはDBごとに作成adminのユーザーは管理者となる。

現在のDBに接続中のユーザー
db.getUsers()
db.system.users.find()

ユーザ作成
※2.4まではaddUser

use name_store

db.createUser({
user:”taro”,
pwd:”123″,
roles:[{
role: “readWrite”,
db: “admin”
}]

})

あるいは

db.createUser({
user:”jiro”,
pwd:”123″,
roles:[“dbAdminAnyDatabase”] 
})

db.createUser({
user:”shiro”,
pwd:”123″,
roles:[“root”]
})

現在の接続先のDBにユーザーがー作成される。
db:は対象のDBというよりロールが存在するDBという意。

主要なロール

read
readWrite
dbAdmin
dbOwner
userAdmin
readAnyDatabase
readWriteAnyDatabase
userAdminAnyDatabase
dbAdminAnyDatabase(他のコレクションのfind等できない)
root

ユーザー削除
use db
db.dropUser(ユーザー名)

認証

認証有効化

/etc/mongod.conf
※winならProgram Filesの中

#security:

security:
__authorization: enabled
※インデント必要

ログイン方法

mongo
use admin
db.auth(“taro”, “123”)

NginxとgolangでAPIサーバー

golangもNginxも始めたばかりなので、他のブログの記事を参考にしつつ試験中

Nginxのconfにlocation追加

golang

ちょっと違う書き方

サーバーの開始

func http.ListenAndServe(addr string, handler Handler) err
http.ListenAndServe(“:81”, nil)

第1引数にTCPアドレス
第2引数にHandlerを引数に受け取りサーバーを起動する。

Handlerというのは、http.Handlerインターフェースを実装していればいい。

ちなみに、内部でhttp.server.ListenAndServeを呼んでいる。http.server.ListenAndServeは内部でhttp.Server.Serveを呼んでいる。http.Server.Serveはforループでリクエストごとにgoroutineを立ち上げる。

http.Handle(r)とは

ServeHTTPメソッドを持つインターフェース。
ServeHTTPはリクエストとレスポンスが記述される。
type Handler interface { ServeHTTP(ResponseWriter, *Request) }

http.Handleとは

func Handle(pattern string, handler Handler)
URLとhttp.Handerを実装した構造体を受け取り、ルータに登録。

http.HandleFuncとは

func HandleFunc(pattern string, handler func(ResponseWriter, *Request))
URLとhttp.Handerを受け取り、ルータに登録。

HandleだとServeHTTPを定義しHandlerを実装した構造体を渡す必要があるが、HandleFuncの場合Funcのまま受け取れる。

http.HandleとHandleFuncについて

http内でDefaultServeMux(ServeMux)が定義されており、DefaultServeMux.Handler、DefaultServeMux.HandleFuncが呼ばれている。

http.ServerMuxとは

ServerMuxはURLとhandlerを登録しておく構造体。
ServeMux自体、ServeHTTPメソッドを実装している→Handler
mux := http.NewServeMux()
mux.Handle(“/echo”, echoHandler)

http.Handle(r)Funcとは

type HandlerFunc func(ResponseWriter, *Request)
func(ResponseWriter, *Request)の別名でServerHTTPが定義(実装)されている。

Handle(r)FuncとHandleFuncについて

そっくりで混乱するが、HandleFuncはURLとHandlerをServerMuxに登録する。Handle(r)Funcの方は、func(ResponseWriter, *Request)の別名でhttp.Handlerとして使える。

http.ServeMux.HandleFuncとは

URLとfunc(ResponseWriter, *Request)を受け取りルータに登録している

内部でfunc(ResponseWriter, *Request)をHandle(r)FuncにキャストしているHandleに登録している。

http.ServerMux.Handleとは

ServeMuxにURLとHandlerを登録する。

出力関係

Print
標準出力へ

Fprint
出力先を指定

Sprint
文字列で返す。

接尾のfはフォーマット

MuuMuu + Xserver 独自ドメイン

以前、MuuMuuで取得したドメインがあって、NSをXserverに指定したまま放置していたのでこのドメインを活用する。メールはそのままXserverで、wwwのみVPSに回す。

MuuMuuでXserverのネームサーバー(ns[1-5].xserver.p)を指定する。
Xserverのサーバーパネル>ドメイン設定
から対象ドメインを追加し、
サーバーパネル>DNSレコード設定
から編集する。

AタイプのIPアドレスをVPSのアドレスに変更する。通常はやらないけど今回はアスタリスクを使ったサブドメインとwww付きを消して1つにしてしまう。

MXはホスト名と内容が同じになっているので、ホスト名をそのまま独自ドメインで、内容をXserverのドメイン(xxx.xsrv.jp)にする。

ホスト名 | A | 210.xxx.xxx.xx | 0
ホスト名 | MX | xxx.xsrv.jp | 0

これでしばらく待つと独自ドメインからSSHアクセスできる。

・DNSレコードについて

A:
ドメインとIPv4を関連づける

MX:
メールサーバー

CNAME:
別名

TXT:
ドメインに関連づけるテキスト情報。主に、メール送信の認証(SPFレコード)に利用される。受信サーバは送信もとアドレスのドメインのTXTレコードを取得しチェックする。

・SPFレコードについて

version qualifier mechanism
という組み合わせになる。

・version:
v=spf1固定

・qualifier:
mechanismでマッチしたらそのメールをどうするかを記号で指定する。

+:
正当なメール

-:
不当なメール(配信しない)

~:
不当なメール(配信する)

?:
指定なし

・mechanism:
送信もとアドレスとマッチするデータを指定する。

ip4:
送信アドレスが一致するか

mx:
MXレコードのIPアドレスと一致するか

a:
AレコードのIPアドレスと一致するか

参考として、
*.domain.com/TXT/v=spf1 +ip4:xxx.xxx.xxx.xxx ~all
ここでは、
+ip4:xxx.xxx.xxx.xxx

~all
の2つが指定されている。

例えば、XserverのDNSレコードはどうなっているか。
*.domain.com/TXT/v=spf1 +ip4:xxx.xxx.xxx.xxx ~all
domain.com/TXT/v=spf1 +ip4:xxx.xxx.xxx.xxx ~all
domain.com/A/xxx.xxx.xxx.xxx
*.domain.com/A/xxx.xxx.xxx.xxx
domain.com/MX/domain.com

golang テストで小さいプログラム

golangはじめて間もないので調べつつ色々試験中

標準入力から日付判断

SQLite接続

サーバー

SSH接続

他言語で言うクラス

json読み込み

時間

golang インストールメモ

最近golangをはじめたので。

WSLインストール

sudo apt-get update
sudo apt-get install golang

バージョン確認
go version

> 1.6.2

環境確認
go env

.bashrcに追加
export GOPATH=”$HOME/go”
export PATH=”$GOPATH/bin:$PATH”

Db(SQLite)を使ってみる

go get github.com/mattn/go-sqlite3

package context: unrecognized import path “context”
というエラーがでる。

1.7ではcontextパッケージとして標準パッケージに仲間入りする。
とのことなのでアップデート

sudo apt-get install golang-1.9
sudo mv /usr/bin/go /usr/bin/go.old
sudo mv /usr/bin/gofmt /usr/bin/gofmt.old
sudo ln -s /usr/lib/go-1.9/bin/go /usr/bin/go
sudo ln -s /usr/lib/go-1.9/bin/gofmt /usr/bin/gofmt

これで入った。

Windows用にクロスコンパイル

WSLからだと通常こうなっているので、
GOOS=linux
以下の用にしてビルド
GOOS=windows go build hello.go

VBS 起動にちょっとアラート

普通Gカレンダとか使うんだけど。

VBA シート間のコピー

シート間のコピー