{"id":20566378,"url":"https://github.com/pennomi/comics","last_synced_at":"2025-04-14T15:42:15.604Z","repository":{"id":39648965,"uuid":"144933446","full_name":"pennomi/comics","owner":"pennomi","description":"A minimalist platform for hosting webcomics. Gives a nice browsing experience due to AJAX navigation.","archived":false,"fork":false,"pushed_at":"2024-04-28T22:07:25.000Z","size":1560,"stargazers_count":62,"open_issues_count":1,"forks_count":6,"subscribers_count":8,"default_branch":"master","last_synced_at":"2025-03-28T04:35:05.224Z","etag":null,"topics":["webcomics","website"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/pennomi.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2018-08-16T03:46:03.000Z","updated_at":"2025-02-22T23:55:56.000Z","dependencies_parsed_at":"2024-04-28T22:40:04.273Z","dependency_job_id":null,"html_url":"https://github.com/pennomi/comics","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pennomi%2Fcomics","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pennomi%2Fcomics/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pennomi%2Fcomics/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pennomi%2Fcomics/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/pennomi","download_url":"https://codeload.github.com/pennomi/comics/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248907928,"owners_count":21181433,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["webcomics","website"],"created_at":"2024-11-16T04:41:31.395Z","updated_at":"2025-04-14T15:42:15.568Z","avatar_url":"https://github.com/pennomi.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# License\r\n\r\nThis minimal webcomics platform is available under the terms of the permissive MIT license. While not required, if you \r\ndo something interesting with the code, please drop us a line; we'd love to know what you're up to!\r\n\r\n\r\n# Project Setup\r\n\r\nWant to run a comics server for yourself? Maybe you'd rather send us a bug fix or new feature? Get started here.\r\n\r\n\r\n## Docker Setup\r\n\r\nIf you're unfamiliar with Docker, this might be a little tricky for you. It's worth learning though; power through it until you understand!\r\n\r\n- Install Docker and Docker Compose for your platform\r\n- Run `python generate_env.py` to set up the docker environment configuration. Answer `y` to the prompt if you're doing development work, or `n` if you're deploying a server.\r\n- Run `docker compose up --build -d`\r\n\r\nYou now have a server running. Unfortunately it doesn't do much - we need to initialize the data or restore from a backup.\r\n\r\n\r\n## Initialize Data From Scratch\r\n\r\n- Enter a shell on the docker django machine `docker compose exec django bash`\r\n- Create the database `python manage.py migrate`\r\n- Add a superuser `python manage.py createsuperuser`. Follow the prompts.\r\n- Collect static files `python manage.py collectstatic`\r\n- The site will now be running on `http://localhost`. (Note that this is running on port 80 unlike many development servers.)\r\n- Add Data into the [Django Admin](http://localhost/admin/). Set up at least one Comic and then give it at least one Page. The Comic should use `localhost` as its \"domain\" so the URL router knows where to find it.\r\n- Open [the Site](http://localhost) in a Web Browser.\r\n\r\n\r\n## Backing Up and Restoring Data\r\n\r\nTo back up your database, run `docker compose exec django python manage.py backup dump \u003cyour filename here\u003e.zip`.\r\n\r\nTo restore your database from a backup zip:\r\n - Ensure you have an empty database to start. It should be migrated.\r\n - Then load the backup zip `docker-compose exec django python manage.py backup load \u003cyour filename here\u003e.zip`.\r\n - Log into your admin and make sure to change any Comics or Alias URLs so they work on your new IPs/Domains.\r\n\r\n# Setting up SSL certs\r\n\r\nThe caddy server will automatically generate certs for the domain set in project.env\r\n\r\n# Roadmap\r\n\r\n- [ ] Bug Fixes\r\n  - [ ] Alt text doesn't dynamically change with page switch on Chrome\r\n  - [ ] nginx access and error logs don't ever cycle, so they might fill up the disk.\r\n  - [ ] Migrate to a slightly larger server for the extra RAM\r\n- [ ] Nice New Features\r\n  - [ ] Community Page: a quick link to all social pages\r\n    - [ ] LD+JSON for author and all community links\r\n  - [ ] Extended Markdown for tag links; update transcripts and wiki pages\r\n    - [ ] Auto-migrate tags when they are renamed.\r\n  - [ ] Global search functionality for archive (returns tags and pages)\r\n- [ ] Comments Overhaul\r\n  - [ ] The forum isn't working out well for comments, is hard to set up, and embedding has gotten harder. What can we do instead?\r\n- [ ] New URL-based Router\r\n  - [ ] Blacklisted page slugs (\"feed\", \"data\")\r\n  - [ ] Restricted admin permissions for artists\r\n  - [ ] Automate SSL certs through LetsEncrypt as a management command\r\n  - [ ] Autorenew certs where applicable\r\n- [ ] Code Cleanliness \u0026 Data Integrity\r\n  - [ ] Ensure RSS feed has no issues. Validate with https://validator.w3.org/feed/check.cgi\r\n  - [ ] Make the CSS variables load into the template and move the main css file out to a static file\r\n  - [ ] Load any JS variables into the template and move the main js file out to a static file\r\n  - [ ] Migrate media files to namespaced paths. Randomize comic page image names so they're not guessable.\r\n  - [ ] Periodically clean out orphaned media. Make sure the comments still link properly.\r\n  - [ ] Use proper HTML template elements for dynamic sections\r\n- [ ] Optimization\r\n  - [ ] Run everything through an SEO checker\r\n  - [ ] Google PageSpeed Insights\r\n  - [ ] User Timing API for real user data\r\n- [ ] Onboarding\r\n  - [ ] Add a \"no content\" placeholder template for comics that have no pages yet\r\n- [ ] New Reader \"Quests\" Section\r\n  - [ ] Subscribe to RSS feed\r\n  - [ ] Social Share Functionality\r\n  - [ ] Vote for me on TopWebComics\r\n  - [ ] Patreon integration\r\n    - [ ] Become a Patron\r\n    - [ ] Remove Ads if user is authed\r\n    - [ ] Google Analytics tracking for conversion\r\n  - [ ] Browser Push Notifications\r\n    - [ ] Only present the modal if requested\r\n    - [ ] Take them to a dedicated page that explains what to expect and then present modal\r\n    - [ ] Look here: [browser push notifications](https://developers.google.com/web/updates/2016/07/web-push-interop-wins)\r\n  - [ ] Join the Conversation on Discord\r\n  - [ ] Tip me on Ko-Fi\r\n  - [ ] GA event tracking\r\n- [ ] Host static media through a better server than gunicorn\r\n- [ ] Auto-post to various social media\r\n  - [ ] General OAuth login\r\n  - [ ] Reddit\r\n  - [ ] Instagram\r\n  - [ ] Discord\r\n  - [ ] Patreon\r\n  - [ ] Webtoons\r\n  - [ ] Tumblr\r\n- [ ] Merch Shop\r\n  - [ ] Identify partner\r\n  - [ ] One product beta\r\n  - [ ] Upload image with strict specifications\r\n  - [ ] Google Analytics tracking for conversion\r\n- [ ] QoL improvements\r\n  - [ ] Error handling for failed AJAX requests\r\n  - [ ] Reveal Hover Text button\r\n  - [ ] Smooth out navigation so people don't get stuck in the tag pages (\"Return to the Comic\" button)\r\n  - [ ] Search\r\n  - [ ] Translations\r\n  - [ ] Transcript/Tag suggestions\r\n  - [ ] Better reading experience for people with 1366x768 laptop screens\r\n  - [ ] Nice 404 page. Maybe make it configurable per comic. (404 Sword Not Found)\r\n- [ ] Search Engine Optimization\r\n  - [ ] Metadata\r\n    - [x] Page\r\n    - [ ] Archive\r\n    - [ ] Tag\r\n    - [ ] TagType\r\n  - [ ] robots.txt \u0026 sitemap (These are stubbed out. Please finish.)\r\n  - [ ] Schema.org tagging for our pages, tags\r\n    - [ ] About the author section\r\n    - [ ] Character section\r\n    - [ ] Distinguish between cover art, etc\r\n    - [ ] Javascript changing of values where appropriate\r\n    - [ ] Tags might want a nullable \"schema type\"\r\n- [ ] Other Wishlist\r\n  - [ ] Translations\r\n  - [ ] Order by Chronological vs Release vs whatever\r\n\r\n# Other ideas:\r\n\r\n- [ ] Swords \"panel bot\" (request a comic id and panel number for a cropped version of the comic)\r\n\r\n# AWS Ubuntu Setup\r\n\r\nHere's a rough outline of what I did to get this server deployed on a fresh Ubuntu AWS EC2 instance.\r\n\r\n```bash\r\n# Apply security updates\r\nsudo apt update\r\nsudo apt upgrade\r\n\r\n# Get Docker\r\nsudo apt install apt-transport-https ca-certificates curl software-properties-common\r\ncurl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg\r\necho \"deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable\" | sudo tee /etc/apt/sources.list.d/docker.list \u003e /dev/null\r\nsudo apt update\r\nsudo apt install docker-ce\r\n\r\n# Get Docker Compose\r\nmkdir -p ~/.docker/cli-plugins/\r\ncurl -SL https://github.com/docker/compose/releases/download/v2.3.3/docker-compose-linux-x86_64 -o ~/.docker/cli-plugins/docker-compose\r\nchmod +x ~/.docker/cli-plugins/docker-compose\r\n\r\n# Make it so we don't have to use docker with sudo\r\nsudo usermod -aG docker ${USER}\r\nnewgrp docker\r\n\r\n# Get the project\r\ngit clone https://github.com/pennomi/comics.git\r\ncd comics\r\n\r\n# HEADS UP! First remember to set your DNS to the public IP address of the server\r\npython3 generate_env.py  # Select \"n\" because this is a production environment\r\ndocker compose build\r\n\r\n# Start the server\r\ndocker compose up --build -d\r\n\r\n# Create the database and initialize the static files\r\ndocker compose exec django python manage.py migrate\r\ndocker compose exec django python manage.py collectstatic\r\n\r\n# EITHER initialize the data\r\ndocker compose exec django python manage.py createsuperuser\r\n# OR load from a data dump\r\ndocker compose exec django python manage.py backup load \u003cdumpfile.zip\u003e\r\n\r\n# Restart the server\r\ndocker compose restart\r\n```\r\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpennomi%2Fcomics","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fpennomi%2Fcomics","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpennomi%2Fcomics/lists"}