How to add self-compiled packages to my own ASU?

Device: Linksys velop WHW03v2

At present, the system is running version 24.10.5, and I want to upgrade it to 25.12.0 by building asu.

Here’s uci show attendedsysupgrade

attendedsysupgrade.server=server
attendedsysupgrade.server.url='https://sysupgrade.example.com'
attendedsysupgrade.client=client
attendedsysupgrade.client.upgrade_packages='1'
attendedsysupgrade.client.auto_search='1'
attendedsysupgrade.client.advanced_mode='1'
attendedsysupgrade.owut=owut

Here’s my .env on 192.168.2.94

PUBLIC_PATH=/home/jackie/Public/AppData/asu/public
CONTAINER_SOCKET_PATH=/run/user/1000/podman/podman.sock
ALLOW_DEFAULTS=1
UPSTREAM_URL=https://feeds.example.com
REPOSITORY_ALLOW_LIST=["https://feeds.example.com/"]

Here’s my podman-compose.yml on 192.168.2.94

services:
  server:
    image: "docker.io/openwrt/asu:latest"
    build:
      context: .
      dockerfile: Containerfile
    restart: unless-stopped
    command: uv run uvicorn --host 0.0.0.0 asu.main:app
    env_file: .env
    environment:
      REDIS_URL: "redis://redis:6379/0"
      TZ: "Asia/Shanghai"
    volumes:
      - $PUBLIC_PATH/store:$PUBLIC_PATH/store:ro
      - $PUBLIC_PATH/logs:$PUBLIC_PATH/logs:ro
    ports:
      - "8888:8000"
    depends_on:
      - redis

  worker:
    image: "docker.io/openwrt/asu:latest"
    build:
      context: .
      dockerfile: Containerfile
    restart: unless-stopped
    command: uv run rqworker --logging_level INFO
    env_file: .env
    environment:
      REDIS_URL: "redis://redis:6379/0"
      TZ: "Asia/Shanghai"
    volumes:
      - $PUBLIC_PATH:$PUBLIC_PATH:rw
      - $CONTAINER_SOCKET_PATH:$CONTAINER_SOCKET_PATH:rw
    depends_on:
      - redis

  redis:
    image: "docker.io/redis/redis-stack-server"
    restart: unless-stopped
    volumes:
      - ./redis-data:/data/:rw
    ports:
      - "6379:6379"

Here’s nginx configure for sysupgrade:

server {
  server_name sysupgrade.example.com;
  listen 443 ssl;
  listen [::]:443 ssl;
  http2 on;
  ssl_certificate /home/nginxWebUI/.acme.sh/*.example.com/fullchain.cer;
  ssl_certificate_key /home/nginxWebUI/.acme.sh/*.example.com/*.example.com.key;
  ssl_protocols TLSv1.2 TLSv1.3;
  listen 80;
  listen [::]:80;
  if ($scheme = http) {
    return 301 https://$host:443$request_uri;
  }
  sendfile on;
  tcp_nopush on;
  tcp_nodelay on;
  location / {
    proxy_pass http://192.168.2.94:8888;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Host $http_host;
    proxy_set_header X-Forwarded-Port $server_port;
    proxy_set_header X-Forwarded-Proto $scheme;
    add_header Access-Control-Allow-Origin *;
    add_header Access-Control-Allow-Methods *;
    add_header Access-Control-Allow-Headers *;
    add_header Access-Control-Allow-Credentials true;
    if ($request_method = 'OPTIONS') {
      return 204;
    }
    proxy_redirect http:// https://;
  }
}

Here’s nginx configure for feeds:

server {
  server_name feeds.example.com;
  listen 443 ssl;
  listen [::]:443 ssl;
  http2 on;
  ssl_certificate /home/nginxWebUI/.acme.sh/*.example.com/fullchain.cer;
  ssl_certificate_key /home/nginxWebUI/.acme.sh/*.example.com/*.example.com.key;
  ssl_protocols TLSv1.2 TLSv1.3;
  sendfile on;
  tcp_nopush on;
  tcp_nodelay on;
  location / {
    root /home/jackie/Public/AppData/asu_upstream/;
    autoindex on;
    add_header Access-Control-Allow-Origin *;
    add_header Access-Control-Allow-Methods *;
    add_header Access-Control-Allow-Headers *;
    add_header Access-Control-Allow-Credentials true;
    default_type application/octet-stream;
  }
}

At the beginning of compilation, the following errors always occur:

11:35:03 Error: Impossible package selection: missing (luci-app-cpu-status, luci-app-log-viewer, luci-app-passwall2, luci-theme-argon, shadowsocks-libev-ss-local, shadowsocks-libev-ss-redir, shadowsocksr-libev-ssr-local, shadowsocksr-libev-ssr-redir)
11:35:03 Worker a6c3943f7ab644638e2af206f78b107d: job 285caccc7625453f001139c48ec8dbddb0d0bb422301dbb2d8769a1f5ec0fc2e: exception raised while executing (asu.build.build)
Traceback (most recent call last):
  File "/app/.venv/lib/python3.14/site-packages/rq/worker.py", line 1439, in perform_job
    return_value = job.perform()
  File "/app/.venv/lib/python3.14/site-packages/rq/job.py", line 1318, in perform
    self._result = self._execute()
                   ~~~~~~~~~~~~~^^
  File "/app/.venv/lib/python3.14/site-packages/rq/job.py", line 1376, in _execute
    result = self.func(*self.args, **self.kwargs)
  File "/app/asu/build.py", line 463, in build
    result = _build(build_request, job)
  File "/app/asu/build.py", line 282, in _build
    report_error(job, check_package_errors(job.meta["stderr"]))
    ~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/app/asu/util.py", line 332, in report_error
    raise RuntimeError(msg)
RuntimeError: Impossible package selection: missing (luci-app-cpu-status, luci-app-log-viewer, luci-app-passwall2, luci-theme-argon, shadowsocks-libev-ss-local, shadowsocks-libev-ss-redir, shadowsocksr-libev-ssr-local, shadowsocksr-libev-ssr-redir) 

However, these packages do exist on the upstream server, can be downloaded correctly in the browser, can be retrieved by opkg update, and can be upgraded normally. Although the following example is 24.10.5, I built 25.12.0 with the same directory structure, which contains compiled apk packages.

root@WHW03v2:~# opkg update
Downloading https://feeds.example.com/releases/24.10.5/packages/arm_cortex-a7_neon-vfpv4/packages/Packages.gz
Updated list of available packages in /var/opkg-lists/my_pkg
Downloading https://feeds.example.com/releases/24.10.5/packages/arm_cortex-a7_neon-vfpv4/packages/Packages.sig
Signature check passed.
Downloading https://feeds.example.com/releases/24.10.5/packages/arm_cortex-a7_neon-vfpv4/luci/Packages.gz
Updated list of available packages in /var/opkg-lists/my_luci
Downloading https://feeds.example.com/releases/24.10.5/packages/arm_cortex-a7_neon-vfpv4/luci/Packages.sig
Signature check passed.
root@WHW03v2:~# wget https://feeds.example.com/releases/25.12.0/packages/arm_cortex-a7_neon-vfpv4/luci/luci-app-passwall2-26.3.5-r1.apk -P /tmp/
Downloading 'https://feeds.example.com/releases/25.12.0/packages/arm_cortex-a7_neon-vfpv4/luci/luci-app-passwall2-26.3.5-r1.apk'
Connecting to 192.168.2.90:443
Writing to 'luci-app-passwall2-26.3.5-r1.apk'
luci-app-passwall2-2 100% |*******************************|   313k  0:00:00 ETA
root@WHW03v2:~# ls -lh /tmp/luci-app-passwall2-26.3.5-r1.apk
-rw-r--r--    1 root     root      313.6K Mar 18 12:00 /tmp/luci-app-passwall2-26.3.5-r1.apk

Therefore, I would like to ask how to configure it to make upstream effective?

What you're doing should work with 24.10 (opkg), but the builder hasn't been updated to write the proper format for apk "extra" feeds. Put a bug in on the asu repo and we can start fixing it...

2 Likes