Deploying with Docker

We provide pre-built Docker images that can be used to run FeedbackBin on your own server.

If you don’t need to change the source code and just want the out-of-the-box FeedbackBin experience, this is the easiest way to get started.

You’ll find the latest version of FeedbackBin’s Docker image at ghcr.io/murny/feedbackbin:master.

To run it you’ll need:

  • A machine that runs Docker
  • A mounted volume (so that your database persists between restarts)
  • Some environment variables for configuration

Mounting a Storage Volume

FeedbackBin keeps all of its storage inside /rails/storage. This includes:

  • SQLite databases (/rails/storage/db/)
  • File uploads (/rails/storage/files/)

By default, Docker containers don’t persist storage between runs, so you’ll want to mount a persistent volume into that location.

The simplest way is with a named volume:

docker run --volume feedbackbin-storage:/rails/storage ghcr.io/murny/feedbackbin:master

Docker handles permissions automatically with named volumes.

Using Bind Mounts

If you prefer to specify the data location yourself:

# First, set correct ownership on the host (UID 1000)
sudo chown -R 1000:1000 /path/to/host/storage

# Then mount it
docker run --volume /path/to/host/storage:/rails/storage ghcr.io/murny/feedbackbin:master

Important: The FeedbackBin container runs as a non-root user (rails, UID 1000) for security. Host-mounted volumes must be owned by UID 1000.

Environment Variables

Required Variables

SECRET_KEY_BASE

Various features inside FeedbackBin rely on cryptography (such as secure sessions). You need to provide a secret value that will be used as the basis for these secrets.

Generate a secret key:

docker run --rm ghcr.io/murny/feedbackbin:master bin/rails secret

Then set it:

docker run --env SECRET_KEY_BASE=your_generated_secret ...

Optional Variables

Variable Description Default
RAILS_MASTER_KEY Rails credentials encryption key -
HTTP_PORT HTTP port to listen on 80

SSL Configuration

FeedbackBin uses Thruster for SSL termination. If you’re running behind a reverse proxy that handles SSL, you can disable it:

docker run --publish 80:80 ...

If you want the container to handle SSL directly, configure your reverse proxy or load balancer to terminate SSL and forward to the container.

SMTP Email

FeedbackBin needs to send email for authentication (magic links) and notifications. Configure your SMTP settings:

Variable Description
SMTP_ADDRESS SMTP server address
SMTP_PORT SMTP port (default: 587)
SMTP_USERNAME SMTP username
SMTP_PASSWORD SMTP password
SMTP_DOMAIN Domain for HELO command

You can use any SMTP provider (Postmark, SendGrid, Mailgun, etc.).

Quick Start

Using Docker Run

docker run \
  --publish 80:80 \
  --restart unless-stopped \
  --volume feedbackbin-storage:/rails/storage \
  --env SECRET_KEY_BASE=your_secret_key_here \
  --name feedbackbin \
  ghcr.io/murny/feedbackbin:master

Using Docker Compose

Create a docker-compose.yml file:

services:
  feedbackbin:
    image: ghcr.io/murny/feedbackbin:master
    container_name: feedbackbin
    restart: unless-stopped
    ports:
      - "80:80"
    volumes:
      - feedbackbin-storage:/rails/storage
    environment:
      SECRET_KEY_BASE: ${SECRET_KEY_BASE}
      # Add SMTP settings for email
      # SMTP_ADDRESS: mail.example.com
      # SMTP_USERNAME: user
      # SMTP_PASSWORD: pass

volumes:
  feedbackbin-storage:

Create a .env file with your secrets:

SECRET_KEY_BASE=your_secret_key_here

Start the application:

docker compose up -d

Check logs:

docker compose logs -f feedbackbin

Building from Source

If you want to build the Docker image yourself:

# Clone the repository
git clone https://github.com/murny/feedbackbin.git
cd feedbackbin

# Build the image
docker build -t feedbackbin .

# Run your custom build
docker run \
  --publish 80:80 \
  --volume feedbackbin-storage:/rails/storage \
  --env SECRET_KEY_BASE=your_secret_key_here \
  feedbackbin

Troubleshooting

Permission Errors

If you see permission errors, ensure your volume is owned by UID 1000:

sudo chown -R 1000:1000 /path/to/your/storage

Container Won’t Start

Check the logs:

docker logs feedbackbin

Common issues:

  • Missing SECRET_KEY_BASE
  • Volume permission problems
  • Port already in use

Database Issues

The SQLite database is stored in /rails/storage/db/. If you need to reset:

docker exec feedbackbin bin/rails db:reset

Next Steps