SchemaSpyでDBドキュメントを自動生成する

# SchemaSpyとは

SchemaSpyは、データベースのドキュメントをHTML化し、Entity Relationship Diagramを含むドキュメントを作成します。
HTML化されたドキュメントを使用することで、チームやコミュニティと簡単に共有することができます。

[SchemaSpy * Database Documentation Built Easy.](https://schemaspy.org/)

# 設定方法

Javaベースで動いているが、dockerを使用することで楽に環境を用意できる

dockerのmysqlを使用する場合設定が変わるかも

ファイル構成

```jsx

schemaspy
	├ docker-compose.yml
	└ docker
	    └ schemaspy
    		   ├ Dockerfile
			   ├ config
			   │  └ schemaspy.properties
			   └ drivers
					└ mysql-connector-java-8.0.16.jar

```

### docker-compose.yml

※commandに-allオブションを付けているので全スキーマ取得します

```yaml
version: "3.8"

services:
  schemaspy:
    build: ./docker/schemaspy
    image: schemaspy/schemaspy
    volumes:
      - ./docker/schemaspy/output:/output
      - ./docker/schemaspy/drivers:/drivers
      - ./docker/schemaspy/config/schemaspy.properties:/app/schemaspy.properties:ro
    extra_hosts:
      - localhost:192.168.X.X # localhostと自身のpcのipアドレスを紐付け
    container_name: "schemaspy"
    command: "java -jar schemaspy.jar -configFile /app/schemaspy.properties -debug -all"

  nginx_schemaspy:
    image: nginx:1.19.5-alpine
    container_name: "nginx_schemaspy"
    ports:
      - "8080:80"
    volumes:
      - ./docker/schemaspy/output:/usr/share/nginx/html:ro
```

### Dockerfile

> ```docker
> FROM openjdk:8u212-jdk-alpine
>
>ENV DRIVER_URL https://repo1.maven.org/maven2/mysql/mysql-connector-java/5.1.6/mysql-connector-java-5.1.6.jar
>ENV APP_URL https://github.com/schemaspy/schemaspy/releases/download/v6.1.0/schemaspy-6.1.0.jar
> # 使用中のmysqlのバージョンを記載
> ENV MYSQL_VERSION=X.X.XX
> 
> WORKDIR /app
> 
> RUN apk --update add graphviz ttf-dejavu && \
>     apk --update add --virtual .builddep tzdata wget libressl && \
>     cp /usr/share/zoneinfo/Asia/Tokyo /etc/localtime && \
>     wget -O mysql-connector-java.jar ${DRIVER_URL} && \
>     wget -O schemaspy.jar ${APP_URL} && \
>     apk del .builddep && \
>     rm -rf /var/cache/apk/*
> ```
> [AppleシリコンMac上のDockerでSchemaspyを動かす方法](https://qiita.com/pnpk/items/d308d96ef933312f8d9a)

### schemaspy.properties

```docker
schemaspy.t=mysql
schemaspy.dp=/drivers/mysql-connector-java-8.0.16.jar
schemaspy.host=localhost
schemaspy.port=3306
schemaspy.db=xxxx // ドキュメントを取得したいdb名
schemaspy.u=xxxx //　ユーザー名
schemaspy.u=xxxx //　パスワード（あるなら）
schemaspy.o=/output
```

### my.cnf 

dockerコンテナからホストpcへのアクセスとなるため、mysqlに外部からのアクセスを許可する設定を行う。

※セキュリティ的に良くなさそうなので、ドキュメント生成後はbind-address = 127.0.0.1に変更した方がいいかも

```yaml
[mysqld]
# Only allow connections from localhost
# bind-address = 127.0.0.1
bind-address = 0.0.0.0

sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
```

### ドライバー取得
```
$ cd ./drivers
$ curl -L https://dev.mysql.com/get/Downloads/Connector-J/mysql-connector-java-8.0.16.tar.gz |
    tar xvzf - -C drivers --strip=1 mysql-connector-java-8.0.16/mysql-connector-java-8.0.16.jar
```


```
mysql> GRANT ALL PRIVILEGES ON *.* TO <ユーザー名>@'192.168.%' IDENTIFIED BY '' WITH GRANT OPTION;

192.168から始まるipからのrootユーザーでのアクセスを許可
root@'%'とすると全てのipからのアクセスを許可

mysql> select user, host from mysql.user;
+---------------+-----------+
| user          | host      |
+---------------+-----------+
| <ユーザー名>    | 192.168.% |  <----このユーザーで外部からログインできる
| mysql.session | localhost |
| mysql.sys     | localhost |
| root          | localhost |
+---------------+-----------+
4 rows in set (0.00 sec)

$ docker-compose up
ここにログが吐かれます
```

localhost:8080でアクセスできる

# 参考

[AppleシリコンMac上のDockerでSchemaspyを動かす方法](https://qiita.com/pnpk/items/d308d96ef933312f8d9a)

[schemaspyをdocker-composeで動かす - エンジニアの覚え書き](https://takahashik.hatenablog.com/entry/2018/10/09/075957)