---
title: "Deploy exif-photo-blog"
description: "EXIF Photo Blog with Postgres and persistent S3 photo storage."
category: "Blogs"
url: https://railway.com/deploy/exif-photo-blog
---

# Deploy exif-photo-blog

EXIF Photo Blog with Postgres and persistent S3 photo storage.

**[Deploy exif-photo-blog on Railway](https://railway.com/template/exif-photo-blog)**

- **Creator:** Tetrahedron Labs
- **Category:** Blogs

## Template content

### Web

- **Source:** https://github.com/sambecker/exif-photo-blog
- **Public domain:** Yes

### Postgres https://devicons.railway.app/i/postgresql.svg

- **Image:** ghcr.io/railwayapp-templates/postgres-ssl:18

### MinIO

- **Image:** minio/minio:latest
- **Start command:** `/bin/bash -c 'set -e; curl -fsSL https://dl.min.io/client/mc/release/linux-amd64/archive/mc.RELEASE.2025-08-13T08-35-41Z -o /tmp/mc; chmod +x /tmp/mc; minio server /data --address :9000 & server_pid=$!; trap "kill $server_pid" TERM INT; until /tmp/mc alias set local http://127.0.0.1:9000 "$MINIO_ROOT_USER" "$MINIO_ROOT_PASSWORD"; do kill -0 "$server_pid" || exit 1; sleep 2; done; /tmp/mc mb --ignore-existing "local/$MINIO_BUCKET"; /tmp/mc anonymous set download "local/$MINIO_BUCKET"; wait "$server_pid"'`
- **Public domain:** Yes

## Documentation

# Deploy and Host EXIF Photo Blog on Railway

Deploy [sambecker/exif-photo-blog](https://github.com/sambecker/exif-photo-blog) on Railway with Postgres and persistent MinIO photo storage.

## About Hosting EXIF Photo Blog

EXIF Photo Blog is a Next.js photography site with built-in admin authentication, image uploads, EXIF extraction, albums and tags, infinite scrolling, search, feeds, and optional AI-generated descriptions. This template supplies every stateful dependency the application needs on Railway.

## Why Deploy EXIF Photo Blog on Railway

This template turns the upstream Vercel-oriented deployment into a one-click Railway stack. Railway manages the web service, private networking, persistent database volumes, generated credentials, and HTTPS domains in one project. The deploy form asks only for admin credentials and the site's public identity.

## Common Use Cases

- Personal photography journals and travel logs
- Public photo portfolios with camera and lens metadata
- Self-hosted galleries with an authenticated upload workflow
- Small team or family photo collections
- Testing and extending the open-source EXIF Photo Blog project

## Dependencies for EXIF Photo Blog

The application requires PostgreSQL for metadata and publicly readable object storage for uploaded photos. Redis-based rate limiting is optional upstream and is intentionally omitted from this streamlined template.

### Deployment Dependencies

- Railway Postgres and a persistent database volume
- MinIO and a persistent Railway volume
- The upstream [`sambecker/exif-photo-blog`](https://github.com/sambecker/exif-photo-blog) repository

## Included services

- **Web** — the Next.js photo blog, sourced directly from [`sambecker/exif-photo-blog`](https://github.com/sambecker/exif-photo-blog)
- **Postgres** — persistent photo metadata and application data
- **MinIO** — persistent S3-compatible photo storage with a Railway volume; its startup creates the `photos` bucket and applies public-download access

## Required configuration

The deploy form asks for only:

- `ADMIN_EMAIL` — email used to sign in at `/admin`
- `ADMIN_PASSWORD` — password used to sign in at `/admin`

All database passwords, storage credentials, `AUTH_SECRET`, ports, and service references are generated or wired automatically. `NEXT_PUBLIC_DOMAIN` uses Web's generated Railway hostname by default.

After deployment finishes, open the generated Web domain, visit `/admin`, and upload your first photo.

## Storage choice

Railway Buckets are S3-compatible but private-only. EXIF Photo Blog stores permanent public asset URLs and currently supports Vercel Blob, AWS S3, Cloudflare R2, or MinIO. This deployment uses MinIO on a persistent Railway volume for publicly accessible photo storage.

MinIO startup grants anonymous download access only; writes, deletes, copies, and listings remain credentialed.

## Optional variables

The deploy form also offers `NEXT_PUBLIC_NAV_TITLE`, `NEXT_PUBLIC_NAV_CAPTION`, `NEXT_PUBLIC_META_TITLE`, and `NEXT_PUBLIC_META_DESCRIPTION`, but all four may be left blank. The upstream project supports many additional variables for titles, descriptions, layout, themes, feeds, AI captions, location services, and performance. Add them to the Web service after deployment as described in the [upstream README](https://github.com/sambecker/exif-photo-blog#customization).

For AI descriptions outside Vercel, set either `OPENAI_SECRET_KEY`, or both `AI_GATEWAY_MODEL` and `AI_GATEWAY_API_KEY`, on the Web service.

## Notes

- The MinIO deployment is single-node storage backed by a persistent Railway volume. It is appropriate for personal photo blogs and small deployments, but it is not a multi-node/high-availability object store.
- The Web service follows the upstream repository's `main` branch directly.
- Attach a custom domain to Web and set `NEXT_PUBLIC_DOMAIN` to that hostname if you replace the generated Railway domain.


## Similar templates

- [Pixelfed](https://railway.com/deploy/OZSdEw) — Explore + Share beautiful photos and videos on the Fediverse
- [Hexo](https://railway.com/deploy/hexo) — Self-hosted Hexo blog with editor, comments, and S3 storage
- [NodeBB](https://railway.com/deploy/nodebb) — Node.js based forum software built for the modern web

Open this page in a browser: https://railway.com/deploy/exif-photo-blog
