# production stage
FROM alpine:3.15
-ENV USER darkhttpd
-ENV GROUP darkhttpd
-ENV GID 911
-ENV UID 911
+ENV GID 1000
+ENV UID 1000
ENV PORT 8080
+ENV SUBFOLDER "/_"
+ENV INIT_ASSETS 1
-RUN addgroup -S ${GROUP} -g ${GID} && adduser -D -S -u ${UID} ${USER} ${GROUP} && \
- apk add -U --no-cache su-exec darkhttpd
+RUN addgroup -S lighttpd -g ${GID} && adduser -D -S -u ${UID} lighttpd lighttpd && \
+ apk add -U --no-cache lighttpd
-COPY --from=build-stage --chown=${USER}:${GROUP} /app/dist /www/
-COPY --from=build-stage --chown=${USER}:${GROUP} /app/dist/assets /www/default-assets
+WORKDIR /www
+
+COPY lighttpd.conf /lighttpd.conf
COPY entrypoint.sh /entrypoint.sh
+COPY --from=build-stage --chown=${UID}:${GID} /app/dist /www/
+COPY --from=build-stage --chown=${USER}:${GROUP} /app/dist/assets /www/default-assets
+
+USER ${UID}:${GID}
HEALTHCHECK --interval=30s --timeout=5s --retries=3 \
CMD wget --no-verbose --tries=1 --spider http://127.0.0.1:${PORT}/ || exit 1
EXPOSE ${PORT}
VOLUME /www/assets
+
ENTRYPOINT ["/bin/sh", "/entrypoint.sh"]
COPY --from=qemu qemu-arm-static /usr/bin/
-ENV USER darkhttpd
-ENV GROUP darkhttpd
+ENV USER lighttpd
+ENV GROUP lighttpd
ENV GID 911
ENV UID 911
ENV PORT 8080
+ENV SUBFOLDER "/_"
RUN addgroup -S ${GROUP} -g ${GID} && adduser -D -S -u ${UID} ${USER} ${GROUP} && \
- apk add -U --no-cache darkhttpd su-exec && \
+ apk add -U --no-cache lighttpd && \
rm /usr/bin/qemu-arm-static
+WORKDIR /www
+
+COPY lighttpd.conf /lighttpd.conf
COPY --from=build-stage --chown=${USER}:${GROUP} /app/dist /www/
-COPY --from=build-stage --chown=${USER}:${GROUP} /app/dist/assets /www/default-assets
-COPY entrypoint.sh /entrypoint.sh
+USER ${USER}
HEALTHCHECK --interval=30s --timeout=5s --retries=3 \
CMD wget --no-verbose --tries=1 --spider http://127.0.0.1:${PORT}/ || exit 1
EXPOSE ${PORT}
VOLUME /www/assets
-ENTRYPOINT ["/bin/sh", "/entrypoint.sh"]
+
+CMD ["lighttpd", "-D", "-f", "/lighttpd.conf"]
COPY --from=qemu qemu-aarch64-static /usr/bin/
-ENV USER darkhttpd
-ENV GROUP darkhttpd
+ENV USER lighttpd
+ENV GROUP lighttpd
ENV GID 911
ENV UID 911
ENV PORT 8080
+ENV SUBFOLDER "/_"
RUN addgroup -S ${GROUP} -g ${GID} && adduser -D -S -u ${UID} ${USER} ${GROUP} && \
- apk add -U --no-cache darkhttpd su-exec && \
+ apk add -U --no-cache lighttpd && \
rm /usr/bin/qemu-aarch64-static
+WORKDIR /www
+
+COPY lighttpd.conf /lighttpd.conf
COPY --from=build-stage --chown=${USER}:${GROUP} /app/dist /www/
-COPY --from=build-stage --chown=${USER}:${GROUP} /app/dist/assets /www/default-assets
-COPY entrypoint.sh /entrypoint.sh
+USER ${USER}
HEALTHCHECK --interval=30s --timeout=5s --retries=3 \
CMD wget --no-verbose --tries=1 --spider http://127.0.0.1:${PORT}/ || exit 1
EXPOSE ${PORT}
VOLUME /www/assets
-ENTRYPOINT ["/bin/sh", "/entrypoint.sh"]
+
+CMD ["lighttpd", "-D", "-f", "/lighttpd.conf"]
### Using docker
-To launch container:
-
```sh
docker run -d \
-p 8080:8080 \
b4bz/homer:latest
```
-Default assets will be automatically installed in the `/www/assets` directory. Use `UID` and/or `GID` env var to change the assets owner (`docker run -e "UID=1000" -e "GID=1000" [...]`).
+Environment variables:
+
+* **`INIT_ASSETS`** (default: `1`)
+Install exemple configuration file & assets (favicons, ...) to help you get started.
+
+* **`SUBFOLDER`** (default: `null`)
+If you would like to host Homer in a subfolder, (ex: *http://my-domain/**homer***), set this to the subfolder path (ex `/homer`).
+
### Using docker-compose
The `docker-compose.yml` file must be edited to match your needs.
-Set the port and volume (equivalent to `-p` and `-v` arguments):
+You probably want to set the port mapping and volume binding (equivalent to `-p` and `-v` arguments):
```yaml
volumes:
- 8080:8080
```
-To launch container:
+Then launch the container:
```sh
-cd /path/to/docker-compose.yml
+cd /path/to/docker-compose.yml/
docker-compose up -d
```
-Default assets will be automatically installed in the `/www/assets` directory. Use `UID` and/or `GID` env var to change the assets owner, also in `docker-compose.yml`:
-
-```yaml
-environment:
- - UID=1000
- - GID=1000
-```
-
### Using the release tarball (prebuilt, ready to use)
Download and extract the latest release (`homer.zip`) from the [release page](https://github.com/bastienwirtz/homer/releases), rename the `assets/config.yml.dist` file to `assets/config.yml`, and put it behind a web server.
- /your/local/assets/:/www/assets
ports:
- 8080:8080
- #environment:
- # - UID=1000
- # - GID=1000
- restart: unless-stopped
+ user: 1000:1000 # default
+ environment:
+ - INIT_ASSETS=1 # default
#!/bin/sh
-# Ensure default assets are present.
-while true; do echo n; done | cp -Ri /www/default-assets/* /www/assets/ &> /dev/null
+PERMISSION_ERROR="Check assets directory permissions & docker user or skip default assets install by setting the INIT_ASSETS env var to 0"
-# Ensure compatibility with previous version (config.yml was in the root directory)
-if [ -f "/www/config.yml" ]; then
- yes n | cp -i /www/config.yml /www/assets/ &> /dev/null
-fi
+# Default assets & exemple configuration installation if possible.
+if [[ "${INIT_ASSETS}" == "1" ]] && [[ ! -f "/www/config.yml" ]]; then
+ echo "No configuration found, installing default config & assets"
+ if [[ ! -w "/www/assets/" ]]; then echo "Assets directory not writable. $PERMISSION_ERROR" && exit 1; fi
+
+ while true; do echo n; done | cp -Ri /www/default-assets/* /www/assets/ &> /dev/null
+ if [[ $? -ne 0 ]]; then echo "Fail to copy default assets. $PERMISSION_ERROR" && exit 1; fi
-# Install default config if no one is available.
-yes n | cp -i /www/default-assets/config.yml.dist /www/assets/config.yml &> /dev/null
+ yes n | cp -i /www/default-assets/config.yml.dist /www/assets/config.yml &> /dev/null
+ if [[ $? -ne 0 ]]; then echo "Fail to copy default config file. $PERMISSION_ERROR" && exit 1; fi
+fi
-chown -R $UID:$GID /www/assets
-exec su-exec $UID:$GID darkhttpd /www/ --no-listing --port "$PORT"
+echo "Starting webserver"
+lighttpd -D -f /lighttpd.conf
--- /dev/null
+include "/etc/lighttpd/mime-types.conf"
+
+server.port = env.PORT
+server.modules = ( "mod_alias" )
+server.username = "lighttpd"
+server.groupname = "lighttpd"
+server.document-root = "/www"
+alias.url = ( env.SUBFOLDER => "/www" )
+server.indexfiles = ("index.html")
+server.follow-symlink = "enable"
</a>
<i v-if="config.icon" :class="config.icon"></i>
</div>
- <div class="dashboard-title">
+ <div
+ class="dashboard-title"
+ :class="{ 'no-logo': !config.icon || !config.logo }"
+ >
<span class="headline">{{ config.subtitle }}</span>
<h1>{{ config.title }}</h1>
</div>
@network-status-update="offline = $event"
/>
- <GetStarted v-if="loaded && !services" />
+ <GetStarted v-if="configurationNeeded" />
<div v-if="!offline">
<!-- Optional messages -->
data: function () {
return {
loaded: false,
+ configNotFound: false,
config: null,
services: null,
offline: false,
showMenu: false,
};
},
+ computed: {
+ configurationNeeded: function () {
+ return (this.loaded && !this.services) || this.configNotFound;
+ },
+ },
created: async function () {
this.buildDashboard();
window.onhashchange = this.buildDashboard;
return;
}
+ if (response.status == 404) {
+ this.configNotFound = true;
+ return {};
+ }
+
if (!response.ok) {
throw Error(`${response.statusText}: ${response.body}`);
}
.dashboard-title {
padding: 6px 0 0 80px;
+
+ &.no-logo {
+ padding-left: 0;
+ }
}
.first-line {
<p>
<a
class="button is-primary mt-5 has-text-weight-bold"
- href="https://github.com/bastienwirtz/homer/blob/main/README.md#getting-started"
+ href="https://github.com/bastienwirtz/homer/blob/main/docs/configuration.md#configuration"
target="_blank"
>
Get started
this.fetch("/System/info/public")
.then((response) => {
if (response.Id) this.status = "running";
- else throw new Error();
+ else throw new Error();
})
.catch((e) => {
console.log(e);