Documentation Index
Fetch the complete documentation index at: https://docs.bunny.net/llms.txt
Use this file to discover all available pages before exploring further.
This guide walks you through building and deploying a simple Go API to Magic Containers using GitHub Container Registry. You’ll need:
- A GitHub account for source code and container registry
Don’t have a bunny.net account yet? Sign up and enable Magic Containers to get started.
Create the Go API
Create a new directory with the following files:
package main
import (
"encoding/json"
"log"
"net/http"
"os"
)
type Response struct {
Message string `json:"message"`
}
func main() {
port := os.Getenv("PORT")
if port == "" {
port = "80"
}
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/json")
json.NewEncoder(w).Encode(Response{Message: "Hello from Bunny 🐰"})
})
log.Printf("Server starting on port %s", port)
log.Fatal(http.ListenAndServe(":"+port, nil))
}
Run locally
Start the development server:
Test the API:
curl http://localhost:80/
Create the Dockerfile
FROM golang:1.23-alpine AS builder
WORKDIR /app
COPY go.mod ./
COPY main.go ./
RUN go build -o server .
FROM alpine:latest
WORKDIR /app
COPY --from=builder /app/server .
ENV PORT=80
EXPOSE 80
CMD ["./server"]
Build and push to GitHub Container Registry
GitHub Actions
Docker CLI
Create .github/workflows/build.yml to automatically build and push on every commit to main:.github/workflows/build.yml
name: Build and Push
on:
push:
branches: [main]
env:
REGISTRY: ghcr.io
IMAGE_NAME: ${{ github.repository }}
jobs:
build-and-push:
runs-on: ubuntu-latest
permissions:
contents: read
packages: write
steps:
- uses: actions/checkout@v4
- name: Log in to GitHub Container Registry
uses: docker/login-action@v3
with:
registry: ${{ env.REGISTRY }}
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Build and push
uses: docker/build-push-action@v5
with:
context: .
push: true
tags: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ github.sha }}
- name: Update container image on Magic Containers
uses: BunnyWay/actions/container-update-image@main
with:
app_id: ${{ vars.APP_ID }}
api_key: ${{ secrets.BUNNYNET_API_KEY }}
container: app
image_tag: "${{ github.sha }}"
Push your code to trigger the workflow:git init
git add .
git commit -m "Initial commit"
git remote add origin https://github.com/YOUR_USERNAME/app-go-api.git
git push -u origin main
Build and push manually from your local machine.Create a Personal Access Token
Log in to GitHub Container Registry
export CR_PAT=your_personal_access_token
echo $CR_PAT | docker login ghcr.io -u YOUR_USERNAME --password-stdin
Build the image
docker build --platform linux/amd64 -t ghcr.io/YOUR_USERNAME/{imageName}:latest .
Magic Containers only supports images built for the linux/amd64 architecture. The --platform flag ensures compatibility regardless of your local machine’s architecture.
Push to registry
docker push ghcr.io/YOUR_USERNAME/{imageName}:latest
Deploy to Magic Containers
Create a new app
In the bunny.net dashboard, go to Magic Containers and click Add
App. Enter a name and select your deployment option.
Add a container
Click Add Container, then configure:| Field | Value |
|---|
| Registry | GitHub Container Registry |
| Image | YOUR_USERNAME/{imageName} |
| Tag | latest for Docker CLI, or the commit SHA from your GitHub Actions workflow |
Add an endpoint
Go to the Endpoints tab, click Add New Endpoint, and set the
container port to 80.
Deploy
Click Add Container, then Next Step, and Confirm and Create.
For more details, see the quickstart guide.
Test your API
curl https://mc-xxx.bunny.run/
{ "message": "Hello from Bunny 🐰" }
Connect a database
You can connect your app to Bunny Database directly from the dashboard:
- Go to Database > [Your Database] > Access
- Click Generate Tokens
- Click Add Secrets to Magic Container App
- Select your app
The BUNNY_DATABASE_URL and BUNNY_DATABASE_AUTH_TOKEN environment variables are now available in your app:
import (
"database/sql"
"fmt"
"os"
_ "github.com/tursodatabase/libsql-client-go/libsql"
)
url := fmt.Sprintf("%s?authToken=%s",
os.Getenv("BUNNY_DATABASE_URL"),
os.Getenv("BUNNY_DATABASE_AUTH_TOKEN"),
)
db, err := sql.Open("libsql", url)
if err != nil {
fmt.Fprintf(os.Stderr, "failed to open db %s: %s", url, err)
os.Exit(1)
}
defer db.Close()
See the Go SDK documentation for more details.
Next steps
- Automate deploys with GitHub Actions
- Add a custom hostname
- Add a persistent volume