From e52f8750b879ae8c4ad5c79812c00cf2c2f6f0d9 Mon Sep 17 00:00:00 2001 From: Kevin Whitaker Date: Sat, 3 Jan 2026 11:28:21 -0500 Subject: [PATCH] first test --- CloudronManifest.json | 11 +++++ Dockerfile | 86 +++++++++++++++++++++++++++++++++++++++ logo.png | Bin 0 -> 5579 bytes start.sh | 31 ++++++++++++++ supervisor/backend.conf | 12 ++++++ supervisor/frontend.conf | 12 ++++++ 6 files changed, 152 insertions(+) create mode 100644 CloudronManifest.json create mode 100644 Dockerfile create mode 100644 logo.png create mode 100755 start.sh create mode 100644 supervisor/backend.conf create mode 100644 supervisor/frontend.conf diff --git a/CloudronManifest.json b/CloudronManifest.json new file mode 100644 index 0000000..c1eec74 --- /dev/null +++ b/CloudronManifest.json @@ -0,0 +1,11 @@ +{ + "title": "Romm", + "version": "0.1.0", + "healthCheckPath": "/", + "httpPort": 3000, + "addons": { + "localstorage": {}, + "postgresql": {} + }, + "manifestVersion": 2 +} diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..338a7a1 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,86 @@ +FROM cloudron/base:5.0.0@sha256:04fd70dbd8ad6149c19de39e35718e024417c3e01dc9c6637eaf4a41ec4e596c + +RUN mkdir -p /app/code +WORKDIR /app/code +ARG VERSION=4.5.0 + +# Prevent interactive prompts during installation +ENV DEBIAN_FRONTEND=noninteractive + +# Install system dependencies +RUN apt-get update && apt-get install -y --no-install-recommends \ + git \ + make \ + gcc \ + g++ \ + libmariadb3 \ + libmariadb-dev \ + libpq-dev \ + libffi-dev \ + musl-dev \ + curl \ + ca-certificates \ + libmagic-dev \ + 7zip \ + tzdata \ + libbz2-dev \ + libssl-dev \ + libreadline-dev \ + libsqlite3-dev \ + zlib1g-dev \ + liblzma-dev \ + libncurses5-dev \ + libncursesw5-dev \ + unzip \ + && apt-get clean \ + && rm -rf /var/lib/apt/lists/* + +# Clone release +RUN wget https://github.com/rommapp/romm/archive/refs/tags/$VERSION.zip && \ +unzip $VERSION.zip -d /app/code && rm $VERSION.zip + +# Install nvm +ENV NVM_DIR="/root/.nvm" +RUN curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.0/install.sh | bash \ + && . "$NVM_DIR/nvm.sh" \ + && nvm install 18.20.8 \ + && nvm use 18.20.8 \ + && nvm alias default 18.20.8 +ENV PATH="$NVM_DIR/versions/node/v18.20.8/bin:$PATH" + +# Build and install RAHasher (optional for RA hashes) +RUN git clone --recursive --branch 1.8.1 --depth 1 https://github.com/RetroAchievements/RALibretro.git /tmp/RALibretro +WORKDIR /tmp/RALibretro +RUN sed -i '22a #include ' ./src/Util.h \ + && sed -i '6a #include ' \ + ./src/libchdr/deps/zlib-1.3.1/gzlib.c \ + ./src/libchdr/deps/zlib-1.3.1/gzread.c \ + ./src/libchdr/deps/zlib-1.3.1/gzwrite.c \ + && make HAVE_CHD=1 -f ./Makefile.RAHasher \ + && cp ./bin64/RAHasher /usr/bin/RAHasher +RUN rm -rf /tmp/RALibretro + +# Install frontend dependencies +COPY frontend/package.json /app/code/frontend/ +WORKDIR /app/code/frontend +RUN npm install + +# Install uv for the non-root user +COPY --from=ghcr.io/astral-sh/uv:0.7.19 /uv /uvx /usr/local/bin/ + +# Install Python +RUN uv python install 3.13 + + +# Copy project files (including pyproject.toml and uv.lock) +COPY pyproject.toml uv.lock* .python-version /app/code/ + +# Install Python dependencies +RUN uv sync --all-extras + +ENV PATH="/app/code/.venv/bin:${PATH}" + +COPY start.sh /app/pkg/ + +CMD [ "/app/pkg/start.sh" ] + diff --git a/logo.png b/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..cb59239e3b4cc1e59535d64c7ab1daf29e0f046d GIT binary patch literal 5579 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 literal 0 HcmV?d00001 diff --git a/start.sh b/start.sh new file mode 100755 index 0000000..f5b5414 --- /dev/null +++ b/start.sh @@ -0,0 +1,31 @@ +#!/bin/bash +set -eu + +mkdir -p /app/data/library /app/data/config /app/data/assets /app/data/resources + +# ensure that data directory is owned by 'cloudron' user +chown -R cloudron:cloudron /app/data + +cd /app/data + +if [ ! -f /app/data/.env ]; then +## Write new .env to import on restarts of the app +ROMM_AUTH_GEN=$(/usr/bin/openssl rand -hex 32) +cat >/app/data/.env < Starting supervisor" +exec /usr/bin/supervisord --configuration /etc/supervisor/supervisord.conf --nodaemon -i Romm diff --git a/supervisor/backend.conf b/supervisor/backend.conf new file mode 100644 index 0000000..25fe984 --- /dev/null +++ b/supervisor/backend.conf @@ -0,0 +1,12 @@ +[program:backend] +priority=5 +directory=/app/code/backend +environment=HOME=/app/code +command=uv run python main.py +user=cloudron +autostart=true +autorestart=true +stdout_logfile=/dev/stdout +stdout_logfile_maxbytes=0 +stderr_logfile=/dev/stderr +stderr_logfile_maxbytes=0 diff --git a/supervisor/frontend.conf b/supervisor/frontend.conf new file mode 100644 index 0000000..e043c22 --- /dev/null +++ b/supervisor/frontend.conf @@ -0,0 +1,12 @@ +[program:backend] +priority=5 +directory=/app/code/frontend +environment=HOME=/app/code +command=npm run prod +user=cloudron +autostart=true +autorestart=true +stdout_logfile=/dev/stdout +stdout_logfile_maxbytes=0 +stderr_logfile=/dev/stderr +stderr_logfile_maxbytes=0