+++ /dev/null
-FROM python:3.7-alpine
-
-ENV FLASK_APP=app.py
-ENV FLASK_RUN_HOST=0.0.0.0
-ENV FLASK_PORT=5000
-
-EXPOSE 5000
-
-RUN apk update && \
- apk add --no-cache gcc musl-dev linux-headers libpq-dev python3-dev
-
-WORKDIR /app
-COPY ./requirements.txt /app
-RUN pip install -r requirements.txt
-
-COPY ./app/app.py /app
-COPY ./app/templates /app
-
-CMD ["flask", "run"]
+++ /dev/null
-from flask import Flask, render_template
-import os
-import re
-
-app = Flask(__name__)
-gallery_root = "/app/gallery"
-get_num_regex = re.compile(r'\d+')
-
-@app.route('/')
-def render_gallery():
- gallery_names = []
- with os.scandir(gallery_root) as galleries:
- for gallery in galleries:
- if not gallery.is_file():
- gallery_names.append(gallery.name)
- gallery_names.sort()
- return render_template( 'gallery.html', galleries=gallery_names )
-
-def get_page_number_from_name(name):
- try:
- return int(get_num_regex.findall(name)[-1])
- except IndexError:
- print ("Index error on name " + name, flush=True)
- return -1
-
-@app.route('/<gallery>')
-def render_pages(gallery=None):
- template_pages = []
- with os.scandir(gallery_root + "/" + gallery) as pages:
- for page in pages:
- if page.is_file() and page.name.endswith('.png') or page.name.endswith('.jpg'):
- template_pages.append({
- 'name': page.name,
- 'number': get_page_number_from_name(page.name)
- })
- template_pages = sorted(template_pages, key=lambda page: page['number'])
- return render_template( 'pages.html', gallery=gallery, pages=template_pages )
-
-@app.route('/<gallery>/<int:page_num>')
-def render_page(gallery=None, page_num=None):
-
- # find a page that I think corrosponds to this page number
- page_name = None
- with os.scandir(gallery_root + "/" + gallery) as pages:
- for page in pages:
- if page.is_file():
- num = get_page_number_from_name(page.name)
- if int(page_num) == int(num):
- page_name = page.name
- break
-
- # if found, create src link to that page
- if page_name:
- src = '/images/{}/{}'.format( gallery, page_name )
- prev_page_url = "/{}/{}".format( gallery, page_num - 1)
- next_page_url = "/{}/{}".format( gallery, page_num + 1)
-
- return render_template( 'page.html',
- gallery=gallery, page_num=page_num,
- title=page_name, src=src, alt=page_name,
- prev_page_url=prev_page_url,
- next_page_url=next_page_url )
- else:
- return 'No page found'
+++ /dev/null
-<!DOCTYPE html>
-<html lang="en">
-<head>
- <title>Gallery</title>
-</head>
-<body>
- <h1>Gallery</h1>
-
- <ul id="navigation">
- {% for gallery in galleries %}
- <li><a href="{{ gallery }}">{{ gallery }}</a></li>
- {% endfor %}
- </ul>
-</body>
-</html>
+++ /dev/null
-<html>
-<body>
-<p>Hello, world!</p>
-</body>
-</html>
+++ /dev/null
-<!DOCTYPE html>
-<html lang="en">
-<head>
- <title>{{ title }}</title>
-</head>
-<body style='background-color: black'>
-<center>
-<div style='height: 99vh'>
-<a href="{{ next_page_url }}">
- <img style='height: 100%; width: 100%; object-fit: contain'
- src="{{ src }}" alt="{{ alt }}" />
-</a>
-</div>
-<p><a href="/">Home</a> | <a href="/{{ gallery }}">{{ gallery }}</a> | <a href="{{ prev_page_url }}">Prev</a>, <a href="{{ next_page_url }}">Next</a></p>
-</center>
-</body>
-</html>
+++ /dev/null
-<!DOCTYPE html>
-<html lang="en">
-<head>
- <title>Pages</title>
-</head>
-<body>
- <h1>Pages</h1>
-
- <ul id="navigation">
- {% for page in pages %}
- <li><a href="{{ gallery }}/{{ page.number }}">{{ page.number }}</a></li>
- {% endfor %}
- </ul>
-</body>
-</html>
--- /dev/null
+version: '3'
+networks:
+ proxy:
+ external: true
+services:
+ navigator:
+ image: cjpalmer/gallery-navigator:1.1.0
+ volumes:
+ - gallery_data:/app/gallery
+ server:
+ image: cjpalmer/gallery-server:1.1.0
+ volumes:
+ - gallery_data:/data/images
+ depends_on:
+ - navigator
+ networks:
+ - default
+ - proxy
+volumes:
+ gallery_data:
+ driver: local
+ driver_opts:
+ o: bind
+ type: none
+ device: /mnt/gallery_data
version: '3'
services:
- db:
- image: postgres:13.4-alpine
+ navigator:
+ build: ./navigator
+ image: cjpalmer/gallery-navigator:1.1.0
+ volumes:
+ - gallery_data:/app/gallery
environment:
- POSTGRES_USER: admin
- POSTGRES_PASSWORD: adminpw
- ports:
- - 5432:5432
- web:
- image: nginx:1.17
+ FLASK_DEBUG: 1
+ server:
+ build: ./server
+ image: cjpalmer/gallery-server:1.1.0
volumes:
- - ./nginx.conf:/etc/nginx/nginx.conf
- gallery_data:/data/images
ports:
- 80:80
depends_on:
- - gallery
- gallery:
- build: .
- image: cjpalmer/gallery:1.0.0
- volumes:
- - gallery_data:/app/gallery
- - ./app:/app
- environment:
- FLASK_DEBUG: 1
- depends_on:
- - db
+ - navigator
volumes:
gallery_data:
driver: local
--- /dev/null
+FROM python:3.7-alpine
+
+ENV FLASK_APP=app.py
+ENV FLASK_RUN_HOST=0.0.0.0
+ENV FLASK_PORT=5000
+
+EXPOSE 5000
+
+RUN apk update && \
+ apk add --no-cache gcc musl-dev linux-headers libpq-dev python3-dev
+
+WORKDIR /app
+COPY ./requirements.txt /app
+RUN pip install -r requirements.txt
+
+COPY ./app/app.py /app
+COPY ./app/templates/ /app/templates/
+
+CMD ["flask", "run"]
--- /dev/null
+from flask import Flask, render_template
+import os
+import re
+
+app = Flask(__name__)
+gallery_root = "/app/gallery"
+get_num_regex = re.compile(r'\d+')
+
+@app.route('/')
+def render_gallery():
+ gallery_names = []
+ with os.scandir(gallery_root) as galleries:
+ for gallery in galleries:
+ if not gallery.is_file():
+ gallery_names.append(gallery.name)
+ gallery_names.sort()
+ return render_template( 'gallery.html', galleries=gallery_names )
+
+def get_page_number_from_name(name):
+ try:
+ return int(get_num_regex.findall(name)[-1])
+ except IndexError:
+ print ("Index error on name " + name, flush=True)
+ return -1
+
+@app.route('/<gallery>')
+def render_pages(gallery=None):
+ template_pages = []
+ with os.scandir(gallery_root + "/" + gallery) as pages:
+ for page in pages:
+ if page.is_file() and page.name.endswith('.png') or page.name.endswith('.jpg'):
+ template_pages.append({
+ 'name': page.name,
+ 'number': get_page_number_from_name(page.name)
+ })
+ template_pages = sorted(template_pages, key=lambda page: page['number'])
+ return render_template( 'pages.html', gallery=gallery, pages=template_pages )
+
+@app.route('/<gallery>/<int:page_num>')
+def render_page(gallery=None, page_num=None):
+
+ # find a page that I think corrosponds to this page number
+ page_name = None
+ with os.scandir(gallery_root + "/" + gallery) as pages:
+ for page in pages:
+ if page.is_file():
+ num = get_page_number_from_name(page.name)
+ if int(page_num) == int(num):
+ page_name = page.name
+ break
+
+ # if found, create src link to that page
+ if page_name:
+ src = '/images/{}/{}'.format( gallery, page_name )
+ prev_page_url = "/{}/{}".format( gallery, page_num - 1)
+ next_page_url = "/{}/{}".format( gallery, page_num + 1)
+
+ return render_template( 'page.html',
+ gallery=gallery, page_num=page_num,
+ title=page_name, src=src, alt=page_name,
+ prev_page_url=prev_page_url,
+ next_page_url=next_page_url )
+ else:
+ return 'No page found'
--- /dev/null
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <title>Gallery</title>
+</head>
+<body>
+ <h1>Gallery</h1>
+
+ <ul id="navigation">
+ {% for gallery in galleries %}
+ <li><a href="{{ gallery }}">{{ gallery }}</a></li>
+ {% endfor %}
+ </ul>
+</body>
+</html>
--- /dev/null
+<html>
+<body>
+<p>Hello, world!</p>
+</body>
+</html>
--- /dev/null
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <title>{{ title }}</title>
+</head>
+<body style='background-color: black'>
+<center>
+<div style='height: 99vh'>
+<a href="{{ next_page_url }}">
+ <img style='height: 100%; width: 100%; object-fit: contain'
+ src="{{ src }}" alt="{{ alt }}" />
+</a>
+</div>
+<p><a href="/">Home</a> | <a href="/{{ gallery }}">{{ gallery }}</a> | <a href="{{ prev_page_url }}">Prev</a>, <a href="{{ next_page_url }}">Next</a></p>
+</center>
+</body>
+</html>
--- /dev/null
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <title>Pages</title>
+</head>
+<body>
+ <h1>Pages</h1>
+
+ <ul id="navigation">
+ {% for page in pages %}
+ <li><a href="{{ gallery }}/{{ page.number }}">{{ page.number }}</a></li>
+ {% endfor %}
+ </ul>
+</body>
+</html>
--- /dev/null
+psycopg2
+flask
+++ /dev/null
-worker_processes auto;
-
-events {
- worker_connections 1024;
-}
-
-http {
- server {
- location / {
- proxy_pass http://gallery:5000;
- }
-
- location /images {
- root /data;
- }
- }
-}
+++ /dev/null
-psycopg2
-flask
--- /dev/null
+FROM nginx:1.17
+
+COPY ./nginx.conf /etc/nginx/nginx.conf
--- /dev/null
+worker_processes auto;
+
+events {
+ worker_connections 1024;
+}
+
+http {
+ server {
+ location / {
+ proxy_pass http://navigator:5000;
+ }
+
+ location /images {
+ root /data;
+ }
+ }
+}