ChartMuseum is an open-source Helm Chart Repository server written in Go (Golang), with support for cloud storage backends, including Google Cloud Storage, Amazon S3, Microsoft Azure Blob Storage, Alibaba Cloud OSS Storage and Openstack Object Storage.
It works as a valid Helm Chart Repository, and also provides an API for uploading charts.
In this guide we will learn how to install Chart Museum in a Linux server.
Checkout:
Step 1: Download the chartmuseum binary
Chartmuseum is available as a single compressed binary that can be downloaded, extracted and copied to the bin directory.
Let us download the package using this command. As of the writing of this guide the latest version is v0.14.0, replace that with the latest version. Check from the release page here.
cd /tmp
curl -LO https://get.helm.sh/chartmuseum-v0.14.0-linux-amd64.tar.gz
Then extract the package:
tar -xzvf chartmuseum-v0.14.0-linux-amd64.tar.gz
Finally, move the binary to the executable binary directory:
mv /tmp/linux-amd64/chartmuseum /usr/local/bin/chartmuseum
rm -rf /tmp/linux-amd64
Step 2: Create a systemd service file
We will need to find a way to run the chartmuseum service. Systemd allows us to run the service and manage it easily.
First create required charts directory:
mkdir /opt/charts
chown rocky:rocky /opt/charts
Then let’s open the systemd file for chartmuseum.
sudo vim /etc/systemd/system/chartmuseum.service
Add this content to the file:
[Unit]
Description=Chartmuseum server
[Service]
Type=simple
User=rocky
Group=rocky
Environment=DEBUG=1
Environment=STORAGE=local
Environment=STORAGE_LOCAL_ROOTDIR=/opt/charts
WorkingDirectory=/tmp
ExecStart=/usr/local/bin/chartmuseum --port=9080
[Install]
WantedBy=multi-user.target
When the service starts, we are running the command /usr/local/bin/chartmuseum --port=9080
which will expose the service in port 9080. We are also exporting some environment variables that will define the chart storage type and path.
Step 3: Start and enable the service
Since we created a new systemd service, let us start by doing a daemon reload:
sudo systemctl daemon-reload
Then start using this command
sudo systemctl start chartmuseum
Confirm the status to ensure its running as expected using this command:
$ sudo systemctl status chartmuseum
● chartmuseum.service - Chartmuseum server
Loaded: loaded (/etc/systemd/system/chartmuseum.service; enabled; vendor preset: disabled)
Active: active (running) since Sun 2022-04-03 20:46:16 UTC; 22s ago
Main PID: 7617 (chartmuseum)
Tasks: 5 (limit: 4915)
CGroup: /system.slice/chartmuseum.service
└─7617 /usr/local/bin/chartmuseum --port=9080
Apr 03 20:46:16 opensusesrv systemd[1]: Started Chartmuseum server.
Apr 03 20:46:16 opensusesrv chartmuseum[7617]: 2022-04-03T20:46:16.147Z DEBUG index-cache.yaml loaded {"repo": ""}
Apr 03 20:46:16 opensusesrv chartmuseum[7617]: 2022-04-03T20:46:16.148Z INFO Starting ChartMuseum {"host": "0.0.0.0", "port": 9080}
Apr 03 20:46:16 opensusesrv chartmuseum[7617]: 2022-04-03T20:46:16.148Z DEBUG Starting internal event listener
Enable the service to start on boot
sudo systemctl enable chartmuseum
Step 4: Accessing the service
Head to http://server_ip:9080
to access the service. You will need to enable the service port if you are accessing in a remote server.
If you have firewalld installed and enabled, you will need to enable the service port. Enable using this command:
sudo firewall-cmd --permanent --add-port=9080/tcp
sudo firewall-cmd --reload
If you see the page with this content:
Welcome to ChartMuseum!
If you see this page, the ChartMuseum web server is successfully installed and working.
Then everything is set up.
Step 5: Adding Nginx for access
You can add nginx to proxy the request so you do not have to use the server IP address. First install Nginx in your server.
# For RHEL based:
sudo dnf install -y nginx
# For Ubuntu and Debian based
sudo apt install -y nginx
Next let us create an Nginx config file for chartmuseum. Open the config file with your editor:
sudo vim /etc/nginx/conf.d/chartmuseum.conf
Then add this content:
server {
listen 80;
server_tokens off;
client_max_body_size 100M;
server_name chartmuseum.citizix.com;
ignore_invalid_headers off;
if ($host !~* ^(chartmuseum.citizix.com)$ ) {
return 444;
}
location / {
send_timeout 600;
proxy_read_timeout 600;
proxy_send_timeout 600;
proxy_connect_timeout 600;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Host $server_name;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_pass http://127.0.0.1:9080;
}
}
Then start and enable nginx
sudo systemctl start nginx
sudo systemctl enable nginx
You can now access the service using this address http://chartmuseum.citizix.com
instead of the server ip and port
Step 6: Working with helm museum
Once everything is set up, we can test if our repository is working as expected. You will need to have helm installed locally to proceed.
First, add the new repo that we created:
helm repo add citizix http://chartmuseum.citizix.com
We can confirm the addition by listing:
➜ helm repo list | grep citizix
citizix http://chartmuseum.citizix.com
Let us create new chart called app:
➜ helm create app
Creating app
Lint to validate that it is fine:
❯ helm lint app/
==> Linting app/
[INFO] Chart.yaml: icon is recommended
1 chart(s) linted, 0 chart(s) failed
We can then push the new app chart to our repository. You will need the helm push plugin. Install push plugin using this command:
helm plugin install https://github.com/chartmuseum/helm-push
Then push the app repo:
➜ helm cm-push app citizix
Pushing app-0.1.0.tgz to citizix...
Done.
To confirm that it was pushed successfully:
helm repo update
Then
➜ helm search repo citizix
NAME CHART VERSION APP VERSION DESCRIPTION
citizix/app 0.1.0 1.16.0 A Helm chart for Kubernetes
Conclusion
In this guide we were able to install, setup and test our set up of chartmuseum on a linux server. For more information please checkout the chartmuseum page.