mirror of
https://github.com/stoatchat/self-hosted.git
synced 2026-07-20 20:16:47 -04:00
Update self-hosted repo to use latest images and web interface #124
Reference in New Issue
Block a user
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Originally created by @insertish on GitHub (Nov 7, 2025).
The repository is slightly out of date currently, it's still usable but it needs updating.
One big blocker is the lack of Docker images for Stoat for Web which needs to be solved first.
All images are being published under the stoatchat on ghcr now though.
I would usually refactor this repo but I am working full time, help appreciated!
Edit: Just added replacing Minio as a sub-issue
@Flash1232 commented on GitHub (Nov 16, 2025):
Currently looking into dockerizing the Stoat for Web frontend, will update with any progress
@Giggitybyte commented on GitHub (Dec 3, 2025):
Following this with great interest!
@fambosyt commented on GitHub (Dec 9, 2025):
Does this mean that this repository will be updated soon?
@Flash1232 commented on GitHub (Dec 14, 2025):
https://github.com/stoatchat/for-web/pull/522 is now ready for review (note this is the pre-dependency for updating this repo).
As soon as someone from the team gets around to review and test maybe Santa has something up his sleeve to update this repo so that everything is rounded up. Keep in mind that progress can sometimes be slow and that's totally fine, we're volunteers after all.
Happy Holidays to everyone🎄🎁
@Giggitybyte commented on GitHub (Dec 14, 2025):
Very happy to hear!
@KloWhrhyde commented on GitHub (Dec 17, 2025):
Okay i just finished to tinker and deploy it on my unraid server. So if help needed to help update the stack, would gladly help whenever i can if you point me in the right direction. Can't wait for the Voice chat rework ...
@edememinov commented on GitHub (Dec 18, 2025):
Any chance you got video chat and screen sharing to work? Since the V2 Voice API is live, I thought maybe there's a branch with those features enabled.
@Giggitybyte commented on GitHub (Jan 8, 2026):
Hope this hasn't been forgotten!
@remusjohn1 commented on GitHub (Jan 8, 2026):
I'm sure the amount of free time he's putting into it it's as much as he can/is willing to spend on it.
Thanks for the good work, Luke!
@baptisterajaut commented on GitHub (Feb 9, 2026):
Hi
Would it be of interest if I were to basically re-write this repo to use helmfile for a kubernetes cluster instead of docker/docker-compose? Helmfile is way more flexible and let you manage both a local one-click deployment and a remote more complex deployment
I made this to deploy lasuitenumerique in that regard => https://github.com/baptisterajaut/lasuite-platform , I can easily port most of the "code" to create a stoatchat-platform that will install everything thats required, or letting admins use their existing infrastructure. (Also by funny coincidence I already deploy livekit with lasuite)
Do tell me if that would be something someone would be looking for.
Cheers
@mdiluz commented on GitHub (Feb 9, 2026):
+1 to a helm file. It might be good to include a quick guide to installing k3s and helm?
@kawazoe commented on GitHub (Feb 9, 2026):
My vote goes against this. While k8s is much more capable for large, complex applications at the scale of hundreds of micro-services with dozens of teams needing granular permissions, this is not necessary for ordinary people self-hosting this project in a closet. Tons of people really just want an easy way to add StoatChat to their TrueNAS machine like they do for immich, plex, or maybe forgo, as a way to take back control of their messaging infrastructure. Setting up a k8s cluster correctly is beyond the expertise I would expect from this audience and would adversely impact adoption.
If the project goes this way, I hope it also continues to support a simpler compose-based deployment workflow.
@baptisterajaut commented on GitHub (Feb 9, 2026):
Sorry I have been unclear, my goal is not to replace this repo bit re-write it somewhere else with a different technology stack. I do understand the point of having docker compose, but I find it really annoying to deal with next to helm and helmfile
@MichaelCDormann commented on GitHub (Feb 10, 2026):
I would definitely be interested in a helmfile version on top of the docker version
@baptisterajaut commented on GitHub (Feb 10, 2026):
https://github.com/baptisterajaut/stoatchat-platform here you have.
Again, i don't intend to replace any official method. However, i can try to backport my changes in this docker-compose, if any of you found my way of doing things worthwhile.
Please note that i had to build and publish the new web-client on my own on the dockerhub, as https://github.com/stoatchat/for-web/pull/522 is not merged yet.
I haven't tested much of it, but voice calls in particular seems to be working.
Have a great day.
@Logan7432 commented on GitHub (Feb 10, 2026):
Can we please get this long awaited update before the discord face/id requirements set in…. Me and my server want to make the switch but cannot due to it missing voice….
@NocFA commented on GitHub (Feb 10, 2026):
Just to add to this, I'm more than happy to help fund/pool and pay with I'm sure many others to get the self-hosted variant on par and ready to plug and play replace discord for people.
I'm not exactly rolling in money but I understand it's a lot of work and gratitude doesn't pay the bills.
@Blasto33 commented on GitHub (Feb 10, 2026):
Once we get this update, I'm definitely selfhosting and switching to Stoat. Discord has become unbearable.
@baptisterajaut commented on GitHub (Feb 10, 2026):
Heres a (untested) drop-in replacement for the official compose.yml. Keep in mind it will use my own-built docker image, so i would suggest to reuse the script from my repo to publish it yourself if you do not trust me (and you shouldn't by default)compose.yml (edited too)Voice is disabled by default (livekit is a ressource hog) , enable it withdocker compose --profile voice up -dI will wait for an official docker image on the web client to do a proper PR for this repoEDIT : adding voice require some more config that cannot be done with a drop-in replacement of just docker-compose (need to add some config in the toml + add a route in caddy) so here is a dirty script that you have to run after using generate_config.sh (i shouldve done a fork at this point) :enable_voice.shEDIT 2 : all of this was missing so many pieces, nothing wouldve worked
@Logan7432 commented on GitHub (Feb 10, 2026):
Thank you for providing this I’ll check it out. It would be really nice though to get an official release of this though. I wouldn’t also mind dropping a donation as if this gets good I won’t be paying for nitro anymore.
@Logan7432 commented on GitHub (Feb 10, 2026):
Also seperate issue but related and sucks is the fact there’s no mobile app for IOS… not sure if this is going to work for people without app and it don’t seem like it’s being worked on.
@baptisterajaut commented on GitHub (Feb 10, 2026):
Developing (and more precisely publishing) an iOS app is beyond annoying. I think the web client is already a pwa so it could be added as a safari app shortcut afaik (dont quote me on that)
@Logan7432 commented on GitHub (Feb 10, 2026):
In PWA login fails (says Load Failed) for me but normal safari works fine. Also no notifications in PWA…. I like getting notified when I’m tagged or someone says something.
@kawazoe commented on GitHub (Feb 10, 2026):
Hi everyone,
Can we keep the conversation on topic? The PWA/iOS stuff is very interesting, but they really deserves their own tickets and we shouldn't be spamming all watchers for the docker compose release with these comments.
Thx
@Nemirtingas commented on GitHub (Feb 10, 2026):
Use better code like https://github.com/stoatchat/self-hosted/issues/176#issuecomment-3884569333
@fambosyt commented on GitHub (Feb 10, 2026):
how i self host it can you give me a full tutorial?
@XorOwl commented on GitHub (Feb 10, 2026):
i tried building this, but javascript runs out of heap really fast. Watching it, it gets to about 4g and dies, making me think something in the chain is building in 32 bit? it's not a matter of host memory, unless it's suddenly needing more than 4gb in one call.
Has anyone else gotten this running?
@baptisterajaut commented on GitHub (Feb 11, 2026):
I'm confused as why you'd need to build the backend given the docker images are provided through ghcr
@baptisterajaut commented on GitHub (Feb 11, 2026):
Ok so sorry for everyone who lost time with my prior messages about "drop in replacement" that didnt work, i remade it from scratch and now you just run
./generate_config.sh domainor (./generate_config.sh domain --voiceto enable voice support) , and that will generate all the required files in the folder to be able to rundocker compose up -d. And i tested it (quickly), this time it will work. (i had to reduce the port range on livekit because it was killing the docker vm, sorry for everyone who had to endure my stupidty)I'm repeating my disclaimer from earlier : this will use my own-built webclient , not the one from stoat directly. If you want to build it and publish it yourself, look here : https://github.com/baptisterajaut/stoatchat-platform/tree/main/docker/client )
Here are the files, enjoy :
stoat-compose.zip
Note : video support is not yet present in the new web-client, but i didnt want to use the deprecated one
Important
If you want to use custom credentials (and you should, especially because RabbitMQ management interface exposes its port directly):
Set env vars for
generate_config.sh(writes them intoRevolt.toml) and create a.envfile with the same values (read bydocker composeat runtime):Available:
REDIS_PASSWORD,RABBITMQ_USER,RABBITMQ_PASS,MINIO_ROOT_USER,MINIO_ROOT_PASSWORD.After setup : edit
Revolt.tomldirectly (search for the password/key you want to change), then create/update.envwith the matching value so the infrastructure container picks it up too. Restart affected services withdocker compose restart. No need to re-rungenerate_config.sh(which would regenerate VAPID keys and file encryption key).@XorOwl commented on GitHub (Feb 11, 2026):
what's needed to point this back at the modern stoatchat interface? simple repo swap, or is it more complicated than that?
@baptisterajaut commented on GitHub (Feb 11, 2026):
I'm sorry i don't understand the question. I am alredy using the modern interface, however stoatchat does not provide official images for it, therefore i build and publish it it myself (with some rewrite at runtime for the variables).
If you want to change the source of the web client image, just modify the compose.yml and change the image name in the client section
@XorOwl commented on GitHub (Feb 11, 2026):
Ah that explains it. your phrasing made it sound like you entirely built your own front end ui from scratch, thanks
@adakac commented on GitHub (Feb 11, 2026):
Hey there, I did this (followed by a
docker compose pull) and the "upgrade" worked :)But I can't seem to connect to the voice channel - I am getting a 400 on trying to "join the voice channel":
Is this the current extend of it or should it work? Maybe I need another port for it? (but I think its WebRTC via TLS?)
@baptisterajaut commented on GitHub (Feb 11, 2026):
Errr no effin clue. Check logs from livekit and in firefox ? Are you using my image with runtime nginx overwrite ?
@LordGuenni commented on GitHub (Feb 11, 2026):
I Managed To deploy everything with traefik in front as that is the Reverse Proxy i am using, i am also Building the Web Client from scratch at runtime, so it doesnt matter that there isnt an official Image.
Will share later as i am not Home rn.
@dra66y commented on GitHub (Feb 11, 2026):
@baptisterajaut I used your script for a new setup for testing and it works great for port 80, but I want to run it under a different port because my main docker server already has port 80 taken and I use nginx proxy manager on it.
These instructions work for the regular stoat self host, but don't seem to work for your setup https://github.com/stoatchat/self-hosted/tree/main?tab=readme-ov-file#placing-behind-another-reverse-proxy-or-another-port I've tried quite a few things and it just won't respond on a port other then 80
Edit: Sorry, I figured it out. Caddy assumes https if you use an https address and when both caddy and nginx are using https it is unhappy. Changing the SITE_ADDRESS to http fixes that.
@adakac commented on GitHub (Feb 11, 2026):
Does it work on your PC? :P
I only edited the yaml like this and did a
docker compose pull:Firefox seems to deliver:
Uncaught (in promise) {"type":"LiveKitUnavailable","location":"crates/delta/src/routes/channels/voice_join.rs:29:20"}Where/How would I use your nginx settings?
@LordGuenni commented on GitHub (Feb 11, 2026):
This also build the web client from source at runtime, also i changed the files upload limit to 100MB in both Backend and the Frontend, as it is hardcoded there. The only thing not working properly yet is gifbox.
stoat-traefik.zip
@baptisterajaut commented on GitHub (Feb 11, 2026):
Check my compose, you should just set the REVOLT_PUBLIC_URL env variable https://github.com/baptisterajaut/stoatchat-platform/blob/main/docker/client/entrypoint.sh
Also, you should use also the v0.10.3 official images if you don't already do?
@Dadadah commented on GitHub (Feb 11, 2026):
I assume the Stoat team is overwhelmed right now with the increased traffic, are you able to get the caddy config working and open a PR with the new changes @baptisterajaut ?
@baptisterajaut commented on GitHub (Feb 11, 2026):
As far as i can see, "it works on my machine" => https://github.com/stoatchat/self-hosted/issues/176#issuecomment-3884569333
If you want something i can support more easily, theres always https://github.com/baptisterajaut/stoatchat-platform/
Edit : because people want so much docker-compose, i'm vibe-coding this : https://github.com/baptisterajaut/helmfile2compose , so you could generate a compose.yml from my helmfile with me having just to manage a yaml descriptor of the translation. IE if theres a version update of something, i just modify the helmfile, not the compose
@baptisterajaut commented on GitHub (Feb 12, 2026):
Good news everyone, i am supporting docker-compose in my own repo now : https://github.com/baptisterajaut/stoatchat-platform/blob/main/docs/compose-deployment.md
If you have any issues with it, you can open new issues directly in my repos instead of needlessly notifying users of the official method.
@Giggitybyte commented on GitHub (Feb 12, 2026):
@baptisterajaut does your stack have functional screensharing?
@baptisterajaut commented on GitHub (Feb 12, 2026):
Nope. New client doesnt support it : https://github.com/baptisterajaut/stoatchat-platform/blob/main/docs/known-limitations.md#no-videoscreen-sharing
@LordGuenni commented on GitHub (Feb 12, 2026):
This is basically a 2 line modification as livekit already Supports this, i did. this on my Client Fork... Camera and Screensharing do work as of now.
@remusjohn1 commented on GitHub (Feb 12, 2026):
I know this is really not the place for this question, but I'm hopelessly lost.
Does anyone know how to increase the file upload size limit. I've tried adding lines to the Revolt.toml and compose.yml and Caddyfile but nothing changes.
@b0BcAtT4T commented on GitHub (Feb 12, 2026):
Can we get a complete docker compose with voice and video? Seems like everything is done but nobody has just put it together in a clean package yet. Also why does the compose from @baptisterajaut also contain caddy? I have nginx already running and maybe a clean Stoat image would be good.
I would literally pay money for this.
@baptisterajaut commented on GitHub (Feb 12, 2026):
Well, caddy is optional and is just used as a front to listen to http/s. You can remove it from compose.yml and modify your nginx to ressemble the caddyfile
@Dadadah commented on GitHub (Feb 12, 2026):
The main reason for this not having been pushed to this repo yet is a lack of an officially provided docker container for the web interface from Stoat. There is a PR out for it by @Flash1232 however they have not finished it quite yet.
@b0BcAtT4T commented on GitHub (Feb 12, 2026):
Damn, I wish stoat did it like Immich and have constant releases and even advertise for donations because myself any many others, I’m sure, would be happy to pay for the cause, given structured updates.
@Dadadah commented on GitHub (Feb 12, 2026):
All of their other repositories have constant docker releases, they just haven't set it up for the web repo yet as it's basically brand new. If you are not able to build it yourself, you can probably expect it to be done soonish (Stoat doesn't give ETA's I've heard)
@LordGuenni commented on GitHub (Feb 13, 2026):
Have a Look at my Fork https://github.com/LordGuenni/for-web/tree/main
You have To rebuild the Client with
Dockerfile
ENV VITE_CFG_MAX_FILE_SIZE=VITE_CFG_MAX_FILE_SIZE
Entrypoint.sh
-e "s|VITE_CFG_MAX_FILE_SIZE|${VITE_CFG_MAX_FILE_SIZE}|g" \
As the Upload Site is currently hardcoded in the frontend and does Not Respect the values of the Backend...
@baptisterajaut commented on GitHub (Feb 13, 2026):
I know support disabling caddy with my system https://github.com/baptisterajaut/helmfile2compose/blob/main/docs/advanced.md
@Eddudos commented on GitHub (Feb 13, 2026):
I tried the setup of @baptisterajaut and it worked great, thank you!
The only feature I lack is that little screenshare button. As @LordGuenni have said that is already implemented in a livekit, but I'm not sure where is that "2 line change", could you please help me figure it out or maybe you already have your setup to try/compare?
@Dadadah commented on GitHub (Feb 13, 2026):
The diff you'd need to enable video can be found here: https://github.com/stoatchat/for-web/compare/main...Dadadah:stoat-for-web:patch/enablevideo
@baptisterajaut commented on GitHub (Feb 13, 2026):
Yoink, thank you, i published it. Everyone using my system will now have this this patch (everyone should git pull and helmfile sync or a docker-compose up, and it should pull automatically the new image (rolling tag))
@jameshiller commented on GitHub (Feb 13, 2026):
Does this change also apply to baptisterajaut/stoatchat-web:dev
@baptisterajaut commented on GitHub (Feb 13, 2026):
Yes, thats what i mean with "I published it"
Here's the conf i used : https://github.com/baptisterajaut/stoatchat-platform/blob/main/docker/client/build.conf
@jameshiller commented on GitHub (Feb 13, 2026):
Thanks for clarifying and for your effort!
@javif89 commented on GitHub (Feb 14, 2026):
Hey y'all. I managed to get stoat working today thanks to this thread, but it took a lot of digging and debugging. I tried to put my findings down here
https://github.com/javif89/stoat-selfhost
Thanks to @baptisterajaut and @LordGuenni for the work they did.
If there's something incorrect in the guide or things change, feel free to make a PR or just link a new guide. I'm sure a lot of people are looking for answers right now.
@Sapd commented on GitHub (Feb 14, 2026):
@javif89 Thanks. With the help of your guide I also managed to get it working. I just reused the existing Livekit instance on my kubernetes cluster from matrix. Video call, screen sharing etc. everything works.
The only piece for me missing is a IdP integration with SSO or similar.
@baptisterajaut commented on GitHub (Feb 14, 2026):
If you have kubernetes, i'm maintaining this : https://github.com/baptisterajaut/stoatchat-platform ; maybe we can figure a way to plug a Keycloak somewhere?
EDIT : some preliminary research . This will not be upstream
@Sapd commented on GitHub (Feb 14, 2026):
Thats a bummer. More and more self hosted software supports oidc. It also lowers the barrier. Because my friends and family already have accounts at my IdP so they would just need to open up the site and it would work.
If its not supported long term that is a dealbreaker.
@Shadowalker125 commented on GitHub (Feb 14, 2026):
I tried all of yesterday to get something working, and while the docker compose would start just fine using the main readme, no matter what I did I could not get cloudflare zero trust tunnel to work with caddy. It would only either return a redirect loop or fail with a 502. Granted, I was doing this on an unraid VM and there are probably some other things breaking that I just dont know how to troubleshoot.
@IngwiePhoenix commented on GitHub (Feb 14, 2026):
Hello!
I have a good amount of experience in containerization (Docker, Podman, Kubernetes) and I was looking at the various repositories to get myself an overview of what is the current state. If you dont mind, I'd like to ask a few questions:
revolt.chat? For instance here: https://github.com/stoatchat/service-admin-panel/blob/main/.env.local.example#L34service-admin-panelis rather self-explaining, it should not be exposed if possible, since that one is used to manage things. Aside from making sure it can read Mongo, Redis, Ntfy, is the Zammad integration required, and do I need to run Authentik or is any OIDC provider (VoidAuth, Keycloak, ...) plausible? Since the/.well-knownfor OIDC issuer is not specified in full, this might also just be OAuth2. A little clarification would help. :)TARGETARCHis specified and pivot to a default.ghcr.io/revoltchat/.... Are those even still up-to-date? Because the Dockerfile, that I linked above, actually builds a unified container of all the services instead - not a container for each application as those containers would make you believe.I'd be happy to help with the work in this regard. Right now, I am testing/trying Root, but feedback from my friends has so far been rather meh, so I want to try my luck with Stoat, and do good with my skills while I am at it in hopes it helps someone else in the process. :)
For now, I saw that you haven't dockerized the web frontend yet; I'll read that one next and see if there is anything I can do, if this is even still needed, considering how fast things move and ship.
Kind regards,
Ingwie
@baptisterajaut commented on GitHub (Feb 14, 2026):
For further référence, i and several people maintain alternative repos that are more up to date than this very repo, and we also provide web client images (with some features that are not upstream yet). There are some discussions about them in this thread, if you don't want to dive into the code.
@IngwiePhoenix commented on GitHub (Feb 14, 2026):
I have seen the forks and custom repos already - but I would really prefer to use upstream images and builds, for the sole simplicity of tracking the "official builds". Swapping between forks of projects and such is not a whole lot of fun, especially since I plan to deploy this on Kubernetes in the long-term and use Rennovate. For a small Docker Compose setup, to test stuff, this is perfectly fine and serviceable of course :)
Really hoping the developers provide a path forward.
As for OIDC; I wouldn't be surprised if this is simply used as the authN/authZ layer - Authentik is a proven solution after all. So thats fine, I would just love to know if it's safe to plug any other provider in to this, or not. :)
@jameshiller commented on GitHub (Feb 14, 2026):
Does the gif menu work for others? I have everything mostly working fine except that. It calls out to api.gifbox.me and gets the response "InvalidSession" which has me thinking the issue isn't with my configs.
@kasivulpis commented on GitHub (Feb 14, 2026):
I just wanted to say my piece since I was having issues getting self hosted + screen sharing up today. Funnily enough @javif89's guide actually actually slowed me down because I ended up putting the wrong pieces together while following the guide. When I decided to use @baptisterajaut's docker compose solution since it was the 'step between' the current repo and @javif89's it basically worked first try for me after i configured everything correctly. I'm sure this is just user error on my part, but I suggest people who are less familiar with the full tech stack/trying to just stand up a personal instance in the first place to try @baptisterajaut's solution first.
P.S. In case you're like me and want to be invite only, invite-only mode still works but there's no UI for it. IDK how the original revolt app 'knew' if there should be a invite field or not, so for my instance i just hard coded the field in. I'm sure someone who understands the frontend better will make a proper PR later.
@baptisterajaut commented on GitHub (Feb 15, 2026):
https://github.com/baptisterajaut/stoatchat-platform/blob/main/docs/known-limitations.md#gif-picker-cannot-be-disabled
However, someone fixed that https://jlai.lu/comment/19467558
Good news mate https://github.com/baptisterajaut/stoatchat-platform/issues/5
@acidtib commented on GitHub (Feb 15, 2026):
Hi all, id your looking for tenor replacement feel free to grab from here
https://github.com/hoy-chat/stoatchat/pull/1
https://github.com/hoy-chat/for-web/pull/1
@b0BcAtT4T commented on GitHub (Feb 16, 2026):
@baptisterajaut Really appreciate your hard work on this, have you considered doing a docker-compose only setup without the Kubernetes stuff? I’d be interested to learn if this would/nt be possible, cheers :)
@baptisterajaut commented on GitHub (Feb 16, 2026):
Theres already this : https://github.com/baptisterajaut/stoatchat-platform/blob/main/docs/compose-deployment.md
But if you mean "Maitain a separate compose.yml by hand" : My brother in christ, i reinvented Kubernetes to be able to NOT do that. Enjoy my supercharged autism bringing you the power of k8s into a compose.yml file.
@HexVertex commented on GitHub (Feb 16, 2026):
I believe the point is to not need K8s related binaries/packages etc. installed when it won't be used for running. The reason I started using docker was to have easily reproducible environments without the bloat and conflicts that come from installing everything locally, let alone the cleanup after removing that stuff. K8s isn't always as easy to work with in my experience, especially if there aren't ready made helm files available.
Whether that is the right approach and how one would maintain a Helm-to-Docker pipeline is a different discussion though.
@baptisterajaut commented on GitHub (Feb 16, 2026):
Working with k8s is my part in my repo. I'm an SRE, making it work magically is my job. Generate-compose make you a compose.yml and a caddyfile. It works in one command, similarly to helmfile. You don't have to manage any k8s object, I am the cursed one to do that. You don't have to ask questions (you can but you don't have to)
If you find this bloated thats completly fine, but I still prefer this over managing a separate docker compose.
No, I don't make the slightest amount of sense but boy am I having the most fun 😁
@Dadadah commented on GitHub (Feb 16, 2026):
I have an updated compose fork that works at dadadah/stoat-self-hosted. I have not opened a PR yet due to the web app not being dockerized yet. My fork, for now, builds the web app when you run
docker compose up -dNote: I have not tested whether it works for existing environments, only new environments. Use at your own risk.