stashとは
OSSのメディア管理ソフトウェアです。もともと、えっちなメディアはクラウドストレージに置けないから自分で管理したいよねという思いから始まったプロジェクトのようで、公式サイトにNSFWな画像が含まれるなどしていますが、普通にメディア管理ソフトウェアとして優秀そうなので紹介、構築したいと思います。
構築
以前の記事で、k8sクラスタ, argoCD, QNAPによるNASを構築しました。これらを使ってstashを構築していきます。
Nodeの作業
今回、NFSを使うので、必要なソフトウェアをk8sの各ノードにインストールします。
sudo apt-get install nfs-common -y
NAS設定
メディアを保存するための共有フォルダを作成します。今回、stashのmetadataを保存するstashapp共有フォルダと、メディアファイルを保存するmedia共有フォルダ、設定保存用にstashapp-configフォルダを作成します。
サーバーからアクセスできるようにNFS(v4)をNAS全体で有効化します。
先ほど作った3つの共有フォルダにNFSの権限設定をします。今回は、k8sクラスタの3つのipアドレスに対して、読み書きを許可しました。
Kustomize
k8sにデプロイするKustomizeファイルを作成します。 gitlabにレポジトリを作成し、baseディレクトリを作成しています。将来overlaysディレクトリが作成可能なようにこのようにしていますが、追加することはないかもしれません。
ディレクトリ構造は以下のようです。
- base
- configMap.yaml
- deployment.yaml
- kustomization.yaml
- service.yaml
configMap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: stashapp-map
data:
data_directory: "/mnt/data"
generated_content_directory: "/mnt/meta/generated"
metadata_directory: "/mnt/meta/metadata"
cache_directory: "/mnt/meta/cache"
deployment.ymal
apiVersion: apps/v1
kind: Deployment
metadata:
name: stashapp-deployment
spec:
replicas: 1
selector:
matchLabels:
deployment: stashapp-deployment
template:
metadata:
labels:
deployment: stashapp-deployment
spec:
containers:
- name: stashapp-container
image: stashapp/stash:latest
ports:
- containerPort: 9999
env:
- name: STASH_STASH
valueFrom:
configMapKeyRef:
name: stashapp-map
key: data_directory
- name: STASH_GENERATED
valueFrom:
configMapKeyRef:
name: stashapp-map
key: generated_content_directory
- name: STASH_METADATA
valueFrom:
configMapKeyRef:
name: stashapp-map
key: metadata_directory
- name: STASH_CACHE
valueFrom:
configMapKeyRef:
name: stashapp-map
key: cache_directory
volumeMounts:
- name: stashapp-meta-volume
mountPath: /mnt/meta
- name: stashapp-data-volume
mountPath: /mnt/data
- name: stashapp-config-volume
mountPath: /root/.stash
volumes:
- name: stashapp-meta-volume
nfs:
server: $NAS_IP
path: /stashapp
- name: stashapp-data-volume
nfs:
server: $NAS_IP
path: /media
- name: stashapp-config-volume
nfs:
server: $NAS_IP
path: /stashapp-config
kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
namespace: stashapp
commonLabels:
app: stashapp
resources:
- deployment.yaml
- service.yaml
- configMap.yaml
service.yaml
kind: Service
apiVersion: v1
metadata:
name: stashapp-service
spec:
selector:
deployment: stashapp-deployment
type: LoadBalancer
ports:
- protocol: TCP
port: 80
targetPort: 9999
argoCDでデプロイ
先に、k8sでnamespaceを作成します。
kubectl create namespace stashapp
argoCDのUIから、Kustomizeを置いたレポジトリを登録します。
argoCDのUIから、project、stash-appを作成します。以下内容です。
DESTINATIONS
Server: https://kubernetes.default.svc
Namespace: stashapp
CLUSTER RESOURCE ALLOW LIST
Kind: *
Group: *
SOURCE REPOSITORIES
Kustomizeを置いたレポジトリのurl
argoCDのUIから、applicationを作成します。以下内容です。
Application name: 任意
project: さっき作成したprojectがsugegstされるので選択
sync policy: manual
Repository URL: さっき登録したレポジトリがsuggestされるので選択
Revision: master
Path: base
Cluster URL: https://kubernetes.default.svc
namespace: stashapp
baseディレクトリの中身を直接使用します。登録ができたらcreateします。 out of syncの状態になるのでsyncします。
無事healthyになったら、kubectlでipを確認して見に行きます。 無事初期設定画面が出れば成功です。