Skip to content
This repository was archived by the owner on Mar 21, 2026. It is now read-only.

Commit a55b760

Browse files
committed
refactor: consolidated updates 2026-01-12
1 parent c639119 commit a55b760

7 files changed

Lines changed: 224 additions & 72 deletions

File tree

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ on:
1010

1111
jobs:
1212
build:
13-
uses: daemonless/daemonless/.github/workflows/build-app.yml@main
13+
uses: daemonless/daemonless/.github/workflows/build-app.yaml@main
1414
with:
1515
image_name: overseerr
1616
secrets: inherit
File renamed without changes.

Containerfile

Lines changed: 21 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,7 @@ RUN ln -sf /usr/bin/clang /usr/bin/cc && \
2020
ENV PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin
2121
ENV NODE_OPTIONS="--max-old-space-size=2048"
2222

23-
RUN OVERSEERR_VERSION=$(fetch -qo - "https://api.github.com/repos/sct/overseerr/releases/latest" | \
24-
sed -n 's/.*"tag_name": *"\([^"]*\)".*/\1/p') && \
23+
RUN OVERSEERR_VERSION=$(fetch -qo - "https://api.github.com/repos/sct/overseerr/releases/latest" | jq -r '.tag_name') && \
2524
echo "Building Overseerr ${OVERSEERR_VERSION}" && \
2625
mkdir -p /app/overseerr && \
2726
fetch -qo - "https://github.com/sct/overseerr/archive/refs/tags/${OVERSEERR_VERSION}.tar.gz" | \
@@ -52,21 +51,23 @@ ARG HEALTHCHECK_ENDPOINT="http://localhost:5055/api/v1/status"
5251

5352
ENV HEALTHCHECK_URL="${HEALTHCHECK_ENDPOINT}"
5453

54+
# --- Metadata (Injected by Generator) ---
5555
LABEL org.opencontainers.image.title="Overseerr" \
56-
org.opencontainers.image.description="Overseerr media request management on FreeBSD" \
57-
org.opencontainers.image.source="https://github.com/daemonless/overseerr" \
58-
org.opencontainers.image.url="https://overseerr.dev/" \
59-
org.opencontainers.image.documentation="https://docs.overseerr.dev/" \
60-
org.opencontainers.image.licenses="MIT" \
61-
org.opencontainers.image.vendor="daemonless" \
62-
org.opencontainers.image.authors="daemonless" \
63-
io.daemonless.port="5055" \
64-
io.daemonless.arch="${FREEBSD_ARCH}" \
65-
io.daemonless.category="Media Management" \
66-
io.daemonless.upstream-url="${UPSTREAM_URL}" \
67-
io.daemonless.upstream-jq="${UPSTREAM_JQ}" \
68-
io.daemonless.healthcheck-url="${HEALTHCHECK_ENDPOINT}" \
69-
io.daemonless.packages="${PACKAGES}"
56+
org.opencontainers.image.description="Overseerr media request management on FreeBSD." \
57+
org.opencontainers.image.source="https://github.com/daemonless/overseerr" \
58+
org.opencontainers.image.url="https://overseerr.dev/" \
59+
org.opencontainers.image.documentation="https://docs.overseerr.dev/" \
60+
org.opencontainers.image.licenses="MIT" \
61+
org.opencontainers.image.vendor="daemonless" \
62+
org.opencontainers.image.authors="daemonless" \
63+
io.daemonless.category="Media Management" \
64+
io.daemonless.port="5055" \
65+
io.daemonless.volumes="/config" \
66+
io.daemonless.arch="${FREEBSD_ARCH}" \
67+
io.daemonless.upstream-url="${UPSTREAM_URL}" \
68+
io.daemonless.upstream-jq="${UPSTREAM_JQ}" \
69+
io.daemonless.healthcheck-url="${HEALTHCHECK_ENDPOINT}" \
70+
io.daemonless.packages="${PACKAGES}"
7071

7172
# Runtime dependencies only
7273
RUN pkg update && \
@@ -85,5 +86,8 @@ RUN mkdir -p /config && chown bsd:bsd /config
8586
COPY root/ /
8687
RUN chmod +x /etc/services.d/*/run /etc/cont-init.d/* 2>/dev/null || true
8788

89+
# --- Expose (Injected by Generator) ---
8890
EXPOSE 5055
89-
VOLUME /config
91+
92+
# --- Volumes (Injected by Generator) ---
93+
VOLUME /config

Containerfile.j2

Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,108 @@
1+
# Overseerr - Media request management
2+
# Multi-stage build: compile with npm, run with node only
3+
4+
ARG BASE_VERSION=15
5+
FROM ghcr.io/daemonless/base:${BASE_VERSION} AS builder
6+
7+
# Build dependencies
8+
RUN pkg update && pkg install -y \
9+
node20 npm-node20 yarn-node20 python311 \
10+
gmake pkgconf sqlite3 \
11+
FreeBSD-clang FreeBSD-lld FreeBSD-toolchain FreeBSD-clibs-dev FreeBSD-runtime-dev \
12+
ca_root_nss \
13+
&& pkg clean -ay
14+
15+
# Symlink compilers
16+
RUN ln -sf /usr/bin/clang /usr/bin/cc && \
17+
ln -sf /usr/bin/clang++ /usr/bin/c++
18+
19+
# Get latest release and download
20+
ENV PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin
21+
ENV NODE_OPTIONS="--max-old-space-size=2048"
22+
23+
RUN OVERSEERR_VERSION=$(fetch -qo - "https://api.github.com/repos/sct/overseerr/releases/latest" | jq -r '.tag_name') && \
24+
echo "Building Overseerr ${OVERSEERR_VERSION}" && \
25+
mkdir -p /app/overseerr && \
26+
fetch -qo - "https://github.com/sct/overseerr/archive/refs/tags/${OVERSEERR_VERSION}.tar.gz" | \
27+
tar xzf - -C /app/overseerr --strip-components=1 && \
28+
echo "${OVERSEERR_VERSION#v}" > /app/version
29+
30+
WORKDIR /app/overseerr
31+
32+
RUN CYPRESS_INSTALL_BINARY=0 yarn install --frozen-lockfile --network-timeout 1000000 && \
33+
yarn build && \
34+
yarn install --production --ignore-scripts --prefer-offline && \
35+
rm -rf src server .next/cache node_modules/.cache && \
36+
find node_modules -name "*.d.ts" -delete && \
37+
find node_modules -name "*.map" -delete && \
38+
find node_modules -name "*.md" -delete && \
39+
find node_modules -type d -name "test" -exec rm -rf {} + 2>/dev/null || true && \
40+
find node_modules -type d -name "tests" -exec rm -rf {} + 2>/dev/null || true && \
41+
find node_modules -type d -name "__tests__" -exec rm -rf {} + 2>/dev/null || true
42+
43+
# Production image
44+
FROM ghcr.io/daemonless/base:${BASE_VERSION}
45+
46+
ARG FREEBSD_ARCH=amd64
47+
ARG PACKAGES="node20"
48+
ARG UPSTREAM_URL="https://api.github.com/repos/sct/overseerr/releases/latest"
49+
ARG UPSTREAM_JQ=".tag_name"
50+
{%- if ports %}
51+
ARG HEALTHCHECK_ENDPOINT="http://localhost:{{ ports[0].port }}/api/v1/status"
52+
{%- else %}
53+
ARG HEALTHCHECK_ENDPOINT="http://localhost:5055/api/v1/status"
54+
{%- endif %}
55+
56+
ENV HEALTHCHECK_URL="${HEALTHCHECK_ENDPOINT}"
57+
58+
# --- Metadata (Injected by Generator) ---
59+
LABEL org.opencontainers.image.title="{{ title }}" \
60+
org.opencontainers.image.description="{{ description }}" \
61+
org.opencontainers.image.source="{{ repo_url }}" \
62+
org.opencontainers.image.url="{{ web_url }}" \
63+
org.opencontainers.image.documentation="https://docs.overseerr.dev/" \
64+
org.opencontainers.image.licenses="MIT" \
65+
org.opencontainers.image.vendor="daemonless" \
66+
org.opencontainers.image.authors="daemonless" \
67+
io.daemonless.category="{{ category }}" \
68+
{%- if ports %}
69+
io.daemonless.port="{{ ports[0].port }}" \
70+
{%- endif %}
71+
{%- if volumes %}
72+
io.daemonless.volumes="{{ volumes | map(attribute='path') | join(',') }}" \
73+
{%- endif %}
74+
{%- if mlock %}
75+
org.freebsd.jail.allow.mlock="required" \
76+
{%- endif %}
77+
io.daemonless.arch="${FREEBSD_ARCH}" \
78+
io.daemonless.upstream-url="${UPSTREAM_URL}" \
79+
io.daemonless.upstream-jq="${UPSTREAM_JQ}" \
80+
io.daemonless.healthcheck-url="${HEALTHCHECK_ENDPOINT}" \
81+
io.daemonless.packages="${PACKAGES}"
82+
83+
# Runtime dependencies only
84+
RUN pkg update && \
85+
pkg install -y ${PACKAGES} && \
86+
pkg clean -ay && \
87+
rm -rf /var/cache/pkg/* /var/db/pkg/repos/*
88+
89+
# Copy built application from builder (with correct ownership)
90+
COPY --from=builder --chown=bsd:bsd /app/overseerr /app/overseerr
91+
COPY --from=builder --chown=bsd:bsd /app/version /app/version
92+
93+
# Create config directory
94+
RUN mkdir -p /config && chown bsd:bsd /config
95+
96+
# Copy service files
97+
COPY root/ /
98+
RUN chmod +x /etc/services.d/*/run /etc/cont-init.d/* 2>/dev/null || true
99+
100+
# --- Expose (Injected by Generator) ---
101+
{%- if ports %}
102+
EXPOSE {{ ports | map(attribute='port') | join(' ') }}
103+
{%- endif %}
104+
105+
# --- Volumes (Injected by Generator) ---
106+
{%- if volumes %}
107+
VOLUME {{ volumes | map(attribute='path') | join(' ') }}
108+
{%- endif %}

README.md

Lines changed: 55 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -1,38 +1,17 @@
1-
# overseerr
1+
# Overseerr
22

3-
Request management and media discovery tool for Plex.
3+
Overseerr media request management on FreeBSD.
44

5-
## Environment Variables
5+
| | |
6+
|---|---|
7+
| **Port** | 5055 |
8+
| **Registry** | `ghcr.io/daemonless/overseerr` |
9+
| **Source** | [https://github.com/sct/overseerr](https://github.com/sct/overseerr) |
10+
| **Website** | [https://overseerr.dev/](https://overseerr.dev/) |
611

7-
| Variable | Description | Default |
8-
|----------|-------------|---------|
9-
| `PUID` | User ID for the application process | `1000` |
10-
| `PGID` | Group ID for the application process | `1000` |
11-
| `TZ` | Timezone for the container | `UTC` |
12-
| `S6_LOG_ENABLE` | Enable/Disable file logging | `1` |
13-
| `S6_LOG_MAX_SIZE` | Max size per log file (bytes) | `1048576` |
14-
| `S6_LOG_MAX_FILES` | Number of rotated log files to keep | `10` |
12+
## Deployment
1513

16-
## Logging
17-
18-
This image uses `s6-log` for internal log rotation.
19-
- **System Logs**: Captured from console and stored at `/config/logs/daemonless/overseerr/`.
20-
- **Application Logs**: Managed by the app and typically found in `/config/logs/`.
21-
- **Podman Logs**: Output is mirrored to the console, so `podman logs` still works.
22-
23-
## Quick Start
24-
25-
```bash
26-
podman run -d --name overseerr \
27-
-p 5055:5055 \
28-
-e PUID=1000 -e PGID=1000 \
29-
-v /path/to/config:/config \
30-
ghcr.io/daemonless/overseerr:latest
31-
```
32-
33-
Access at: http://localhost:5055
34-
35-
## podman-compose
14+
### Podman Compose
3615

3716
```yaml
3817
services:
@@ -42,47 +21,69 @@ services:
4221
environment:
4322
- PUID=1000
4423
- PGID=1000
45-
- TZ=America/New_York
24+
- TZ=UTC
4625
volumes:
47-
- /data/config/overseerr:/config
26+
- /path/to/containers/overseerr:/config
4827
ports:
4928
- 5055:5055
5029
restart: unless-stopped
5130
```
5231
53-
## Tags
32+
### Podman CLI
33+
34+
```bash
35+
podman run -d --name overseerr \
36+
-p 5055:5055 \
37+
-e PUID=@PUID@ \
38+
-e PGID=@PGID@ \
39+
-e TZ=@TZ@ \
40+
-v /path/to/containers/overseerr:/config \
41+
ghcr.io/daemonless/overseerr:latest
42+
```
43+
Access at: `http://localhost:5055`
44+
45+
### Ansible
5446

55-
| Tag | Source | Description |
56-
|-----|--------|-------------|
57-
| `:latest` | [Upstream Releases](https://github.com/sct/overseerr) | Latest development build |
47+
```yaml
48+
- name: Deploy overseerr
49+
containers.podman.podman_container:
50+
name: overseerr
51+
image: ghcr.io/daemonless/overseerr:latest
52+
state: started
53+
restart_policy: always
54+
env:
55+
PUID: "1000"
56+
PGID: "1000"
57+
TZ: "UTC"
58+
ports:
59+
- "5055:5055"
60+
volumes:
61+
- "/path/to/containers/overseerr:/config"
62+
```
63+
64+
## Configuration
5865
59-
## Environment Variables
66+
### Environment Variables
6067
6168
| Variable | Default | Description |
6269
|----------|---------|-------------|
63-
| `PUID` | 1000 | User ID for app |
64-
| `PGID` | 1000 | Group ID for app |
65-
| `TZ` | UTC | Timezone |
70+
| `PUID` | `1000` | User ID for the application process |
71+
| `PGID` | `1000` | Group ID for the application process |
72+
| `TZ` | `UTC` | Timezone for the container |
6673

67-
## Volumes
74+
### Volumes
6875

6976
| Path | Description |
7077
|------|-------------|
7178
| `/config` | Configuration directory |
7279

73-
## Ports
80+
### Ports
7481

75-
| Port | Description |
76-
|------|-------------|
77-
| 5055 | Web UI |
82+
| Port | Protocol | Description |
83+
|------|----------|-------------|
84+
| `5055` | TCP | Web UI |
7885

7986
## Notes
8087

81-
- **User:** `bsd` (UID/GID set via PUID/PGID, default 1000)
82-
- **Base:** Built on `ghcr.io/daemonless/base-image` (FreeBSD)
83-
- **Build:** Built from source (Node.js)
84-
85-
## Links
86-
87-
- [Website](https://overseerr.dev/)
88-
- [GitHub](https://github.com/sct/overseerr)
88+
- **User:** `bsd` (UID/GID set via PUID/PGID)
89+
- **Base:** Built on `ghcr.io/daemonless/base` (FreeBSD)

compose.yaml

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
name: overseerr
2+
3+
x-daemonless:
4+
title: "Overseerr"
5+
icon: ":material-eye:"
6+
category: "Media Management"
7+
description: "Overseerr media request management on FreeBSD."
8+
upstream_url: "https://github.com/sct/overseerr"
9+
web_url: "https://overseerr.dev/"
10+
freshports_url: "https://www.freshports.org/www/overseerr/"
11+
user: "bsd"
12+
mlock: false
13+
14+
docs:
15+
env:
16+
PUID: "User ID for the application process"
17+
PGID: "Group ID for the application process"
18+
TZ: "Timezone for the container"
19+
volumes:
20+
/config: "Configuration directory"
21+
ports:
22+
5055: "Web UI"
23+
24+
services:
25+
overseerr:
26+
image: ghcr.io/daemonless/overseerr:latest
27+
container_name: overseerr
28+
restart: unless-stopped
29+
30+
environment:
31+
- PUID=1000
32+
- PGID=1000
33+
- TZ=UTC
34+
35+
volumes:
36+
- /path/to/containers/overseerr:/config
37+
38+
ports:
39+
- 5055:5055

0 commit comments

Comments
 (0)