Important PSA Regarding Portainer 2.33.0 LTS

Portainer 2.33.0 LTS has some fairly significant changes, and a couple of them are "breaking changes" for those using OliveTin-for-Channels and/or Orgainizr. Thanks to @Tolli for helping to uncover the one related to OliveTin.

If you're using OliveTin-for-Channels, and you upgrade to Portainer 2.33.0 LTS (whether manually or using Watchtower), you'll need to update your Olivetin Docker Compose to the latest version shown here (version 2025.08.25 as of this writing):

If you've been using Portainer in an iFrame with Organizr, you'll find this no longer works with Portainer 2.33.0 LTS. There are two ways to address this, the first is to disable the new Portainer Content Security Policy.

From the command line these should be the steps:

docker stop portainer
docker rm portainer
docker rmi portainer/portainer-ce:latest
docker run -d -p 9000:9000 -p 9443:9443 --name portainer \
    --restart=always \
    -e CSP=false \
    -v /var/run/docker.sock:/var/run/docker.sock \
    -v portainer_data:/data \
    portainer/portainer-ce:latest

If you're using remote Portainer Edge Agents (not likely for most), you'll also need -p 8000 above.

The other option is to reverse proxy Portainer using the Docker version of Caddy as described here:

And here:

Thanks for the heads up, and steps to follow for fixing. I just updated my OliveTin container. Then I went to the command line for the iFrame/Organizr fix. The third command gave me an error:

Error response from daemon: No such image: portainer/portainer-ce:latest

EDIT to add: I just went on to the next command, which succeeded, and I'm back up and running.

Portainer uses multiple repositories, so you may have been using cr.portainer.io. So, try:

docker rmi cr.portainer.io/portainer/portainer-ce:latest

They're both the same, so once you delete the one from their repo you can pull the new one from Docker Hub (which is what's happening in the docker run command above).

Thanks. I got it up and running, edited my post above. I checked Organizr and my Portainer iFrame is working.

The command you suggested in Terminal also worked, I got responses saying portainer-ce was "untagged."

1 Like

Another quick note, just in case anyone else is in the same boat. The first command also gave me an error:

docker stop Portainer

Error response from daemon: No such container: Portainer

I then realized my installation was named "portainer," and these commands are case-sensitive. So I tried again:

docker stop portainer

...worked fine.

1 Like

Right you are! Fixed in the original post...

That worked. I was wondering why I couldn't display portainer on organizr

1 Like

I've been running OliveTin for Channels and Portainer CE v2.33.0 LTS for the last 6 days and don't see any problems. I don't use organizer.

What changed in Portainer that requires changing the OliveTin stack?
Do any environment variables need changed?
What change do I need to make in my OliveTin compose statement (I modified mine from what you have posted)?

services:
  olivetin: # This docker-compose typically requires no editing. Use the Environment variables section of Portainer to set your values.
    # 2025.03.27
    # GitHub home for this project: https://github.com/bnhf/OliveTin
    # Docker tag versions: https://hub.docker.com/r/bnhf/olivetin/tags?page=1&ordering=last_updated
    # Docker container home for this project with setup instructions: https://hub.docker.com/r/bnhf/olivetin
    container_name: ${OLIVETIN_NAME:-olivetin}
    dns_search: ${DOMAIN:+${DOMAIN}} # For Tailscale users using Magic DNS, add your Tailnet (tailxxxxx.ts.net) to use hostnames for remote nodes, otherwise use your local domain name.
    hostname: ${OLIVETIN_NAME:-olivetin}
    image: bnhf/olivetin:${TAG:-latest} # Add the tag like latest or test to the environment variables below.
    ports:
      - ${HOST_PORT:-1337}:1337
    environment:
      - ALERT_EMAIL_FROM=${ALERT_EMAIL_FROM} # Sender address for alert e-mails.
      - ALERT_EMAIL_PASS=${ALERT_EMAIL_PASS} # SMTP "app" password established through GMail or Yahoo Mail. Do not use your everyday e-mail address.
      - ALERT_EMAIL_TO=${ALERT_EMAIL_TO} # Recipient address for alert e-mails.
      - ALERT_SMTP_SERVER=${ALERT_SMTP_SERVER} # SMTP server to use for sending alert e-mails. smtp.gmail.com:587 for example.
      - CHANNELS_CLIENTS=${CHANNELS_CLIENTS} # Space separated list of Channels DVR clients you'd like notifications sent to in the form hostname or IP.
      - CHANNELS_DVR=${CHANNELS_DVR1_HOST}:${CHANNELS_DVR1_PORT} # Add your Channels DVR server in the form CHANNELS_DVR_HOST=<hostname or ip> and CHANNELS_DVR_PORT=<port>.
      - CHANNELS_DVR_ALTERNATES=${CHANNELS_DVR_ALTERNATES} # Space separated list of alternate Channels DVR servers to choose from in the form hostname:port or ip:port.
      - OLIVETIN_COMPOSE=2025.03.26 # Do not change this value.
      - PERSISTENT_LOGS=${PERSISTENT_LOGS} # Set this to true to keep log contents between restarts.
      - PORTAINER_ENV=${PORTAINER_ENV:-2} # Set this is if you're using an alternate Portainer Environment for some reason. 2 is the default.
      - PORTAINER_HOST=${PORTAINER_HOST:-$CHANNELS_DVR1_HOST} # Hostname or IP of the Docker host you're running Portainer on.
      - PORTAINER_PORT=${PORTAINER_PORT:-9443} # https port you're running Portainer on. 9443 is the default.
      - PORTAINER_TOKEN=${PORTAINER_TOKEN} # Generate via <username> dropdown (upper right of WebUI), "My account", API tokens.
      - TZ=${TZ} # Add your local timezone in standard linux format. E.G. US/Eastern, US/Central, US/Mountain, US/Pacific, etc.
      - UPDATE_SCRIPTS=${UPDATE_SCRIPTS:-true} # Set this to true to update all included scripts.
      - UPDATE_YAMLS=${UPDATE_YAMLS:-true} # Set this to true to update config.yaml.
    volumes:
      - ${DVR1_SHARE}:/mnt/${CHANNELS_DVR1_HOST}-${CHANNELS_DVR1_PORT}               # these volume mounts should always be to /mnt/hostname-port or /mnt/ip-port (dash rather than a colon between)
      - ${DVR2_SHARE}:/mnt/${CHANNELS_DVR2_HOST}-${CHANNELS_DVR2_PORT}               # these volume mounts should always be to /mnt/hostname-port or /mnt/ip-port (dash rather than a colon between)
      - ${DVR3_SHARE}:/mnt/${CHANNELS_DVR3_HOST}-${CHANNELS_DVR3_PORT}               # these volume mounts should always be to /mnt/hostname-port or /mnt/ip-port (dash rather than a colon between)
      - ${DVR4_SHARE}:/mnt/${CHANNELS_DVR4_HOST}-${CHANNELS_DVR4_PORT}               # these volume mounts should always be to /mnt/hostname-port or /mnt/ip-port (dash rather than a colon between)
      - ${DVR5_SHARE}:/mnt/${CHANNELS_DVR5_HOST}-${CHANNELS_DVR5_PORT}               # these volume mounts should always be to /mnt/hostname-port or /mnt/ip-port (dash rather than a colon between)
      - ${DVR6_SHARE}:/mnt/${CHANNELS_DVR6_HOST}-${CHANNELS_DVR6_PORT}               # these volume mounts should always be to /mnt/hostname-port or /mnt/ip-port (dash rather than a colon between)
      - ${DVR7_SHARE}:/mnt/${CHANNELS_DVR7_HOST}-${CHANNELS_DVR7_PORT}               # these volume mounts should always be to /mnt/hostname-port or /mnt/ip-port (dash rather than a colon between)
      - ${HOST_DIR}/olivetin:/config                                                 # Add the parent directory on your Docker you'd like to use.
      - ${LOGS1_SHARE}:/mnt/${CHANNELS_DVR1_HOST}-${CHANNELS_DVR1_PORT}_logs         # these volume mounts should always be to /mnt/hostname-port or /mnt/ip-port (dash rather than a colon between)
      - ${LOGS2_SHARE}:/mnt/${CHANNELS_DVR2_HOST}-${CHANNELS_DVR2_PORT}_logs         # these volume mounts should always be to /mnt/hostname-port or /mnt/ip-port (dash rather than a colon between)
      - ${LOGS3_SHARE}:/mnt/${CHANNELS_DVR3_HOST}-${CHANNELS_DVR3_PORT}_logs         # these volume mounts should always be to /mnt/hostname-port or /mnt/ip-port (dash rather than a colon between)
      - ${LOGS4_SHARE}:/mnt/${CHANNELS_DVR4_HOST}-${CHANNELS_DVR4_PORT}_logs         # these volume mounts should always be to /mnt/hostname-port or /mnt/ip-port (dash rather than a colon between)
      - ${LOGS5_SHARE}:/mnt/${CHANNELS_DVR5_HOST}-${CHANNELS_DVR5_PORT}_logs         # these volume mounts should always be to /mnt/hostname-port or /mnt/ip-port (dash rather than a colon between)
      - ${LOGS6_SHARE}:/mnt/${CHANNELS_DVR6_HOST}-${CHANNELS_DVR6_PORT}_logs         # these volume mounts should always be to /mnt/hostname-port or /mnt/ip-port (dash rather than a colon between)
      - ${LOGS7_SHARE}:/mnt/${CHANNELS_DVR7_HOST}-${CHANNELS_DVR7_PORT}_logs         # these volume mounts should always be to /mnt/hostname-port or /mnt/ip-port (dash rather than a colon between)
      - /var/run/docker.sock:/var/run/docker.sock
    restart: unless-stopped

  static-file-server:
    container_name: static-file-server
    dns_search: ${DOMAIN}
    image: halverneus/static-file-server:latest
    ports:
      - ${HOST_SFS_PORT}:8080
    environment:
      - DEBUG=false
      - FOLDER=${FOLDER}
      - TZ=${TZ} # Add your local timezone in standard linux format. E.G. US/Eastern, US/Central, US/Mountain, US/Pacific, etc.
    volumes:
      - ${HOST_DIR}/olivetin/data:${FOLDER}
    restart: unless-stopped

You are probably a unique case given your numerous CDVR servers. There was a small but significant syntax change in supported methods of variable expansion allowed by Portainer. For most people, with a single CDVR server this line would cause a failure with 2.33.0 LTS:

${CHANNELS_DVR2_HOST:+CHANNELS_DVR_ALTERNATES=${CHANNELS_DVR2_HOST}:${CHANNELS_DVR2_PORT}} ${CHANNELS_DVR3_HOST:+${CHANNELS_DVR3_HOST}:${CHANNELS_DVR3_PORT}} 

Portainer would complain about a trailing space in the variable assignment, which would be the case if CHANNELS_DVR2_HOST in not null, but CHANNELS_DVR3_HOST is -- however, this was happening when both values were equal to null (probably a bug).

This variation works:

CHANNELS_DVR_ALTERNATES=${CHANNELS_DVR2_HOST:+${CHANNELS_DVR2_HOST}:${CHANNELS_DVR2_PORT}}${CHANNELS_DVR3_HOST:+ ${CHANNELS_DVR3_HOST}:${CHANNELS_DVR3_PORT}}

Same basic idea, but with a couple of small differences in approach.

For you, as maybe(?) the only person running more than 3 CDVR servers (at least the only one I've ever heard from), you'd need to follow this pattern to add server 4 and beyond:

${CHANNELS_DVR4_HOST:+ ${CHANNELS_DVR4_HOST}:${CHANNELS_DVR4_PORT}}

No space between the blocks, but note the internal space after the + sign.

EDIT: Looking at the custom compose you posted while I was writing this, you should be fine. Since you're defining CDVR_ALTERNATES= as its own value, as opposed to building it from individual CHANNELS_DVRx_HOST and CHANNELS_DVRx_PORT values -- you should be unaffected.

Thanks, I'm using
compose

- CHANNELS_DVR_ALTERNATES=${CHANNELS_DVR_ALTERNATES}

environment

CHANNELS_DVR_ALTERNATES=192.168.1.4:8089 192.168.1.4:8090 192.168.1.4:8189 192.168.1.4:8190 192.168.1.4:8289 192.168.1.4:8389

I just ran the OliveTin Post-Install Healthcheck and noticed that now I'm using Portainer CE v2.33.0 LTS it doesn't report the Portainer Environment ID (which is 2 in my case)

----------------------------------------
Checking if your Portainer token is working on ports 9000 and/or 9443:
Portainer http response on port 9000 reports version 2.33.0
Portainer Environment ID for local is 
Portainer https response on port 9443 reports version 2.33.0
Portainer Environment ID for local is 
----------------------------------------
Here's a list of your current OliveTin-related settings:
HOSTNAME=olivetin
CHANNELS_DVR=192.168.1.4:8489
CHANNELS_DVR_ALTERNATES=192.168.1.4:8089 192.168.1.4:8090 192.168.1.4:8189 192.168.1.4:8190 192.168.1.4:8289 192.168.1.4:8389
CHANNELS_CLIENTS=
ALERT_SMTP_SERVER=[Redacted]:587
ALERT_EMAIL_FROM=[Redacted]
ALERT_EMAIL_PASS=[Redacted]
ALERT_EMAIL_TO=[Redacted]
UPDATE_YAMLS=true
UPDATE_SCRIPTS=true
PORTAINER_HOST=192.168.1.4
PORTAINER_PORT=9443
PORTAINER_ENV=2

You should be seeing something more along these lines (this is a test system with only one CDVR server):

Here's a list of your current OliveTin-related settings:

HOSTNAME=olivetin
CHANNELS_DVR=192.168.110.116:8089
CHANNELS_DVR_ALTERNATES=
CHANNELS_CLIENTS=
ALERT_SMTP_SERVER=
ALERT_EMAIL_FROM=[Redacted]@
ALERT_EMAIL_PASS=[Redacted]
ALERT_EMAIL_TO=[Redacted]@
UPDATE_YAMLS=true
UPDATE_SCRIPTS=true
PORTAINER_TOKEN=[Redacted]
PORTAINER_HOST=192.168.110.116
PORTAINER_PORT=9443
PORTAINER_ENV=1

Do you have a PORTAINER_TOKEN defined in the Environment variables section of the Stack Editor?

Thanks, My bad. I was testing changing env vars in the container and forgot I had removed it. That's what I get for multi-tasking.

----------------------------------------
Checking if your Portainer token is working on ports 9000 and/or 9443:
Portainer http response on port 9000 reports version 2.33.0
Portainer Environment ID for local is 2
Portainer https response on port 9443 reports version 2.33.0
Portainer Environment ID for local is 2
----------------------------------------
Here's a list of your current OliveTin-related settings:
HOSTNAME=olivetin
CHANNELS_DVR=192.168.1.4:8489
CHANNELS_DVR_ALTERNATES=192.168.1.4:8089 192.168.1.4:8090 192.168.1.4:8189 192.168.1.4:8190 192.168.1.4:8289 192.168.1.4:8389
CHANNELS_CLIENTS=
ALERT_SMTP_SERVER=[Redacted]:587
ALERT_EMAIL_FROM=[Redacted].net
ALERT_EMAIL_PASS=[Redacted]
ALERT_EMAIL_TO=[Redacted].net
UPDATE_YAMLS=true
UPDATE_SCRIPTS=true
PORTAINER_TOKEN=[Redacted]
PORTAINER_HOST=192.168.1.4
PORTAINER_PORT=9443
PORTAINER_ENV=2
----------------------------------------

Like when you keep getting interrupted and it leads to a stack overflow.

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.