Suwayomi
Overview
Suwayomi Server is a free, open-source, Tachiyomi-compatible manga server and reader. It installs extension sources, browses and searches their catalogs, and serves a browser reading UI where you read chapters or download them for offline access. The library, reading progress and downloads all stay on a server you own.
The SecureAnyCloud image installs Suwayomi Server 2.3.2243 from the official GitHub release jar with SHA-256 verification, on a headless OpenJDK 21 runtime. Two things differ from a stock Suwayomi install:
- Suwayomi ships with authentication disabled (
server.authMode = "none"), which would leave the reader open to anyone who can reach the port. This image therefore binds Suwayomi to the loopback interface only and fronts it with an nginx reverse proxy on port 80 that requires HTTP authentication on every request. A single anonymous endpoint,/healthz, is kept for load-balancer and monitoring probes. - No credential ships in the image. A one-shot first-boot service generates a 24-character admin password that is unique to this VM. It writes the password into the proxy's credential store and into a root-only file. Until that has happened, neither the reader nor the proxy serves any request.
What you get:
- Suwayomi Server 2.3.2243 as a single self-contained jar at
/opt/suwayomi/Suwayomi-Server.jar, with the web reader UI bundled inside it - Headless OpenJDK 21 JRE from Ubuntu 24.04 noble main
suwayomi.servicerunning as the unprivilegedsuwayomiservice user, bound to127.0.0.1:4567- The server data root on a dedicated 40 GiB Azure data disk mounted at
/var/lib/suwayomi, holding the library database, downloaded chapters, thumbnails, extension sources, the cached web UI andserver.conf - An nginx reverse proxy on port 80 with HTTP Basic authentication and an unauthenticated
/healthzendpoint - A per-VM admin password generated at first boot and stored in
/root/suwayomi-credentials.txt(mode 0600) - Unattended security upgrades enabled
- 24/7 SecureAnyCloud support
Prerequisites
You need an active Azure subscription, an SSH key, and a VNet with a subnet.
Standard_B2s (2 vCPU, 4 GB RAM, 1024m JVM heap by default) suits a personal or small-group library. For a large library, heavy concurrent reading or bulk downloading, raise the VM size and the JVM heap together (Step 12).
Configure the NSG inbound rules to allow 22/tcp from your management CIDR and 80/tcp from the client CIDRs that need the reading UI. You do not need to open 4567/tcp. Suwayomi binds only to loopback and is reached exclusively through the proxy.
The reader is served over plain HTTP on port 80. For production, put TLS in front of it with an Azure Application Gateway, Azure Front Door, or your own reverse proxy with a certificate for your domain.
Step 1-3 - Deploy the VM and connect over SSH
Deploy the VM from the Azure Marketplace offer, then connect over SSH as azureuser:
ssh azureuser@<vm-ip>Check service status and health
Confirm that both services are active and that the unauthenticated health endpoint responds:
sudo systemctl is-active suwayomi.service nginx.service curl -s -o /dev/null -w 'healthz: HTTP %{http_code}\n' http://127.0.0.1/healthzBoth units report active, and /healthz returns HTTP 200. nginx serves /healthz directly and never proxies it to Suwayomi. You can point a load balancer or monitor at it as a front-door liveness signal, with no credential.
Read the per-VM admin credentials
First boot wrote the admin password, which is unique to this VM, to a root-only file. Read it with sudo:
sudo cat /root/suwayomi-credentials.txtThe file lists SUWAYOMI_ADMIN_USER (admin), SUWAYOMI_ADMIN_PASSWORD (the per-VM password) and SUWAYOMI_URL. Store the password safely. It is the only credential that unlocks the reader.
Test authentication
Confirm that the proxy refuses anonymous requests, accepts the per-VM password and refuses a wrong password:
curl -s -o /dev/null -w 'anonymous: HTTP %{http_code}\n' http://127.0.0.1/
curl -s -u 'admin:<SUWAYOMI_ADMIN_PASSWORD>' -o /dev/null -w 'with password: HTTP %{http_code}\n' http://127.0.0.1/
curl -s -u 'admin:wrong-password' -o /dev/null -w 'wrong password: HTTP %{http_code}\n' http://127.0.0.1/You get 401, 200, 401. The GraphQL API behaves the same way through the proxy: /api/graphql on port 80 also requires the credential. Nothing on the server is reachable anonymously except /healthz.
Verify the version, runtime, bind address and data disk
From the VM itself, Suwayomi's own GraphQL API answers without a credential on 127.0.0.1:4567. That interface is not exposed to the network. Run these checks on the VM:
curl -sS -H 'Content-Type: application/json' \
--data '{"query":"{ aboutServer { version buildType } }"}' \
http://127.0.0.1:4567/api/graphql; echo java -version 2>&1 | head -1 ss -tlnH | grep 4567 findmnt /var/lib/suwayomiaboutServer reports v2.3.2243 / Stable. The socket line matters most for security. It reads [::ffff:127.0.0.1]:4567, an IPv4-mapped loopback socket, which confirms the server is not listening on any routable interface. findmnt confirms that the data root is the dedicated Azure data disk and not the OS disk.
Sign in to the reading UI
Browse to http://<vm-ip>/. When your browser prompts for credentials, enter admin and the password from Step 5. The Library view loads. It is empty on a fresh VM, because no library data ships in the image.
The left-hand rail holds the whole application: Library (your saved titles), Updates, History, Browse (sources and extensions), Downloads, Settings and About.
Add an extension source
Suwayomi reads catalogs through Tachiyomi-compatible extensions. Extensions come from repositories that you choose and add yourself. No repository is pre-configured in this image.
In the UI, open Browse. The Source tab lists the available sources. On a fresh VM it shows only Local source, the built-in source that serves comics you place on the VM yourself (Step 10). Installed extensions appear on the Extension tab after you add a repository under Settings > Browse > Extension repositories.
Choose your repositories deliberately. You are responsible for the sources you add and the content you access through them. SecureAnyCloud does not bundle, endorse or host any catalog.
Serve your own comics with the Local source
The Local source reads directly from the data disk, so you can host your own scans or legally obtained archives without any extension. Use one directory per title, and one directory (or one CBZ file) per chapter:
/var/lib/suwayomi/local/ └── My Comic/ ├── cover.jpg ├── details.json └── Chapter 1/ ├── 001.jpg ├── 002.jpg └── 003.jpgCreate the directory, copy your page images in, then restart the server so it re-indexes:
sudo install -d -o suwayomi -g suwayomi -m 0755 "/var/lib/suwayomi/local/My Comic/Chapter 1"
sudo systemctl restart suwayomi.service for i in $(seq 1 60); do curl -sf -o /dev/null http://127.0.0.1:4567/ && break; sleep 2; done curl -s -u 'admin:<SUWAYOMI_ADMIN_PASSWORD>' -o /dev/null -w 'reader after restart: HTTP %{http_code}\n' http://127.0.0.1/The reader returns HTTP 200 again after the restart. In the UI, Browse > Local source > Latest now lists your title. Open it and tap the heart to add it to your Library.
Read a chapter
Open a title from the Library to reach its detail view, which shows the cover, metadata, description and chapter list. For local titles, the optional details.json fields (title, author, artist, description, genre, status) appear here.
Click a chapter to open the reader. Pages render full width with a page counter. You can set the reading mode (paged, continuous vertical, right-to-left) per title and globally under Settings > Reader. Reading progress is stored server-side, so you resume in the same place from any browser.
Tune the JVM heap and VM size
The service runs with a 1024 MB maximum heap, which suits a personal library on Standard_B2s. Check the current setting:
systemctl cat suwayomi.service | grep -E 'ExecStart|Xmx'To raise it, move to a larger VM size first, then add a systemd drop-in. The heap flags are part of ExecStart, so the override must clear and restate the whole line. Create /etc/systemd/system/suwayomi.service.d/10-heap.conf:
[Service] ExecStart= ExecStart=/usr/bin/java -Djava.awt.headless=true -Xms512m -Xmx3072m -Dsuwayomi.tachidesk.config.server.rootDir=/var/lib/suwayomi -jar /opt/suwayomi/Suwayomi-Server.jarThen run sudo systemctl daemon-reload && sudo systemctl restart suwayomi.service.
Never set a maximum heap larger than about 75% of the VM's RAM. The image deliberately ships no swap, because Azure manages swap on the ephemeral resource disk and a swap file baked into an image fails Azure certification. An oversized heap is therefore killed by the OOM reaper rather than paged.
Manage server settings and backups
Everything Suwayomi exposes is under Settings: reader defaults, library categories and update behavior, download locations, extension repositories, backups, and the server settings that mirror server.conf.
Take care with two settings, because changing them removes the protection this image adds:
- Do not change the server IP or port from
127.0.0.1:4567. The proxy expects the server there, and exposing it directly would publish an unauthenticated reader. - Suwayomi's own authentication is deliberately off. The nginx layer authenticates you. You can also turn on Suwayomi's built-in authentication, but then you manage two credentials.
Suwayomi writes automatic backups into the data root. List them and inspect what the data disk holds:
sudo ls -la /var/lib/suwayomi/backups
sudo du -sh /var/lib/suwayomi 2>/dev/null df -h /var/lib/suwayomi | tail -1The library, downloads and backups all live on the dedicated data disk. You can snapshot that disk in Azure for a point-in-time copy of the whole library, and grow it without touching the OS disk.
Change the reader password
The reader credential is an nginx htpasswd entry, so rotate it with htpasswd. Replace <new-password> with your own password:
sudo htpasswd -bB /etc/nginx/.suwayomi_htpasswd admin '<new-password>'
sudo chown root:www-data /etc/nginx/.suwayomi_htpasswd
sudo chmod 0640 /etc/nginx/.suwayomi_htpasswd
sudo nginx -t && sudo systemctl reload nginx.service-B stores the password bcrypt-hashed. To keep the password out of your shell history, drop the -b flag and the argument (sudo htpasswd -B /etc/nginx/.suwayomi_htpasswd admin). htpasswd then prompts for the password instead.
Update /root/suwayomi-credentials.txt yourself if you want that file to stay accurate. Nothing reads it at runtime. It is a record for you.
Patching, logs and troubleshooting
Unattended security upgrades are enabled, so the OS patches itself. Check their status:
systemctl is-enabled unattended-upgrades.service cat /etc/apt/apt.conf.d/20auto-upgradesServer logs go to the journal. Suwayomi also writes its own log files to the data disk:
sudo journalctl -u suwayomi.service -n 20 --no-pager sudo ls -la /var/lib/suwayomi/logsCommon checks:
- Browser prompts repeatedly (401 loop). The password is wrong. Re-read it with
sudo cat /root/suwayomi-credentials.txt, or set a new one (Step 14). - HTTP 502 from the proxy. Suwayomi is not up. Run
sudo systemctl status suwayomi.serviceandsudo journalctl -u suwayomi.service -n 50. A JVM start takes a few seconds. A heap set larger than the VM's RAM (Step 12) fails here. - HTTP 500 on the reader but
/healthzreturns 200. The proxy's credential file is missing. This is the fail-closed state. Restore the file with Step 14. - A new title does not appear. Restart the server so the Local source re-indexes (Step 10), and check that
suwayomiowns the directory. A chapter directory with no page images is indexed as an empty chapter. ERROR CEFManager -- Failed to set up CEF/CefException: CEF is disabledin the journal at every start. This is expected and harmless. CEF is Suwayomi's optional embedded Chromium WebView, used only for sources that need to solve an in-browser challenge. This image setsserver.kcefEnabled = false, because CEF downloads a full Chromium runtime at first use. A headless server does not need that runtime, and it would add a large unpatched attack surface to the image. Suwayomi logs the refusal at ERROR level, but nothing is broken. If you need a source that requires a browser challenge, enablekcefEnabledunder Settings and accept that download, or configure FlareSolverr instead.- Suwayomi rewrites
server.conf. This is normal. On its first start, Suwayomi normalizes the file into its own flatserver.<key> = <value>reference form and keeps your values. Edit the file in that form, or use the UI.
Security
- Single front door. The Suwayomi server binds only to
127.0.0.1:4567and is never exposed to the network. nginx on port 80 is the only entry point, and it requires HTTP authentication for every path except/healthz. - No shared credential. The admin password is generated uniquely on each VM's first boot and stored in
/root/suwayomi-credentials.txt(mode 0600, root only). No shared or default credential exists in the image, and the server ships with no in-app account at all. - Hardened service. The service runs as the unprivileged
suwayomiuser under systemd hardening (NoNewPrivileges,ProtectSystem=full,PrivateTmp, and write access confined to the data root). - Restrict the network. Limit port 80 in your NSG to the client CIDRs that need the reader, and keep port 4567 closed. Terminate TLS in front of the VM before production.
- Protect the data. The library and downloads live on a dedicated data disk. You can encrypt it with Azure disk encryption and snapshot it independently.
You are responsible for the extension repositories you add and the content you access through them. SecureAnyCloud bundles no catalog and no repository.
Support
SecureAnyCloud provides 24/7 technical support by email and live chat. Support covers deployment and VM sizing, reverse-proxy and authentication setup, extension-source configuration, data-disk management and backups, and JVM administration. Email sales@secureanycloud.com.
Deploy on Azure
Launch Suwayomi Server 2.3.2243 on Ubuntu 24.04 LTS on Azure with 24/7 support from SecureAnyCloud.
View this image
Need Help?
Our support team is available 24/7.
sales@secureanycloud.com
Overview
Suwayomi Server is a free, open-source, self-hosted manga server and reader. It is compatible with Tachiyomi extension sources. You install extensions, browse and search catalogs, and read or download manga from a browser reading UI, with your library kept on your own instance.
This image runs Suwayomi Server on AWS and is secure by default. Suwayomi ships with no authentication of its own, which would leave the reader open to anyone who can reach it. An nginx reverse proxy on port 80 therefore fronts it.
What you get:
- Suwayomi Server installed as a single self-contained jar under
/opt/suwayomi, running on a headless OpenJDK 21 runtime - A dedicated unprivileged
suwayomisystem account running the server under a systemd service that starts it on boot and restarts it on failure - The server bound only to the loopback interface on port 4567
- A data root at
/var/lib/suwayomion a dedicated, independently resizable EBS data volume, holding the manga library database, downloaded chapters, thumbnails, installed extension sources, the bundled web UI assets and the server configuration - The web reading UI served on port 80 by nginx, which enforces HTTP Basic authentication on every request except an anonymous health endpoint at
/healthz - An administrator password generated on the first boot of every instance, so two instances launched from the same AMI never share a password
- The password written to
/root/suwayomi-credentials.txtwith mode 0600, so only the root user can read it
Prerequisites
Before you deploy this image, you need:
- An Amazon Web Services account where you can launch EC2 instances
- IAM permissions to launch instances, create security groups and subscribe to AWS Marketplace products
- An EC2 key pair in the target Region for SSH access to the instance
- A VPC and subnet in the target Region, with a security group that allows inbound port 22 from your management network and port 80 for the web UI from the networks you will read from
- The AWS CLI (version 2) installed locally, if you plan to deploy from the command line
Launch the instance from the AWS Marketplace
Sign in to the AWS Management Console, open the EC2 service, and select Launch instance. Under Application and OS Images, choose AWS Marketplace AMIs and search for Suwayomi Server. Select the SecureAnyCloud listing and choose Select, then Continue on the subscription summary.
Pick an instance type of m5.large or larger. Suwayomi is a JVM workload, so size it for your library and reading concurrency. Choose your EC2 key pair under Key pair (login).
Under Network settings, select your VPC and subnet. Create or select a security group that opens port 22 from your management network and port 80 for the web UI. Leave the root volume at the default size or larger, and keep the attached data volume that holds your library.
Select Launch instance. First-boot initialization takes about one minute after the instance state becomes Running and the status checks pass.
Launch the instance from the AWS CLI
The following command launches an instance from the SecureAnyCloud Suwayomi Server Marketplace AMI into an existing subnet and security group. Replace the values in angle brackets:
- <ami-id>: the AMI ID shown on the Marketplace listing
- <key-name>: your EC2 key pair name
- <subnet-id>: your subnet ID
- <security-group-id>: a security group that opens ports 22 and 80, as described above
aws ec2 run-instances \
--image-id <ami-id> \
--instance-type m5.large \
--key-name <key-name> \
--subnet-id <subnet-id> \
--security-group-ids <security-group-id> \
--tag-specifications 'ResourceType=instance,Tags=[{Key=Name,Value=suwayomi}]'When the instance reaches the Running state and its status checks pass, note its public IP address or DNS name. You can find it in the EC2 console or with aws ec2 describe-instances.
Connect to your instance
Connect over SSH with your key pair and the login user for your operating system variant.
OS variant SSH login user
Ubuntu 24.04 ubuntu
ssh -i /path/to/your-key.pem ubuntu@<public-ip>Retrieve the administrator password
HTTP Basic authentication protects the reader. First boot generates a unique administrator password and stores it in a root-only file. Retrieve it over SSH:
sudo cat /root/suwayomi-credentials.txtThe file lists the reader URL, the user name (admin) and the generated password. Store it safely. The password is unique to this instance.
Confirm the services are running
Confirm that the Suwayomi server and the nginx reverse proxy are both active, and that the anonymous health endpoint answers:
systemctl is-active suwayomi.service nginx.servicecurl -fsS http://127.0.0.1/healthzThe first command prints active for both services. The health check prints ok.
Open the web reading UI
Open a browser and go to http://<public-ip>/. When prompted, sign in with the user name admin and the password from Step 4. The library view loads. It is empty until you add sources and titles.
The Suwayomi server itself binds only to the loopback interface on port 4567 and is never exposed directly. All access goes through the nginx reverse proxy on port 80, which enforces authentication.
Verify authentication from the command line
Confirm that the reader accepts the generated credential and rejects an anonymous request. The first command reads the password from the credentials file and requests the UI as admin. The second command confirms that an unauthenticated request is refused.
PASS=$(sudo grep '^suwayomi.admin.pass=' /root/suwayomi-credentials.txt | cut -d= -f2-)
curl -fsS -u "admin:${PASS}" -o /dev/null -w 'authenticated: HTTP %{http_code}\n' http://127.0.0.1/
curl -s -o /dev/null -w 'anonymous: HTTP %{http_code}\n' http://127.0.0.1/The authenticated request returns HTTP 200 and the anonymous request returns HTTP 401.
Check the server version
Suwayomi exposes a GraphQL API. Query the server version directly on the instance. The loopback API is not behind the reverse proxy.
curl -fsS -H 'Content-Type: application/json' \
--data '{"query":"{ aboutServer { version buildType } }"}' \
http://127.0.0.1:4567/api/graphqlThis returns the running Suwayomi version and build type as JSON.
Add extension sources
Suwayomi is compatible with Tachiyomi extension sources. In the web UI, open Browse, then the Extension tab. Add an extension repository (a source repo URL) under the repository settings, then install the extensions you want.
Installed sources appear under the Source tab. There you can browse and search catalogs, open a title, add it to your library, and read or download chapters. A built-in Local source is available for manga you upload yourself.
Check the dedicated data volume
Your library, downloads, thumbnails, extension sources and server configuration live on a dedicated EBS data volume mounted at /var/lib/suwayomi. It is separate from the operating system disk, so you can resize or snapshot it independently.
df -h /var/lib/suwayomiTo grow storage later, expand the EBS volume in the AWS console and then grow the filesystem on the instance.
Manage the service
Suwayomi runs under systemd. Common operations:
systemctl status suwayomi.service --no-pagerAfter you change the configuration at /var/lib/suwayomi/server.conf, restart the server:
sudo systemctl restart suwayomi.serviceThe nginx credential store is at /etc/nginx/.suwayomi_htpasswd. To rotate the reader password, regenerate the entry with htpasswd for user admin and reload nginx. Then update your saved credentials.
Security
- Authentication by default. The nginx reverse proxy requires HTTP Basic authentication for every request except the anonymous
/healthzendpoint. The Suwayomi server binds only to loopback and is never exposed directly. - Per-instance credentials. The administrator password is generated uniquely on first boot and stored in
/root/suwayomi-credentials.txt(mode 0600). No shared or default reader credential ships in the image. - Encryption at rest. Enable AWS EBS encryption when you launch the instance, or use encrypted snapshots, to encrypt the data volume that holds your library.
- Network isolation. Deploy in a private VPC subnet and restrict the security group so that only trusted networks can reach port 80. For access over the public internet, place the instance behind a TLS-terminating load balancer or reverse proxy.
Support
SecureAnyCloud provides 24/7 technical support for this image by email and live chat. We help with deployment, reverse-proxy and authentication setup, extension-source configuration, data-volume management and backups, JVM administration, and troubleshooting.
For assistance, or to request a refund, contact sales@secureanycloud.com.
Deploy on AWS
Launch Suwayomi Server on AWS with 24/7 support from SecureAnyCloud.
View on Marketplace
Need Help?
Our support team is available 24/7.
sales@secureanycloud.com