OpenBrew is a free and open source homebrew recipe workspace for building, cloning, sharing, and tracking beer recipes.
It is a modernized fork of Brewgr.com with the current work focused on keeping the app usable on a local development stack, cleaning up legacy view and route issues, and making configuration easier through environment variables.
- Build, clone, and edit beer recipes
- Track brew sessions and recipe comments
- Upload and manage recipe photos
- Search recipes and browse style guides
- Send feedback and contact messages through the site
- Reset passwords by email when SMTP is configured
- Run locally with Docker or directly in Visual Studio/IIS Express
- Added Docker support for the web app and SQL Server Edge
- Moved host, database, and media path settings to environment variables
- Added SMTP configuration via environment variables for password reset and contact email
- Fixed several Mono/ASP.NET MVC view lookup issues that were breaking pages on Linux/macOS containers
- Fixed recipe photo uploads and cleanup so deleted recipes also remove their stored images and broken photo-stream links stop piling up
- Cleaned up the site footer and about navigation so source links live only on the about page
- Replaced the Facebook login flow with Sign in with Google and removed the old Facebook auth assets
- Renamed the web core project to
Openbrew.Web.Coreto match the rest of the refactor - Updated the site branding from "OpenBrew recipe finder (beta)" to "Advanced Search"
The fastest way to run OpenBrew locally is with the provided Docker setup:
docker compose up --buildBy default this starts:
webonhttp://localhost:8085dbon SQL Server Edge atlocalhost:1433
Useful environment variables:
OPENBREW_HOST_PORTOPENBREW_HOST_NAMEOPENBREW_DB_NAMEOPENBREW_SA_PASSWORDOPENBREW_REPO_ROOTOPENBREW_WEB_ROOTOPENBREW_CONNECTION_STRINGOPENBREW_BLOG_CONNECTION_STRINGOPENBREW_ROOT_URLOPENBREW_ROOT_URL_SECUREOPENBREW_STATIC_ROOT_URLOPENBREW_STATIC_ROOT_URL_SECUREOPENBREW_MEDIA_PHYSICAL_ROOTEnvironmentSmtpHostSmtpPortSmtpUserNameSmtpPassword
For local development, copy .openbrew.dev.env.example to .openbrew.dev.env. Set OPENBREW_SA_PASSWORD (required), then add SMTP and Google OAuth values as needed. scripts/run-dev.sh reads that ignored file when it creates brewgr-web; it intentionally contains no credential fallbacks. Outgoing OpenBrew messages use info@openbrew.net as the sender.
For the cluster deployment, keep using the four external Docker secrets referenced by docker-stack.dev.yml: openbrew_smtp_host, openbrew_smtp_port, openbrew_smtp_username, and openbrew_smtp_password.
If you want password reset and contact email to work, set the SMTP values to a real mail server or local mail catcher.
For cluster deploys, the repo now includes Swarm stack templates:
docker-stack.dev.ymlfordev.openbrew.netdocker-stack.prod.ymlforopenbrew.net
Both stacks:
- run the web app from a Docker Hub image
- use
mcr.microsoft.com/mssql/server:2022-latestfor SQL Server - keep uploaded media and SQL data on persistent storage
- dev uses
/var/lib/openbrew-dev - prod keeps the current
/volume1/docker/openbrew-prodpath until you decide to move it too - route through the existing
traefik-netoverlay network - bootstrap the database from the schema script inside the app image
To deploy them from Portainer or docker stack deploy, provide these environment values:
OPENBREW_IMAGEfor the app image, for exampleaustinderbique/openbrew:devOPENBREW_SA_PASSWORDOPENBREW_DB_NAMEOPENBREW_HOST_PORTOPENBREW_CONNECTION_STRINGOPENBREW_BLOG_CONNECTION_STRINGOPENBREW_ROOT_URLOPENBREW_ROOT_URL_SECUREOPENBREW_STATIC_ROOT_URLOPENBREW_STATIC_ROOT_URL_SECUREOPENBREW_MEDIA_PHYSICAL_ROOTGOOGLE_APPLICATION_KEYGOOGLE_APPLICATION_SECRETopenbrew_smtp_hostsecretopenbrew_smtp_portsecretopenbrew_smtp_usernamesecretopenbrew_smtp_passwordsecret
The stack templates mount those four secrets into /run/secrets/... and expose them to the app through SMTP_*_FILE environment variables. The app reads those files directly, so the SMTP password never has to appear in the stack YAML or in a plain environment variable.
The workflow in .github/workflows/dockerhub.yml publishes the app image to austinderbique/openbrew using the DOCKERHUB_TOKEN repository secret. It publishes sha-<commit> for every configured branch push, latest and prod from master/main, dev from development branches, and both vX.Y.Z and X.Y.Z for a release tag.
Keep real credentials in your cluster's secret store (or a Portainer/Docker secret), not in either stack YAML file. The stack templates deliberately reference GOOGLE_APPLICATION_KEY and GOOGLE_APPLICATION_SECRET; GOOGLE_APPLICATION_KEY is the Google OAuth client ID.
Recipe photos are both written to and served from the application Media directory. Mount the same persistent volume at this exact in-container path:
/workspace/brewgr/Openbrew.Web/Media
Set OPENBREW_MEDIA_PHYSICAL_ROOT to that same path. Mounting the volume only at a separate path such as /data/media lets uploads report success but leaves /Media/... image URLs unreachable after a refresh.
For Google Sign in, configure these authorized JavaScript origins on the OAuth web client as applicable:
http://localhost:8085
https://dev.openbrew.net
https://openbrew.net
The retained OAuth callback endpoints are https://dev.openbrew.net/Auth/OAuthLogin and https://openbrew.net/Auth/OAuthLogin. The current Google Identity Services button posts its credential to the same-origin /Auth/GoogleLogin endpoint; that URL is not an OAuth redirect URI.
Before increasing web replicas, ensure every replica can reach the same media volume and that your session/authentication setup is appropriate for more than one instance. The provided Swarm templates intentionally pin the web service to one node.
- Clone the repository.
- Restore packages.
- Set
OPENBREW_CONNECTION_STRINGto a valid SQL Server connection string. - Make sure
dev.openbrew.localpoints to127.0.0.1if you are using the host name based dev setup. - Open
Openbrew.Web.slnand run the web project.
If you are starting from scratch, follow the database instructions in:
- Current source: https://github.com/aderbique/openbrew
- Original source: https://github.com/rak-phillip/Brewgr.com
- Microsoft ASP.NET MVC
- Microsoft Entity Framework
- AutoMapper
- Ninject
- Exceptional
- Fluent Validation
- Image Resizer
- jQuery
- Various jQuery plugins
OpenBrew is copyright (c) 2011-2015 Matthew Marksbury, Jason Zimmerman, and other contributors under the GNU General Public License v3.0.