Skip to content

Commit 0dfd197

Browse files
aptalcathespadquietsyj0nnymoethelamer
authored
Monthly (#340)
* Update permissions on workflow templates * Remove armhf from arch table * keep sanitized and raw external versions separate in external trigger * Clarify logs * Remove fleet * Retrieve syft image tag from jenkins env vars, default to latest * use CI_SYFT_IMAGE_TAG for the ci test, with fall back to SYFT_IMAGE_TAG * add selkies blurb for readmes (#341) * add selkies blurb for readmes * typo * append more options to selkies blurb * add working path for watermark * general blurb cleanup emphasize https and nvidia encoding support * Add selkies note to requires --------- Co-authored-by: thespad <[email protected]> Co-authored-by: quietsy <[email protected]> Co-authored-by: j0nnymoe <[email protected]> Co-authored-by: Ryan Kuba <[email protected]> Co-authored-by: Roxedus <[email protected]>
1 parent 1c0338a commit 0dfd197

15 files changed

Lines changed: 169 additions & 18 deletions
Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
[![Blog]({{ lsio_shieldsio_static_blog }})]({{ lsio_blog_url }} "{{ lsio_blog_desc }}")
22
[![Discord]({{ lsio_shieldsio_discord }})]({{ lsio_discord_url }} "{{ lsio_discord_desc }}")
33
[![Discourse]({{ lsio_shieldsio_discourse_topics }})]({{ lsio_discourse_url }} "{{ lsio_discourse_desc }}")
4-
[![Fleet]({{ lsio_shieldsio_static_fleet }})]({{ lsio_fleet_url }} "{{ lsio_fleet_desc }}")
54
[![GitHub]({{ lsio_shieldsio_static_github }})]({{ lsio_github_url }} "{{ lsio_github_desc }}")
65
[![Open Collective]({{ lsio_shieldsio_opencollective_all }})]({{ lsio_opencollective_url }} "{{ lsio_opencollective_desc }}")

ansible/roles/documentation/templates/README_SNIPPETS/GROUP_INFO.j2

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,5 @@ Find us at:
1515
* [Blog]({{ lsio_blog_url }}) - {{ lsio_blog_desc }}
1616
* [Discord]({{ lsio_discord_url }}) - {{ lsio_discord_desc }}
1717
* [Discourse]({{ lsio_discourse_url }}) - {{ lsio_discourse_desc }}
18-
* [Fleet]({{ lsio_fleet_url }}) - {{ lsio_fleet_desc }}
1918
* [GitHub]({{ lsio_github_url }}) - {{ lsio_github_desc }}
2019
* [Open Collective]({{ lsio_opencollective_url }}) - {{ lsio_opencollective_desc }}
Lines changed: 117 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,117 @@
1+
**Modern GUI desktop apps may have compatibility issues with the latest Docker syscall restrictions. You can use Docker with the `--security-opt seccomp=unconfined` setting to allow these syscalls on hosts with older Kernels or libseccomp versions.**
2+
3+
### Security
4+
5+
{{ "This container provides privileged access to the host system. Do not expose it to the Internet unless you have secured it properly." | admonition(flavour=markdown, severity="warning") }}
6+
7+
**HTTPS is required for full functionality.** Modern browser features such as WebCodecs, used for video and audio, will not function over an insecure HTTP connection.
8+
9+
By default, this container has no authentication. The optional `CUSTOM_USER` and `PASSWORD` environment variables enable basic HTTP auth, which is suitable only for securing the container on a trusted local network. For internet exposure, we strongly recommend placing the container behind a reverse proxy, such as [SWAG](https://github.com/linuxserver/docker-swag), with a robust authentication mechanism.
10+
11+
The web interface includes a terminal with passwordless `sudo` access. Any user with access to the GUI can gain root control within the container, install arbitrary software, and probe your local network.
12+
13+
### Options in all Selkies-based GUI containers
14+
15+
This container is based on [Docker Baseimage Selkies](https://github.com/linuxserver/docker-baseimage-selkies), which provides the following environment variables and run configurations to customize its functionality.
16+
17+
#### Optional Environment Variables
18+
19+
| Variable | Description |
20+
| :----: | --- |
21+
| `CUSTOM_PORT` | Internal HTTP port. Defaults to `{% if external_http_port is defined %}{{ external_http_port }}{% else %}3000{% endif %}`. |
22+
| `CUSTOM_HTTPS_PORT` | Internal HTTPS port. Defaults to `{% if external_https_port is defined %}{{ external_https_port }}{% else %}3001{% endif %}`. |
23+
| `CUSTOM_USER` | Username for HTTP Basic Auth. Defaults to `abc`. |
24+
| `PASSWORD` | Password for HTTP Basic Auth. If unset, authentication is disabled. |
25+
| `SUBFOLDER` | Application subfolder for reverse proxy configurations. Must include leading and trailing slashes, e.g., `/subfolder/`. |
26+
| `TITLE` | Page title displayed in the web browser. Defaults to "Selkies". |
27+
| `START_DOCKER` | If set to `false`, the privileged Docker-in-Docker setup will not start automatically. |
28+
| `DISABLE_IPV6` | Set to `true` to disable IPv6 support in the container. |
29+
| `LC_ALL` | Sets the container's locale, e.g., `fr_FR.UTF-8`. |
30+
| `NO_DECOR` | If set, applications will run without window borders, suitable for PWA usage. |
31+
| `NO_FULL` | If set, applications will not be automatically fullscreened. |
32+
| `DISABLE_ZINK` | If set, Zink-related environment variables will not be configured when a video card is detected. |
33+
| `WATERMARK_PNG` | Full path to a watermark PNG file inside the container, e.g., `/usr/share/selkies/www/icon.png`. |
34+
| `WATERMARK_LOCATION` | Integer specifying the watermark location: `1` (Top Left), `2` (Top Right), `3` (Bottom Left), `4` (Bottom Right), `5` (Centered), `6` (Animated). |
35+
36+
#### Optional Run Configurations
37+
38+
| Argument | Description |
39+
| :----: | --- |
40+
| `--privileged` | Starts a Docker-in-Docker (DinD) environment. For better performance, mount the Docker data directory from the host, e.g., `-v /path/to/docker-data:/var/lib/docker`. |
41+
| `-v /var/run/docker.sock:/var/run/docker.sock` | Mounts the host's Docker socket to manage host containers from within this container. |
42+
43+
### Language Support - Internationalization
44+
45+
To launch the desktop session in a different language, set the `LC_ALL` environment variable. For example:
46+
47+
* `-e LC_ALL=zh_CN.UTF-8` - Chinese
48+
* `-e LC_ALL=ja_JP.UTF-8` - Japanese
49+
* `-e LC_ALL=ko_KR.UTF-8` - Korean
50+
* `-e LC_ALL=ar_AE.UTF-8` - Arabic
51+
* `-e LC_ALL=ru_RU.UTF-8` - Russian
52+
* `-e LC_ALL=es_MX.UTF-8` - Spanish (Latin America)
53+
* `-e LC_ALL=de_DE.UTF-8` - German
54+
* `-e LC_ALL=fr_FR.UTF-8` - French
55+
* `-e LC_ALL=nl_NL.UTF-8` - Netherlands
56+
* `-e LC_ALL=it_IT.UTF-8` - Italian
57+
58+
{% if show_nvidia is defined %}### Nvidia GPU Support
59+
60+
**Note: Nvidia support is not available for Alpine-based images.**
61+
62+
Nvidia GPU support is available by leveraging Zink for OpenGL. When a compatible Nvidia GPU is passed through, it will also be **automatically utilized for hardware-accelerated video stream encoding** (using the `x264enc` full-frame profile), significantly reducing CPU load.
63+
64+
Enable Nvidia support with the following runtime flags:
65+
66+
| Flag | Description |
67+
| :----: | --- |
68+
| `--gpus all` | Passes all available host GPUs to the container. This can be filtered to specific GPUs. |
69+
| `--runtime nvidia` | Specifies the Nvidia runtime, which provides the necessary drivers and tools from the host. |
70+
71+
For Docker Compose, you must first configure the Nvidia runtime as the default on the host:
72+
73+
```
74+
sudo nvidia-ctk runtime configure --runtime=docker --set-as-default
75+
sudo systemctl restart docker
76+
```
77+
78+
Then, assign the GPU to the service in your `compose.yaml`:
79+
80+
```
81+
services:
82+
{{ project_name }}:
83+
image: lscr.io/{{ lsio_project_name_short }}/{{ project_name }}:{{ release_tag }}
84+
deploy:
85+
resources:
86+
reservations:
87+
devices:
88+
- driver: nvidia
89+
count: 1
90+
capabilities: [compute,video,graphics,utility]
91+
```
92+
93+
{% endif %}### Application Management
94+
95+
There are two methods for installing applications inside the container: PRoot Apps (recommended for persistence) and Native Apps.
96+
97+
#### PRoot Apps (Persistent)
98+
99+
Natively installed packages (e.g., via `apt-get install`) will not persist if the container is recreated. To retain applications and their settings across container updates, we recommend using [proot-apps](https://github.com/linuxserver/proot-apps). These are portable applications installed to the user's persistent `$HOME` directory.
100+
101+
To install an application, use the command line inside the container:
102+
103+
```
104+
proot-apps install filezilla
105+
```
106+
107+
A list of supported applications is available [here](https://github.com/linuxserver/proot-apps?tab=readme-ov-file#supported-apps).
108+
109+
#### Native Apps (Non-Persistent)
110+
111+
You can install packages from the system's native repository using the [universal-package-install](https://github.com/linuxserver/docker-mods/tree/universal-package-install) mod. This method will increase the container's start time and is not persistent. Add the following to your `compose.yaml`:
112+
113+
```yaml
114+
environment:
115+
- DOCKER_MODS=linuxserver/mods:universal-package-install
116+
- INSTALL_PACKAGES=libfuse2|git|gdb
117+
```

ansible/roles/documentation/templates/README_SNIPPETS/SUPPORTED_ARCHITECTURES.j2

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,4 +13,3 @@ The architectures supported by this image are:
1313
| riscv64 | {{ '✅ | riscv64-\<version tag\>' }} |
1414
{% endif %}
1515
| arm64 | {{ '✅ | arm64v8-\<version tag\>' if 'arm64' in (available_architectures | map(attribute="arch") ) else '❌ |' }} |
16-
| armhf | {{ '✅ | arm32v7-\<version tag\>' if 'armhf' in (available_architectures | map(attribute="arch") ) else '❌ |' }} |

ansible/roles/documentation/templates/documentation.md.j2

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,10 @@ description: "{{ noter(project_blurb) | trim }}"
6464
{% if kasm_blurb is defined %}
6565
{% include "README_SNIPPETS/KASM.j2" | trim %}
6666

67+
{% endif %}
68+
{% if selkies_blurb is defined %}
69+
{% include "README_SNIPPETS/SELKIES.j2" | trim %}
70+
6771
{% endif %}
6872
{% if readonly_supported is defined and readonly_supported %}
6973
{% include "README_SNIPPETS/READONLY.j2" | trim %}

ansible/roles/documentation/templates/readme.md.j2

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,10 @@
5555
{% if kasm_blurb is defined %}
5656
{% include "README_SNIPPETS/KASM.j2" | trim %}
5757

58+
{% endif %}
59+
{% if selkies_blurb is defined %}
60+
{% include "README_SNIPPETS/SELKIES.j2" | trim %}
61+
5862
{% endif %}
5963
{% if readonly_supported is defined and readonly_supported %}
6064
{% include "README_SNIPPETS/READONLY.j2" | trim %}

ansible/roles/documentation/templates/unraid.xml.j2

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -91,13 +91,19 @@
9191
{# Set the WebUI link based on the link the CI runs against #}
9292
<TemplateURL>{{ "false" if unraid_template_sync is sameas false else "https://raw.githubusercontent.com/linuxserver/templates/main/unraid/" + project_name | lower + ".xml" }}</TemplateURL>
9393
<Icon>https://raw.githubusercontent.com/linuxserver/docker-templates/master/linuxserver.io/img/linuxserver-ls-logo.png</Icon>
94-
{% if (unraid_requirement is defined and unraid_requirement != "") or (external_application_snippet_enabled) %}
94+
{% if (unraid_requirement is defined and unraid_requirement != "") or (external_application_snippet_enabled) or (selkies_blurb is defined) %}
9595
<Requires>
96-
{{ unraid_requirement }}
97-
{% if external_application_snippet_enabled %}
96+
{% if unraid_requirement is defined %}
97+
{{ unraid_requirement | indent(4) | trim }}
98+
{% endif %}
99+
{% if external_application_snippet_enabled %}
98100
This container requires an external application to be run separately.
99-
{{ external_application_unraid_block }}
100-
{% endif %}
101+
{{ external_application_unraid_block | indent(4) | trim }}
102+
{% endif %}
103+
{% if selkies_blurb is defined %}
104+
This image is unprotected by default __**do not**__ expose it to the internet.
105+
Please read {{ project_github_repo_url }}#security for more information.
106+
{% endif %}
101107
</Requires>
102108
{% endif %}
103109
{# Create changelog #}

ansible/roles/github/templates/call_issue_pr_tracker.yml.j2

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,9 @@ on:
88
pull_request_review:
99
types: [submitted,edited,dismissed]
1010

11+
permissions:
12+
contents: read
13+
1114
jobs:
1215
manage-project:
1316
permissions:

ansible/roles/github/templates/call_issues_cron.yml.j2

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,9 @@ on:
44
- cron: '{{ 60 | random(seed=('docker-' + project_name + '-minute')) }} {{ 24 | random(seed=('docker-' + project_name + '-hour')) }} * * *'
55
workflow_dispatch:
66

7+
permissions:
8+
contents: read
9+
710
jobs:
811
stale:
912
permissions:

ansible/roles/github/templates/external_trigger.yml.j2

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,9 @@ name: External Trigger Main
1010
on:
1111
workflow_dispatch:
1212

13+
permissions:
14+
contents: read
15+
1316
jobs:
1417
external-trigger-{{ ls_branch|regex_replace('[^a-zA-Z0-9-]','-') }}:
1518
runs-on: ubuntu-latest
@@ -107,8 +110,8 @@ jobs:
107110
"username": "Github Actions"}' ${{ '{{' }} secrets.DISCORD_WEBHOOK {{ '}}' }}
108111
exit 1
109112
fi
110-
EXT_RELEASE=$(echo ${EXT_RELEASE} | sed 's/[~,%@+;:/]//g')
111-
echo "External version: \`${EXT_RELEASE}\`" >> $GITHUB_STEP_SUMMARY
113+
EXT_RELEASE_SANITIZED=$(echo ${EXT_RELEASE} | sed 's/[~,%@+;:/]//g')
114+
echo "Sanitized external version: \`${EXT_RELEASE_SANITIZED}\`" >> $GITHUB_STEP_SUMMARY
112115
echo "Retrieving last pushed version" >> $GITHUB_STEP_SUMMARY
113116
image="{{ better_vars.LS_USER }}/{{ project_name }}"
114117
tag="{{ release_tag }}"
@@ -164,8 +167,8 @@ jobs:
164167
exit 1
165168
fi
166169
echo "Last pushed version: \`${IMAGE_VERSION}\`" >> $GITHUB_STEP_SUMMARY
167-
if [ "${EXT_RELEASE}" == "${IMAGE_VERSION}" ]; then
168-
echo "Version \`${EXT_RELEASE}\` already pushed, exiting" >> $GITHUB_STEP_SUMMARY
170+
if [ "${EXT_RELEASE_SANITIZED}" == "${IMAGE_VERSION}" ]; then
171+
echo "Sanitized version \`${EXT_RELEASE_SANITIZED}\` already pushed, exiting" >> $GITHUB_STEP_SUMMARY
169172
exit 0
170173
{% if external_type == "alpine_repo" and better_vars.MULTIARCH == 'true' %}
171174
elif [[ $(curl -sL "{{ better_vars.DIST_REPO }}aarch64/APKINDEX.tar.gz" | tar -xz -C /tmp && awk '/^P:'"{{ better_vars.DIST_REPO_PACKAGES }}"'$/,/V:/' /tmp/APKINDEX | sed -n 2p | sed 's/^V://') != "${EXT_RELEASE}" ]]{% if build_armhf %} || [[ $(curl -sL "{{ better_vars.DIST_REPO }}armv7/APKINDEX.tar.gz" | tar -xz -C /tmp && awk '/^P:'"{{ better_vars.DIST_REPO_PACKAGES }}"'$/,/V:/' /tmp/APKINDEX | sed -n 2p | sed 's/^V://') != "${EXT_RELEASE}" ]]{% endif %}; then
@@ -197,7 +200,7 @@ jobs:
197200
"username": "Github Actions"}' ${{ '{{' }} secrets.DISCORD_WEBHOOK {{ '}}' }}
198201
else
199202
printf "\n## Trigger new build\n\n" >> $GITHUB_STEP_SUMMARY
200-
echo "New version \`${EXT_RELEASE}\` found; old version was \`${IMAGE_VERSION}\`. Triggering new build" >> $GITHUB_STEP_SUMMARY
203+
echo "New sanitized version \`${EXT_RELEASE_SANITIZED}\` found; old version was \`${IMAGE_VERSION}\`. Triggering new build" >> $GITHUB_STEP_SUMMARY
201204
if [[ "${artifacts_found}" == "true" ]]; then
202205
echo "All artifacts seem to be uploaded." >> $GITHUB_STEP_SUMMARY
203206
fi
@@ -217,7 +220,7 @@ jobs:
217220
--data-urlencode "description=GHA external trigger https://github.com/${{ '{{' }} github.repository {{ '}}' }}/actions/runs/${{ '{{' }} github.run_id {{ '}}' }}" \
218221
--data-urlencode "Submit=Submit"
219222
echo "**** Notifying Discord ****"
220-
TRIGGER_REASON="A version change was detected for {{ project_name }} tag {{ release_tag }}. Old version:${IMAGE_VERSION} New version:${EXT_RELEASE}"
223+
TRIGGER_REASON="A version change was detected for {{ project_name }} tag {{ release_tag }}. Old version:${IMAGE_VERSION} New version:${EXT_RELEASE_SANITIZED}"
221224
curl -X POST -H "Content-Type: application/json" --data '{"avatar_url": "https://cdn.discordapp.com/avatars/354986384542662657/df91181b3f1cf0ef1592fbe18e0962d7.png","embeds": [{"color": 9802903,
222225
"description": "**Build Triggered** \n**Reason:** '"${TRIGGER_REASON}"' \n**Build URL:** '"${buildurl}display/redirect"' \n"}],
223226
"username": "Github Actions"}' ${{ '{{' }} secrets.DISCORD_WEBHOOK {{ '}}' }}

0 commit comments

Comments
 (0)