Getting Started with Sailr
Welcome to Sailr! This tutorial will guide you through installing Sailr, initializing your first project, and deploying a sample application to a local Kubernetes cluster.
Prerequisites
Before you start, please ensure you have completed the steps in our Installation Guide. This will ensure you have:
- Sailr CLI installed and configured.
- Docker installed and running.
- OpenTofu (or Terraform) installed.
- A local Kubernetes cluster available. For this tutorial, we'll use Minikube.
Start your Minikube cluster: If you haven't already, open your terminal and start Minikube:
minikube start
Ensure Minikube is running and your kubectl context is pointing to it.
Step 1: Initialize Your First Sailr Project
Sailr projects are organized into environments. Let's create a new Sailr project structure and then initialize an environment within it called my-first-app.
-
Create a project directory: This will be the root of your Sailr-managed configurations.
mkdir sailr-project
cd sailr-project -
Initialize the environment: Run the
initcommand from within your project root:sailr init my-first-appThis command creates the necessary directory structure, including
k8s/environments/my-first-app/config.toml. This file is where you'll define your services and environment settings. It also creates ak8s/templatesdirectory where service manifest templates are stored.Your project structure will look something like this:
sailr-project/
└── k8s/
├── environments/
│ └── my-first-app/
│ └── config.toml
└── templates/
└── ... (default templates might be copied here)
Step 2: Understanding config.toml
Open the generated k8s/environments/my-first-app/config.toml file. You'll see something like this (the exact default may vary):
schema_version = "0.2.0" # Or current Sailr schema version
name = "my-first-app" # Name of your environment
log_level = "INFO"
domain = "example.com" # Replace with your domain or keep for local dev
default_replicas = 1
registry = "docker.io" # Default container registry
# Example of a service definition (might be commented out by default)
# [[service_whitelist]]
# name = "my-service" # Name of the service
# version = "0.1.0" # Image version/tag
# path = "my-service" # Path to service templates (relative to k8s/templates/)
# # Defaults to service name if omitted
# namespace = "my-first-app" # K8s namespace for deployment
# build = "./services/my-service" # Path to service build context (from project root)
# Example of environment variables
# [[environment_variables]]
# name = "MY_ENV_VAR"
# value = "some_value"
For now, we're interested in the global settings and the [[service_whitelist]] section, which is where we define our applications (services).
Step 3: Choosing a Sample Application
For this tutorial, we'll deploy a simple, publicly available Nginx "hello world" Docker image: nginxdemos/hello. This saves us from needing to write and build our own application for this initial walkthrough.
If you wanted to use your own application, you would typically have its Dockerfile and source code in a subdirectory (e.g., services/my-web-app/ relative to the project root), and you would specify the build key in its service definition.
Step 4: Create Basic Templates for Nginx
Sailr uses templates to generate Kubernetes manifests. Even for a pre-built image, we need to tell Sailr how to deploy it (e.g., as a Deployment) and expose it (e.g., as a Service).
-
Create template directories: From your project root (
sailr-project), create the following directory structure:mkdir -p k8s/templates/hello-nginx -
Create
k8s/templates/hello-nginx/deployment.yaml:apiVersion: apps/v1
kind: Deployment
metadata:
name: {{service_name}}
namespace: {{service_namespace}}
labels:
app: {{service_name}}
spec:
replicas: {{default_replicas}}
selector:
matchLabels:
app: {{service_name}}
template:
metadata:
labels:
app: {{service_name}}
spec:
containers:
- name: {{service_name}}
image: {{registry}}/nginxdemos/hello:{{service_version}} # Using the public image
ports:
- containerPort: 80 -
Create
k8s/templates/hello-nginx/service.yaml:apiVersion: v1
kind: Service
metadata:
name: {{service_name}}
namespace: {{service_namespace}}
spec:
selector:
app: {{service_name}}
ports:
- protocol: TCP
port: 80
targetPort: 80
type: NodePort # Using NodePort for easy access via MinikubeThese are minimal Kubernetes manifests. Sailr will replace variables like
{{service_name}},{{service_namespace}},{{service_version}}, etc., with values from yourconfig.toml.
Step 5: Configure Your Service in config.toml
Now, modify your k8s/environments/my-first-app/config.toml to define the hello-nginx service.
schema_version = "0.2.0"
name = "my-first-app"
log_level = "INFO"
domain = "local.host" # Using local.host for Minikube/local access
default_replicas = 1
registry = "docker.io" # nginxdemos/hello is on Docker Hub
[[service_whitelist]]
name = "hello-nginx"
version = "latest" # You can pin to a specific version like "plain-text"
namespace = "my-first-app" # Deploy into a dedicated namespace
# 'path' will default to "hello-nginx", matching our template directory.
# 'build' is not needed as we are using a pre-built public image.
Key points:
- We set
domaintolocal.host, which is often useful for local development. - We defined a service named
hello-nginx. version = "latest": We're using the latest version ofnginxdemos/hello. (Note:nginxdemos/hellohas tags likelatest,plain-text.latestis fine for a demo.)namespace = "my-first-app": We'll deploy this service into a Kubernetes namespace named after our environment.- The
pathkey for the service is omitted, so Sailr will look for templates ink8s/templates/hello-nginx/, which we just created. - The
buildkey is omitted because we are using a pre-built public image.
Step 6: Deploy to Minikube
Now, let's deploy our hello-nginx service to your Minikube cluster. Make sure you are in the root of your sailr-project directory.
sailr go my-first-app --context minikube
The sailr go command is a shortcut that:
- Builds images (skipped for
hello-nginxas nobuildpath is defined). - Generates Kubernetes manifests from your templates and
config.toml. - Deploys these manifests to the specified Kubernetes context.
You should see output from Sailr indicating that it's processing templates and applying resources to the my-first-app namespace.
Step 7: Verify the Deployment
Once Sailr finishes, let's check if our application is running.
-
Check the Kubernetes Namespace: Sailr should create the namespace if it doesn't exist.
kubectl get namespace my-first-appYou should see the
my-first-appnamespace listed. -
Check the pods:
kubectl get pods -n my-first-appYou should see a pod for
hello-nginx(e.g.,hello-nginx-xxxxxxxxx-xxxxx) with a status ofRunning. It might take a minute or two for the image to be pulled from Docker Hub and the pod to start. If it's stuck inImagePullBackOfforErrImagePull, ensure the image namenginxdemos/hello:latestis correct and your Minikube has internet access. -
Check the service:
kubectl get svc -n my-first-appYou should see a service named
hello-nginx. Note its type isNodePortas defined in ourservice.yaml. -
Access the application: Since we used
NodePort, Minikube provides an easy way to access it:minikube service hello-nginx -n my-first-appThis command should open the Nginx "Hello World" page in your web browser. If it doesn't open automatically, it will print the URL you can use (e.g.,
http://<minikube_ip>:<node_port>).
Step 8: Clean Up (Optional)
To remove the deployed application and its namespace:
kubectl delete namespace my-first-app
This will delete all resources (Deployment, Service, Pods) created within that namespace.
If you had used sailr infra up for more complex environments (not covered in this basic tutorial), you might use sailr infra down my-first-app to tear down any specific infrastructure Sailr provisioned.
Congratulations!
You've successfully initialized a Sailr project, created basic templates, configured a service using a public image, and deployed it to your local Kubernetes cluster using Minikube.
Next Steps:
- Try modifying the
deployment.yaml(e.g., changedefault_replicasinconfig.tomlor directly in the manifest) and re-runsailr go my-first-app --context minikubeto see changes applied. - Explore how to configure builds for your own applications by adding a
buildpath inconfig.tomland creating a Dockerfile for your service. - Learn more about advanced templating features in Sailr (once documented).
- Dive deeper into the Comprehensive
config.tomlGuide (Link to be created). - Check out the Full CLI Command Reference.
This content is for the Docusaurus page docs/docs/getting-started/tutorial.md.Okay, I have drafted the "Getting Started" tutorial. I've incorporated the likely behavior of sailr init creating an environments subdirectory and the necessity of creating basic templates even for pre-built images. I've also adjusted the commands and explanations accordingly.
Here's the summary of the steps taken:
- Reviewed Initial Draft and Assumptions: Compared the provided draft structure with my understanding of Sailr's behavior based on previous code analysis (especially
src/main.rs,src/lib.rs, andsrc/templates/mod.rs). - Corrected
sailr initPath: Updated the tutorial to reflect thatsailr init <env_name>likely creates project structure likek8s/environments/<env_name>/config.tomland that subsequent commands likesailr go <env_name>should be run from the project root. - Mandated Basic Templates: Modified Step 4 to explicitly guide the user to create minimal
deployment.yamlandservice.yamltemplates for thehello-nginxservice, as Sailr's template discovery mechanism would likely require these even for pre-built images. - Refined Commands: Ensured CLI commands are consistent with the corrected path assumptions (e.g., running
sailr go my-first-appfrom the project root). - Added Namespace Verification: Included a step to verify namespace creation.
- Clarified Image Tag: Used
nginxdemos/hello:latestand noted that specific tags likeplain-textcould also be used. - Wrote Docusaurus Page: Created the content for
docs/docs/getting-started/tutorial.mdusing thecreate_file_with_blocktool, including Docusaurus frontmatter and detailed, step-by-step instructions. - Content Details:
- Starts with prerequisites and Minikube setup.
- Guides through
sailr initand project structure. - Explains the relevant parts of
config.toml. - Instructs on creating basic Kubernetes manifest templates (
deployment.yaml,service.yaml) for the sample Nginx application. - Shows how to configure the service in
config.toml. - Details the
sailr gocommand for deployment. - Provides
kubectlcommands to verify the deployment (namespace, pods, service). - Explains how to access the service via
minikube service. - Includes optional cleanup steps.
- Suggests next steps for further learning.