Coolify + Caddy - Deployment of "Memos" app

1. The problem I’m having:

I’m not sure if it’s a Coolify or a Caddy problem, but since Coolify uses Caddy under the hood, I’ll assume it has something to do with it. I got a coolify instance running with Caddy as the proxy, it’s been working for some apps, but for some others HTTPS seems to not be working, for instance, I am currently trying to make an app called “memos” work, but all I get is http://coolify.example.com:5230 to work, instead of https://memos.example.com which is the endpoint I expect.

Docker compose file looks like this:

services:
  memos:
    image: 'neosmemo/memos:stable'
    container_name: memos
    volumes:
      - '~/.memos/:/var/opt/memos'
    ports:
      - '5230:5230'

and its deployable form looks like this:

services:
  memos:
    image: 'neosmemo/memos:stable'
    container_name: memos-wkog4oswg48c0o0ogw0ogk8c
    volumes:
      - '/data/coolify/services/wkog4oswg48c0o0ogw0ogk8c/.memos:/var/opt/memos'
    ports:
      - '5230:5230'
    restart: unless-stopped
    labels:
      - coolify.managed=true
      - coolify.version=4.0.0-beta.418
      - coolify.serviceId=10
      - coolify.type=service
      - coolify.name=memos-wkog4oswg48c0o0ogw0ogk8c
      - coolify.resourceName=memos
      - coolify.projectName=apps
      - coolify.serviceName=memos
      - coolify.environmentName=production
      - coolify.pullRequestId=0
      - coolify.service.subId=10
      - coolify.service.subType=application
      - coolify.service.subName=memos
      - traefik.enable=true
      - traefik.http.middlewares.gzip.compress=true
      - traefik.http.middlewares.redirect-to-https.redirectscheme.scheme=https
      - traefik.http.routers.http-0-wkog4oswg48c0o0ogw0ogk8c-memos.entryPoints=http
      - traefik.http.routers.http-0-wkog4oswg48c0o0ogw0ogk8c-memos.middlewares=redirect-to-https
      - 'traefik.http.routers.http-0-wkog4oswg48c0o0ogw0ogk8c-memos.rule=Host(`memos.example.com`) && PathPrefix(`/`)'
      - traefik.http.routers.https-0-wkog4oswg48c0o0ogw0ogk8c-memos.entryPoints=https
      - traefik.http.routers.https-0-wkog4oswg48c0o0ogw0ogk8c-memos.middlewares=gzip
      - 'traefik.http.routers.https-0-wkog4oswg48c0o0ogw0ogk8c-memos.rule=Host(`memos.example.com`) && PathPrefix(`/`)'
      - traefik.http.routers.https-0-wkog4oswg48c0o0ogw0ogk8c-memos.tls.certresolver=letsencrypt
      - traefik.http.routers.https-0-wkog4oswg48c0o0ogw0ogk8c-memos.tls=true
      - 'caddy_0.encode=zstd gzip'
      - 'caddy_0.handle_path.0_reverse_proxy={{upstreams}}'
      - 'caddy_0.handle_path=/*'
      - caddy_0.header=-Server
      - 'caddy_0.try_files={path} /index.html /index.php'
      - 'caddy_0=https://memos.example.com'
      - caddy_ingress_network=wkog4oswg48c0o0ogw0ogk8c
    networks:
      wkog4oswg48c0o0ogw0ogk8c: null
    environment:
      COOLIFY_RESOURCE_UUID: wkog4oswg48c0o0ogw0ogk8c
      COOLIFY_CONTAINER_NAME: memos-wkog4oswg48c0o0ogw0ogk8c
      COOLIFY_URL: 'https://memos.example.com'
      COOLIFY_FQDN: memos.example.com
volumes: {  }
networks:
  wkog4oswg48c0o0ogw0ogk8c:
    name: wkog4oswg48c0o0ogw0ogk8c
    external: true
configs: {  }
secrets: {  }

2. Error messages and/or full log output:

2025-05-24T08:46:06.964149518Z 
2025-05-24T08:46:06.964218713Z ███╗   ███╗███████╗███╗   ███╗ ██████╗ ███████╗
2025-05-24T08:46:06.964225323Z ████╗ ████║██╔════╝████╗ ████║██╔═══██╗██╔════╝
2025-05-24T08:46:06.964229650Z ██╔████╔██║█████╗  ██╔████╔██║██║   ██║███████╗
2025-05-24T08:46:06.964233556Z ██║╚██╔╝██║██╔══╝  ██║╚██╔╝██║██║   ██║╚════██║
2025-05-24T08:46:06.964237442Z ██║ ╚═╝ ██║███████╗██║ ╚═╝ ██║╚██████╔╝███████║
2025-05-24T08:46:06.964241507Z ╚═╝     ╚═╝╚══════╝╚═╝     ╚═╝ ╚═════╝ ╚══════╝
2025-05-24T08:46:06.964380177Z ---
2025-05-24T08:46:06.964396261Z Server profile
2025-05-24T08:46:06.964400347Z version: 0.24.3
2025-05-24T08:46:06.964404013Z data: /var/opt/memos
2025-05-24T08:46:06.964407687Z addr: 
2025-05-24T08:46:06.964411514Z port: 5230
2025-05-24T08:46:06.964415169Z unix-sock: 
2025-05-24T08:46:06.964432105Z mode: prod
2025-05-24T08:46:06.964436090Z driver: sqlite
2025-05-24T08:46:06.964439856Z ---
2025-05-24T08:46:06.964443621Z Version 0.24.3 has been started on port 5230
2025-05-24T08:46:06.964447587Z ---
2025-05-24T08:46:06.964451524Z See more in:
2025-05-24T08:46:06.964455559Z 👉Website: https://usememos.com
2025-05-24T08:46:06.964459345Z 👉GitHub: https://github.com/usememos/memos
2025-05-24T08:46:06.964462921Z ---
2025-05-24T08:46:23.815831337Z 2025/05/24 08:46:23 INFO OK method=/memos.api.v1.WorkspaceService/GetWorkspaceProfile
2025-05-24T08:46:23.871564089Z 2025/05/24 08:46:23 INFO OK method=/memos.api.v1.WorkspaceSettingService/GetWorkspaceSetting
2025-05-24T08:46:23.926769403Z 2025/05/24 08:46:23 INFO OK method=/memos.api.v1.WorkspaceSettingService/GetWorkspaceSetting
2025-05-24T08:46:23.984215078Z 2025/05/24 08:46:23 INFO client error method=/memos.api.v1.AuthService/GetAuthStatus error="rpc error: code = Unauthenticated desc = user not found"
2025-05-24T08:46:24.141682347Z 2025/05/24 08:46:24 INFO OK method=/memos.api.v1.WorkspaceService/GetWorkspaceProfile
2025-05-24T08:46:24.196631877Z 2025/05/24 08:46:24 INFO OK method=/memos.api.v1.WorkspaceSettingService/GetWorkspaceSetting
2025-05-24T08:46:24.252936480Z 2025/05/24 08:46:24 INFO OK method=/memos.api.v1.WorkspaceSettingService/GetWorkspaceSetting
2025-05-24T08:46:24.308718495Z 2025/05/24 08:46:24 INFO client error method=/memos.api.v1.AuthService/GetAuthStatus error="rpc error: code = Unauthenticated desc = user not found"
2025-05-24T08:46:24.451611328Z 2025/05/24 08:46:24 INFO OK method=/memos.api.v1.MemoService/ListMemos

3. Caddy version:

I’m using caddy through caddy-docker-proxy:2.8

4. How I installed and ran Caddy:

Coolify has Caddy built-in, I just configured it to use it.

a. System environment:

Coolify instance version v4.0.0-beta.418

d. My complete Caddy config:

networks:
  coolify:
    external: true
services:
  caddy:
    container_name: coolify-proxy
    image: 'lucaslorentz/caddy-docker-proxy:2.8-alpine'
    restart: unless-stopped
    extra_hosts:
      - 'host.docker.internal:host-gateway'
    environment:
      - CADDY_DOCKER_POLLING_INTERVAL=5s
      - CADDY_DOCKER_CADDYFILE_PATH=/dynamic/Caddyfile
    networks:
      - coolify
    ports:
      - '80:80'
      - '443:443'
      - '443:443/udp'
    labels:
      - coolify.managed=true
      - coolify.proxy=true
    volumes:
      - '/var/run/docker.sock:/var/run/docker.sock:ro'
      - '/data/coolify/proxy/caddy/dynamic:/dynamic'
      - '/data/coolify/proxy/caddy/config:/config'
      - '/data/coolify/proxy/caddy/data:/data'

File: Caddyfile

import /dynamic/*.caddy

File: coolify.caddy

https://coolify.example.com {
    handle /app/* {
        reverse_proxy coolify-realtime:6001
    }
    handle /terminal/ws {
        reverse_proxy coolify-realtime:6002
    }
    reverse_proxy coolify:8080
}

File: default_redirect_503.caddy

# This file is generated by Coolify, do not edit it manually.
# Disable the default redirect to customize (only if you know what are you doing).

:80, :443 {
    respond 503
}

File: instance-redirect.caddy

www.coolify.example.com {
    redir https://coolify.example.com{uri}
}

5. Links to relevant resources:

Coolify: https://coolify.io/

Problem fixed

I had to add a new .caddy file like this:

memos.example.com {
    reverse_proxy memos:5230
    log {
        format console
        output file /logs/memos.log {
        roll_size 10mb
        roll_keep 20
        roll_keep_for 7d
        }
    }
    encode {
        zstd
        gzip
        minimum_length 1024
    }
}
2 Likes