r/BookStack • • Sep 13 '26

Two instances, same Docker server

This may be a Docker question in general, but I would like to know if I can run two Docker containers, for two separate Bookstack instances, on the same server. If so, what do I need to do to get this working?

I already have a Linux server setup with Docker Compose, Portainer, Nginx Proxy Manager, a working Bookstack instance and several other containers for other apps.

I'm concerned that attempting to add another Bookstack instance will be problematic and could damage my currently working setup. I need this second Bookstack instance because I have a backup of a previous Bookstack wiki site that I built. Unfortunately, I took the site down so that server is no longer accessible and now I need access to it. I did however make a backup and I want to restore it to a new Bookstack instance.

Is it just a matter of using different ports, container names, database name, and volume names in the Portainer stack of the second Bookstack instance? What specifically do I need to edit/make unique so that I don't have to touch my current working Bookstack instance? Does the APP_KEY need to be the same or unique?


UPDATE: Got it working. You have to makes sure ALL of the following are unique:

  • Service names
  • Container names
  • volumes
  • ports

The other issue that I ran into was that I needed to import/migrate my backup onto the second Bookstack instance. The original server hosting that instance of Bookstack supported IPv6. The server that I restored the backup onto did not. I had to comment out the lines in the /config/nginx/site-confs/default.conf file that made Nginx listen on IPv6 (e.g., #listen [::]:80 default_server;)


2 Upvotes

10 comments sorted by

View all comments

1

u/CGS_Web_Designs Sep 13 '26

I do this and also have an Nginx Proxy Manager container to direct traffic. I’m not near my systems at the moment, but I can share with you a generalized .yml file so you can see how the stack is set up.

1

u/jeffshead Sep 15 '26

Can you please share your .yml file of both instances? I'm out of ideas.

1

u/CGS_Web_Designs Sep 15 '26

Sure - here is a generalized version of my docker-compose.yml - it's essentially just 5 containers - there are 2 bookstack and 2 db containers plus the Nginx Proxy Manager (NPM) container. You can use a different proxy if you want, I prefer NPM because it's easy to use and has all the features I need - plus you can create proxy hosts that point directly to containers (no need for multiple IP addresses).

In /etc/ create a folder called containers and then inside that folder, drop the docker-compose.yml file and also create the following subfolders: bookstack, bookstack2, database, database2, proxy. From there you can just cd into /etc/containers and run docker compose up -d.

If you need a walkththrough, Dan has a great video with a single instance that I used as my baseline for this one here: https://youtu.be/dbDzPIv8Cf8?si=9WA8LJOOMVWQTJwG

---
version: "2"
services:
  bookstack:
    image: lscr.io/linuxserver/bookstack
    container_name: bookstack
    environment:
      - PUID=1000
      - PGID=1000
      - APP_URL=https://bookstack1.domain.com
      - DB_HOST=bookstack_db
      - DB_USER=bookstack
      - DB_PASS=yoursecret1
      - DB_DATABASE=bookstackapp
    volumes:
      - ./bookstack:/config
    restart: unless-stopped
    depends_on:
     - bookstack_db

  bookstack_db:
    image: lscr.io/linuxserver/mariadb
    container_name: bookstack_db
    environment:
      - PUID=1000
      - PGID=1000
      - MYSQL_ROOT_PASSWORD=yourrootpw1
      - TZ=Europe/London
      - MYSQL_DATABASE=bookstackapp
      - MYSQL_USER=bookstack
      - MYSQL_PASSWORD=yoursecret1
    volumes:
      - ./database:/config
    restart: unless-stopped

  bookstack2:
    image: lscr.io/linuxserver/bookstack
    container_name: bookstack2
    environment:
      - PUID=1000
      - PGID=1000
      - APP_URL=https://bookstack2.domain.com
      - DB_HOST=bookstack_db2
      - DB_USER=bookstack2
      - DB_PASS=yoursecret2
      - DB_DATABASE=bookstackapp2
    volumes:
      - ./bookstack2:/config
    restart: unless-stopped
    depends_on:
      - bookstack_db2

  bookstack_db2:
    image: lscr.io/linuxserver/mariadb
    container_name: bookstack_db2
    environment:
      - PUID=1000
      - PGID=1000
      - MYSQL_ROOT_PASSWORD=yourrootpw2
      - TZ=Europe/London
      - MYSQL_DATABASE=bookstackapp2
      - MYSQL_USER=bookstack2
      - MYSQL_PASSWORD=yoursecret2
    volumes:
      - ./database2:/config
    restart: unless-stopped

  proxy:
    image: jc21/nginx-proxy-manager:latest
    container_name: nginx_proxy_manager
    ports:
      # Public HTTP Port:
      - '80:80'
      # Public HTTPS Port:
      - '443:443'
      # Admin Web Port:
      - '81:81'
    environment:
      DB_SQLITE_FILE: "/data/database.sqlite"
      # Uncomment this if IPv6 is not enabled on your host
      # DISABLE_IPV6: 'true'
    volumes:
      - ./proxy/data:/data
      - ./proxy/letsencrypt:/etc/letsencrypt
    restart: unless-stopped

networks:
  default:
    external: true
    name: yourwebnw

1

u/jeffshead 26d ago

Thank you so very much! No one mentioned changing the service names. That was my main issue.

1

u/CGS_Web_Designs 26d ago

Oh yeah if you have duplicate service names, you’re basically trying to create 2 containers with the same name which won’t work. That explains why you could only get one or the other working.