Compare commits

...

15 Commits

Author SHA1 Message Date
0eb2ecf033 Changes to compose and env files to get FDroid build working successfully. 2025-11-11 20:12:33 -07:00
a233f32751 Run script is no longer needed to keep the container running, build file uses nginx as the command which also provides the web log. 2025-11-11 20:10:42 -07:00
99afb5ac50 Container is now working!! Apps do not register though, likely since they are missing metadata. 2025-11-11 20:09:15 -07:00
f16b44a5b6 Start the container in root's home, not /. 2025-11-11 20:08:13 -07:00
87a571c89a Create super simple container for playing around in. 2025-11-11 15:51:00 -07:00
52d108fa75 Get the FDroid project to the point where it starts and runs. Not creating the actual repo under the webserver yet though. Does not seem to be keeping the APKs the Dockerfile downloads. 2025-11-11 15:14:57 -07:00
df3a4cb354 Update wording for the website's files directory README. 2025-11-11 12:03:34 -07:00
44f4aa55c6 Prep file does not need to source the master env file. 2025-11-10 14:14:08 -07:00
7199a88627 Move the REPO and WEBROOT vars to the Dockerfile since that's the only place they're needed. Dir is getting created successfully now. 2025-11-01 13:16:31 -07:00
bf2499e6ce F-Droid: Fix variable error; MEM not RAM. 2025-11-01 12:59:42 -07:00
e8e4b69ed6 Resource parameters are not needed in the env section. Change the order of the app and db. 2025-11-01 12:02:41 -07:00
9bc7988b81 More work on the F-Droid Repo setup. 2025-11-01 11:54:34 -07:00
0ed000cd20 Automatically run the prep, maintenance, and purge scripts. begin adding explicit double quotes. 2025-11-01 11:54:14 -07:00
4264e47577 Wordpress config: Differentiate the service name from the container name. 2025-11-01 11:53:27 -07:00
1bcf5f3e7b Create untested configuration for hosting an F-Droid repository. 2025-11-01 04:28:27 -07:00
10 changed files with 342 additions and 54 deletions

View File

@@ -0,0 +1,119 @@
# Build a container which hosts Android apps through an F-Droid repository.
# https://f-droid.org/en/docs/Setup_an_F-Droid_App_Repo/
# Base Image #
FROM debian:trixie-slim
# Setup #
#ARG REPO
#ENV REPO="$REPO"
#ARG WEBROOT
#ENV WEBROOT="$WEBROOT"
ARG REPO_DOMAIN
ENV REPO_DOMAIN="$REPO_DOMAIN"
ARG REPO_NAME
ENV REPO_NAME="$REPO_NAME"
ENV WEBROOT="/var/www/html"
ENV FDROID="/root/fdroid"
ENV REPO="$FDROID/repo"
ARG FILE00
ENV FILE00="$FILE00"
ARG FILE01
ENV FILE01="$FILE01"
ARG FILE02
ENV FILE02="$FILE02"
ARG FILE03
ENV FILE03="$FILE03"
ARG FILE04
ENV FILE04="$FILE04"
ARG FILE05
ENV FILE05="$FILE05"
ARG FILE06
ENV FILE06="$FILE06"
ARG FILE07
ENV FILE07="$FILE07"
ARG FILE08
ENV FILE08="$FILE08"
ARG FILE09
ENV FILE09="$FILE09"
ARG FILE10
ENV FILE10="$FILE10"
ARG FILE11
ENV FILE11="$FILE11"
ARG FILE12
ENV FILE12="$FILE12"
ARG FILE13
ENV FILE13="$FILE13"
ARG FILE14
ENV FILE14="$FILE14"
ARG FILE15
ENV FILE15="$FILE15"
ARG FILE16
ENV FILE16="$FILE16"
ARG FILE17
ENV FILE17="$FILE17"
ARG FILE18
ENV FILE18="$FILE18"
ARG FILE19
ENV FILE19="$FILE19"
# Install Packages#
# https://f-droid.org/en/docs/Installing_the_Server_and_Repo_Tools/#debianubuntumintetc
RUN apt-get update && apt-get install -y sudo bash curl git vim nginx
COPY files/debian-backports.sources /etc/apt/sources.list.d/
RUN apt-get update && apt-get install -y -t trixie-backports fdroidserver
# Generate F-Droid Repo #
USER root
RUN mkdir -pv "$FDROID"
WORKDIR "$FDROID"
RUN fdroid init
# Configure F-Droid Repo #
RUN sed -i "$ a repo_url: $REPO_DOMAIN/fdroid/repo" "$FDROID/config.yml"
RUN sed -i "$ a repo_name: $REPO_NAME" "$FDROID/config.yml"
RUN fdroid update
# Download Remote Files #
RUN mkdir -pv /root/fdroid/repo
RUN bash -c 'if [[ -n "$FILE00" ]]; then wget -P "$REPO" "$FILE00"; fi'
RUN bash -c 'if [[ -n "$FILE01" ]]; then wget -P "$REPO" "$FILE01"; fi'
RUN bash -c 'if [[ -n "$FILE02" ]]; then wget -P "$REPO" "$FILE02"; fi'
RUN bash -c 'if [[ -n "$FILE03" ]]; then wget -P "$REPO" "$FILE03"; fi'
RUN bash -c 'if [[ -n "$FILE04" ]]; then wget -P "$REPO" "$FILE04"; fi'
RUN bash -c 'if [[ -n "$FILE05" ]]; then wget -P "$REPO" "$FILE05"; fi'
RUN bash -c 'if [[ -n "$FILE06" ]]; then wget -P "$REPO" "$FILE06"; fi'
RUN bash -c 'if [[ -n "$FILE07" ]]; then wget -P "$REPO" "$FILE07"; fi'
RUN bash -c 'if [[ -n "$FILE08" ]]; then wget -P "$REPO" "$FILE08"; fi'
RUN bash -c 'if [[ -n "$FILE09" ]]; then wget -P "$REPO" "$FILE09"; fi'
RUN bash -c 'if [[ -n "$FILE10" ]]; then wget -P "$REPO" "$FILE10"; fi'
RUN bash -c 'if [[ -n "$FILE11" ]]; then wget -P "$REPO" "$FILE11"; fi'
RUN bash -c 'if [[ -n "$FILE12" ]]; then wget -P "$REPO" "$FILE12"; fi'
RUN bash -c 'if [[ -n "$FILE13" ]]; then wget -P "$REPO" "$FILE13"; fi'
RUN bash -c 'if [[ -n "$FILE14" ]]; then wget -P "$REPO" "$FILE14"; fi'
RUN bash -c 'if [[ -n "$FILE15" ]]; then wget -P "$REPO" "$FILE15"; fi'
RUN bash -c 'if [[ -n "$FILE16" ]]; then wget -P "$REPO" "$FILE16"; fi'
RUN bash -c 'if [[ -n "$FILE17" ]]; then wget -P "$REPO" "$FILE17"; fi'
RUN bash -c 'if [[ -n "$FILE18" ]]; then wget -P "$REPO" "$FILE18"; fi'
RUN bash -c 'if [[ -n "$FILE19" ]]; then wget -P "$REPO" "$FILE19"; fi'
RUN fdroid update -c
# Publish Repo Contents to Web Root #
RUN cp -r "$REPO/"* "$WEBROOT/"
RUN service nginx start
# Start Container #
CMD nginx -g "daemon off;"

View File

@@ -0,0 +1,15 @@
# F-Droid Repo
Simple container to create a 3rd party repository to be imported into F-Droid.
Downloads all the APKs during the build process and loads them automatically,
does not need any interaction other than modifying the `.env` with the URLs
of the apps you would like to be present.
If any apps get updated, rebuilding the container should pull any changes.
``` shell
docker compose down
docker compose build
docker compose up -d
```

View File

@@ -0,0 +1,71 @@
# 2025-11-01 Hyperling
# Create a 3rd party F-Droid repository for providing app updates.
services:
app:
container_name: fd-app
build:
context: ./
network: host
args:
#WEBROOT: ${WEBROOT}
#REPO: ${REPO}
REPO_DOMAIN: ${REPO_DOMAIN}
REPO_NAME: ${REPO_NAME}
FILE00: ${FILE00}
FILE01: ${FILE01}
FILE02: ${FILE02}
FILE03: ${FILE03}
FILE04: ${FILE04}
FILE05: ${FILE05}
FILE06: ${FILE06}
FILE07: ${FILE07}
FILE08: ${FILE08}
FILE09: ${FILE09}
FILE10: ${FILE10}
FILE11: ${FILE11}
FILE12: ${FILE12}
FILE13: ${FILE13}
FILE14: ${FILE14}
FILE15: ${FILE15}
FILE16: ${FILE16}
FILE17: ${FILE17}
FILE18: ${FILE18}
FILE19: ${FILE19}
restart: always
ports:
- "8015:80"
environment:
#- WEBROOT=$WEBROOT
#- REPO=$REPO
- REPO_DOMAIN=$REPO_DOMAIN
- REPO_NAME=$REPO_NAME
- FILE00=$FILE00
- FILE01=$FILE01
- FILE02=$FILE02
- FILE03=$FILE03
- FILE04=$FILE04
- FILE05=$FILE05
- FILE06=$FILE06
- FILE07=$FILE07
- FILE08=$FILE08
- FILE09=$FILE09
- FILE10=$FILE10
- FILE11=$FILE11
- FILE12=$FILE12
- FILE13=$FILE13
- FILE14=$FILE14
- FILE15=$FILE15
- FILE16=$FILE16
- FILE17=$FILE17
- FILE18=$FILE18
- FILE19=$FILE19
#volumes:
# #- ../../Volumes/F-DroidRepo/fdroid:/root/fdroid
# - ../../Volumes/F-DroidRepo/nginx:/var/www/html
deploy:
mode: global
resources:
limits:
cpus: $CPU
memory: $MEM

View File

@@ -0,0 +1,49 @@
# This file will need copied as `.env` and to have its values changed.
## Docker ##
COMPOSE_BAKE=true
## Performance ##
CPU=0.25
MEM=0.25G
## Repo Settings ##
#WEBROOT="/var/www/html"
#REPO="/root/fdroid"
REPO_DOMAIN="https://fdroid.hyperling.com"
REPO_NAME="Hyperling's Apps"
## Files ##
# Should be provided as URLs directly to the APK files.
# TBD/TODO: Remove version from app and have it in the APK?
#FILE00="https://git.hyperling.com/me/android-carb-up/releases/download/latest/TBD"
#FILE01="https://git.hyperling.com/me/flutter-expense-tracker/releases/download/latest/TBD"
#FILE02="https://git.hyperling.com/me/android-infinite-timer/releases/download/latest/TBD"
#FILE03="https://git.hyperling.com/me/android-45-minute-rule/releases/download/latest/TBD"
#FILE04="https://git.hyperling.com/me/android-tictactoe/releases/download/latest/TBD"
#FILE05="https://git.hyperling.com/me/android-hypergames/releases/download/latest/TBD"
FILE00="https://git.hyperling.com/me/android-carb-up/releases/download/latest/CarbUp_v1.0.1.apk"
FILE01="https://git.hyperling.com/me/flutter-expense-tracker/releases/download/latest/ExpenseTracker_v0.1.3.apk"
FILE02="https://git.hyperling.com/me/android-infinite-timer/releases/download/latest/InfiniteTimer_v1.1.1.apk"
FILE03="https://git.hyperling.com/me/android-45-minute-rule/releases/download/latest/The45MinuteRule_v1.0.7.apk"
FILE04="https://git.hyperling.com/me/android-tictactoe/releases/download/latest/TicTacToe_v1.1.0.apk"
FILE05="https://git.hyperling.com/me/android-hypergames/releases/download/latest/HyperGames_v0.0.11.apk"
FILE06=""
FILE07=""
FILE08=""
FILE09=""
FILE10="https://git.hyperling.com/me/ebook-freedom-flyer/releases/download/latest/VoluntarySovereignty.pdf"
FILE11="https://git.hyperling.com/me/ebook-health-protocol/releases/download/latest/HyperlingsHealthProtocol.pdf"
FILE12=""
FILE13=""
FILE14=""
FILE15=""
FILE16=""
FILE17=""
FILE18=""
FILE19=""

View File

@@ -0,0 +1,6 @@
Types: deb deb-src
URIs: http://deb.debian.org/debian
Suites: trixie-backports
Components: main contrib non-free non-free-firmware
Signed-By: /usr/share/keyrings/debian-archive-keyring.gpg
Enabled: yes

View File

@@ -1,5 +1,5 @@
# Hyperling.com - files/ # Hyperling.com - files/
This is copied to the container's www/files/ folder for hosting static content. This is a volume for the container's /var/www/files/ which hosts static content.
TBD: Make this a volume, rather than copying with `Dockerfile`. TBD: Move this to Volumes?

View File

@@ -4,7 +4,6 @@
DIR="$(dirname -- "${BASH_SOURCE[0]}")" DIR="$(dirname -- "${BASH_SOURCE[0]}")"
source $DIR/.env source $DIR/.env
source ../../source.env
## Main ## ## Main ##

View File

@@ -0,0 +1,11 @@
# 2025-11-11 Hyperling
# Basic container for testing commands in a blank slate environment.
services:
app:
container_name: sandbox
image: debian:trixie-slim
command: "tail -F /var/mail/*"
working_dir: /root
volumes:
- ../../Volumes/Sandbox/root-shared:/root/shared

View File

@@ -17,7 +17,39 @@
services: services:
wp-db: app:
container_name: wp-app
image: wordpress:latest
restart: always
ports:
- 8080:80
depends_on:
db:
condition: service_healthy
links:
- db
volumes:
- ../../Volumes/WordPress/wordpress:/var/www/html
environment:
WORDPRESS_ADMIN_USERNAME: $WORDPRESS_ADMIN_USERNAME
WORDPRESS_ADMIN_PASSWORD: $WORDPRESS_ADMIN_PASSWORD
WORDPRESS_DB_HOST: wp-db
WORDPRESS_DB_NAME: $MARIADB_DATABASE
# TBD/TODO: Does not work, but recommended. :(
#WORDPRESS_DB_USER: $MARIADB_USER
#WORDPRESS_DB_PASSWORD: $MARIADB_PASSWORD
# Works, but not recommended. Lol.
WORDPRESS_DB_USER: root
WORDPRESS_DB_PASSWORD: $MARIADB_ROOT_PASSWORD
WORDPRESS_DEBUG: $WORDPRESS_DEBUG
deploy:
mode: global
resources:
limits:
cpus: $WP_CPU
memory: $WP_MEM
db:
container_name: wp-db container_name: wp-db
image: mariadb:lts image: mariadb:lts
restart: always restart: always
@@ -36,45 +68,9 @@ services:
MARIADB_PASSWORD: MARIADB_PASSWORD MARIADB_PASSWORD: MARIADB_PASSWORD
MARIADB_ROOT_PASSWORD: $MARIADB_ROOT_PASSWORD MARIADB_ROOT_PASSWORD: $MARIADB_ROOT_PASSWORD
MARIADB_AUTO_UPGRADE: $MARIADB_AUTO_UPGRADE MARIADB_AUTO_UPGRADE: $MARIADB_AUTO_UPGRADE
WP_CPU_DB: $WP_CPU_DB
WP_MEM_DB: $WP_MEM_DB
deploy: deploy:
mode: global mode: global
resources: resources:
limits: limits:
cpus: $WP_CPU_DB cpus: $WP_CPU_DB
memory: $WP_MEM_DB memory: $WP_MEM_DB
wp-app:
container_name: wp-app
image: wordpress:latest
restart: always
ports:
- 8080:80
depends_on:
wp-db:
condition: service_healthy
links:
- wp-db
volumes:
- ../../Volumes/WordPress/wordpress:/var/www/html
environment:
WORDPRESS_ADMIN_USERNAME: $WORDPRESS_ADMIN_USERNAME
WORDPRESS_ADMIN_PASSWORD: $WORDPRESS_ADMIN_PASSWORD
WORDPRESS_DB_HOST: wp-db
WORDPRESS_DB_NAME: $MARIADB_DATABASE
# TBD/TODO: Does not work, but recommended. :(
#WORDPRESS_DB_USER: $MARIADB_USER
#WORDPRESS_DB_PASSWORD: $MARIADB_PASSWORD
# Works, but not recommended. Lol.
WORDPRESS_DB_USER: root
WORDPRESS_DB_PASSWORD: $MARIADB_ROOT_PASSWORD
WORDPRESS_DEBUG: $WORDPRESS_DEBUG
WP_CPU: $WP_CPU
WP_MEM: $WP_MEM
deploy:
mode: global
resources:
limits:
cpus: $WP_CPU
memory: $WP_MEM

View File

@@ -16,7 +16,7 @@ function usage() {
# 1) The exit code used when leaving. # 1) The exit code used when leaving.
exit_code=$1 exit_code=$1
echo "" echo ""
echo -n "Usage: $PROG [-A ( -u | -d | -b | -p | -c | -s )] " 1>&2 echo -n "Usage: $PROG [-A ( -u | -d | -b | -p | -c | -m | -s )] " 1>&2
echo "[-i CONTAINER] [-l CONTAINER] [-h]" 1>&2 echo "[-i CONTAINER] [-l CONTAINER] [-h]" 1>&2
cat <<- EOF cat <<- EOF
@@ -26,7 +26,7 @@ function usage() {
Parameters - Standalone: Parameters - Standalone:
(ALL) (ALL)
-A : Equivalent of specifying '-udbpcs' for a full upgrade service. -A : Equivalent of specifying '-udbpcms' for a full upgrade service.
(UP) (UP)
-u : Start all containers with 'up -d'. -u : Start all containers with 'up -d'.
@@ -43,6 +43,9 @@ function usage() {
(CLEAN) (CLEAN)
-c : Remove any abandoned Docker objects using the 'prune' commands. -c : Remove any abandoned Docker objects using the 'prune' commands.
(MAINTENANCE)
-m : Run any maintenance and/or purge scripts for each subproject.
(STATS) (STATS)
-s : Tune in to the 'stats' of how each container is running. -s : Tune in to the 'stats' of how each container is running.
@@ -86,7 +89,7 @@ function check_container() {
## Parameters ## ## Parameters ##
while getopts ':Audbpcsi:l:h' opt; do while getopts ':Audbpcsi:l:mh' opt; do
case $opt in case $opt in
A) all="Y" ;; A) all="Y" ;;
u) up="Y" ;; u) up="Y" ;;
@@ -97,30 +100,31 @@ while getopts ':Audbpcsi:l:h' opt; do
s) stats="Y" ;; s) stats="Y" ;;
i) interact="$OPTARG" ;; i) interact="$OPTARG" ;;
l) logs="$OPTARG" ;; l) logs="$OPTARG" ;;
m) maintenance="Y" ;;
h) usage 0 ;; h) usage 0 ;;
*) echo "ERROR: Parameter '$OPTARG' not recognized." 1>&2 && usage 1 ;; *) echo "ERROR: Parameter '$OPTARG' not recognized." 1>&2 && usage 1 ;;
esac esac
done done
# This is done outside the getopts for readability. # This is done outside the getopts for readability.
if [[ -n $all ]]; then if [[ -n "$all" && "$all" == "Y" ]]; then
up="Y"; down="Y"; build="Y"; pull="Y"; clean="Y"; stats="Y" up="Y"; down="Y"; build="Y"; pull="Y"; clean="Y"; stats="Y"; maintenance="Y"
fi fi
## Validations ## ## Validations ##
# Script will behave poorly if not run with admin privileges. # Script will behave poorly if not run with admin privileges.
if [[ $LOGNAME != "root" ]]; then if [[ "$LOGNAME" != "root" ]]; then
echo "*************************************************************" echo "*************************************************************"
echo "WARNING: Script is intended for root. Please su or sudo/doas." echo "WARNING: Script is intended for root. Please su or sudo/doas."
echo "*************************************************************" echo "*************************************************************"
fi fi
# Options which only work if the container exists or is going to be started. # Options which only work if the container exists or is going to be started.
if [[ -n $interact ]]; then if [[ -n "$interact" ]]; then
check_container $interact interaction check_container $interact interaction
fi fi
if [[ -n $logs ]]; then if [[ -n "$logs" ]]; then
check_container $logs logs check_container $logs logs
fi fi
@@ -128,14 +132,14 @@ fi
# If no parameters are passed, list all the containers which are running. # If no parameters are passed, list all the containers which are running.
if [[ -z $up && -z $down && -z $build && -z $pull && -z $clean if [[ -z $up && -z $down && -z $build && -z $pull && -z $clean
&& -z $interact && -z $logs && -z $stats && -z $interact && -z $logs && -z $stats && -z $maintenance
]]; then ]]; then
docker ps --size docker ps --size
exit 0 exit 0
fi fi
# Otherwise, loop through all the subproject configurations. # Otherwise, loop through all the subproject configurations.
if [[ -n $up || -n $down || -n $build || -n $pull ]]; then if [[ -n $up || -n $down || -n $build || -n $pull || -n $maintenance ]]; then
cd $DOCKER_HOME/Config cd $DOCKER_HOME/Config
for dir in `ls`; do for dir in `ls`; do
# If this is a directory, enter it, otherwise skip to the next listing. # If this is a directory, enter it, otherwise skip to the next listing.
@@ -143,10 +147,10 @@ if [[ -n $up || -n $down || -n $build || -n $pull ]]; then
echo "" echo ""
pwd pwd
# Ensure .env files exist so that all compose variables are populated. # Ensure env file exists so that all compose variables are populated.
if [[ -e ./env.standard && ! -e ./.env ]]; then if [[ -e ./example.env && ! -e ./.env ]]; then
echo "WARNING: .env file was not found, copying standard as placeholder." echo "WARNING: .env file was not found, copying example as placeholder."
cp -v env.standard .env cp -v example.env .env
fi fi
# Ensure all configuration files have been created. # Ensure all configuration files have been created.
@@ -160,6 +164,21 @@ if [[ -n $up || -n $down || -n $build || -n $pull ]]; then
done done
fi fi
# Run the prep script to create any necessary volumes.
if [[ -f prep.sh ]]; then
./prep.sh
fi
# Run any maintenance scripts associate with the container.
if [[ "$maintenance" == "Y" ]]; then
if [[ -f "maintenance.sh" ]]; then
./maintenance.sh
fi
if [[ -f "purge.sh" ]]; then
./purge.sh
fi
fi
# Shut off container. # Shut off container.
if [[ $down == "Y" ]]; then if [[ $down == "Y" ]]; then
[ -e docker-compose.yml ] && docker compose down [ -e docker-compose.yml ] && docker compose down
@@ -200,6 +219,9 @@ if [[ -n $clean ]]; then
docker network prune docker network prune
docker builder prune -a docker builder prune -a
docker system df docker system df
echo "Syncing."
sync
sleep 5
fi fi
# Follow the logs of a container. # Follow the logs of a container.