Lychee-Docker/Kubernetes ギャラリーソフトウェア

投稿者: | 1月 5, 2025

githubのレポジトリを漁っていると、使い始めたころと思しき、テスト用のレポジトリがあったりする。作者がどういう経緯で学習をしていったのかがわかったりする。そこに落ちているアプリケーションで面白いアプリケーションを見つけた。コンテナのデモとしては使えると思う。

いきなり、閑話休題

 

Lycheeという画像ギャラリーソフトウェアソフトのご紹介。

https://lycheeorg.github.io

まぁ、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ができてもう少し複雑になる。

 

いずれにせよ、ログインをすると初回パスワードを登録する。変数に入れておけば、この作業は不要。

あとは、ログインをして、写真をアップロードするだけ。使い方は言わずもがななので、割愛。

 

ちょっとしたデモ環境としては使えると思う。

 

コメントを残す