ProxmoxVE/.github/CONTRIBUTOR_GUIDE/install/AppName-install.md
CanbiZ 160c546002
Add initial PR for Contributing & Coding Standard (#920)
* First Design: CONTRIBUTING

* Update CONTRIBUTING.md

* Update CONTRIBUTING.md

* Update CONTRIBUTING.md

* Update CONTRIBUTING.md

* Update CONTRIBUTING.md

* Update CONTRIBUTING.md

* Update CONTRIBUTING.md

* Update CONTRIBUTING.md

* Update CONTRIBUTING.md

* Ideas for CONTRIBUTING.md (#768)

* Update CONTRIBUTING.md

* Update CONTRIBUTING.md

* Update CONTRIBUTING.md

* Update CONTRIBUTING.md

* Update CONTRIBUTING.md

* Add files via upload

* fix var_tags

* add comments to AppName.sh

* Rework Contributing to merge the tow existing Versions

* Remove coding_standards.md

* Fix broken link

* Fix broken link

* UPDATE contributing

* UPDATE contributing

* UPDATE contributing

* Update

* UPDATE

* Update AppName.md

* UPDATE CONTRIBUTING.md

* UPDATE CONTRIBUTING.md

* Fixing some typos

* Update

Co-authored-by: Sébastiaan <se_bastiaan@outlook.com>

* Update Contributing

---------

Co-authored-by: Michel Roegl-Brunner <73236783+michelroegl-brunner@users.noreply.github.com>
Co-authored-by: Michel Roegl-Brunner <michel.roegl-brunner@htl-braunau.at>
Co-authored-by: Rémi Bédard-Couture <remi.bc@outlook.com>
Co-authored-by: Sébastiaan <se_bastiaan@outlook.com>
2025-01-10 10:33:33 +01:00

7.8 KiB

AppName-install.sh Scripts

AppName-install.sh scripts found in the /install directory. These scripts are responsible for the installation of the application. For this guide we take /install/snipeit-install.sh as example.

Table of Contents

1. File header

1.1 Shebang

  • Use #!/usr/bin/env bash as the shebang.
#!/usr/bin/env bash

1.2 Comments

  • Add clear comments for script metadata, including author, copyright, and license information.
  • Use meaningful inline comments to explain complex commands or logic.

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
  • When updating/reworking scripts, add "| Co-Author [YourUserName]"

1.3 Variables and function import

  • This sections adds the support for all needed functions and variables.
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
color
verb_ip6
catch_errors
setting_up_container
network_check
update_os

2. Variable naming and management

2.1 Naming conventions

  • Use uppercase names for constants and environment variables.
  • Use lowercase names for local script variables.

Example:

DB_NAME=snipeit_db    # Environment-like variable (constant)
db_user="snipeit"     # Local variable

3. Dependencies

3.1 Install all at once

  • Install all dependencies with a single command if possible

Example:

$STD apt-get install -y \
  curl \
  composer \
  git \
  sudo \
  mc \
  nginx 

3.2 Collapse dependencies

Collapse dependencies to keep the code readable.

Example: Use

php8.2-{bcmath,common,ctype}

instead of

php8.2-bcmath php8.2-common php8.2-ctype

4. Paths to application files

If possible install the app and all necessary files in /opt/


5. Version management

5.1 Install the latest release

  • Always try and install the latest release
  • Do not hardcode any version if not absolutely necessary

Example for a git 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) }')
wget -q "https://github.com/snipe/snipe-it/archive/refs/tags/v${RELEASE}.zip"

5.2 Save the version for update checks

  • Write the installed version into a file.
  • This is used for the update function in AppName.sh to check for if a Update is needed.

Example:

echo "${RELEASE}" >"/opt/AppName_version.txt"

6. Input and output management

6.1 User feedback

  • Use standard functions like msg_info, msg_ok or msg_error to print status messages.
  • Each msg_info must be followed with a msg_ok before any other output is made.
  • Display meaningful progress messages at key stages.

Example:

msg_info "Installing Dependencies"
$STD apt-get install -y ...
msg_ok "Installed Dependencies"

6.2 Verbosity

  • Use the appropiate flag (-q in the examples) for a command to suppres its output Example:
wget -q
unzip -q
  • If a command dose not come with such a functionality use $STD (a custom standard redirection variable) for managing output verbosity.

Example:

$STD apt-get install -y nginx

7. String/File Manipulation

7.1 File Manipulation

  • Use sed to replace placeholder values in configuration files.

Example:

sed -i -e "s|^DB_DATABASE=.*|DB_DATABASE=$DB_NAME|" \
       -e "s|^DB_USERNAME=.*|DB_USERNAME=$DB_USER|" \
       -e "s|^DB_PASSWORD=.*|DB_PASSWORD=$DB_PASS|" .env

8. Security practices

8.1 Password generation

  • Use openssl to generate random passwords.
  • Use only alphanumeric values to not introduce unknown behaviour.

Example:

DB_PASS=$(openssl rand -base64 18 | tr -dc 'a-zA-Z0-9' | head -c13)

8.2 File permissions

Explicitly set secure ownership and permissions for sensitive files.

Example:

chown -R www-data: /opt/snipe-it
chmod -R 755 /opt/snipe-it

9. Service Configuration

9.1 Configuration files

Use cat <<EOF to write configuration files in a clean and readable way.

Example:

cat <<EOF >/etc/nginx/conf.d/snipeit.conf
server {
    listen 80;
    root /opt/snipe-it/public;
    index index.php;
}
EOF

9.2 Credential management

Store the generated credentials in a file.

Example:

USERNAME=username
PASSWORD=$(openssl rand -base64 18 | tr -dc 'a-zA-Z0-9' | head -c13)
{
    echo "Application-Credentials"
    echo "Username: $USERNAME"
    echo "Password: $PASSWORD"
} >> ~/application.creds

9.3 Enviroment files

Use cat <<EOF to write enviromental files in a clean and readable way.

Example:

cat <<EOF >/path/to/.env
VARIABLE="value"
PORT=3000
DB_NAME="${DB_NAME}"
EOF

9.4 Services

Enable affected services after configuration changes and start them right away.

Example:

systemctl enable -q --now nginx

10. Cleanup

10.1 Remove temporary files

Remove temporary files and downloads after use.

Example:

rm -rf /opt/v${RELEASE}.zip

10.2 Autoremove and autoclean

Remove unused dependencies to reduce disk space usage.

Example:

apt-get -y autoremove
apt-get -y autoclean

11. Best Practices Checklist

  • Shebang is correctly set (#!/usr/bin/env bash).
  • Metadata (author, license) is included at the top.
  • Variables follow naming conventions.
  • Sensitive values are dynamically generated.
  • Files and services have proper permissions.
  • Script cleans up temporary files.

Example: High-Level Script Flow

  1. Dependencies installation
  2. Database setup
  3. Download and configure application
  4. Service configuration
  5. Final cleanup