Cleaner file structure
The existing structure is unnecessarily complicated:
- The different source files are intermingled with the rest, all the source directories have to be set for each tool manually.
- There are some directories that need to be accessible from the HTTP server but they are again located in different places (public and data).
- There are directories that need to be writeable and not accessible.
Goals
- Related files and directories should be grouped together.
- Files that should not be accessible should not be grouped with public ones.
- Configuring web server should be simple – there should not be any complicated rewrite rules so that selfoss could be installed on non-traditional servers without much work.
- Installation should be simple (
chmoding as few directories as possible).
Proposed directory structure
- 📂 data (writeable)
- 📁 cache
- 📁 logs
- 📁 sqlite
- 📄 config.ini
- 📁 plugins
- 📂 public (accessible)
- 📂 assets
- 📁 css
- 📁 fonts
- 📁 images
- 📁 js
- 📄 favicon.svg
- 📂 gen (writeable)
- 📁 favicons
- 📁 thumbnails
- 📄 all.css
- 📄 all.js
- 📂 assets
- 📂 src
- 📁 controllers
- 📁 daos
- 📁 helpers
- 📁 lang
- 📁 spouts
- 📁 templates
- 📄 common.php
- 📁 tests
- 📁 utils
- 📁 vendor
- 📄 .htaccess
- 📄 index.php
- 📄 README.md
- 📄 run.php
The public directory can either be set as document root of virtual host or there can be a simple .htaccess in the parent directory.
Further goals to consider
- Automated installer should be able to write
config.ini,datais thus a good location for it. - I would like to split selfoss-client off of selfoss. That would mean selfoss would drop the
templatesandassetsdirectories, only keeping the API,faviconsandthumbnails. - Maybe selfoss could be compiled to PHAR to reduce the number of files (faster upload to FTP). At least the
publicanddatadirectories would need to be kept outside. - If we created a plugin manager as a part of selfoss, it would need to be able to write to plugins directory.
- There should be a place for tests, it should be easily separable from the source code so it could be excluded in the build.
Simpler .htaccess
<IfModule mod_rewrite.c>
RewriteEngine On
# RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule !\.(pdf|js|ico|gif|jpg|png|css|rar|zip|tar\.gz)$ index.php [L]
</IfModule>
Nice.
- We should plan for a test directory or make the planned structure not incompatible with the presence of such directory.
- Some people run selfoss in restricted hosting and do not have access to setting the document root: the document root is the upload root. Therefore, I think
index.phpin the projet root cannot be avoided, although for people selfoss on less restricted environments, putting the libs out of the document root is desirable. We should support both.
- I would place the
testsdirectory to the root. Other possible location issrc/tests, which could make linting them easier but they would have to be explicitly excluded from the build. For that reason, placing tests next to the file/class they test is out of the game. - Actually, I am one of those people.
-
The problem could be fixed by placing an additional
.htaccessin the project root, that would rewrite to the document root. In pseudo-code:if $url begins with 'public/' remove prefix 'public/' rewrite (.*) to public/$1It might be slightly confusing what the document root should be, but that could be rectified in the docs.
-
Keeping the
index.phpin the project root would mean one fewer.htaccessbut there would need to be access control at least for thedatadirectory.
-
With #1137, we will be one step closer:
- 📂 assets
- 📁 css
- 📁 images
- 📁 js
- 📁 locale
- 📂 data (writeable)
- 📁 cache
- 📁 logs
- 📁 sqlite
- 📁 favicons (still here)
- 📁 thumbnails (still here)
- 📂 public (accessible, generated statically)
- 📄 all.css
- 📄 all.js
- 📂 src
- 📁 controllers
- 📁 daos
- 📁 helpers
- 📁 spouts
- 📁 templates
- 📄 common.php
- 📁 utils
- 📁 vendor
- 📄 .htaccess
- 📄 config.ini (still here)
- 📄 index.php
- 📄 README.md
- 📄 run.php