lxcを使ったインストール。gitlabはもうそれ専用のシステムにしてしまった方がよい気がします。ホストはstretchを使う。
# apt install lxc パッケージリストを読み込んでいます... 完了 依存関係ツリーを作成しています 状態情報を読み取っています... 完了 以下の追加パッケージがインストールされます: bridge-utils debootstrap dns-root-data dnsmasq-base liblxc1 libpam-cgfs lxcfs python3-lxc uidmap 提案パッケージ: apparmor btrfs-tools lvm2 以下のパッケージが新たにインストールされます: bridge-utils debootstrap dns-root-data dnsmasq-base liblxc1 libpam-cgfs lxc lxcfs python3-lxc uidmap アップグレード: 0 個、新規インストール: 10 個、削除: 0 個、保留: 0 個。 1,519 kB のアーカイブを取得する必要があります。 この操作後に追加で 3,895 kB のディスク容量が消費されます。 続行しますか? [Y/n]
# lxc-checkconfig Kernel configuration not found at /proc/config.gz; searching... Kernel configuration found at /boot/config-4.9.0-3-amd64 --- Namespaces --- Namespaces: enabled Utsname namespace: enabled Ipc namespace: enabled Pid namespace: enabled User namespace: enabled Network namespace: enabled --- Control groups --- Cgroup: enabled Cgroup clone_children flag: enabled Cgroup device: enabled Cgroup sched: enabled Cgroup cpu account: enabled Cgroup memory controller: enabled Cgroup cpuset: enabled --- Misc --- Veth pair device: enabled Macvlan: enabled Vlan: enabled Bridges: enabled Advanced netfilter: enabled CONFIG_NF_NAT_IPV4: enabled CONFIG_NF_NAT_IPV6: enabled CONFIG_IP_NF_TARGET_MASQUERADE: enabled CONFIG_IP6_NF_TARGET_MASQUERADE: enabled CONFIG_NETFILTER_XT_TARGET_CHECKSUM: enabled FUSE (for use with lxcfs): enabled --- Checkpoint/Restore --- checkpoint restore: enabled CONFIG_FHANDLE: enabled CONFIG_EVENTFD: enabled CONFIG_EPOLL: enabled CONFIG_UNIX_DIAG: enabled CONFIG_INET_DIAG: enabled CONFIG_PACKET_DIAG: enabled CONFIG_NETLINK_DIAG: enabled File capabilities: enabled Note : Before booting a new kernel, you can check its configuration usage : CONFIG=/path/to/config /usr/bin/lxc-checkconfig
で、いずれにせよbridgeが必要になりそう。bridge-utilsは依存で入っているはずだ。
で、ここでは例えばだけど、1つの仮りているvpnがあって、それには当然グローバルIPも振ってあり各種サービスが動作している(apacheなど)といった場合。 まあこの場合でも何とかしてみよう。
# lxc-create -n lxc-gitlab -t debian -- -r stretch
-nは名称 あとはまあdebian stretchを投入するお呪いという所
... invoke-rc.d: could not determine current runlevel invoke-rc.d: policy-rc.d denied execution of start. Current default time zone: 'Etc/UTC' Local time is now: Sat Feb 3 02:10:56 UTC 2018. Universal Time is now: Sat Feb 3 02:10:56 UTC 2018.
みたいな感じで終わるだろう
# lxc-ls -f NAME STATE AUTOSTART GROUPS IPV4 IPV6 lxc-gitlab STOPPED 0 - - -
# lxc-start -n lxc-gitlab # lxc-attach -n lxc-gitlab root@lxc-gitlab:~#
とまあこういう具合
あたり前といえばあたり前なのだが現状ネットワークがないので
# apt update エラー:1 http://httpredir.debian.org/debian stretch InRelease 'httpredir.debian.org' が一時的に解決できません エラー:2 http://security.debian.org stretch/updates InRelease 'security.debian.org' が一時的に解決できません パッケージリストを読み込んでいます... 完了 依存関係ツリーを作成しています... 完了 パッケージはすべて最新です。 W: http://httpredir.debian.org/debian/dists/stretch/InRelease の取得に失敗しました 'httpredir.debian.org' が一時的に解決できません W: http://security.debian.org/dists/stretch/updates/InRelease の取得に失敗しました 'security.debian.org' が一時的に解決できません W: いくつかのインデックスファイルのダウンロードに失敗しました。これらは無視されるか、古いものが代わりに使われます。 # ifconfig -a lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536 inet 127.0.0.1 netmask 255.0.0.0 inet6 ::1 prefixlen 128 scopeid 0x10<host> loop txqueuelen 1 (ローカルループバック) RX packets 80 bytes 6536 (6.3 KiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 80 bytes 6536 (6.3 KiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
というわけでループバックしかないため、一度抜けて止める。
root@lxc-gitlab:~# exit # lxc-stop -n lxc-gitlab # lxc-ls -f NAME STATE AUTOSTART GROUPS IPV4 IPV6 lxc-gitlab STOPPED 0 - - -
/var/lib/lxc/lxc-gitlab/config とかにある。が、まだ手をつけない。
というか基本的にlxcの関連は/var/lib/lxc/以下にまとまっているので覚えておくこと。
なんだけどもnatをするにあたってもbridgeが1つあるといい、lxcは適当にインタフェース名を決めるので、それを束ねておくブリッジが必要になってくるのだ。よく利用されるものとしてlxc-brという名前が多いようだからそうする(名前は適当に決めてもよい)。
/etc/network/interfaces
ここでは適当なプライベートアドレス192.168.100.0/24を想定するが、192.168.100..っていうのが埋まっているなら勿論別のものを割り当ててください。
auto lxc-br iface lxc-br inet static address 192.168.100.1 netmask 255.255.255.0 broadcast 192.168.100.255 pre-up brctl addbr lxc-br
# ifup lxc-br # ifconfig lxc-br lxc-br: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 192.168.100.1 netmask 255.255.255.0 broadcast 192.168.100.255 inet6 fe80::1cb4:b2ff:fe7e:b6a6 prefixlen 64 scopeid 0x20<link> ether 1e:b4:b2:7e:b6:a6 txqueuelen 1000 (イーサネット) RX packets 0 bytes 0 (0.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 7 bytes 578 (578.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
とかまあ、こういう具合になる。
lxc-brが設定できたのでconfigを書き換える
/var/lib/lxc/lxc-gitlab/config
#lxc.network.type = empty lxc.network.type = veth lxc.network.link = lxc-br # ↑この辺だけ変更
ここでlxc-startしてlxc-attachするとviが使えないといかいうおちがあるので(chrootしてつっこむとかいう手はあり)、外側から書いていこう。 コンテナの/etc/network/interfacesは現状loopbackしか書かれていないため、eth0とかを書く。
# vi /var/lib/lxc/lxc-gitlab/rootfs/etc/network/interfaces --- auto lo iface lo inet loopback auto eth0 #iface eth0 inet dhcp iface eth0 inet static address 192.168.100.2 netmask 255.255.255.0 gateway 192.168.100.1 broadcast 192.168.100.255
あとnameserver(リゾルバ)も書き換えとく /var/lib/lxc/lxc-gitlab/rootfs/etc/resolv.conf
#search sakura.ne.jp #nameserver 210.188.224.10 #nameserver 127.0.0.1 nameserver 8.8.8.8
sources.listも序でだし変えとく
/var/lib/lxc/lxc-gitlab/rootfs/etc/apt/sources.list
deb [arch=amd64] http://ftp.jp.debian.org/debian stretch main deb [arch=amd64] http://security.debian.org/ stretch/updates main
これで8割okなんだが、ホストの側のnatがだめかも。
ホスト側で
# iptables -t nat -F # iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
etc0は実際出ていくアダプタを指定してください。たとえばbr0とかになっているならbr0です。
あと
# echo 1 > /proc/sys/net/ipv4/ip_forward
としときまして、再起動されてもいいように
/etc/sysctl.d/99-sysctl.conf
# Uncomment the next line to enable packet forwarding for IPv4 net.ipv4.ip_forward=1
としといていよいよattach
# lxc-start -n lxc-gitlab # lxc-attach -n lxc-gitlab # apt update 取得:1 http://security.debian.org stretch/updates InRelease [63.0 kB] 無視:2 http://ftp.jp.debian.org/debian stretch InRelease ヒット:3 http://ftp.jp.debian.org/debian stretch Release 取得:4 http://security.debian.org stretch/updates/main amd64 Packages [269 kB] 取得:5 http://security.debian.org stretch/updates/main Translation-en [118 kB] 450 kB を 0秒 で取得しました (631 kB/s) パッケージリストを読み込んでいます... 完了 依存関係ツリーを作成しています 状態情報を読み取っています... 完了 アップグレードできるパッケージが 4 個あります。表示するには 'apt list --upgradable' を実行してください。
通信できるようになりました。まあこれで第一段階はok。なんならrootfsを全部コピーしときます。gitlabのインストールをミスってもいいように。
locale=cでやる事。
# export LANG=C # locale LANG=C LANGUAGE= LC_CTYPE="C" LC_NUMERIC="C" LC_TIME="C" LC_COLLATE="C" LC_MONETARY="C" LC_MESSAGES="C" LC_PAPER="C" LC_NAME="C" LC_ADDRESS="C" LC_TELEPHONE="C" LC_MEASUREMENT="C" LC_IDENTIFICATION="C" LC_ALL=
ここから注意というか、SSLを使わない場合はこのまま進んでよい。SSLを使う場合を想定する。
# apt install gitlab Reading package lists... Done Building dependency tree Reading state information... Done The following additional packages will be installed: ...
ともあれaptを通す。
ドメインを決めて(named virtualhostになるようなのでちゃんとする)
これ、ごちゃごちゃ書かれているがLet's Encryptにも対応するぞ的な事。これを< はい >にすると
この辺使ってないからわからんのですよ。。。3か月ごとに手動更新必要だぞとかなんかいろいろ書いてありますが、とりあえず「いいえ」
DBのパスワードはすら表示されないので注意して進めると…
Reloading nginx configuration... Job for nginx.service failed because the control process exited with error code. See "systemctl status nginx.service" and "journalctl -xe" for details. invoke-rc.d: initscript nginx, action "reload" failed. dpkg: error processing package gitlab (--configure): subprocess installed post-installation script returned error exit status 1 Processing triggers for libc-bin (2.24-11+deb9u1) ... Processing triggers for ca-certificates (20161130+nmu1) ... Updating certificates in /etc/ssl/certs... 0 added, 0 removed; done. Running hooks in /etc/ca-certificates/update.d... done. Processing triggers for systemd (232-25+deb9u1) ... Errors were encountered while processing: gitlab E: Sub-process /usr/bin/dpkg returned an error code (1)
いわれる通りsystemctl status nginx.serviceコマンドを打つと
Feb 03 12:47:19 lxc-gitlab nginx[12114]: nginx: [emerg] BIO_new_file("/etc/gitlab/ssl/gitlab.crt") failed (SSL: error:02001002:system library:fopen:No such file or directory:fopen('/etc/gitlab/ssl/gitlab.crt','r') error:2006D080:BIO routines:BIO_new_file:no such file) Feb 03 12:47:19 lxc-gitlab systemd[1]: nginx.service: Control process exited, code=exited status=1 Feb 03 12:47:19 lxc-gitlab systemd[1]: Reload failed for A high performance web server and a reverse proxy server.
この辺らしい。
というわけで、最初に/etc/gitlab/ssl/gitlab.crtを作らないといけない?まあつくってみるならば
# openssl genrsa -out /etc/gitlab/ssl/gitlab.key 2048 # openssl req -new -key /etc/gitlab/ssl/gitlab.key -out /etc/gitlab/ssl/gitlab.csr # ↑(最低限common nameくらいは合わせるべきか) # openssl x509 -req -days 365 -in /etc/gitlab/ssl/gitlab.csr -signkey /etc/gitlab/ssl/gitlab.key -out /etc/gitlab/ssl/gitlab.crt
とまあ、こんなのしておいて
# apt -f install
などとするとinstallは完了するはず。
ホストでがっちり止められているのでポート通しときましょう。。。
iptables -A PREROUTING -t nat -p tcp -i eth0 --dport 443 -j DNAT --to 192.168.100.2:443
あと最後もう一息
/var/lib/lxc/lxc-gitlab/config
lxc.start.auto = 1
iptables系
# iptables -t nat -F # iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE # iptables -A PREROUTING -t nat -p tcp -i eth0 --dport 443 -j DNAT --to 192.168.100.2:443
ipv4のfowaredは/etcで有効化してあるとして、これを保存するにはiptables-persistentを利用するのが楽だ。 きちんと保存されていればdumpをそのまま書き加えてくれる。それだけ。あとはhostをrebootしてもokなはずだよ。
あえてここまできっちりゲストおよびホストおもにネットワークの環境を作成したと仮定したらLet's encryptも使えるだろう。この場合rootfsを一度消してやりなおそう。
ちなみにこの場合も一瞬でいいけど80(HTTP)もgitlabに被せてくださいね