diff --git a/.docker/vivaldi/Dockerfile b/.docker/vivaldi/Dockerfile new file mode 100644 index 0000000..b5fa22d --- /dev/null +++ b/.docker/vivaldi/Dockerfile @@ -0,0 +1,42 @@ +ARG BASE_IMAGE=m1k1o/neko:base +FROM $BASE_IMAGE + +ARG VIVALDI_VERSION="5.3.2679.34-1" +# TODO: Get chromium version from vivaldi +ARG CHROMIUM_VERSION="102.0.5005.72" + +# +# install vivaldi +SHELL ["/bin/bash", "-c"] +RUN set -eux; apt-get update; \ + wget -O /tmp/vivaldi.deb "https://downloads.vivaldi.com/stable/vivaldi-stable_${VIVALDI_VERSION}_amd64.deb"; \ + apt-get install -y --no-install-recommends wget unzip xz-utils jq openbox /tmp/vivaldi.deb; \ + /opt/vivaldi/update-ffmpeg; \ + # + # install latest version of uBlock Origin and SponsorBlock for YouTube + EXTENSIONS_DIR="/usr/share/chromium/extensions"; \ + EXTENSIONS=( \ + cjpalhdlnbpafiamejdnhcphjbkeiagm \ + mnjggcdmjocbbbhaepdhchncahnbgone \ + ); \ + mkdir -p "${EXTENSIONS_DIR}"; \ + for EXT_ID in "${EXTENSIONS[@]}"; \ + do \ + EXT_URL="https://clients2.google.com/service/update2/crx?response=redirect&nacl_arch=x86-64&prodversion=${CHROMIUM_VERSION}&acceptformat=crx2,crx3&x=id%3D${EXT_ID}%26installsource%3Dondemand%26uc"; \ + EXT_PATH="${EXTENSIONS_DIR}/${EXT_ID}.crx"; \ + wget -O "${EXT_PATH}" "${EXT_URL}"; \ + EXT_VERSION="$(unzip -p "${EXT_PATH}" manifest.json 2>/dev/null | jq -r ".version")"; \ + echo -e "{\n \"external_crx\": \"${EXT_PATH}\",\n \"external_version\": \"${EXT_VERSION}\"\n}" > "${EXTENSIONS_DIR}"/"${EXT_ID}".json; \ + done; \ + # + # clean up + apt-get --purge autoremove -y xz-utils jq; \ + apt-get clean -y; \ + rm -rf /var/lib/apt/lists/* /var/cache/apt/* + +# +# copy configuation files +COPY supervisord.conf /etc/neko/supervisord/vivaldi-browser.conf +COPY --chown=neko preferences.json /home/neko/.config/vivaldi/Default/Preferences +COPY policies.json /etc/opt/vivaldi/policies/managed/policies.json +COPY openbox.xml /etc/neko/openbox.xml diff --git a/.docker/vivaldi/openbox.xml b/.docker/vivaldi/openbox.xml new file mode 100644 index 0000000..94fb830 --- /dev/null +++ b/.docker/vivaldi/openbox.xml @@ -0,0 +1,763 @@ + + + + + + + + 10 + 20 + + + + + + no + true + yes + normal + + + + + yes + + no + + yes + + no + + 200 + + no + + + + + Smart + +
yes
+ + Primary + + 1 + +
+ + + Clearlooks + NLIMC + + yes + yes + + sans + 8 + + bold + + normal + + + + sans + 8 + + bold + + normal + + + + sans + 9 + + normal + + normal + + + + sans + 9 + + normal + + normal + + + + sans + 9 + + bold + + normal + + + + sans + 9 + + bold + + normal + + + + + + + 1 + 1 + + + + 875 + + + + + yes + Nonpixel + + Center + + + + + 10 + + 10 + + + + + + + 0 + 0 + 0 + 0 + + + + TopLeft + + 0 + 0 + no + Above + + Vertical + + no + 300 + + 300 + + Middle + + + + + C-g + + + + leftno + + + rightno + + + upno + + + downno + + + leftno + + + rightno + + + upno + + + downno + + + 1 + + + 2 + + + 3 + + + 4 + + + + + + + + + + + + + + + + + + + + scrot -s + + + + + + + + + + + + + + + + + + + + + + + + yesyes + + + + + + + + + + + + right + + + + + left + + + + + up + + + + + down + + + + + + + + true + Konqueror + + kfmclient openProfile filemanagement + + + + + scrot + + + + + 1 + + 500 + + 400 + + false + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + previous + + + next + + + previous + + + next + + + previous + + + next + + + + + + + + + + + + + + no + + + + + + + + + + + yes + + + + + + + + + + + + + + + + + + + + + + + + + + + top + + + + + + left + + + + + + right + + + + + + bottom + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + vertical + + + horizontal + + + + + + + + + + + + + + + + + previous + + + next + + + + previous + + + next + + + previous + + + next + + + + + + + + + + + + + + + + + + + + previous + + + next + + + previous + + + next + + + + + + + + + + + menu.xml + 200 + + no + + 100 + + 400 + + yes + + yes + + + + + + + +
diff --git a/.docker/vivaldi/policies.json b/.docker/vivaldi/policies.json new file mode 100644 index 0000000..1c46099 --- /dev/null +++ b/.docker/vivaldi/policies.json @@ -0,0 +1,38 @@ +{ + "HomepageLocation": "", + "AutoFillEnabled": false, + "AutofillAddressEnabled": false, + "AutofillCreditCardEnabled": false, + "BrowserSignin": 0, + "DefaultNotificationsSetting": 2, + "DeveloperToolsAvailability": 2, + "EditBookmarksEnabled": false, + "FullscreenAllowed": true, + "IncognitoModeAvailability": 1, + "SyncDisabled": true, + "AutoplayAllowed": true, + "BrowserAddPersonEnabled": false, + "BrowserGuestModeEnabled": false, + "DefaultPopupsSetting": 2, + "DownloadRestrictions": 3, + "VideoCaptureAllowed": true, + "AllowFileSelectionDialogs": false, + "PromptForDownloadLocation": false, + "BookmarkBarEnabled": false, + "PasswordManagerEnabled": false, + "URLBlacklist": [ + "file://*", + "chrome://policy" + ], + "ExtensionInstallForcelist": [ + "cjpalhdlnbpafiamejdnhcphjbkeiagm;https://clients2.google.com/service/update2/crx", + "mnjggcdmjocbbbhaepdhchncahnbgone;https://clients2.google.com/service/update2/crx" + ], + "ExtensionInstallWhitelist": [ + "cjpalhdlnbpafiamejdnhcphjbkeiagm", + "mnjggcdmjocbbbhaepdhchncahnbgone" + ], + "ExtensionInstallBlacklist": [ + "*" + ] +} diff --git a/.docker/vivaldi/preferences.json b/.docker/vivaldi/preferences.json new file mode 100644 index 0000000..54cfc02 --- /dev/null +++ b/.docker/vivaldi/preferences.json @@ -0,0 +1,339 @@ +{ + "homepage": "http://www.google.com", + "homepage_is_newtabpage": false, + "first_run_tabs": [ + "https://www.google.com/_/chrome/newtab?ie=UTF-8" + ], + "custom_links": { + "initialized": true, + "list": [ + { + "title": "YouTube", + "url": "https://www.youtube.com/" + }, + { + "title": "Netflix", + "url": "https://netflix.com" + }, + { + "title": "Hulu", + "url": "https://www.hulu.com/" + }, + { + "title": "9Anime", + "url": "https://9anime.to/" + }, + { + "title": "Crunchy Roll", + "url": "https://www.crunchyroll.com/" + }, + { + "title": "Funimation", + "url": "https://www.funimation.com/" + }, + { + "title": "Disney+", + "url": "https://www.disneyplus.com/" + }, + { + "title": "HBO Now", + "url": "https://play.hbonow.com/" + }, + { + "title": "Amazon Video", + "url": "https://www.amazon.com/Amazon-Video/b?node=2858778011" + }, + { + "title": "VRV", + "url": "https://vrv.co/" + }, + { + "title": "Twitch", + "url": "https://www.twitch.tv/" + }, + { + "title": "Mixer", + "url": "https://mixer.com/" + } + ] + }, + "browser": { + "custom_chrome_frame": false, + "show_home_button": true, + "window_placement": { + "maximized": true + } + }, + "bookmark_bar": { + "show_on_all_tabs": false + }, + "sync_promo": { + "show_on_first_run_allowed": false + }, + "default_search_provider_data": { + "image_template_url_data": { + "alternate_urls": ["https://www.google.com/#q={searchTerms}", "https://www.google.com/search#q={searchTerms}", "https://www.google.com/webhp#q={searchTerms}", "https://www.google.com/s#q={searchTerms}", "https://www.google.com/s?q={searchTerms}"], + "contextual_search_url": "", + "created_by_policy": false, + "created_from_play_api": false, + "date_created": "0", + "doodle_url": "", + "favicon_url": "https://www.google.com/favicon.ico", + "id": "11", + "image_url": "https://www.google.com/searchbyimage/upload", + "image_url_post_params": "encoded_image={google:imageThumbnail},image_url={google:imageURL},sbisrc={google:imageSearchSource},original_width={google:imageOriginalWidth},original_height={google:imageOriginalHeight}", + "input_encodings": ["UTF-8"], + "is_active": 0, + "keyword": "g", + "last_modified": "0", + "last_visited": "0", + "logo_url": "", + "new_tab_url": "", + "originating_url": "", + "position": "IhxEc1dKb3ZJanppM1NCWTZhRHNGN0ljYkRHeVk9", + "preconnect_to_search_url": false, + "prepopulate_id": 1, + "safe_for_autoreplace": true, + "search_url_post_params": "", + "short_name": "Google", + "side_search_param": "", + "suggestions_url": "", + "suggestions_url_post_params": "", + "url": "https://www.google.com/search?q={searchTerms}&{google:originalQueryForSuggestion}{google:prefetchSource}{google:sourceId}{google:contextualSearchVersion}ie={inputEncoding}", + "usage_count": 0 + }, + "private_template_url_data": { + "alternate_urls": [], + "contextual_search_url": "", + "created_by_policy": false, + "created_from_play_api": false, + "date_created": "0", + "doodle_url": "", + "favicon_url": "https://duckduckgo.com/favicon.ico", + "id": "4", + "image_url": "", + "image_url_post_params": "", + "input_encodings": ["UTF-8"], + "is_active": 0, + "keyword": "d", + "last_modified": "0", + "last_visited": "0", + "logo_url": "", + "new_tab_url": "", + "originating_url": "", + "position": "Ih3bMkFheVB5WitEdGZmeU9hV0d5K3RGUXRhR3RFPQ==", + "preconnect_to_search_url": false, + "prepopulate_id": 7, + "safe_for_autoreplace": true, + "search_url_post_params": "", + "short_name": "DuckDuckGo", + "side_search_param": "", + "suggestions_url": "https://duckduckgo.com/ac/?q={searchTerms}&type=list", + "suggestions_url_post_params": "", + "url": "https://duckduckgo.com/?q={searchTerms}&{ddg:Referral}", + "usage_count": 0 + }, + "speeddials_template_url_data": { + "alternate_urls": ["https://www.google.com/#q={searchTerms}", "https://www.google.com/search#q={searchTerms}", "https://www.google.com/webhp#q={searchTerms}", "https://www.google.com/s#q={searchTerms}", "https://www.google.com/s?q={searchTerms}"], + "contextual_search_url": "", + "created_by_policy": false, + "created_from_play_api": false, + "date_created": "0", + "doodle_url": "", + "favicon_url": "https://www.google.com/favicon.ico", + "id": "11", + "image_url": "https://www.google.com/searchbyimage/upload", + "image_url_post_params": "encoded_image={google:imageThumbnail},image_url={google:imageURL},sbisrc={google:imageSearchSource},original_width={google:imageOriginalWidth},original_height={google:imageOriginalHeight}", + "input_encodings": ["UTF-8"], + "is_active": 0, + "keyword": "g", + "last_modified": "0", + "last_visited": "0", + "logo_url": "", + "new_tab_url": "", + "originating_url": "", + "position": "IhxEc1dKb3ZJanppM1NCWTZhRHNGN0ljYkRHeVk9", + "preconnect_to_search_url": false, + "prepopulate_id": 1, + "safe_for_autoreplace": true, + "search_url_post_params": "", + "short_name": "Google", + "side_search_param": "", + "suggestions_url": "", + "suggestions_url_post_params": "", + "url": "https://www.google.com/search?q={searchTerms}&{google:originalQueryForSuggestion}{google:prefetchSource}{google:sourceId}{google:contextualSearchVersion}ie={inputEncoding}", + "usage_count": 0 + }, + "template_url_data": { + "alternate_urls": ["https://www.google.com/#q={searchTerms}", "https://www.google.com/search#q={searchTerms}", "https://www.google.com/webhp#q={searchTerms}", "https://www.google.com/s#q={searchTerms}", "https://www.google.com/s?q={searchTerms}"], + "contextual_search_url": "", + "created_by_policy": false, + "created_from_play_api": false, + "date_created": "0", + "doodle_url": "", + "favicon_url": "https://www.google.com/favicon.ico", + "id": "11", + "image_url": "https://www.google.com/searchbyimage/upload", + "image_url_post_params": "encoded_image={google:imageThumbnail},image_url={google:imageURL},sbisrc={google:imageSearchSource},original_width={google:imageOriginalWidth},original_height={google:imageOriginalHeight}", + "input_encodings": ["UTF-8"], + "is_active": 0, + "keyword": "g", + "last_modified": "0", + "last_visited": "0", + "logo_url": "", + "new_tab_url": "", + "originating_url": "", + "position": "IhxEc1dKb3ZJanppM1NCWTZhRHNGN0ljYkRHeVk9", + "preconnect_to_search_url": false, + "prepopulate_id": 1, + "safe_for_autoreplace": true, + "search_url_post_params": "", + "short_name": "Google", + "side_search_param": "", + "suggestions_url": "", + "suggestions_url_post_params": "", + "url": "https://www.google.com/search?q={searchTerms}&{google:originalQueryForSuggestion}{google:prefetchSource}{google:sourceId}{google:contextualSearchVersion}ie={inputEncoding}", + "usage_count": 0 + } + }, + "distribution": { + "import_bookmarks_from_file": "bookmarks.html", + "import_bookmarks": true, + "import_history": true, + "import_home_page": true, + "import_search_engine": true, + "ping_delay": 60, + "do_not_create_desktop_shortcut": true, + "do_not_create_quick_launch_shortcut": true, + "do_not_create_taskbar_shortcut": true, + "do_not_launch_chrome": true, + "do_not_register_for_update_launch": true, + "make_chrome_default": true, + "make_chrome_default_for_user": true, + "system_level": false, + "verbose_logging": false + }, + "enable_do_not_track": true, + "profile": { + "avatar_index": 34, + "default_content_setting_values": { + "clipboard": 2, + "cookies": 4, + "geolocation": 2, + "media_stream_camera": 2, + "media_stream_mic": 2, + "midi_sysex": 2, + "payment_handler": 2, + "usb_guard": 2 + }, + "name": "Neko", + "using_default_avatar": false, + "using_default_name": false, + "using_gaia_avatar": false + }, + "signin": { + "allowed": false + }, + "vivaldi": { + "address_bar": { + "autocomplete": { + "enabled": false + }, + "omnibox": { + "show_browser_history": false, + "show_search_history": false, + "show_typed_history": false + }, + "search": { + "display": 1, + "in_new_tab": false + }, + "show_full_url": true, + "show_qr_generator": true, + "visible": true + }, + "bookmarks": { + "deleted_partners": [ + "f79cd6e8-ebc0-444d-ac96-00da456dcb59", + "d680347f-1073-46b9-a546-ae0238e7b9d9" + ], + "language": "en-US", + "version": "24" + }, + "downloads": { + "notify_on_complete": false, + "open_panel_on_new": false, + "start_automatically": false, + "update_default_download_when_saving_as": false + }, + "history": { + "days_to_keep_visits": 0 + }, + "homepage": "vivaldi://startpage", + "incognito": { + "show_intro": false + }, + "language_at_install": "en-US", + "menu": { + "icon_type": 1 + }, + "mouse_gestures": { + "enabled": false, + "rocker_gestures": { + "enabled": false + } + }, + "popups": { + "show_in_tab": true + }, + "settings": { + "in_tab": true + }, + "startpage": { + "navigation": 1, + "speed_dial": { + "add_button_visible": false, + "allow_dnd": false, + "columns": 4, + "delete_visible": false, + "display_search": true, + "privacy_stats_show": false, + "tracker_suggestion_show": false, + "width": 170 + } + }, + "startup": { + "check_is_default": false, + "has_seen_feature": 1 + }, + "status_bar": { + "display": 0, + "minimized": 0 + }, + "system": { + "show_exit_confirmation_dialog": true + }, + "tabs": { + "new_placement": 3, + "open_new_in_background": false, + "stacking": { + "open_accordions": [] + } + }, + "theme": { + "schedule": { + "o_s": { + "dark": "Vivaldi2", + "light": "Vivaldi2" + } + }, + "use_animation": false + }, + "translate": { + "enabled": false + }, + "windows": { + "use_native_decoration": true + } + } +} diff --git a/.docker/vivaldi/supervisord.conf b/.docker/vivaldi/supervisord.conf new file mode 100644 index 0000000..c972801 --- /dev/null +++ b/.docker/vivaldi/supervisord.conf @@ -0,0 +1,22 @@ +[program:vivaldi-stable] +environment=HOME="/home/%(ENV_USER)s",USER="%(ENV_USER)s",DISPLAY="%(ENV_DISPLAY)s" +command=/usr/bin/vivaldi-stable --no-sandbox --window-position=0,0 --display=%(ENV_DISPLAY)s --user-data-dir=/home/neko/.config/vivaldi --no-first-run --start-maximized --bwsi --force-dark-mode --disable-file-system --disable-gpu --disable-software-rasterizer --disable-dev-shm-usage +stopsignal=INT +autorestart=true +priority=800 +user=%(ENV_USER)s +stdout_logfile=/var/log/neko/vivaldi.log +stdout_logfile_maxbytes=100MB +stdout_logfile_backups=10 +redirect_stderr=true + +[program:openbox] +environment=HOME="/home/%(ENV_USER)s",USER="%(ENV_USER)s",DISPLAY="%(ENV_DISPLAY)s" +command=/usr/bin/openbox --config-file /etc/neko/openbox.xml +autorestart=true +priority=300 +user=%(ENV_USER)s +stdout_logfile=/var/log/neko/openbox.log +stdout_logfile_maxbytes=100MB +stdout_logfile_backups=10 +redirect_stderr=true diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index a93225d..f9e429b 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -50,7 +50,7 @@ jobs: # Will build all images even if some fail. fail-fast: false matrix: - tags: [ firefox, chromium, google-chrome, ungoogled-chromium, microsoft-edge, brave, tor-browser, remmina, vlc, xfce ] + tags: [ firefox, chromium, google-chrome, ungoogled-chromium, microsoft-edge, brave, vivaldi, tor-browser, remmina, vlc, xfce ] env: DOCKER_TAG: ${{ matrix.tags }} steps: diff --git a/.github/workflows/tags.yml b/.github/workflows/tags.yml index 16dfd70..26cbf32 100644 --- a/.github/workflows/tags.yml +++ b/.github/workflows/tags.yml @@ -78,6 +78,8 @@ jobs: platforms: linux/amd64 - tag: brave platforms: linux/amd64 + - tag: vivaldi + platforms: linux/amd64 - tag: tor-browser platforms: linux/amd64,linux/arm64 - tag: remmina diff --git a/docs/changelog.md b/docs/changelog.md index a51fc57..5d30683 100644 --- a/docs/changelog.md +++ b/docs/changelog.md @@ -2,6 +2,9 @@ ## master branch +### New Features +- Added `m1k1o/neko:vivaldi` tag (thanks @Xeddius). + ## [n.eko v2.6](https://github.com/m1k1o/neko/releases/tag/v2.6) ### Bugs diff --git a/docs/getting-started/README.md b/docs/getting-started/README.md index 38b0dd6..a3495ca 100644 --- a/docs/getting-started/README.md +++ b/docs/getting-started/README.md @@ -7,6 +7,7 @@ Use the following docker images: - `m1k1o/neko:ungoogled-chromium` - for [Ungoogled Chromium](https://github.com/Eloston/ungoogled-chromium) (needs `--cap-add=SYS_ADMIN`, see the [security implications](https://www.redhat.com/en/blog/container-tidbits-adding-capabilities-container)) (by @whalehub). - `m1k1o/neko:microsoft-edge` - for Microsoft Edge (needs `--cap-add=SYS_ADMIN`, see the [security implications](https://www.redhat.com/en/blog/container-tidbits-adding-capabilities-container)). - `m1k1o/neko:brave` - for [Brave Browser](https://brave.com) (needs `--cap-add=SYS_ADMIN`, see the [security implications](https://www.redhat.com/en/blog/container-tidbits-adding-capabilities-container)). +- `m1k1o/neko:vivaldi` - for [Vivaldi Browser](https://vivaldi.com) (needs `--cap-add=SYS_ADMIN`, see the [security implications](https://www.redhat.com/en/blog/container-tidbits-adding-capabilities-container)) (by @Xeddius). - `m1k1o/neko:tor-browser` - for Tor Browser. - `m1k1o/neko:remmina` - for remote desktop connection (by @lowne). - Pass env var `REMMINA_URL=://[[:]@]server[:port]` (proto being `vnc`, `rdp` or `spice`).