自宅サーバでDocker

お久し振りです。

かねてよりクラウドでアプリケーションサーバを立てることばかりにフォーカスしていましたが、気付けばAzureの無料枠も底を突き、さぁどうしようかと考えていたところ、ちょうど会社の同期がパソコンを買いに行くというのでついでに5~6万の格安構成で自作してLinuxサーバを立てることにしました。

構成は以下です。

OSCentOS Linux 7.5.1804
CPUIntel Core i3-8100 BOX
M/BASRock H370M-ITX/ac
RAMCrucial CT2K4G4DFS824A
HDD東芝 DT01ACA300 x2(RAID1)
光学ドライブLG GH24NSD1BLBLH
電源玄人志向 KRPW-GP550W/90+
筐体Cooler Master RC-120A-KKN1-JP

ついでにドメインも取得しました。一昔前までは年間7000~9000円という印象だったんですが、今のご時世、.comドメインなら年間1000円で運用できるんですね。。。

で、構築した環境ですが、基本的には前回を踏襲しています。

今回はそれに加えて各コンテナのサブドメイン化、HTTPS化、データ永続化とJupyterHub(Jupyterマルチユーザ化)にトライしました。あとついでに進捗管理ツールのRedmineを乗っけました。

サブドメイン化

独自ドメインの場合、事前にDNSのAレコードを追加しておく必要があります。

最も簡単なのは「*.hogedomain.com」を全てサーバのIPアドレスに紐付けるやり方でしょうか。

JupyterHubコンテナ作成

JupyterHubは事前にDockerfileでイメージをビルドする必要があります。

下記5ファイルを用意します。

#!/bin/sh

IFS="
"
for line in `cat userlist`; do
  test -z "$line" && continue
  user=`echo $line | cut -f 1 -d' '`
  echo "adding user $user"
  useradd -m -s /bin/bash $user
#  cp -r /srv/ipython/examples /home/$user/examples
#  chown -R $user /home/$user/examples
done
# Designed to be run as
#
# docker run -it -p 8000:8000 jupyterhub/oauthenticator

FROM jupyterhub/jupyterhub

MAINTAINER Project Jupyter <[email protected]>

# Install oauthenticator from git
RUN python3 -m pip install oauthenticator

# Create oauthenticator directory and put necessary files in it
RUN mkdir /srv/oauthenticator
WORKDIR /srv/oauthenticator
ENV OAUTHENTICATOR_DIR /srv/oauthenticator
# GitLabのサブドメイン名を設定
ENV GITLAB_HOST http://git.hogedomain.com/
ADD jupyterhub_config.py jupyterhub_config.py
ADD addusers.sh /srv/oauthenticator/addusers.sh
ADD userlist /srv/oauthenticator/userlist
ADD ssl /srv/oauthenticator/ssl

RUN pip3 install --upgrade notebook

RUN chmod 700 /srv/oauthenticator

RUN ["sh", "/srv/oauthenticator/addusers.sh"]
# add your github oauth config to this file,
# and run the container with `docker run -it -p 9000:8000 --env-file=env jupyterhub-oauth`
OAUTH_CLIENT_ID=[GitLabから後で設定します]
OAUTH_CLIENT_SECRET=[GitLabから後で設定します]

# JupyterHubのサブドメイン+コールバックURIを設定(GitLabと連携します)
OAUTH_CALLBACK_URL=http://jupyter.hogedomain.com/hub/oauth_callback
# Configuration file for Jupyter Hub

c.JupyterHub.log_level = 10
#from oauthenticator.github import LocalGitHubOAuthenticator
#c.JupyterHub.authenticator_class = LocalGitHubOAuthenticator

#from oauthenticator.github import GitHubOAuthenticator
#c.JupyterHub.authenticator_class = GitHubOAuthenticator

from oauthenticator.gitlab import LocalGitLabOAuthenticator
c.JupyterHub.authenticator_class = LocalGitLabOAuthenticator

c.LocalGitLabOAuthenticator.create_system_users = False

c.Authenticator.whitelist = whitelist = set()
c.JupyterHub.admin_users = admin = set()

import os
import sys

join = os.path.join

here = os.path.abspath(os.path.dirname(__file__))
root = os.environ.get('OAUTHENTICATOR_DIR', here)
sys.path.insert(0, root)

with open(join(root, 'userlist')) as f:
    for line in f:
        if not line:
            continue
        parts = line.split()
        name = parts[0]
        whitelist.add(name)
        if len(parts) > 1 and parts[1] == 'admin':
            admin.add(name)

c.GitHubOAuthenticator.oauth_callback_url = os.environ['OAUTH_CALLBACK_URL']

# ssl config
ssl = join(root, 'ssl')
keyfile = join(ssl, 'ssl.key')
certfile = join(ssl, 'ssl.cert')
if os.path.exists(keyfile):
    c.JupyterHub.ssl_key = keyfile
if os.path.exists(certfile):
    c.JupyterHub.ssl_cert = certfile
hogeuser admin

ビルドします。

docker build -t jupyter/oauthenticator .

docker-compose.yml作成&起動

docker-compose.ymlを作ります。ちなみに今回はリバースプロキシのファイルアップロード上限を増やしたり(server.conf)、Redmineのテンプレートを追加したり(gitmike)しているので、これだけだと「ファイルが足りません」みたいに怒られると思います。

余裕があれば後で完全版をアップしますが、それは多分実現しません。ここまで根気よく読んでいただけている皆さんならググればすぐに解決すると思います。

version: "2"

services:
  proxy:
    image: jwilder/nginx-proxy
    container_name: Proxy
    privileged: true
    restart: always
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - '/srv/docker/nginx-proxy-with-encrypt/certs:/etc/nginx/certs:ro'
      - '/srv/docker/nginx-proxy-with-encrypt/htpasswd:/etc/nginx/htpasswd'
      - '/etc/nginx/vhost.d'
      - '/usr/share/nginx/html'
      - '/var/run/docker.sock:/tmp/docker.sock:ro'
      - '/srv/docker/nginx-proxy-with-encrypt/log:/var/log/nginx'
      - './server.conf:/etc/nginx/conf.d/server.conf:z'
    networks:
      app_net:
        ipv4_address: 192.168.56.100
      ssl_proxy:

  letsencrypt-nginx:
    image: jrcs/letsencrypt-nginx-proxy-companion
    container_name: letsencrypt-nginx
    privileged: true
    restart: always
    volumes:
      - '/srv/docker/nginx-proxy-with-encrypt/certs:/etc/nginx/certs:rw'
      - '/var/run/docker.sock:/var/run/docker.sock:ro'
    volumes_from:
      - proxy
    networks:
      app_net:
        ipv4_address: 192.168.56.101

  gitlab:
    image: gitlab/gitlab-ce
    container_name: GitLab
    privileged: true
    restart: always
    environment:
      - VIRTUAL_HOST=git.hogedomain.com
      - VIRTUAL_PORT=80
      - LETSENCRYPT_HOST=git.hogedomain.com
      - [email protected]
    volumes:
      - '/srv/docker/gitlab/config:/etc/gitlab'
      - '/srv/docker/gitlab/logs:/var/log/gitlab'
      - '/srv/docker/gitlab/data:/var/opt/gitlab'
    networks:
      app_net:
        ipv4_address: 192.168.56.2

  jupyterhub:
    image: jupyter/oauthenticator
    container_name: JupyterHub
    privileged: true
    restart: always
    environment:
      - VIRTUAL_HOST=jupyter.hogedomain.com
      - VIRTUAL_PORT=8000
      - LETSENCRYPT_HOST=jupyter.hogedomain.com
      - [email protected]
    volumes:
      - '/srv/docker/jupyter/data:/home:z'
    env_file:
      - "./env"
    extra_hosts:
      - 'GitLab:192.168.56.2'
      - 'git.hogedomain.com:192.168.56.2'
    networks:
      app_net:
        ipv4_address: 192.168.56.3

  redmine:
    image: redmine
    container_name: Redmine
    privileged: true
    restart: always
    environment:
      - REDMINE_DB_POSTGRES=postgres
      - REDMINE_DB_USERNAME=redmine
      - REDMINE_DB_PASSWORD=hogepassword
      - VIRTUAL_HOST=redmine.hogedomain.com
      - VIRTUAL_PORT=3000
      - LETSENCRYPT_HOST=redmine.hogedomain.com
      - [email protected]
    volumes:
      - '/srv/docker/redmine/files:/usr/src/redmine/files'
      - '/srv/docker/redmine/plugins:/usr/src/redmine/plugins'
      - '/srv/docker/redmine/vplugins:/usr/src/redmine/vendor/plugins'
      - '/srv/docker/redmine/themes:/usr/src/redmine/public/themes'
      - './gitmike:/usr/src/redmine/public/themes/gitmike'
    links:
      - redminepg:postgres
    networks:
      app_net:
        ipv4_address: 192.168.56.4

  redminepg:
    image: postgres
    container_name: RedmineDB
    privileged: true
    restart: always
    environment:
      - POSTGRES_PASSWORD=hogepassword
      - POSTGRES_USER=redmine
    volumes:
      - '/srv/docker/redminepg/data:/var/lib/postgresql/data'
    networks:
      app_net:
        ipv4_address: 192.168.56.5

networks:
  ssl_proxy:
    external: true
  app_net:
    driver: bridge
    ipam:
      driver: default
      config:
        - subnet: 192.168.56.0/24
          gateway: 192.168.56.1

立ち上げます。

docker-compose up -d

何事もなければ10分~20分で全てのコンテナが立ち上がると思います(大半はそこまでかからないけどGitLabだけ時間がかかる)。

OAuth設定

GitLabが立ち上がったらサインアップして「User Settings」→「Applications」からGitLabを利用してOAuth認証するアプリケーションを作成します。

作成して生成された「Application Id」と「Secret」を先ほどの「env」というファイルの「OAUTH_CLIENT_ID」と「OAUTH_CLIENT_SECRET」に記載して、

docker-compose restart

すると、JupyterHubにログインできるようになるはずです。

何か怒られたら

docker-compose down
docker-compose up -d

で。

時間が時間なので駆け足になってしまいましたが、それぞれのアプリケーションについて後ほどもう少し詳細に書いていこうかなと思います。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日記

次の記事

ブログを移設しました