You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 
Efertone e22a67d6f3
This application is much simpler than it seems for the first time
2 years ago
.assets add screenshots 2 years ago
.vscode Initial commit 2 years ago
api This application is much simpler than it seems for the first time 2 years ago
elm This application is much simpler than it seems for the first time 2 years ago
server This application is much simpler than it seems for the first time 2 years ago
storage Cache images + client jwt 2 years ago
.gitattributes Initial commit 2 years ago
.gitignore remove generated js 2 years ago
.golangci.yaml Initial commit 2 years ago
.goreleaser.yml getting better and better 2 years ago
Dockerfile Dockerfiles 2 years ago
Dockerfile.prebuilt-elm Dockerfiles 2 years ago
LICENSE Initial commit 2 years ago
Makefile getting better and better 2 years ago
elm.json getting better and better 2 years ago
go.mod Cache images + client jwt 2 years ago
go.sum Cache images + client jwt 2 years ago
main.go Initial commit 2 years ago
readme.md update readme 2 years ago
root_command.go experimental thumbnail 2 years ago
serve_command.go kind of basic structure, it works... maybe 2 years ago
thumbnail_command.go Cache images + client jwt 2 years ago
version_command.go Initial commit 2 years ago

readme.md

Fulla

Why?

We have a lot of pictures (mostly about our children). I store them in my Minio instance and the backup is on Wasabi. I tried to find a good soltion that can be used in a very simple way, like no database, but I coulnd't find an good solution for my probelem. I only wanted a small software that can list all images and view them. I need only one "login" credential that can be shared between us (close family members).

Intended environment: local network, not on the public internet. Of course you can do it, but I have no intention to make it bullet-proof. Just host it in your own network (homeserver, rpi, whatever).

  • Why Go? Because I like Go and with 1.16+, the embed module is awesome.
  • Why Elm? Because I want to learn more Elm and it was a good candidate.

Configuration

Endironment variables:

FULLA_ENDPOINT          -> endpoint
  Example: storage.efertone.me, s3.eu-central-1.wasabisys.com

FULLA_ACCESS_KEY_ID     -> access key id
FULLA_SECRET_ACCESS_KEY -> secret access key
FULLA_BUCKET            -> target bucket name
FULLA_NOSSL             -> if it's not empty, use http, otherwise use https

FULLA_LOGIN_SECRET      -> secret for login
  If not provided, the system will generate one (not persistent)

Example docker compose file

  • xxxx -> access key id (aws, wasabi, minio, any s3 compatible service)
  • yyyy -> secret access key (aws, wasabi, minio, any s3 compatible service)
  • zzzz -> secret token for login (example: openssl rand -base64 30)
---
version: '3.2'

services:
  web:
    image: yitsushi/fulla:1.0.1
    networks:
      - traefik-public
    ports:
      - 9876
    command: serve --listen="0.0.0.0:9876"
    environment:
      - FULLA_ENDPOINT=storage.mydomain.tld
      - FULLA_BUCKET=fulla-photos
      - FULLA_ACCESS_KEY_ID=xxxx
      - FULLA_SECRET_ACCESS_KEY=yyyy
      - FULLA_LOGIN_SECRET=zzzz
    deploy:
      labels:
        - "traefik.enable=true"
        - "traefik.http.routers.fulla-router.rule=Host(`fulla.mydomain.tld`)"
        - "traefik.http.services.fulla-service.loadbalancer.server.port=9876"
        - "traefik.http.routers.fulla-router.tls=true"
        - "traefik.http.routers.fulla-router.tls.certresolver=cloudflare"
        - "traefik.docker.network=traefik-public"
        - "traefik.http.middlewares.wg.ipwhitelist.sourcerange=127.0.0.1/32, 10.100.100.1/24, 172.18.0.1/24"
        - "traefik.http.routers.fulla-router.middlewares=wg@docker"

networks:
  traefik-public:
    external: true

Start server

fulla serve --listen="0.0.0.0:9876" [--debug]

Generate thumbnails

fulla thumbnail --workers=4 [--debug]

Hotkeys

  • Esc: Close single-image view
  • ArrowLeft: Previous image in single-image view
  • ArrowRight: Previous image in single-image view

Note

This project target audiance is not a hosted solition for large user base.

The name field on the login screen is just a placeholder. It does not matter what is the value, it will be saved in the JWT token and will be used on image upload (Issue#3) to populate object metadata.

Screenshots

Directory list Image list Single image view