自宅サーバでDocker
お久し振りです。
かねてよりクラウドでアプリケーションサーバを立てることばかりにフォーカスしていましたが、気付けばAzureの無料枠も底を突き、さぁどうしようかと考えていたところ、ちょうど会社の同期がパソコンを買いに行くというのでついでに5~6万の格安構成で自作してLinuxサーバを立てることにしました。
構成は以下です。
OS | CentOS Linux 7.5.1804 |
CPU | Intel Core i3-8100 BOX |
M/B | ASRock H370M-ITX/ac |
RAM | Crucial 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
で。
時間が時間なので駆け足になってしまいましたが、それぞれのアプリケーションについて後ほどもう少し詳細に書いていこうかなと思います。