ブロガーさんが気になるのは、日々のキーワードランキングではないでしょうか?

キーワード検出ツールはいろいろありますが、まともな機能の有料ソフトだと月数千円ぐらいして高いんですよね。

アフィリエイトで月100万ぐらい稼いでいる方なら、大した出費だとは思わないかもしれませんが、初心者さんにはきついかも・・・

でもDockerが使えれば、そんな悩みもなくなります。

DockerでSerposcopeをたくさん稼働させれば、画像チェックにも引っかからず余裕で数百サイトの順位検索が可能です。

そんなDocker+Serposcopeの導入方法をご紹介!

SerposcopeをDockerで実践

一番簡単な方法は、Docker Hubからのインストールです。

まずは、DockerHubのサイトにアクセスしましょう。

dockerhub-serposcope

画僧のようにSerposcopeで検索すると、多くのdocker imageを入手する事ができます。

導入実績が多いimageならどれでも大丈夫ですが、迷ったら検索時で最も更新日が新しいのが良いでしょう。

今回は「martinbouillaud/serposcope」で実践です。

# docker pull martinbouillaud/serposcope
# docker run <serposcopeのイメージID> -p 7134:7134 -d

即効で動かしたいなら、もうこれだけでOKです。

ウェブブラウザを開いて、レンタルVPSサーバーのグローバルIPアドレスとポート番号を入力するだけでインストール完了です。

 serposcope_ip

EmailとPasswordを入力すれば、すぐに使い始める事が可能です。

でも、使ってみればわかりますが、短い間に何度もキーワード検索をおこなうと、画像キャプチャーが表示されて、全然使い物にならないんです。

また、折角入手したキーワードのデーターベースも永久的に利用したいですよね。

そんな時は、docker-composeの出番です。

DockerでSerposcopeを複数同時に立ち上げる方法

2つのコンテナ実装で、1つのグローバルIPアドレスで複数稼働も簡単です。

DB(データベース)を別のコンテナとして稼働させて連携、また設定ファイルはホストOSからもアクセスできるようにマウントしましょう。

docker-compose.ymlに記述すれば、serposcopeとDB連携の設定が簡単に出来ます。

Dockerでhttps-potalを使う

基本構成は2つのコンテナ
  • アプリケーションサーバー(app)コンテナ
  • データベースサーバー(db)コンテナ

ディレクトリ構成は次のようになります。

serposcope
 ├── docker-compose.yml
 └── db

コンソール画面でdocker-compose.ymlを立ち上げて、次のように記述してください。

version: "3.5"
services:
     ser_web_http:
                restart: always
                container_name: ser_web_http
                image: martinbouillaud/serposcope:latest
                ports:
                        - '7135:7134'
                depends_on:
                        - ser_db_http
                environment:
                        SERPOSCOPE_DB_URL: 'jdbc:mysql://ser_db/serposcope_db?user=serposcope_user\&password=password\&allowMultiQueries=true'
                        SERPOSCOPE_DB_DEBUG: "true"
                        TZ: Asia/Tokyo
                networks:
                        - serpos_net_http
        ser_db_http:
                image: mariadb:latest
                container_name: ser_db_http
                hostname: ser_db
                #command: mysqld --user=mysql
                networks:
                        - serpos_net_http
                #ports:
                        # - '3306:3306'
                volumes:
                        - ./db:/var/lib/mysql
                environment:
                        MYSQL_ROOT_PASSWORD: password
                        MYSQL_DATABASE: serposcope_db
                        MYSQL_USER: serposcope_user
                        MYSQL_PASSWORD: password
                        TZ: Asia/Tokyo
                restart: always
networks:
        serpos_net_http:
                driver: bridge

Dockerにした場合、2つのコンテナをnetworksで繋げているので、portの設定をしなくてもDBは繋がります。

ポイントは次の3つです。

①serposcopeで使用するDB(データベース)を内部から、外部のmariaDBに変更

depends_on:
    - ser_db_http 
environment: 
    SERPOSCOPE_DB_URL: 'jdbc:mysql://ser_db/serposcope_db?user=serposcope_user\&password=password\&allowMultiQueries=true' 
    SERPOSCOPE_DB_DEBUG: "true" 
    TZ: Asia/Tokyo

先にDBが読み込まれてから、実行するようにdepends_onで設定し、データベースを外部出力するパスに変更します。

大事なのは、TZ: Asia/Tokyo、日本時刻のログになります。

②タイムゾーンを日本時刻に設定

environment: 
    MYSQL_ROOT_PASSWORD: password 
    MYSQL_DATABASE: serposcope_db 
    MYSQL_USER: serposcope_user 
    MYSQL_PASSWORD: password 
    TZ: Asia/Tokyo

serposcopeのデータベースに接続するパスワードを用意します。

TZ: Asia/Tokyoの設定はコンテナ毎に必要です。

③ホストOS側に作成したデータベースをマウント

volumes: - ./db:/var/lib/mysql

本来なら、dockerコンテナが稼働していないと、データベースにはアクセスできません。

volumesにパスの記述をするだけで、docker-compose downでコンテナを削除しても、キーワードデータは残っています。

再接続はdocker-compose up です。

 

Serposcopeをhttps対応にする方法

Serposcopeのセキュリティを強化するためのhttps導入もドメインを指定すれば簡単です。

でも、その為にわざわざ、ドメインを購入する手間暇が嫌という方は、そのままIPアドレスのまま使ってしまいましょう。

Dockerを利用すれば、そんな事もちょちょいのちょいです。

Serposcopeとhttps-potal2つのコンテナ

最小構成は2つのコンテナで可能
  • アプリケーションサーバー(app)コンテナ
  • リバースプロキシ―(https)コンテナ

ディレクトリ構成は次のようになります。

serposcope
 ├── docker-compose.yml
 ├── nginx
 └── src

nginxとsrcのディレクトリは、docker-compose.ymlを実行すれば、自動で作成されるので、事前に作る必要はありません。

尚、外部DBを利用するなら、コンテナは3つ必要になりますが、説明を簡単にするため2つにしています。

version: "3.5"
services:
        serposcope_web:
                restart: always
                container_name: serposcope_web
                image: martinbouillaud/serposcope:latest
                expose:
                        - '7134'
                environment:
                        TZ: Asia/Tokyo
        serposcope_https:
                image: steveltn/https-portal:1
                container_name: serposcope_https
                ports:
                        - '80:80'
                        - '443:443'
                restart: always
                volumes:
                        - ./nginx/ssl_certs:/var/lib/https-portal
                        - ./nginx/conf/mysite_nginx.conf:/etc/nginx/conf.d/mysite_nginx.conf
                        - ./nginx/uwsgi_params:/etc/nginx/uwsgi_params
                        - ./src/static:/static
                environment:
                        DOMAINS: 'serposcope.119.271.0.155.nip.io -> http://serposcope_web:7134'
                        STAGE: local #staging
                        # FORCE_RENEW: 'true'
                depends_on:
                        - serposcope_web

ポイントは2つ、WEBサーバー側で7134ポートを吐き出している点と、ワイルドカードDNSを使っている点です。

ワイルドカードDNSに関しては、IPアドレスのままhttpsにする方法でご紹介しています。

https://crypto-nft-fire.com/docker-ip-https/

もちろん、○○.comといった正規ドメインを取得して利用する事も可能です。

ウェブブラウザにhttps://serposcope.119.271.0.155.nip.io/と入力すれば、https通信が可能になります。

 serposcope_nip

尚、オレオレ証明書をlocalにて発行しているので、証明書をブラウザ側で認証させない限り、保護されていない通信と警告がでます。

 

SerposcopeのDBをいつでもphpmyadminで確認する方法

最後にhttpsで稼働するSerposcopeのDB連携です。

基本構成は次の4つのコンテナ
  • アプリケーションサーバー(app)コンテナ
  • データベースサーバー(db)コンテナ
  • リバースプロキシ―(https)コンテナ
  • データベースチェック(phpmyadmin)コンテナ
version: "3.5"
services:
        ser_web:
                restart: always
                container_name: ser_web
                image: martinbouillaud/serposcope:latest
                expose:
                        - '7134'
                depends_on:
                        - ser_db
                environment:
                        SERPOSCOPE_DB_URL: 'jdbc:mysql://ser_db/serposcope_db?user=serposcope_user\&password=password\&allowMultiQueries=true'
                        SERPOSCOPE_DB_DEBUG: "true"
                        TZ: Asia/Tokyo
                networks:
                        - serpos_net
        ser_db:
                image: mariadb:latest
                container_name: ser_db
                hostname: ser_db
                #command: mysqld --user=mysql
                networks:
                        - serpos_net
                volumes:
                        - ./db:/var/lib/mysql
                environment:
                        MYSQL_ROOT_PASSWORD: password
                        MYSQL_DATABASE: serposcope_db
                        MYSQL_USER: serposcope_user
                        MYSQL_PASSWORD: password
                        TZ: Asia/Tokyo
                restart: always
        ser_phpmyadmin:
                image: phpmyadmin/phpmyadmin:latest
                container_name: ser_phpmyadmin
                expose:
                        - '80'
                environment:
                        - PMA_HOST=ser_db
                        #- PMA_USER=serposcope_user
                        #- PMA_PASSWORD=password
                depends_on:
                        - ser_db
                networks:
                        - serpos_net
       ser_https:
                image: steveltn/https-portal:1
                container_name: ser_https
                ports:
                        - '80:80'
                        - '443:443'
                restart: always
                volumes:
                        - ./nginx/ssl_certs:/var/lib/https-portal
                        - ./nginx/conf/mysite_nginx.conf:/etc/nginx/conf.d/mysite_nginx.conf
                        - ./src/static:/static
                environment:
                        DOMAINS: 'serposcope_web.119.271.0.155.nip.io -> http://ser_web:7134,serposcope_db_admin.119.271.0.155.nip.io -> http://ser_phpmyadmin:80'
                        STAGE: local #staging
                        # FORCE_RENEW: 'true'
                depends_on:
                        - ser_web
                networks:
                        - serpos_net
networks:
        serpos_net:
                driver: bridge

environmentのDMAINSに注目です。

2つのWEBサイト

serposcopeのWEBには、https://serposcope_web.119.271.0.155.nip.io
phpmyadminには、https://serposcope_db_admin.119.271.0.155.nip.io

これだけで、アクセスできるようにしています。

つまり、サブドメイン形式にすることで、同じグローバルIPアドレスを使いまわすことが可能なのです。

この方法なら、serposcope1、serposcope2、serposcope3といった感じでwebサービスを増やすことが出来ます。

尚、複数のserposcopeサービスを同時に起動する場合は、正規ドメインでの運用がいいでしょう。

 

httpsにしなくて良いなら、3つのコンテナでも大丈夫です。

httpsなし:3つのコンテナ
  • アプリケーションサーバー(app)コンテナ
  • データベースサーバー(db)コンテナ
  • データベースチェック(phpmyadmin)コンテナ

こちらが最もシンプルかも知れませんね。

version: "3.5"
services:
     ser_web_http:
                restart: always
                container_name: ser_web_http
                image: martinbouillaud/serposcope:latest
                ports:
                        - '7134:7134'
                depends_on:
                        - ser_db_http
                environment:
                        SERPOSCOPE_DB_URL: 'jdbc:mysql://ser_db/serposcope_db?user=serposcope_user\&password=password\&allowMultiQueries=true'
                        SERPOSCOPE_DB_DEBUG: "true"
                        TZ: Asia/Tokyo
                networks:
                        - serpos_net_http
        ser_db_http:
                image: mariadb:latest
                container_name: ser_db_http
                hostname: ser_db
                networks:
                        - serpos_net_http
                #ports:
                        # - '3306:3306'
                volumes:
                        - ./db:/var/lib/mysql
                environment:
                        MYSQL_ROOT_PASSWORD: password
                        MYSQL_DATABASE: serposcope_db
                        MYSQL_USER: serposcope_user
                        MYSQL_PASSWORD: password
                        TZ: Asia/Tokyo
                restart: always
        ser_phpmyadmin_http:
                image: phpmyadmin/phpmyadmin:latest
                container_name: ser_phpmyadmin_http
                ports:
                        - '1080:80'
                environment:
                        - PMA_HOST=ser_db
                          #- PMA_USER=serposcope_user
                          #- PMA_PASSWORD=password
                depends_on:
                        - ser_db_http
                networks:
                        - serpos_net_http
networks:
        serpos_net_http:
                driver: bridge


 

serposcopを常に最新バージョンにする方法

serposcopeのバージョンも常に最新にしておくと安心です。

windowsOSにインストールしているなら、ダウンロードすれば、自動で更新も簡単にできますが、レンタルVPSで運用している場合は、ちょっとめんどくさいです。

そこで、Dockerfileを用意して、docker-compose build、docker-compose upのサイクル運用の方法をご紹介です。(ubuntuの場合)

serposcope
 ├── docker-compose.yml
 ├── web 
      └── Dockerfile

serposcopeの最新バージョンimageファイルを作る

Dockerfileの中身を次のように記載します。

FROM martinbouillaud/serposcope
USER root

# 必要なパッケージを記載
RUN apt-get update && apt-get install --no-install-recommends -y \
curl && \
apt install sudo && \
apt-get clean


ENV SERPOSCOPE_VERSION 2.15.0

RUN curl -L https://serposcope.serphacker.com/download/${SERPOSCOPE_VERSION}/serposcope-${SERPOSCOPE_VERSION}.jar > /opt/serposcope.jar -k

ENVの環境変数でバージョン管理です。最新のバージョンにするだけで、毎回の変更が簡単です。

Dockerfileでserposcopの新しいimageを作成します。

単独なら”docker image build ./ -t serposcope_new”と入力すれば、serposcope_newの新しいimageが作成されます。

自動化するなら、docker-compose.ymlの中身を変更しましょう。

docker-compose.ymlの中身を変更してserposcopを最新バージョンにする

docker hubからpullしてきた”martinbouillaud/serposcope”のimageを削除して、新規image名を記入します。

例えば、serposcope_newです。このimageはまだ存在していなくても大丈夫です。

  ser_web:
   build:
    context: ./web
    dockerfile: "Dockerfile"
   image: serposcope_new
   #image: martinbouillaud/serposcope
   ・
   ・

docker-compose.ymlファイルを修正したら、コマンドを入力して終了です。

docker-compose  build
docker-compose up

buildコマンドで、serposcope_newが作られて、upコマンドでコンテナ作成されます。