├── .github └── workflows │ └── publish.yml ├── Dockerfile ├── README.md ├── docker-entrypoint.sh └── get-latest-files.sh /.github/workflows/publish.yml: -------------------------------------------------------------------------------- 1 | name: Publish docker image anisette_server 2 | 3 | on: 4 | push: 5 | branches: 6 | - 'main' 7 | paths: 8 | - '**.sh' 9 | - 'Dockerfile' 10 | 11 | jobs: 12 | docker: 13 | runs-on: ubuntu-latest 14 | steps: 15 | - name: Set up QEMU 16 | uses: docker/setup-qemu-action@v2 17 | - name: Set up Docker Buildx 18 | uses: docker/setup-buildx-action@v2 19 | - name: Login to GitHub Container Registry 20 | uses: docker/login-action@v2 21 | with: 22 | registry: ghcr.io 23 | username: ${{ github.actor }} 24 | password: ${{ secrets.GITHUB_TOKEN }} 25 | - name: Build and push 26 | uses: docker/build-push-action@v3 27 | with: 28 | push: true 29 | tags: | 30 | ghcr.io/sidestore/altcon:latest 31 | platforms: linux/386,linux/amd64,linux/arm/v7,linux/arm64/v8 32 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM debian:bookworm-slim 2 | 3 | ENV ALTSERVER_ANISETTE_SERVER="https://ani.sidestore.io/" 4 | 5 | RUN apt-get update && apt-get install -y --no-install-recommends unzip ca-certificates usbmuxd libimobiledevice6 libimobiledevice-utils libavahi-compat-libdnssd-dev curl && \ 6 | apt-get clean && \ 7 | rm -rf /var/lib/apt/lists/ && \ 8 | mkdir app 9 | 10 | WORKDIR /app/ 11 | 12 | COPY get-latest-files.sh . 13 | 14 | SHELL ["/bin/bash", "-o", "pipefail", "-c"] 15 | RUN ./get-latest-files.sh && \ 16 | rm get-latest-files.sh 17 | 18 | COPY docker-entrypoint.sh . 19 | 20 | ENTRYPOINT ["./docker-entrypoint.sh"] 21 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Altcon 2 | 3 | Altcon is a container image that is meant to install any IPA of your choosing using AltServer-linux. 4 | The benefitis of this container is that you only need an Apple account to install Sidestore for example. 5 | Because all of this is in a container, you also don't leave anything on the host and it's easier to use. The UDID and pairingfile is fetched for you and the Sidestore IPA is already present too. After pairing you'll get an example command how to install the SideStore ipa. 6 | 7 | You'll find your pairing file in the current directory when you leave the Altcon container. Email it to yourself and save it into files to import it using SideStore. 8 | 9 | ## How it works 10 | 11 | The container will try to pair with your iDevice, just plug it in and enter your pin. After the pairing is successful, you'll be brought into the terminal within the container. Then you'll only need to run the command and adjust the apple account to the one of your choosing. 12 | I do advice to [create a secondairy account](https://wiki.sidestore.io/guides/burner-apple-id/#create-an-apple-id-account-using-itunes--no-mfa). 13 | After you're done, you can type exit and the container will be removed. 14 | You will see your pairingfile in your home directory (ends with .mobiledevicepairing). Copy this to your iDevice using mail/whatever so you can import it into SideStore. 15 | 16 | ### How to run Altcon 17 | 18 | The following will install usbmuxd and docker. Run these as a none-root user and you only have to this once. After this you only need to use the docker run command. 19 | 20 | ```bash 21 | sudo apt install -y usbmuxd 22 | curl -fsSL https://test.docker.com -o test-docker.sh 23 | sudo sh test-docker.sh 24 | sudo usermod -aG docker $USER 25 | docker run --rm -it -v ${PWD}/:/mnt/ -v /var/run/usbmuxd:/var/run/usbmuxd ghcr.io/sidestore/altcon 26 | ``` 27 | 28 | ## Credit 29 | 30 | - [Dadoum's Anisette](https://github.com/Dadoum/Provision) for providing a stable anisette. 31 | - [NyaMisty's AltServer-linux](https://github.com/NyaMisty/AltServer-Linux) for making Altserver work on Linux. 32 | - [Powenn's AltServer-Linux-shellScript](https://github.com/powenn/AltServer-Linux-ShellScript) for helping me understand how to work with AltServer-Linux. 33 | - [Hkfuertes's altserverd](https://github.com/hkfuertes/altserverd) for inspring me to make something more userfriendly, simpler and how to get the pairing to work within a container. 34 | - [Dadoum's Jitterbug-cross](https://github.com/Dadoum/Jitterbug-cross/releases) for making jitterbug available on arm devices. 35 | - All of the SideStore community members <3 36 | -------------------------------------------------------------------------------- /docker-entrypoint.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | printf "\nPlug in your idevice and enter your passcode.\n" 4 | printf "=============================================\n" 5 | while ! idevicepair pair; do 6 | sleep 1s 7 | done 8 | 9 | # Get SideStore ipa 10 | printf "\nDownloading SideStore.ipa stable.\n" 11 | printf "=================================\n" 12 | curl --progress-bar -L -o SideStore.ipa $(curl -s https://api.github.com/repos/SideStore/SideStore/releases/latest | grep "browser_download_url.*SideStore.ipa*" | cut -d : -f 2,3 | tr -d \") 13 | 14 | # Get SideStore-Nightly ipa 15 | printf "\nDownloading SideStore.ipa nightly.\n" 16 | printf "=================================\n" 17 | curl --progress-bar -L -o SideStore-Nightly.ipa https://github.com/SideStore/SideStore/releases/download/nightly/SideStore.ipa 18 | 19 | # Get udid 20 | udid=$(idevice_id | awk '{print $1}') 21 | 22 | # Generate mobiledevicepairing file 23 | printf "\nGenerating mobiledevicepairing file for SideStore\n" 24 | printf "===============================================================\n" 25 | ./jitterbugpair -c > /mnt/${udid}.mobiledevicepairing && echo "Check your home folder on your host/after your exit, and copy the ${udid}.mobiledevicepairing file to your iDevice." 26 | 27 | echo -e "\nTo install an IPA, run the following command and change \033[0;31mmyemail\033[0m and \033[0;31mmyapplepass\033[0m. The \033[0;32mUDID\033[0m is already correct:" 28 | printf "=============================================================================================================\n" 29 | echo -e "./AltServer -u \033[0;32m${udid}\033[0m -a \033[0;31mmyemail@mail.com\033[0m -p \033[0;31mmyapplepass\033[0m SideStore.ipa\n" 30 | echo -e "\nDo note that if your password contains special characters like '@','$' '!'or a space." 31 | echo "It may not work and you need to put backslashes before it" 32 | echo "For example, if your password is 'azerty79!?', you need to write 'azerty79\!\?'" 33 | printf "=============================================================================================\n" 34 | echo -e "\nOnce you're finished, type: \033[0;35mexit\033[0m." 35 | printf "=================================\n\n" 36 | 37 | /bin/bash 38 | -------------------------------------------------------------------------------- /get-latest-files.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # Check if we're running 32-bit arm, x86 or else aarch64/x86_64 4 | if [[ "$(uname -m)" = 'arm'* ]]; then 5 | curl -L -o AltServer $(curl -s https://api.github.com/repos/NyaMisty/AltServer-Linux/releases/latest | grep "browser_download_url.*armv*" | cut -d : -f 2,3 | tr -d \") 6 | curl -L -o jitterbugpair.zip $(curl -s https://api.github.com/repos/Dadoum/Jitterbug-cross/releases/latest | grep "browser_download_url.*armv*" | cut -d : -f 2,3 | tr -d \") 7 | unzip jitterbugpair.zip 8 | elif [[ "$(uname -m)" = 'i'* ]]; then 9 | curl -L -o AltServer $(curl -s https://api.github.com/repos/NyaMisty/AltServer-Linux/releases/latest | grep "browser_download_url.*86" | grep -E '86\>' | cut -d : -f 2,3 | tr -d \") 10 | curl -L -o jitterbugpair.zip $(curl -s https://api.github.com/repos/Dadoum/Jitterbug-cross/releases/latest | grep "browser_download_url.*86" | grep -E '86\>' | cut -d : -f 2,3 | tr -d \") 11 | unzip jitterbugpair.zip 12 | else 13 | curl -L -o AltServer $(curl -s https://api.github.com/repos/NyaMisty/AltServer-Linux/releases/latest | grep "browser_download_url.*$(uname -m)*" | cut -d : -f 2,3 | tr -d \") 14 | curl -L -o jitterbugpair.zip $(curl -s https://api.github.com/repos/Dadoum/Jitterbug-cross/releases/latest | grep "browser_download_url.*$(uname -m)*" | cut -d : -f 2,3 | tr -d \") 15 | unzip jitterbugpair.zip 16 | fi 17 | 18 | rm jitterbugpair.zip 19 | chmod +x AltServer jitterbugpair --------------------------------------------------------------------------------