improvements to run inside docker

autocomplete
Shish 3 years ago
parent 9d3939b87f
commit ad9cca36b1
  1. 1
      .dockerignore
  2. 9
      .github/workflows/test_and_publish.yml
  3. 42
      Dockerfile
  4. 20
      README.md
  5. 70
      core/install.php
  6. 2
      ext/index/theme.php
  7. 2
      ext/static_files/style.css
  8. 2
      tests/bootstrap.php
  9. 7
      tests/docker-init.sh

@ -5,3 +5,4 @@ data
images
thumbs
*.sqlite
Dockerfile

@ -64,13 +64,13 @@ jobs:
- name: Run test suite
run: |
if [[ "${{ matrix.database }}" == "pgsql" ]]; then
export DSN="pgsql:user=shimmie;password=shimmie;host=127.0.0.1;dbname=shimmie"
export TEST_DSN="pgsql:user=shimmie;password=shimmie;host=127.0.0.1;dbname=shimmie"
fi
if [[ "${{ matrix.database }}" == "mysql" ]]; then
export DSN="mysql:user=root;password=root;host=127.0.0.1;dbname=shimmie"
export TEST_DSN="mysql:user=root;password=root;host=127.0.0.1;dbname=shimmie"
fi
if [[ "${{ matrix.database }}" == "sqlite" ]]; then
export DSN="sqlite:data/shimmie.sqlite"
export TEST_DSN="sqlite:data/shimmie.sqlite"
fi
vendor/bin/phpunit --configuration tests/phpunit.xml --coverage-clover=data/coverage.clover
@ -82,7 +82,7 @@ jobs:
name: Publish
runs-on: ubuntu-latest
needs: test
if: github.ref == 'refs/heads/master'
if: github.event_name == 'push'
steps:
- uses: actions/checkout@master
- name: Publish to Registry
@ -92,3 +92,4 @@ jobs:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
cache: ${{ github.event_name != 'schedule' }}
buildoptions: "--build-arg RUN_TESTS=false"

@ -1,19 +1,39 @@
# "Build" shimmie (composer install - done in its own stage so that we don't
# need to include all the composer fluff in the final image)
FROM debian:stable-slim
RUN apt update && apt install -y composer php7.3-gd php7.3-dom php7.3-sqlite3 imagemagick
COPY composer.json composer.lock /app/
WORKDIR /app
RUN composer install
COPY . /app/
ARG RUN_TESTS=true
RUN [ $RUN_TESTS = false ] || (\
echo '=== Installing ===' && mkdir -p data/config && INSTALL_DSN="sqlite:data/shimmie.sqlite" php index.php && \
echo '=== Smoke Test ===' && php index.php get-page /post/list && \
echo '=== Unit Tests ===' && ./vendor/bin/phpunit --configuration tests/phpunit.xml && \
echo '=== Coverage ===' && ./vendor/bin/phpunit --configuration tests/phpunit.xml --coverage-text && \
echo '=== Cleaning ===' && rm -rf data)
# Build su-exec so that our final image can be nicer
FROM debian:stable-slim
RUN apt-get update && apt-get install -y --no-install-recommends gcc libc-dev curl
RUN curl -k -o /usr/local/bin/su-exec.c https://raw.githubusercontent.com/ncopa/su-exec/master/su-exec.c; \
gcc -Wall /usr/local/bin/su-exec.c -o/usr/local/bin/su-exec; \
chown root:root /usr/local/bin/su-exec; \
chmod 0755 /usr/local/bin/su-exec;
# Actually run shimmie
FROM debian:stable-slim
ENV DEBIAN_FRONTEND=noninteractive
EXPOSE 8000
HEALTHCHECK --interval=5m --timeout=3s CMD curl --fail http://127.0.0.1:8000/ || exit 1
ENV UID=1000 \
GID=1000
RUN apt update && apt install -y curl \
php7.3-cli php7.3-gd php7.3-pgsql php7.3-mysql php7.3-sqlite3 php7.3-zip php7.3-dom php7.3-mbstring php-xdebug \
composer imagemagick vim zip unzip
composer imagemagick vim zip unzip && \
rm -rf /var/lib/apt/lists/*
COPY --from=0 /app /app
COPY --from=1 /usr/local/bin/su-exec /usr/local/bin/su-exec
COPY composer.json composer.lock /app/
WORKDIR /app
RUN composer install
COPY . /app/
#RUN echo '=== Installing ===' && mkdir -p data/config && echo "<?php \$dsn = \"sqlite:data/shimmie.sqlite\";" > data/config/auto_install.conf.php && php index.php && \
# echo '=== Smoke Test ===' && php index.php get-page /post/list && \
# echo '=== Unit Tests ===' && ./vendor/bin/phpunit --configuration tests/phpunit.xml && \
# echo '=== Coverage ===' && ./vendor/bin/phpunit --configuration tests/phpunit.xml --coverage-text && \
# echo '=== Cleaning ===' && rm -rf data
CMD ["/bin/sh", "/app/tests/docker-init.sh"]

@ -48,23 +48,21 @@ check out one of the versioned branches.
5. Follow instructions noted in "Installation" starting from step 3.
# Docker
Useful for testing in a known-good environment, this command will build a
simple debian image and run all the unit tests inside it:
If you just want to run shimmie inside docker, there's a pre-built image
in dockerhub - `shish2k/shimmie2` - which can be used like:
```
docker build -t shimmie .
docker run -p 8000 -v /my/hard/drive:/app/data shish2k/shimmie2
```
Once you have an image which has passed all tests, you can then run it to get
a live system:
If you want to build your own image from source:
```
docker run -p 0.0.0.0:8123:8000 -v /mnt/shimmie-data:/app/data shimmie
docker build -t shimmie .
```
Then you can visit your server on port 8123 to see the site, with data
stored in /mnt/shimmie-data on your local drive.
There are various options settable with environment variables:
- `UID` / `GID` - which user ID to run as (default 1000/1000)
- `INSTALL_DSN` - specify a data source to install into, to skip the installer screen, eg
`-e INSTALL_DSN="pgsql:user=shimmie;password=6y5erdfg;host=127.0.0.1;dbname=shimmie"`
### Upgrade from earlier versions

@ -18,7 +18,6 @@
function install()
{
date_default_timezone_set('UTC');
define("DATABASE_TIMEOUT", 10000);
if (is_readable("data/config/shimmie.conf.php")) {
exit_with_page(
@ -59,10 +58,8 @@ function install()
function get_dsn()
{
if (file_exists("data/config/auto_install.conf.php")) {
$dsn = null;
/** @noinspection PhpIncludeInspection */
require_once "data/config/auto_install.conf.php";
if (getenv("INSTALL_DSN")) {
$dsn = getenv("INSTALL_DSN");;
} elseif (@$_POST["database_type"] == DatabaseDriver::SQLITE) {
/** @noinspection PhpUnhandledExceptionInspection */
$id = bin2hex(random_bytes(5));
@ -136,37 +133,34 @@ function ask_questions()
$warn_msg
$err_msg
<h3>Database Install</h3>
<form action="index.php" method="POST">
<div style="text-align: center;">
<table class='form'>
<tr>
<th>Type:</th>
<td><select name="database_type" id="database_type" onchange="update_qs();">
$db_m
$db_p
$db_s
</select></td>
</tr>
<tr class="dbconf mysql pgsql">
<th>Host:</th>
<td><input type="text" name="database_host" size="40" value="localhost"></td>
</tr>
<tr class="dbconf mysql pgsql">
<th>Username:</th>
<td><input type="text" name="database_user" size="40"></td>
</tr>
<tr class="dbconf mysql pgsql">
<th>Password:</th>
<td><input type="password" name="database_password" size="40"></td>
</tr>
<tr class="dbconf mysql pgsql">
<th>DB&nbsp;Name:</th>
<td><input type="text" name="database_name" size="40" value="shimmie"></td>
</tr>
<tr><td colspan="2"><input type="submit" value="Go!"></td></tr>
</table>
</div>
<table class='form' style="margin: 1em auto;">
<tr>
<th>Type:</th>
<td><select name="database_type" id="database_type" onchange="update_qs();">
$db_m
$db_p
$db_s
</select></td>
</tr>
<tr class="dbconf mysql pgsql">
<th>Host:</th>
<td><input type="text" name="database_host" size="40" value="localhost"></td>
</tr>
<tr class="dbconf mysql pgsql">
<th>Username:</th>
<td><input type="text" name="database_user" size="40"></td>
</tr>
<tr class="dbconf mysql pgsql">
<th>Password:</th>
<td><input type="password" name="database_password" size="40"></td>
</tr>
<tr class="dbconf mysql pgsql">
<th>DB&nbsp;Name:</th>
<td><input type="text" name="database_name" size="40" value="shimmie"></td>
</tr>
<tr><td colspan="2"><input type="submit" value="Go!"></td></tr>
</table>
<script>
document.addEventListener('DOMContentLoaded', update_qs);
function q(n) {
@ -205,14 +199,14 @@ EOD
function create_dirs()
{
$data_exists = file_exists("data") || mkdir("data");
$data_writable = is_writable("data") || chmod("data", 0755);
$data_writable = $data_exists && (is_writable("data") || chmod("data", 0755));
if (!$data_exists || !$data_writable) {
throw new InstallerException(
"Directory Permissions Error:",
"<p>Shimmie needs to have a 'data' folder in its directory, writable by the PHP user.</p>
<p>If you see this error, if probably means the folder is owned by you, and it needs to be writable by the web server.</p>
<p>PHP reports that it is currently running as user: ".$_ENV["USER"]." (". $_SERVER["USER"] .")</p>
<p>PHP reports that it is currently running as user: ".get_current_user()." (". getmyuid() .")</p>
<p>Once you have created this folder and / or changed the ownership of the shimmie folder, hit 'refresh' to continue.</p>",
7
);
@ -319,7 +313,7 @@ function write_config($dsn)
}
if (file_put_contents("data/config/shimmie.conf.php", $file_content, LOCK_EX)) {
header("Location: index.php");
header("Location: index.php?flash=Installation%20complete");
exit_with_page(
"Installation Successful",
"<p>If you aren't redirected, <a href=\"index.php\">click here to Continue</a>."

@ -29,7 +29,7 @@ and of course start organising your images :-)
";
$page->set_title("Welcome to Shimmie ".VERSION);
$page->set_heading("Welcome to Shimmie");
$page->add_block(new Block("Installation Succeeded!", $text, "main", 0));
$page->add_block(new Block("Nothing here yet!", $text, "main", 0));
}
/**

@ -58,10 +58,10 @@ IMG.lazy {display: none;}
padding: 2px;
}
#installer H1 {
border-bottom: 1px solid black;
border-radius: 16px 16px 0 0;
}
#installer H3 {
border-top: 1px solid black;
border-bottom: 1px solid black;
}
#installer TH {

@ -21,7 +21,7 @@ $_tracer = new EventTracer();
$_tracer->begin("bootstrap");
_load_core_files();
$cache = new Cache(CACHE_DSN);
$dsn = getenv("DSN");
$dsn = getenv("TEST_DSN");
$database = new Database($dsn ? $dsn : "sqlite::memory:");
create_dirs();
create_tables($database);

@ -1,3 +1,6 @@
#!/bin/sh
echo "<?php define(\"DATABASE_DSN\", \"${DB_DSN}\");" > data/config/auto_install.conf.php
/usr/bin/php -d upload_max_filesize=50M -d post_max_size=50M -S 0.0.0.0:8000 tests/router.php
groupadd -g $GID shimmie
useradd -ms /bin/bash -u $UID -g $GID shimmie
mkdir /app/data
chown shimmie:shimmie /app/data
exec /usr/local/bin/su-exec shimmie:shimmie /usr/bin/php -d upload_max_filesize=50M -d post_max_size=50M -S 0.0.0.0:8000 tests/router.php

Loading…
Cancel
Save