4420dd51ac
Features: - Immich integration with automatic album image carousel - Dynamic configuration via JSON files - Nginx proxy for Immich API access - Docker deployment ready - Gitea Actions CI/CD workflow Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
235 lines
5.4 KiB
Markdown
235 lines
5.4 KiB
Markdown
# LisiLou Photography Portfolio
|
|
|
|
A lightweight, configurable photography portfolio website designed to integrate with Immich for image hosting and client gallery access.
|
|
|
|
## Features
|
|
|
|
- 🎨 **Elegant, modern design** - Clean photography-focused aesthetic
|
|
- ⚙️ **Easy configuration** - Update content via JSON files, no code changes needed
|
|
- 📱 **Fully responsive** - Looks great on all devices
|
|
- 🖼️ **Immich integration** - Direct links to shared albums for portfolio and client galleries
|
|
- 👥 **Multi-photographer support** - Configure multiple profiles for different photographers
|
|
- 🐳 **Docker ready** - Easy deployment with Docker and Docker Compose
|
|
- 🔄 **CI/CD ready** - Gitea Actions workflow included
|
|
|
|
## Quick Start
|
|
|
|
### Local Development
|
|
|
|
1. Clone this repository
|
|
2. Customize `config/site.json` with your information
|
|
3. Add your images to `public/images/`
|
|
4. Run with Docker:
|
|
|
|
```bash
|
|
docker compose up -d
|
|
```
|
|
|
|
5. Visit `http://localhost:8080`
|
|
|
|
### Configuration
|
|
|
|
All site content is configured through `config/site.json`. Here's what you can customize:
|
|
|
|
#### Site Settings
|
|
```json
|
|
{
|
|
"site": {
|
|
"title": "Your Photography Name",
|
|
"tagline": "Your tagline here",
|
|
"description": "SEO description"
|
|
}
|
|
}
|
|
```
|
|
|
|
#### Social Media
|
|
```json
|
|
{
|
|
"social": {
|
|
"instagram": "your.handle",
|
|
"facebook": "yourpage",
|
|
"pinterest": "yourprofile",
|
|
"tiktok": "yourhandle"
|
|
}
|
|
}
|
|
```
|
|
|
|
#### Immich Integration
|
|
```json
|
|
{
|
|
"immich": {
|
|
"baseUrl": "https://photos.yourdomain.com",
|
|
"publicAlbumPrefix": "/share/"
|
|
}
|
|
}
|
|
```
|
|
|
|
#### Portfolio Categories
|
|
```json
|
|
{
|
|
"portfolio": {
|
|
"categories": [
|
|
{
|
|
"id": "seniors",
|
|
"name": "Senior Portraits",
|
|
"description": "Celebrate your milestone",
|
|
"coverImage": "/images/portfolio/seniors-cover.jpg",
|
|
"immichAlbumId": "your-immich-album-share-id"
|
|
}
|
|
]
|
|
}
|
|
}
|
|
```
|
|
|
|
#### Theme Customization
|
|
```json
|
|
{
|
|
"theme": {
|
|
"primaryColor": "#8B7355",
|
|
"accentColor": "#D4C5B5",
|
|
"textColor": "#2C2C2C",
|
|
"backgroundColor": "#FDFBF9"
|
|
}
|
|
}
|
|
```
|
|
|
|
### Adding Portfolio Images
|
|
|
|
1. Create cover images for each portfolio category
|
|
2. Place them in `public/images/portfolio/`
|
|
3. Update the `coverImage` paths in `config/site.json`
|
|
4. Get the share IDs from your Immich albums and add them to `immichAlbumId`
|
|
|
|
### Client Gallery Access
|
|
|
|
Clients can enter their gallery code (Immich share ID) on the website. They'll be redirected to their Immich shared album.
|
|
|
|
**Workflow:**
|
|
1. Create a shared album in Immich for your client
|
|
2. Give them the share ID as their "gallery code"
|
|
3. They enter it on your website and are taken directly to their photos
|
|
|
|
## Deployment
|
|
|
|
### With Docker Compose
|
|
|
|
1. Copy files to your server:
|
|
```bash
|
|
scp -r . user@server:/opt/lisilou-portfolio/
|
|
```
|
|
|
|
2. Create the external network:
|
|
```bash
|
|
docker network create web
|
|
```
|
|
|
|
3. Start the container:
|
|
```bash
|
|
cd /opt/lisilou-portfolio
|
|
docker compose up -d
|
|
```
|
|
|
|
### With Reverse Proxy (Traefik/Nginx)
|
|
|
|
If using Traefik, add labels to docker-compose.yml:
|
|
|
|
```yaml
|
|
services:
|
|
portfolio:
|
|
labels:
|
|
- "traefik.enable=true"
|
|
- "traefik.http.routers.portfolio.rule=Host(`lisilou.com`)"
|
|
- "traefik.http.routers.portfolio.tls=true"
|
|
- "traefik.http.routers.portfolio.tls.certresolver=letsencrypt"
|
|
```
|
|
|
|
### Gitea Actions CI/CD
|
|
|
|
1. Set up Gitea Actions on your Gitea instance
|
|
2. Add these secrets to your repository:
|
|
- `REGISTRY_USERNAME` - Container registry username
|
|
- `REGISTRY_PASSWORD` - Container registry password
|
|
- `DEPLOY_HOST` - Your server hostname
|
|
- `DEPLOY_USER` - SSH username
|
|
- `DEPLOY_KEY` - SSH private key
|
|
|
|
3. Update `.gitea/workflows/deploy.yml` with your registry URL
|
|
|
|
4. Push to main branch to trigger automatic deployment
|
|
|
|
## Multi-Photographer Support
|
|
|
|
To support multiple photographers:
|
|
|
|
1. Create additional config files (e.g., `config/photographer2.json`)
|
|
2. Update `config/profiles.json`:
|
|
|
|
```json
|
|
{
|
|
"profiles": {
|
|
"lisilou": {
|
|
"enabled": true,
|
|
"domain": "lisilou.com",
|
|
"configFile": "site.json"
|
|
},
|
|
"photographer2": {
|
|
"enabled": true,
|
|
"domain": "photographer2.com",
|
|
"configFile": "photographer2.json"
|
|
}
|
|
},
|
|
"defaultProfile": "lisilou",
|
|
"multiTenant": true
|
|
}
|
|
```
|
|
|
|
3. Add multi-tenant routing to nginx.conf (or use separate containers)
|
|
|
|
## File Structure
|
|
|
|
```
|
|
lisilou-portfolio/
|
|
├── config/
|
|
│ ├── site.json # Main configuration
|
|
│ └── profiles.json # Multi-profile config
|
|
├── public/
|
|
│ └── images/
|
|
│ ├── portfolio/ # Portfolio cover images
|
|
│ ├── logo.png # Site logo
|
|
│ └── favicon.ico # Favicon
|
|
├── src/
|
|
│ └── index.html # Main HTML file
|
|
├── .gitea/
|
|
│ └── workflows/
|
|
│ └── deploy.yml # CI/CD workflow
|
|
├── docker-compose.yml
|
|
├── Dockerfile
|
|
├── nginx.conf
|
|
└── README.md
|
|
```
|
|
|
|
## Updating Content
|
|
|
|
### To update text/settings:
|
|
1. Edit `config/site.json`
|
|
2. The changes are applied immediately (no rebuild needed)
|
|
|
|
### To update images:
|
|
1. Add new images to `public/images/`
|
|
2. Update paths in `config/site.json`
|
|
3. Changes are applied immediately
|
|
|
|
### To update code:
|
|
1. Edit `src/index.html`
|
|
2. Rebuild the Docker image:
|
|
```bash
|
|
docker compose build
|
|
docker compose up -d
|
|
```
|
|
|
|
Or push to Git and let CI/CD handle it.
|
|
|
|
## License
|
|
|
|
MIT License - Feel free to use and modify for your photography business!
|