githubのレポジトリを漁っていると、使い始めたころと思しき、テスト用のレポジトリがあったりする。作者がどういう経緯で学習をしていったのかがわかったりする。そこに落ちているアプリケーションで面白いアプリケーションを見つけた。コンテナのデモとしては使えると思う。
いきなり、閑話休題
Lycheeという画像ギャラリーソフトウェアソフトのご紹介。
まぁ、NASを買えば、こんなアプリも付いてくるのだが、それはそれで置いておいて。
このソフトウェアは、単純にWebベースで画像ギャラリーをホスティングするソフトウェア。まぁ、写真はEXIFとか対応しているし。有償版も一応ある。統計を取れたり、クォータを設定したり。多分ホスティングプロバイダー用だと思う。
インストール方法は以下にある。サーバに直接建てたり、Dockerで建てたりできるらしい。
https://lycheeorg.github.io/docs/installation.html
この手のソフトウェアを一から構築するのは面倒なので、Dockerで建ててみた。
Dockerでの構築は以下。
https://lycheeorg.github.io/docs/docker.html
作ったDocker Composeは以下。
Dockerのボリュームの設定をして、公開先のURLをAPP_URLに設定すればいい。
services:
lychee_db:
container_name: lychee_db
image: mariadb:10
environment:
- MYSQL_ROOT_PASSWORD=<パスワード>
- MYSQL_DATABASE=lychee
- MYSQL_USER=lychee
- MYSQL_PASSWORD=<パスワード>
expose:
- 3306
volumes:
- ./mysql:/var/lib/mysql
networks:
- lychee
restart: unless-stopped
lychee:
image: lycheeorg/lychee
container_name: lychee
ports:
- 90:80
volumes:
- ./lychee/conf:/conf
- ./lychee/uploads:/uploads
- ./lychee/sym:/sym
- ./lychee/logs:/logs
- ./lychee/tmp:/lychee-tmp
networks:
- lychee
environment:
#- PUID=1000
#- PGID=1000
# PHP timezone e.g. PHP_TZ=America/New_York
- PHP_TZ=Asia/Tokyo
- TIMEZONE=Asia/Tokyo
#- APP_NAME=Laravel
#- APP_ENV=local
#- APP_DEBUG=true
#- APP_FORCE_HTTPS=false
- APP_URL=http://192.168.10.10:90
#- APP_DIR=
#- DEBUGBAR_ENABLEd=false
#- VUEJS_ENABLED=true
#- LEGACY_API_ENABLED=false
#- LEGACY_V4_REDIRECT=false
#- DB_OLD_LYCHEE_PREFIX=''
- DB_CONNECTION=mysql
- DB_HOST=lychee_db
- DB_PORT=3306
- DB_DATABASE=lychee
- DB_USERNAME=lychee
- DB_PASSWORD=<パスワード>
#- DB_PASSWORD_FILE=<filename>
#- DB_LOG_SQL=false
#- DB_LOG_SQL_EXPLAIN=false
#- ENABLE_TOKEN_AUTH=true
#- CACHE_DRIVER=file
#- SESSION_DRIVER=file
#- SESSION_LIFETIME=120
#- QUEUE_CONNECTION=sync
#- SECURITY_HEADER_HSTS_ENABLE=false
#- SECURITY_HEADER_CSP_CONNECT_SRC=
#- SECURITY_HEADER_SCRIPT_SRC_ALLOW=
#- SESSION_SECURE_COOKIE=false
#- MAIL_DRIVER=smtp
#- MAIL_HOST=smtp.mailtrap.io
#- MAIL_PORT=2525
#- MAIL_USERNAME=null
#- MAIL_PASSWORD=null
#- MAIL_PASSWORD_FILE=<filename>
#- MAIL_ENCRYPTION=null
#- MAIL_FROM_NAME=masezou
#- MAIL_FROM_ADDRESS=masezou@gmail.com
#- TRUSTED_PROXIES=
#- SKIP_PERMISSIONS_CHECKS
- STARTUP_DELAY=30
#- ADMIN_USER=admin
#- ADMIN_PASSWORD=<ADMIN_PASSWORD>
#- ADMIN_PASSWORD_FILE=<filename>
### Unused in Lychee
#- REDIS_HOST=127.0.0.1
#- REDIS_PASSWORD=null
#- REDIS_PASSWORD_FILE=<filename>
#- REDIS_PORT=6379
restart: unless-stopped
depends_on:
- lychee_db
networks:
lychee:
volumes:
mysql:
これで起動する。
Kubernetesの場合は、以下で作れるのだが、PVCがないので、データが永続的にならない。
helm repo add k8s-at-home https://k8s-at-home.com/charts/
helm repo update
helm -n lychee install lychee k8s-at-home/lychee --create-namespace --set image.tag="v6.2.0"
結果として、スクラッチで作るしかなかった。
作ったのがこれ。完成系。
SCにStorageClassを入れて、DNSDOMAINNAMEに、ドメイン名を入れる。K3sなので、Ingressは、traefikになっている。必要なら設定を変更しておく。
cat << EOF > picture-gallery.yaml
---
apiVersion: v1
kind: Service
metadata:
name: picture-gallery
labels:
app: picture-gallery
spec:
ports:
- port: 80
selector:
app: picture-gallery
tier: frontend
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pic-gal-pics
labels:
app: picture-gallery
contains: uploaded-pictures
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 2Gi
storageClassName: ${SC}
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: picture-gallery
labels:
app: picture-gallery
spec:
strategy:
type: Recreate
selector:
matchLabels:
app: picture-gallery
template:
metadata:
labels:
app: picture-gallery
tier: frontend
spec:
containers:
- image: lycheeorg/lychee:v6.2.0
livenessProbe:
httpGet:
path: /
port: 80
scheme: HTTP
initialDelaySeconds: 30
timeoutSeconds: 5
name: picture-gallery
ports:
- containerPort: 80
name: picture-gallery
env:
- name: APP_URL
value: picture-gallery.${DNSDOMAINNAME}
- name: PHP_TZ
value: Asia/Tokyo
- name: TZ
value: Asia/Tokyo
- name: STARTUP_DELAY
value: "30"
- name: LYCHEE_UPLOADS_URL
value: /uploads
volumeMounts:
- name: pic-gal-pic
mountPath: /uploads
volumes:
- name: pic-gal-pic
persistentVolumeClaim:
claimName: pic-gal-pics
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: picture-gallery
spec:
ingressClassName: traefik
rules:
- host: picture-gallery.${DNSDOMAINNAME}
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: picture-gallery
port:
number: 80
EOF
作られたのは、SQLiteバックエンドなので、シンプル。MySQLでも作れた。MySQLだと、MySQLのDeploymentができてもう少し複雑になる。
いずれにせよ、ログインをすると初回パスワードを登録する。変数に入れておけば、この作業は不要。
あとは、ログインをして、写真をアップロードするだけ。使い方は言わずもがななので、割愛。
ちょっとしたデモ環境としては使えると思う。