Open source image server for Incus / LXD

Hi Everyone

I am happy to announce that we have open-sourced our image server:

Production Server

You can now access the production server: https://images.opsmaru.com

Sandbox Server

The MVP (sandbox server) is up and running already it’s located here https://images.opsmaru.dev

The production server will be up soon, the difference is sandbox server receive more updates / may be more unstable than the production, other than that they’re exactly the same.

Try it out

You can try it out by using the following comand:

Incus

incus remote add opsmaru https://images.opsmaru.dev/spaces/c39d9dd3087c0aa086da110a --public --protocol simplestreams

or

LXD

lxc remote add opsmaru https://images.opsmaru.dev/spaces/a781c2dc5092b7b5816e7dc3 --public --protocol simplestreams

The above uses a url that will expire after 30 days. This is to enable the community to try it out.

What happens after it expires?

We are developing a UI where you will be able to sign up and issue your own url / token for remote images.

You will be able to issue tokens that never expire if you want. You will also be able to specify which client (LXD / Incus) the token is for. The feed will be generated for your specified client to avoid issues.

You don’t have the images I need

We will add new images, if there is demand, please open an issue or a pull-request here.

We will currently support the following architectures:

  • x86_64 (amd64)
  • aarch64 (arm64)

Will consider adding more if there is demand.

The bulk of the build system is done, I’m using a fork here which pushes to the sandbox server.

You can see the success build action here.

When will the ui be done

This is something of a high priority for us, therefore soon. I’m working on cleaning up the MVP ui to get this thing up in production hopefully beginning March.

Can I self host the image server?

Yes you will be able to self-host the image server if you want. We will provide instructions and an easy guide to enable you to do this.

How it Works

We have a basic architecture diagram here:

In Action

Here is an example of it in action

lxc image list opsmaru:

+----------------------------+--------------+--------+---------------------------------+--------------+-----------+---------+-------------------------------+
|           ALIAS            | FINGERPRINT  | PUBLIC |           DESCRIPTION           | ARCHITECTURE |   TYPE    |  SIZE   |          UPLOAD DATE          |
+----------------------------+--------------+--------+---------------------------------+--------------+-----------+---------+-------------------------------+
| alpine/3.16 (3 more)       | d4e280b3b850 | yes    | alpine 3.16 arm64 (20240221-14) | aarch64      | CONTAINER | 2.28MiB | Feb 21, 2024 at 12:00am (UTC) |
+----------------------------+--------------+--------+---------------------------------+--------------+-----------+---------+-------------------------------+
| alpine/3.16/amd64 (1 more) | 4fbbab01353e | yes    | alpine 3.16 amd64 (20240221-14) | x86_64       | CONTAINER | 2.50MiB | Feb 21, 2024 at 12:00am (UTC) |
+----------------------------+--------------+--------+---------------------------------+--------------+-----------+---------+-------------------------------+
| alpine/3.17 (3 more)       | 8edf37df13ec | yes    | alpine 3.17 arm64 (20240221-14) | aarch64      | CONTAINER | 2.70MiB | Feb 21, 2024 at 12:00am (UTC) |
+----------------------------+--------------+--------+---------------------------------+--------------+-----------+---------+-------------------------------+
| alpine/3.17/amd64 (1 more) | 099f83764a67 | yes    | alpine 3.17 amd64 (20240221-14) | x86_64       | CONTAINER | 2.93MiB | Feb 21, 2024 at 12:00am (UTC) |
+----------------------------+--------------+--------+---------------------------------+--------------+-----------+---------+-------------------------------+
| alpine/3.18 (3 more)       | 7c31777227b0 | yes    | alpine 3.18 arm64 (20240221-14) | aarch64      | CONTAINER | 2.75MiB | Feb 21, 2024 at 12:00am (UTC) |
+----------------------------+--------------+--------+---------------------------------+--------------+-----------+---------+-------------------------------+
| alpine/3.18/amd64 (1 more) | 37062029ee44 | yes    | alpine 3.18 amd64 (20240221-14) | x86_64       | CONTAINER | 2.94MiB | Feb 21, 2024 at 12:00am (UTC) |
+----------------------------+--------------+--------+---------------------------------+--------------+-----------+---------+-------------------------------+
| alpine/3.19 (3 more)       | e44e496455f5 | yes    | alpine 3.19 arm64 (20240221-14) | aarch64      | CONTAINER | 2.72MiB | Feb 21, 2024 at 12:00am (UTC) |
+----------------------------+--------------+--------+---------------------------------+--------------+-----------+---------+-------------------------------+
| alpine/3.19/amd64 (1 more) | b392f4461aaf | yes    | alpine 3.19 amd64 (20240221-14) | x86_64       | CONTAINER | 2.92MiB | Feb 21, 2024 at 12:00am (UTC) |
+----------------------------+--------------+--------+---------------------------------+--------------+-----------+---------+-------------------------------+
| alpine/edge (3 more)       | 34b71a8b87ab | yes    | alpine edge arm64 (20240221-14) | aarch64      | CONTAINER | 2.72MiB | Feb 21, 2024 at 12:00am (UTC) |
+----------------------------+--------------+--------+---------------------------------+--------------+-----------+---------+-------------------------------+
| alpine/edge/amd64 (1 more) | 4d7c0a086c41 | yes    | alpine edge amd64 (20240221-14) | x86_64       | CONTAINER | 2.93MiB | Feb 21, 2024 at 12:00am (UTC) |
+----------------------------+--------------+--------+---------------------------------+--------------+-----------+---------+-------------------------------+

5 Likes

Nice! We have now alternatives.

2 Likes

Huh
 I’m confused. I’m not seeing anything.

$ incus remote add opsmaru https://images.opsmaru.dev/spaces/c39d9dd3087c0aa086da110a --public --protocol simplestreams


$ incus remote list
+-----------------+------------------------------------------------------------+---------------+-------------+--------+--------+--------+
|      NAME       |                            URL                             |   PROTOCOL    |  AUTH TYPE  | PUBLIC | STATIC | GLOBAL |
+-----------------+------------------------------------------------------------+---------------+-------------+--------+--------+--------+
| images          | https://images.linuxcontainers.org                         | simplestreams | none        | YES    | NO     | NO     |
+-----------------+------------------------------------------------------------+---------------+-------------+--------+--------+--------+
| local (current) | unix://                                                    | incus         | file access | NO     | YES    | NO     |
+-----------------+------------------------------------------------------------+---------------+-------------+--------+--------+--------+
| opsmaru         | https://images.opsmaru.dev/spaces/c39d9dd3087c0aa086da110a | simplestreams | none        | YES    | NO     | NO     |
+-----------------+------------------------------------------------------------+---------------+-------------+--------+--------+--------+

$ incus image list opsmaru
+-------+-------------+--------+-------------+--------------+------+------+-------------+
| ALIAS | FINGERPRINT | PUBLIC | DESCRIPTION | ARCHITECTURE | TYPE | SIZE | UPLOAD DATE |
+-------+-------------+--------+-------------+--------------+------+------+-------------+

There’s nothing there.

Separate and unrelated - from the main topic related to the recent changes, I thought the “official” site was supposed to work for a while longer, but it doesn’t.

$ incus launch images:ubuntu/jammy mycontainer
Launching mycontainer
Error: Failed instance creation: Get "https://sgp1lxdmirror01.do.letsbuildthe.cloud/images/ubuntu/jammy/amd64/default/20240223_07:42/incus.tar.xz": net/http: timeout awaiting response headers

If you do not prepend the : to the last argument (the name of the remote), Incus assumes that you want to list a local: image. There is no local:opsmaru image, therefore the output is empty.

Try instead

incus image list opsmaru:

The other command that fails with the following, likely hit some temporary issue. Or, the hostname sgp1lxdmirror01.do.letsbuildthe.cloud looks a bit weird.

Error: Failed instance creation: Get "https://sgp1lxdmirror01.do.letsbuildthe.cloud/images/ubuntu/jammy/amd64/default/20240223_07:42/incus.tar.xz": net/http: timeout awaiting response headers
2 Likes

Thank you. I’ve been using LXD for years but never caught that detail!

That’s normal, it’s the Singapore mirror for our images. Looks like there’s some kind of issue with that one so I’ll pull it out of rotation for now until @mpontillo can investigate.

Traffic normally headed to the Singapore mirror will now be handled directly by the main servers back in Canada. That will likely lead to slower download speeds for affected users until whatever issue is going on with the Singapore mirror is sorted out.

Interestingly, the issue didn’t cause sufficient network errors to get picked up by our external monitoring provider: https://status.images.linuxcontainers.org/

1 Like

And further reconfigured to send the normal Singapore-bound traffic to Sydney instead as that’s geographically closer than going all the way back to Canada :slight_smile:

1 Like

This has now been resolved and the Singapore mirror is now back in the rotation.

1 Like

We have recently added debian and ubuntu images to the image server. You can try it out.

  • debian/bookworm
  • debian/sid
  • ubuntu/jammy
  • ubuntu/noble

Also in case anyone is curious about our CDN we are using bunny.net you can see their network coverage here:

3 Likes

This is a recent image list. I notice that some images do not have an alias.

$ incus image list opsmaru: -c lfd
+-----------------------------+--------------+------------------------------------+
|            ALIAS            | FINGERPRINT  |            DESCRIPTION             |
+-----------------------------+--------------+------------------------------------+
| alpine/3.16 (3 more)        | 4fbbab01353e | alpine 3.16 amd64 (20240221-14)    |
+-----------------------------+--------------+------------------------------------+
| alpine/3.16/arm64 (1 more)  | d4e280b3b850 | alpine 3.16 arm64 (20240221-14)    |
+-----------------------------+--------------+------------------------------------+
| alpine/3.17 (3 more)        | 099f83764a67 | alpine 3.17 amd64 (20240221-14)    |
+-----------------------------+--------------+------------------------------------+
| alpine/3.17/arm64 (1 more)  | 8edf37df13ec | alpine 3.17 arm64 (20240221-14)    |
+-----------------------------+--------------+------------------------------------+
| alpine/3.18 (3 more)        | 37062029ee44 | alpine 3.18 amd64 (20240221-14)    |
+-----------------------------+--------------+------------------------------------+
| alpine/3.18/arm64 (1 more)  | 7c31777227b0 | alpine 3.18 arm64 (20240221-14)    |
+-----------------------------+--------------+------------------------------------+
| alpine/3.19 (3 more)        | b392f4461aaf | alpine 3.19 amd64 (20240221-14)    |
+-----------------------------+--------------+------------------------------------+
| alpine/3.19/arm64 (1 more)  | e44e496455f5 | alpine 3.19 arm64 (20240221-14)    |
+-----------------------------+--------------+------------------------------------+
| alpine/edge (3 more)        | 4d7c0a086c41 | alpine edge amd64 (20240221-14)    |
+-----------------------------+--------------+------------------------------------+
| alpine/edge/arm64 (1 more)  | 34b71a8b87ab | alpine edge arm64 (20240221-14)    |
+-----------------------------+--------------+------------------------------------+
| debian/12 (7 more)          | dbf29f7a2c9e | debian bookworm amd64 (20240226-3) |
+-----------------------------+--------------+------------------------------------+
| debian/12/arm64 (3 more)    | e5e3acfbb5f6 | debian bookworm arm64 (20240226-3) |
+-----------------------------+--------------+------------------------------------+
| debian/sid (3 more)         | fd0af2dffa61 | debian sid amd64 (20240226-3)      |
+-----------------------------+--------------+------------------------------------+
| debian/sid/arm64 (1 more)   | 8d6700d4714d | debian sid arm64 (20240226-3)      |
+-----------------------------+--------------+------------------------------------+
| ubuntu/jammy (7 more)       | 9ae5d3f488f0 | ubuntu jammy amd64 (20240226-4)    |
+-----------------------------+--------------+------------------------------------+
| ubuntu/jammy/arm64 (3 more) | 2ad2d7fe813f | ubuntu jammy arm64 (20240226-4)    |
+-----------------------------+--------------+------------------------------------+
|                             | 0e838cf66383 | debian sid arm64 (20240226-2)      |
+-----------------------------+--------------+------------------------------------+
|                             | b896b9c896f9 | debian bookworm arm64 (20240226-2) |
+-----------------------------+--------------+------------------------------------+
|                             | dc919ab23485 | debian bookworm amd64 (20240226-2) |
+-----------------------------+--------------+------------------------------------+
|                             | f33f6c37df89 | debian sid amd64 (20240226-2)      |
+-----------------------------+--------------+------------------------------------+

Hey

Yeah, because they’re the older builds of debian. I did 2 builds in one day, I needed to try something. The alias is only for the latest version. So if you launch containers using the alias they will refer to the latest version of a given product.

Also we just shipped an update to https://images.opsmaru.dev

You should be able to sign up and issue your own token now (even ones that don’t expire)

how can I create a mirror of the server ?