improvements to run inside docker
This commit is contained in:
		
							parent
							
								
									9d3939b87f
								
							
						
					
					
						commit
						ad9cca36b1
					
				| @ -5,3 +5,4 @@ data | ||||
| images | ||||
| thumbs | ||||
| *.sqlite | ||||
| Dockerfile | ||||
|  | ||||
							
								
								
									
										9
									
								
								.github/workflows/test_and_publish.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										9
									
								
								.github/workflows/test_and_publish.yml
									
									
									
									
										vendored
									
									
								
							| @ -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" | ||||
|  | ||||
							
								
								
									
										46
									
								
								Dockerfile
									
									
									
									
									
								
							
							
						
						
									
										46
									
								
								Dockerfile
									
									
									
									
									
								
							| @ -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 | ||||
| ENV DEBIAN_FRONTEND=noninteractive | ||||
| EXPOSE 8000 | ||||
| HEALTHCHECK --interval=5m --timeout=3s CMD curl --fail http://127.0.0.1:8000/ || exit 1 | ||||
| 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 | ||||
| 
 | ||||
| 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/ | ||||
| #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 | ||||
| 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 | ||||
| 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 && \ | ||||
|     rm -rf /var/lib/apt/lists/* | ||||
| COPY --from=0 /app /app | ||||
| COPY --from=1 /usr/local/bin/su-exec /usr/local/bin/su-exec | ||||
| 
 | ||||
| WORKDIR /app | ||||
| CMD ["/bin/sh", "/app/tests/docker-init.sh"] | ||||
|  | ||||
							
								
								
									
										22
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										22
									
								
								README.md
									
									
									
									
									
								
							| @ -48,23 +48,21 @@ check out one of the versioned branches. | ||||
| 5. Follow instructions noted in "Installation" starting from step 3. | ||||
| 
 | ||||
| # Docker | ||||
| 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 run -p 8000 -v /my/hard/drive:/app/data shish2k/shimmie2 | ||||
| ``` | ||||
| 
 | ||||
| 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 want to build your own image from source: | ||||
| ``` | ||||
| docker build -t shimmie . | ||||
| ``` | ||||
| 
 | ||||
| Once you have an image which has passed all tests, you can then run it to get | ||||
| a live system: | ||||
| 
 | ||||
| ``` | ||||
| docker run -p 0.0.0.0:8123:8000 -v /mnt/shimmie-data:/app/data 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 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 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…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user