-This is a lot like the docker-osx solution discussed in 4 Bluebubbles and Beeper, except it’s proxmox focused.
Github repo with official instructions is here: https://github.com/luchina-gabriel/OSX-PROXMOX
First you run the installer. Be aware this will require a restart after it runs:
/bin/bash -c "$(curl -fsSL https://install.osx-proxmox.com)"That should ask some questions, all of which should have pretty obvious answers. I chose macos ventura, and put it on my optiplex zfs pool, and gave it an arbitrary vm id.
It will spin up a vm after it reboots, and that vm will be running the macos installer
First you need to open up the disk utility and wipe the virtio block disk. You should choose apfs for the filesystem type with the guid partition table.
Then you hit reinstall macos, accept terms, select the partition you just created, etc.
Once you begin installation, it may restart, many times. Just keep choosing macos-installer from the boot list. Eventually you boot into the real macos setup page. It might do like 8 or 9 restarts though. I didn’t count but it did a lot.
Once I got into macos, first thing I did was enable the ssh server. apple logo in top left → system settings → general → sharing → enable remote login → click the i next to remote login → allow full disk access for all users and allow access for all users
you will see none of your old imessages in the vm. You’ll be able to see the new ones, but none of the old ones.
This is, infact, a travesty. Completely unacceptable.
My solution to this is to copy over the messages from my old mac.
Here is the guide I followed to do that: https://www.reddit.com/r/mac/comments/3kq6dr/whats_the_best_way_to_transfer_imessages_to_a_new/
So, first we have to make sure messages is closed, which requires closing bluebubbles too.
Ip of new mac is 192.168.2.164
We also must rename the old messages folder, to something new. In order to do this, ssh in, and use sudo to mv /Users/thomasmcelroy/Library/Messages /Users/thomasmcelroy/Library/Messages2
So now I can
scp -r /Users/thomasmcelroy/Library/Messages [email protected]:/Users/thomasmcelroy/Library/MessagesThen I must restart the new computer, once that copy operation finishes. I now see all my messages, and can send messages and they work. You should test this before continuing.
Next up we need to install bluebubbles. I could just grab the dmg from their github releases, but I am going to do homebrew so I can have updates via brew ( currently the developer’s apple developer account is unable to push updates, so auto update is broken )
In order to do this, I went to brew.sh, where homebrew is distributed, but it didn’t load right.
Installing and using chrome fixed that.
Brew can be installed via this command:
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"Once the brew installation finishes, you can install bluebubbles server with this command:
brew install --cask bluebubblesNow bluebubbles will be in your applications menu. Open it up.
It will tell you that it can’t be verified, so you should hit cancel then go fix that via settings → privacy and security → “bluebubbles was blocked … open anyway” → enter password → open
It’s gonna ask you for full disk access. Settings → privacy and security → full disk access → enable bluebubbles
You’re also going to want to go to settings → privacy and security → accessiblity and enable bluebubbles.
Now it wants me to setup firebase. Issue is that I have already setup firebase multiple times previously. I am just going to rename the old projects, so that I can start a new one. I also could totally skip setting up firebase if I wanted, because firebase handles notifications and I am using the beeper bridge, but It is still worthwhile just in case beeper stops working for whatever reason.
go to https://console.firebase.google.com/ and rename or delete any projects you have already titled bluebubbles Renaming can be done by clicking the project, and hitting the settings cog next to “project overview” in the top left, then hitting project settings.
then you should be able to continue with google in the bluebubbles app.
If you get an error saying status code 429 or failed to provision or anything like that, just hit the continue with google button again and try again. Took me 3 tries.
On next page, youll need to set server password and proxy. I chose cloudflare for proxy. Remember to hit the save button on your password, or else you cant continue with the thing. Odd that it requires individual saving though, and that it isnt saved just by you hitting the next button
Now it is time for the private api setup
We need to edit config.plist to disable SIP, and for that we need a plist editor. I have absolutely no wish to deal with installing dependencies, and ProperTree, the plist editor im aware of, is not on brew, so im going to install it from the aur on my laptop https://aur.archlinux.org/packages/propertree-git.
yay -S propertree-gitThen we need to send the config.plist file to ourself.
open finder → EFI-PX-HACK → EFI → OC
Copy config.plist
send to yourself however you want ( i emailed it cause i was already signed into that )
then run ProperTree on it
ProperTree config.plistthen you need to hit ctrl+f
type in csr
hit enter
You should find the key csr-active-config
Set csr-active-config’s data value to 67000000
send it back to yourself, and replace the old config.plist file with it’s new edited form.
now reboot, and hit 4 to reset nvram
I also then went to recovery ( 3 i believe ) and ran
csrutil disablein the recovery terminal
i know they advise against this for virtualized macs, but i did it anyway and have had no issues yet.
then reboot again.
Next I setup startup disk and autologin
settings → users and groups → automatically login as → your user
and I edited config.plist once more . open it up in propertree hit ctrl+f and find ShowPicker. Set that to false.
send it to yourself again and have it replace current config.plist
this will make you not have to hit enter in order to boot the thing.
All we have left now is installing the beeper bridge!
For that, I will be using https://github.com/ngencokamin/sh-imessage-setup
first, we need to install tmux
brew install tmux then we need to
git clone https://github.com/ngencokamin/sh-imessage-setup
cd sh-imessage-setup
chmod +x setup.sh
./setup.shsay Y to reinstall bbctl and Y to just about everything else other than entering passwords.
then run zsh to get a new shell and run bbctl login to do the beeper login process
run start-bb-server then tmux a
give it a little bit to get setup. While you wait, send a message to yourself and see if it comes in on your phone.
Your chats WILL most likely separate from eachother, which sucks, but you will still get backfill so it won’t matter too much. You will just get duplicate old messages which kinda sucks
The duplicate thing you can avoid if you run
bbctl delete sh-imessage
then re run
./setup.shthough this does mean you lose any messages that don’t get backfilled for whatever reason
This script also does handling of automatic startup on boot via cron jobs. I have never experienced it work, because it looks at .bashrc, which is not relevant on macos, and because it tries to use an alias sourced from bashrc, which I do not think is how shell scripts work
It does the adding to the contab right, but not the actual script
so first you need to run ssh-keygen and ssh-copy-id localhost
then open ~/check_and_run.sh
replace current contents with this
#!/bin/bash
if ! pgrep -f "bbctl" > /dev/null
then
rm ~/bbctllog.txt
rm ~/balls.txt
sleep 100
touch ~/balls.txt
ssh -tt localhost "/usr/local/bin/bbctl run --param 'bluebubbles_url=[http://localhost:1234](http://localhost:1234)' --param 'bluebubbles_password=yourbbpassword' --param 'imessage_platform=bluebubbles' sh-imessage >> ~/bbctllog.txt"
fiedit yourbbpassword to be your bluebubbles server password
Reboot to make sure that works. It will take 100 seconds for it to start up, because of sleep 100. I do this so that bluebubbles can start before it, because if it starts before bluebubbles the script will fail to connect and then exit. I could do this better with like checking whether or not curl localhost:1234 returns anything in a while loop etc etc but I did not bother.
balls.txt’s existance is a flag for whether or not the script has been started. it is not necessary if things are working properly.
bbcttllog is the log of output from the script, you can cat bbctllog.txt at any time to see what it’s up to
can’t use tmux doing like this because getting cronjob to start a tmux session was a nuisance