Compare commits
4 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 5df3a21a71 | |||
| 307f4f34a5 | |||
| 123a86e6b8 | |||
| 5111b42f52 |
@@ -17,10 +17,8 @@ body:
|
|||||||
label: Version
|
label: Version
|
||||||
description: What version of Photon are you running? You can find this in the footer of the app.
|
description: What version of Photon are you running? You can find this in the footer of the app.
|
||||||
options:
|
options:
|
||||||
- 0.1.3 (Latest)
|
- 1.0.0
|
||||||
- 0.1.2
|
- 0.1.4
|
||||||
- 0.1.1
|
|
||||||
- 0.1.0
|
|
||||||
validations:
|
validations:
|
||||||
required: true
|
required: true
|
||||||
- type: markdown
|
- type: markdown
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
blank_issues_enabled: false
|
blank_issues_enabled: true
|
||||||
@@ -17,10 +17,8 @@ body:
|
|||||||
label: Version
|
label: Version
|
||||||
description: What version of Photon are you running? You can find this in the footer of the app.
|
description: What version of Photon are you running? You can find this in the footer of the app.
|
||||||
options:
|
options:
|
||||||
- 0.1.3 (Latest)
|
- 1.0.0
|
||||||
- 0.1.2
|
- 0.1.4
|
||||||
- 0.1.1
|
|
||||||
- 0.1.0
|
|
||||||
validations:
|
validations:
|
||||||
required: true
|
required: true
|
||||||
- type: markdown
|
- type: markdown
|
||||||
|
|||||||
@@ -17,10 +17,8 @@ body:
|
|||||||
label: Version
|
label: Version
|
||||||
description: What version of Photon are you running? You can find this in the footer of the app.
|
description: What version of Photon are you running? You can find this in the footer of the app.
|
||||||
options:
|
options:
|
||||||
- 0.1.3 (Latest)
|
- 1.0.0
|
||||||
- 0.1.2
|
- 0.1.4
|
||||||
- 0.1.1
|
|
||||||
- 0.1.0
|
|
||||||
validations:
|
validations:
|
||||||
required: true
|
required: true
|
||||||
- type: markdown
|
- type: markdown
|
||||||
|
|||||||
@@ -1,9 +1,126 @@
|
|||||||
# Photon Screenshot Dashboard
|
# Photon Screenshot Dashboard
|
||||||
|
|
||||||
The PHP Screenshot Management Dashboard
|

|
||||||
|
|
||||||
To deploy Photon, use the included `docker-compose-example.yml`.
|

|
||||||
|

|
||||||
|
|
||||||
Ensure you have a data folder that contains your screenshots. Current supported mimetypes are `JPG`, `PNG`, `GIF` and `MP4`.
|
A modern, self-hosted PHP screenshot and media management dashboard with powerful organization features, sharing capabilities, and a clean web interface.
|
||||||
|
|
||||||
You can find the container image history [here](https://git.jrdn.dev/jordanwalster/-/packages/container/photon-dashboard/versions).
|
The project consists of three main components:
|
||||||
|
|
||||||
|
1. **Photon Dashboard** (`photon`): Web interface for managing screenshots.
|
||||||
|
2. **Photon Worker** (`worker`): Background processing and file scanning.
|
||||||
|
3. **MariaDB Database** (`db`): Stores metadata and application data.
|
||||||
|
|
||||||
|
Keep up-to-date on new releases by following the [changelog](./changelog.md).
|
||||||
|
|
||||||
|
## Features
|
||||||
|
|
||||||
|
- **Smart Organization**: Organize screenshots with folders and tags.
|
||||||
|
- **Advanced Search**: Find images quickly by name or content using OCR.
|
||||||
|
- **Easy Sharing**: Built-in public sharing URLs.
|
||||||
|
- **Media Support**: JPG, PNG, GIF, and MP4 (experimental) file support.
|
||||||
|
- **Bulk Operations**: Select and manage multiple files at once.
|
||||||
|
- **Sorting Options**: Sort by date, size, or filename.
|
||||||
|
- **Trash Management**: Safe deletion with trash functionality.
|
||||||
|
- **Background Processing**: Dedicated worker for compression and OCR processing.
|
||||||
|
- **Database Storage**: MariaDB backend for reliable data persistence.
|
||||||
|
|
||||||
|
An external authentication proxy is recommended to protect your dashboard from unwanted eyes.
|
||||||
|
|
||||||
|
## Quick Start
|
||||||
|
|
||||||
|
1. **Clone the repository**
|
||||||
|
```bash
|
||||||
|
git clone <repository-url>
|
||||||
|
cd photon-dashboard
|
||||||
|
```
|
||||||
|
|
||||||
|
2. **Configure environment**
|
||||||
|
```bash
|
||||||
|
cp .env.example .env
|
||||||
|
# Edit .env with your settings
|
||||||
|
```
|
||||||
|
|
||||||
|
3. **Create data directory**
|
||||||
|
```bash
|
||||||
|
mkdir data
|
||||||
|
# Copy your screenshots to ./data/
|
||||||
|
```
|
||||||
|
|
||||||
|
4. **Deploy with Docker Compose**
|
||||||
|
```bash
|
||||||
|
docker-compose -f examples/compose-default.yml up -d
|
||||||
|
```
|
||||||
|
|
||||||
|
5. **Access the dashboard**
|
||||||
|
- Open http://localhost:8090 in your browser
|
||||||
|
|
||||||
|
## Configuration
|
||||||
|
|
||||||
|
### Environment Variables
|
||||||
|
|
||||||
|
Copy the `.env` file and customize these key settings:
|
||||||
|
|
||||||
|
#### Dashboard Settings
|
||||||
|
- `PHOTON_PORT`: Web interface port (default: 8090)
|
||||||
|
- `USER_EMAIL`: Admin email address
|
||||||
|
- `DATA_PATH`: Path to your screenshots folder
|
||||||
|
|
||||||
|
#### Worker Settings
|
||||||
|
- `SCAN_RATE`: File scanning interval in seconds (default: 10)
|
||||||
|
|
||||||
|
#### Database Settings
|
||||||
|
- `MYSQL_DATABASE`: Database name used by Photon (defaults to photon).
|
||||||
|
- `MYSQL_USER`: Database user used by Photon.
|
||||||
|
- `MYSQL_PASSWORD`: Database password used by Photon user.
|
||||||
|
- `MYSQL_ROOT_PASSWORD`: Database root password.
|
||||||
|
|
||||||
|
#### Domain Options
|
||||||
|
- `PHOTON_DOMAIN`: Domain used for dashboard.
|
||||||
|
- `PHOTON_SHARE_DOMAIN`: Optional subdomain for sharing links.
|
||||||
|
- `COOKIE_DOMAIN`: Required when adding a subdomain for sharing.
|
||||||
|
|
||||||
|
### Deployment Options
|
||||||
|
|
||||||
|
#### Standard Deployment
|
||||||
|
Use `examples/compose-default.yml` for simple deployments:
|
||||||
|
```bash
|
||||||
|
docker-compose -f examples/compose-default.yml up -d
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Traefik – Custom Domains
|
||||||
|
Use `examples/compose-traefik.yml` for reverse proxy setups with custom domains.
|
||||||
|
|
||||||
|
## Project Structure
|
||||||
|
|
||||||
|
```
|
||||||
|
photon-dashboard/
|
||||||
|
├── examples/
|
||||||
|
│ ├── compose-default.yml # Default example for basic usage.
|
||||||
|
│ ├── compose-traefik.yml # Traefik example for custom domain routing.
|
||||||
|
│ └── .env # Environment configuration
|
||||||
|
│
|
||||||
|
└── changelog.md # Version history
|
||||||
|
```
|
||||||
|
|
||||||
|
## Updates
|
||||||
|
|
||||||
|
Container images are available at:
|
||||||
|
- Dashboard: `git.jrdn.dev/jordanwalster/photon-dashboard:latest`
|
||||||
|
- Worker: `git.jrdn.dev/jordanwalster/photon-worker:latest`
|
||||||
|
|
||||||
|
View version history: [Container Registry](https://git.jrdn.dev/jordanwalster/-/packages/container/photon-dashboard/versions)
|
||||||
|
|
||||||
|
### Logs
|
||||||
|
```bash
|
||||||
|
# View photon logs
|
||||||
|
docker logs photon_dashboard
|
||||||
|
|
||||||
|
# View worker logs
|
||||||
|
docker logs photon_worker
|
||||||
|
|
||||||
|
# View database logs
|
||||||
|
docker logs photon_db
|
||||||
|
```
|
||||||
|
|||||||
+63
-1
@@ -2,7 +2,69 @@
|
|||||||
|
|
||||||
All notable changes to this project will be documented in this file.
|
All notable changes to this project will be documented in this file.
|
||||||
|
|
||||||
## [v0.1.4] - 2025-04-24
|
## [v1.0.0] - 2026-04-30
|
||||||
|
|
||||||
|
> [!CAUTION]
|
||||||
|
> The nginx web container has been removed, share links now default to `/share/example.jpg`. To use custom domains please refer to the `examples/compose-traefik.yml` example.
|
||||||
|
|
||||||
|
### Added
|
||||||
|
- Selected images counter.
|
||||||
|
- Sharing endpoint in photon container.
|
||||||
|
- Deselect all button.
|
||||||
|
- Active page indicator for tag pages.
|
||||||
|
- Context menu for image interactions.
|
||||||
|
- File metadata inside context menu.
|
||||||
|
- Context menu for tags in the sidebar (rename and delete actions).
|
||||||
|
- Sorting for images (date, size and name).
|
||||||
|
- Selection across multiple pages at a time for better management.
|
||||||
|
- Sticky pagination bar, prevents moving when item count is lower between pages.
|
||||||
|
- Ability to make images private, links will only work with a valid session.
|
||||||
|
- Favicon and logo to footer.
|
||||||
|
- Better backend reporting for uploads.
|
||||||
|
- New compose files for updated deployments.
|
||||||
|
- Ability to move items between folders.
|
||||||
|
- Animations on hover.
|
||||||
|
- GitHub button in footer linking to project.
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
- Environment variables `ADMIN_DOMAIN` and `SHARE_DOMAIN` replaced with `PHOTON_DOMAIN` and `PHOTON_SHARE_DOMAIN`.
|
||||||
|
- Search now acts as a filter on a given page context.
|
||||||
|
- File names now only available in the context menu.
|
||||||
|
- Image selection highlights border, shrinks and darkens image.
|
||||||
|
- Images now have rounded corners to match the design language.
|
||||||
|
- Compression now limits image dimensions to further decrease storage consumption.
|
||||||
|
- Backup file name now contains timestamp.
|
||||||
|
- Simplified backend functions for easier maintainability.
|
||||||
|
- Upload limits have been raised for mass-uploading.
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
- Screenshots with special characters in the name cannot be selected by clicking.
|
||||||
|
- Restoring a file from trash will always go back to root folder regardless of original source.
|
||||||
|
- Image does not scale correctly when changing column count.
|
||||||
|
- Assigning tags after first page redirects you to the start.
|
||||||
|
- Renaming an image results in tags being lost - resulting in orphaned attachments.
|
||||||
|
- Renaming an image results in thumbnails being regenerated and creating duplicates.
|
||||||
|
- 'All Screenshots' in sidebar doesn't show subfolder count.
|
||||||
|
- Going to a folder by link doesn't show it as active in the sidebar
|
||||||
|
- Image counter for folders doesn't update on upload.
|
||||||
|
- Uploading an image with the same name as existing will replace it without confirmation.
|
||||||
|
- Image counters don't update on deletion.
|
||||||
|
- Newly created tags do not show up in the delete menu until a full-page refresh has occurred.
|
||||||
|
- Delete tag dropdown doesn't dynamically update if a tag has been deleted.
|
||||||
|
|
||||||
|
### Removed
|
||||||
|
- Autocompletion on rename form for previously entered names.
|
||||||
|
- Secondary web container.
|
||||||
|
- Option for two columns.
|
||||||
|
- Menu button on images.
|
||||||
|
- URL scheme settings.
|
||||||
|
- Checkbox on images.
|
||||||
|
- SQLite to MySQL migration tool.
|
||||||
|
|
||||||
|
## [v0.1.4] - 2026-04-24
|
||||||
|
|
||||||
|
> [!TIP]
|
||||||
|
> Web container is being removed in the next update, update your compose files on the next update.
|
||||||
|
|
||||||
### Added
|
### Added
|
||||||
- Folders for better file management, items in folders can also have tags.
|
- Folders for better file management, items in folders can also have tags.
|
||||||
|
|||||||
@@ -1,10 +1,15 @@
|
|||||||
### Photon Environment Variables
|
### Photon Environment Variables
|
||||||
PHOTON_PORT=8090
|
PHOTON_PORT=8090
|
||||||
SHARE_DOMAIN=localhost:8080
|
|
||||||
USER_EMAIL=photon@jrdn.dev
|
USER_EMAIL=photon@jrdn.dev
|
||||||
SHARE_URL_SCHEME=http
|
|
||||||
DATA_PATH=./data
|
DATA_PATH=./data
|
||||||
|
|
||||||
|
### Domain Options
|
||||||
|
PHOTON_DOMAIN=photon.local
|
||||||
|
|
||||||
|
# Uncomment the below lines if you are using a custom subdomain for link sharing.
|
||||||
|
# PHOTON_SHARE_DOMAIN=share.photon.local
|
||||||
|
# COOKIE_DOMAIN=.photon.local
|
||||||
|
|
||||||
### Photon Worker Environment Variables
|
### Photon Worker Environment Variables
|
||||||
SCAN_RATE=10
|
SCAN_RATE=10
|
||||||
|
|
||||||
@@ -14,4 +19,3 @@ MYSQL_DATABASE=photon
|
|||||||
MYSQL_USER=photon
|
MYSQL_USER=photon
|
||||||
MYSQL_PASSWORD=changeme
|
MYSQL_PASSWORD=changeme
|
||||||
MYSQL_ROOT_PASSWORD=pleasechangeme
|
MYSQL_ROOT_PASSWORD=pleasechangeme
|
||||||
|
|
||||||
@@ -13,13 +13,6 @@ services:
|
|||||||
- ${PHOTON_PORT:-8090}:80
|
- ${PHOTON_PORT:-8090}:80
|
||||||
env_file:
|
env_file:
|
||||||
- .env
|
- .env
|
||||||
web:
|
|
||||||
container_name: public_web
|
|
||||||
image: nginx
|
|
||||||
ports:
|
|
||||||
- 8080:80
|
|
||||||
volumes:
|
|
||||||
- ${DATA_PATH}:/usr/share/nginx/html:ro
|
|
||||||
worker:
|
worker:
|
||||||
container_name: photon_worker
|
container_name: photon_worker
|
||||||
image: git.jrdn.dev/jordanwalster/photon-worker:latest
|
image: git.jrdn.dev/jordanwalster/photon-worker:latest
|
||||||
@@ -34,6 +27,5 @@ services:
|
|||||||
- db:/var/lib/mysql
|
- db:/var/lib/mysql
|
||||||
env_file:
|
env_file:
|
||||||
- .env
|
- .env
|
||||||
|
|
||||||
volumes:
|
volumes:
|
||||||
db:
|
db:
|
||||||
@@ -0,0 +1,57 @@
|
|||||||
|
services:
|
||||||
|
# Photon services
|
||||||
|
photon:
|
||||||
|
container_name: photon_dashboard
|
||||||
|
image: git.jrdn.dev/jordanwalster/photon-dashboard:latest
|
||||||
|
volumes:
|
||||||
|
- ./db:/var/www/html/db # Only required if migrating from SQLite
|
||||||
|
- type: bind
|
||||||
|
source: ${DATA_PATH}
|
||||||
|
target: /var/www/html/data
|
||||||
|
bind:
|
||||||
|
propagation: rshared
|
||||||
|
env_file:
|
||||||
|
- .env
|
||||||
|
labels:
|
||||||
|
# Dashboard configuration
|
||||||
|
- "traefik.enable=true"
|
||||||
|
- "traefik.http.routers.photon.rule=Host(`${PHOTON_DOMAIN}`)"
|
||||||
|
- "traefik.http.routers.photon.service=photon"
|
||||||
|
- "traefik.http.services.photon.loadbalancer.server.port=80"
|
||||||
|
|
||||||
|
# Custom domain for share links
|
||||||
|
- "traefik.http.routers.photon-share.rule=Host(`${PHOTON_SHARE_DOMAIN}`)"
|
||||||
|
- "traefik.http.routers.photon-share.service=photon-share"
|
||||||
|
- "traefik.http.middlewares.photon-share-path.addprefix.prefix=/share"
|
||||||
|
- "traefik.http.routers.photon-share.middlewares=photon-share-path"
|
||||||
|
- "traefik.http.services.photon-share.loadbalancer.server.port=80"
|
||||||
|
worker:
|
||||||
|
container_name: photon_worker
|
||||||
|
image: git.jrdn.dev/jordanwalster/photon-worker:latest
|
||||||
|
volumes:
|
||||||
|
- ${DATA_PATH}:/var/www/html/data
|
||||||
|
env_file:
|
||||||
|
- .env
|
||||||
|
|
||||||
|
# Database
|
||||||
|
db:
|
||||||
|
container_name: photon_db
|
||||||
|
image: mariadb
|
||||||
|
volumes:
|
||||||
|
- db:/var/lib/mysql
|
||||||
|
env_file:
|
||||||
|
- .env
|
||||||
|
|
||||||
|
# Reverse proxy
|
||||||
|
traefik:
|
||||||
|
container_name: traefik
|
||||||
|
image: traefik:v3
|
||||||
|
command:
|
||||||
|
- "--providers.docker=true"
|
||||||
|
- "--entrypoints.web.address=:80"
|
||||||
|
ports:
|
||||||
|
- "80:80"
|
||||||
|
volumes:
|
||||||
|
- /var/run/docker.sock:/var/run/docker.sock
|
||||||
|
volumes:
|
||||||
|
db:
|
||||||
Reference in New Issue
Block a user