diff --git a/.kateproject b/.kateproject
new file mode 100644
index 0000000000..ffa68f76c4
--- /dev/null
+++ b/.kateproject
@@ -0,0 +1,4 @@
+{
+ "name": "Glitch Soc - Barkshark Edition"
+, "files": [ { "git": 1 } ]
+}
\ No newline at end of file
diff --git a/Gemfile b/Gemfile
index 4389f8ebd5..b75991844a 100644
--- a/Gemfile
+++ b/Gemfile
@@ -106,10 +106,6 @@ group :development, :test do
gem 'rspec-rails', '~> 3.8'
end
-group :production, :test do
- gem 'private_address_check', '~> 0.5'
-end
-
group :test do
gem 'capybara', '~> 3.25'
gem 'climate_control', '~> 0.2'
diff --git a/Gemfile.lock b/Gemfile.lock
index c8e00d7a18..803c70774c 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -413,7 +413,6 @@ GEM
premailer-rails (1.10.2)
actionmailer (>= 3, < 6)
premailer (~> 1.7, >= 1.7.9)
- private_address_check (0.5.0)
pry (0.12.2)
coderay (~> 1.1.0)
method_source (~> 0.9.0)
@@ -724,7 +723,6 @@ DEPENDENCIES
pkg-config (~> 1.3)
posix-spawn!
premailer-rails
- private_address_check (~> 0.5)
pry-byebug (~> 3.7)
pry-rails (~> 0.3)
puma (~> 3.12)
diff --git a/Procfile b/Procfile
index b18e4b6be5..97bbb71dea 100644
--- a/Procfile
+++ b/Procfile
@@ -1,2 +1,3 @@
-web: bundle exec puma -C config/puma.rb
-worker: bundle exec sidekiq
+web: env PORT=3000 bundle exec puma -C config/puma.rb
+sidekiq: env PORT=3000 bundle exec sidekiq
+stream: env PORT=4000 yarn run start
diff --git a/README.md b/README.md
index 470e379dc0..eab3ecfa75 100644
--- a/README.md
+++ b/README.md
@@ -1,12 +1,21 @@
-# Mastodon Glitch Edition #
+# Glitch-Soc: Barkshark Edition
-> Now with automated deploys!
+It's [Mastodon](https://github.com/tootsuite/mastodon), but [Glitchy](https://github.com/glitch-soc/mastodon) and merpy
-[![Build Status](https://img.shields.io/circleci/project/github/glitch-soc/mastodon.svg)][circleci]
+## Differences
-[circleci]: https://circleci.com/gh/glitch-soc/mastodon
+* Optional extra themes
+* Domain purge command doesn't remove instance blocks (can be re-enabled)
+* Option to change audio length limit
+* Higher sidekiq job and db connection limit
+ * Sidekiq: 50 jobs
+ * DB Connections: 50
-So here's the deal: we all work on this code, and then it runs on dev.glitch.social and anyone who uses that does so absolutely at their own risk. can you dig it?
+## Installation
-- You can view documentation for this project at [glitch-soc.github.io/docs/](https://glitch-soc.github.io/docs/).
-- And contributing guidelines are available [here](CONTRIBUTING.md) and [here](https://glitch-soc.github.io/docs/contributing/).
+You can follow the normal guides for [production](https://docs.joinmastodon.org/administration/installation/) and [development](https://docs.joinmastodon.org/development/overview/) or use the setup scripts in dist.
+
+## Extra Themes
+
+* Nuzzle Plum by [TrashyFins](https://chomp.life/users/trashyfins)
+* Pink Moonlight by [Me](https://mastodon.barkshark.tk/users/izaliamae)
diff --git a/app/javascript/skins/glitch/nuzzle-plum/common.scss b/app/javascript/skins/glitch/nuzzle-plum/common.scss
new file mode 100644
index 0000000000..dd4546a5b0
--- /dev/null
+++ b/app/javascript/skins/glitch/nuzzle-plum/common.scss
@@ -0,0 +1,3 @@
+@import 'styles/nuzzle-plum/variables';
+@import 'flavours/glitch/styles/index';
+@import 'styles/nuzzle-plum/diff';
diff --git a/app/javascript/skins/glitch/nuzzle-plum/names.yml b/app/javascript/skins/glitch/nuzzle-plum/names.yml
new file mode 100644
index 0000000000..5a63ec042f
--- /dev/null
+++ b/app/javascript/skins/glitch/nuzzle-plum/names.yml
@@ -0,0 +1,4 @@
+en:
+ skins:
+ glitch:
+ nuzzle-plum: Nuzzle Plum
diff --git a/app/javascript/skins/glitch/pink-moonlight/LICENSE b/app/javascript/skins/glitch/pink-moonlight/LICENSE
new file mode 100644
index 0000000000..82b56508cc
--- /dev/null
+++ b/app/javascript/skins/glitch/pink-moonlight/LICENSE
@@ -0,0 +1,614 @@
+GNU AFFERO GENERAL PUBLIC LICENSE
+
+Version 3, 19 November 2007
+
+Copyright (C) 2007 Free Software Foundation, Inc.
+
+Everyone is permitted to copy and distribute verbatim copies of this license
+document, but changing it is not allowed.
+
+Preamble
+
+The GNU Affero General Public License is a free, copyleft license for software
+and other kinds of works, specifically designed to ensure cooperation with
+the community in the case of network server software.
+
+The licenses for most software and other practical works are designed to take
+away your freedom to share and change the works. By contrast, our General
+Public Licenses are intended to guarantee your freedom to share and change
+all versions of a program--to make sure it remains free software for all its
+users.
+
+When we speak of free software, we are referring to freedom, not price. Our
+General Public Licenses are designed to make sure that you have the freedom
+to distribute copies of free software (and charge for them if you wish), that
+you receive source code or can get it if you want it, that you can change
+the software or use pieces of it in new free programs, and that you know you
+can do these things.
+
+Developers that use our General Public Licenses protect your rights with two
+steps: (1) assert copyright on the software, and (2) offer you this License
+which gives you legal permission to copy, distribute and/or modify the software.
+
+A secondary benefit of defending all users' freedom is that improvements made
+in alternate versions of the program, if they receive widespread use, become
+available for other developers to incorporate. Many developers of free software
+are heartened and encouraged by the resulting cooperation. However, in the
+case of software used on network servers, this result may fail to come about.
+The GNU General Public License permits making a modified version and letting
+the public access it on a server without ever releasing its source code to
+the public.
+
+The GNU Affero General Public License is designed specifically to ensure that,
+in such cases, the modified source code becomes available to the community.
+It requires the operator of a network server to provide the source code of
+the modified version running there to the users of that server. Therefore,
+public use of a modified version, on a publicly accessible server, gives the
+public access to the source code of the modified version.
+
+An older license, called the Affero General Public License and published by
+Affero, was designed to accomplish similar goals. This is a different license,
+not a version of the Affero GPL, but Affero has released a new version of
+the Affero GPL which permits relicensing under this license.
+
+The precise terms and conditions for copying, distribution and modification
+follow.
+
+TERMS AND CONDITIONS
+
+ 0. Definitions.
+
+ "This License" refers to version 3 of the GNU Affero General Public License.
+
+"Copyright" also means copyright-like laws that apply to other kinds of works,
+such as semiconductor masks.
+
+"The Program" refers to any copyrightable work licensed under this License.
+Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals
+or organizations.
+
+To "modify" a work means to copy from or adapt all or part of the work in
+a fashion requiring copyright permission, other than the making of an exact
+copy. The resulting work is called a "modified version" of the earlier work
+or a work "based on" the earlier work.
+
+A "covered work" means either the unmodified Program or a work based on the
+Program.
+
+To "propagate" a work means to do anything with it that, without permission,
+would make you directly or secondarily liable for infringement under applicable
+copyright law, except executing it on a computer or modifying a private copy.
+Propagation includes copying, distribution (with or without modification),
+making available to the public, and in some countries other activities as
+well.
+
+To "convey" a work means any kind of propagation that enables other parties
+to make or receive copies. Mere interaction with a user through a computer
+network, with no transfer of a copy, is not conveying.
+
+An interactive user interface displays "Appropriate Legal Notices" to the
+extent that it includes a convenient and prominently visible feature that
+(1) displays an appropriate copyright notice, and (2) tells the user that
+there is no warranty for the work (except to the extent that warranties are
+provided), that licensees may convey the work under this License, and how
+to view a copy of this License. If the interface presents a list of user commands
+or options, such as a menu, a prominent item in the list meets this criterion.
+
+ 1. Source Code.
+
+The "source code" for a work means the preferred form of the work for making
+modifications to it. "Object code" means any non-source form of a work.
+
+A "Standard Interface" means an interface that either is an official standard
+defined by a recognized standards body, or, in the case of interfaces specified
+for a particular programming language, one that is widely used among developers
+working in that language.
+
+The "System Libraries" of an executable work include anything, other than
+the work as a whole, that (a) is included in the normal form of packaging
+a Major Component, but which is not part of that Major Component, and (b)
+serves only to enable use of the work with that Major Component, or to implement
+a Standard Interface for which an implementation is available to the public
+in source code form. A "Major Component", in this context, means a major essential
+component (kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to produce
+the work, or an object code interpreter used to run it.
+
+The "Corresponding Source" for a work in object code form means all the source
+code needed to generate, install, and (for an executable work) run the object
+code and to modify the work, including scripts to control those activities.
+However, it does not include the work's System Libraries, or general-purpose
+tools or generally available free programs which are used unmodified in performing
+those activities but which are not part of the work. For example, Corresponding
+Source includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically linked
+subprograms that the work is specifically designed to require, such as by
+intimate data communication or control flow between those
+
+ subprograms and other parts of the work.
+
+The Corresponding Source need not include anything that users can regenerate
+automatically from other parts of the Corresponding Source.
+
+ The Corresponding Source for a work in source code form is that same work.
+
+ 2. Basic Permissions.
+
+All rights granted under this License are granted for the term of copyright
+on the Program, and are irrevocable provided the stated conditions are met.
+This License explicitly affirms your unlimited permission to run the unmodified
+Program. The output from running a covered work is covered by this License
+only if the output, given its content, constitutes a covered work. This License
+acknowledges your rights of fair use or other equivalent, as provided by copyright
+law.
+
+You may make, run and propagate covered works that you do not convey, without
+conditions so long as your license otherwise remains in force. You may convey
+covered works to others for the sole purpose of having them make modifications
+exclusively for you, or provide you with facilities for running those works,
+provided that you comply with the terms of this License in conveying all material
+for which you do not control copyright. Those thus making or running the covered
+works for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of your copyrighted
+material outside their relationship with you.
+
+Conveying under any other circumstances is permitted solely under the conditions
+stated below. Sublicensing is not allowed; section 10 makes it unnecessary.
+
+ 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+No covered work shall be deemed part of an effective technological measure
+under any applicable law fulfilling obligations under article 11 of the WIPO
+copyright treaty adopted on 20 December 1996, or similar laws prohibiting
+or restricting circumvention of such measures.
+
+When you convey a covered work, you waive any legal power to forbid circumvention
+of technological measures to the extent such circumvention is effected by
+exercising rights under this License with respect to the covered work, and
+you disclaim any intention to limit operation or modification of the work
+as a means of enforcing, against the work's users, your or third parties'
+legal rights to forbid circumvention of technological measures.
+
+ 4. Conveying Verbatim Copies.
+
+You may convey verbatim copies of the Program's source code as you receive
+it, in any medium, provided that you conspicuously and appropriately publish
+on each copy an appropriate copyright notice; keep intact all notices stating
+that this License and any non-permissive terms added in accord with section
+7 apply to the code; keep intact all notices of the absence of any warranty;
+and give all recipients a copy of this License along with the Program.
+
+You may charge any price or no price for each copy that you convey, and you
+may offer support or warranty protection for a fee.
+
+ 5. Conveying Modified Source Versions.
+
+You may convey a work based on the Program, or the modifications to produce
+it from the Program, in the form of source code under the terms of section
+4, provided that you also meet all of these conditions:
+
+a) The work must carry prominent notices stating that you modified it, and
+giving a relevant date.
+
+b) The work must carry prominent notices stating that it is released under
+this License and any conditions added under section 7. This requirement modifies
+the requirement in section 4 to "keep intact all notices".
+
+c) You must license the entire work, as a whole, under this License to anyone
+who comes into possession of a copy. This License will therefore apply, along
+with any applicable section 7 additional terms, to the whole of the work,
+and all its parts, regardless of how they are packaged. This License gives
+no permission to license the work in any other way, but it does not invalidate
+such permission if you have separately received it.
+
+d) If the work has interactive user interfaces, each must display Appropriate
+Legal Notices; however, if the Program has interactive interfaces that do
+not display Appropriate Legal Notices, your work need not make them do so.
+
+A compilation of a covered work with other separate and independent works,
+which are not by their nature extensions of the covered work, and which are
+not combined with it such as to form a larger program, in or on a volume of
+a storage or distribution medium, is called an "aggregate" if the compilation
+and its resulting copyright are not used to limit the access or legal rights
+of the compilation's users beyond what the individual works permit. Inclusion
+of a covered work in an aggregate does not cause this License to apply to
+the other parts of the aggregate.
+
+ 6. Conveying Non-Source Forms.
+
+You may convey a covered work in object code form under the terms of sections
+4 and 5, provided that you also convey the machine-readable Corresponding
+Source under the terms of this License, in one of these ways:
+
+a) Convey the object code in, or embodied in, a physical product (including
+a physical distribution medium), accompanied by the Corresponding Source fixed
+on a durable physical medium customarily used for software interchange.
+
+b) Convey the object code in, or embodied in, a physical product (including
+a physical distribution medium), accompanied by a written offer, valid for
+at least three years and valid for as long as you offer spare parts or customer
+support for that product model, to give anyone who possesses the object code
+either (1) a copy of the Corresponding Source for all the software in the
+product that is covered by this License, on a durable physical medium customarily
+used for software interchange, for a price no more than your reasonable cost
+of physically performing this conveying of source, or (2) access to copy the
+Corresponding Source from a network server at no charge.
+
+c) Convey individual copies of the object code with a copy of the written
+offer to provide the Corresponding Source. This alternative is allowed only
+occasionally and noncommercially, and only if you received the object code
+with such an offer, in accord with subsection 6b.
+
+d) Convey the object code by offering access from a designated place (gratis
+or for a charge), and offer equivalent access to the Corresponding Source
+in the same way through the same place at no further charge. You need not
+require recipients to copy the Corresponding Source along with the object
+code. If the place to copy the object code is a network server, the Corresponding
+Source may be on a different server (operated by you or a third party) that
+supports equivalent copying facilities, provided you maintain clear directions
+next to the object code saying where to find the Corresponding Source. Regardless
+of what server hosts the Corresponding Source, you remain obligated to ensure
+that it is available for as long as needed to satisfy these requirements.
+
+e) Convey the object code using peer-to-peer transmission, provided you inform
+other peers where the object code and Corresponding Source of the work are
+being offered to the general public at no charge under subsection 6d.
+
+A separable portion of the object code, whose source code is excluded from
+the Corresponding Source as a System Library, need not be included in conveying
+the object code work.
+
+A "User Product" is either (1) a "consumer product", which means any tangible
+personal property which is normally used for personal, family, or household
+purposes, or (2) anything designed or sold for incorporation into a dwelling.
+In determining whether a product is a consumer product, doubtful cases shall
+be resolved in favor of coverage. For a particular product received by a particular
+user, "normally used" refers to a typical or common use of that class of product,
+regardless of the status of the particular user or of the way in which the
+particular user actually uses, or expects or is expected to use, the product.
+A product is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent the
+only significant mode of use of the product.
+
+"Installation Information" for a User Product means any methods, procedures,
+authorization keys, or other information required to install and execute modified
+versions of a covered work in that User Product from a modified version of
+its Corresponding Source. The information must suffice to ensure that the
+continued functioning of the modified object code is in no case prevented
+or interfered with solely because modification has been made.
+
+If you convey an object code work under this section in, or with, or specifically
+for use in, a User Product, and the conveying occurs as part of a transaction
+in which the right of possession and use of the User Product is transferred
+to the recipient in perpetuity or for a fixed term (regardless of how the
+transaction is characterized), the Corresponding Source conveyed under this
+section must be accompanied by the Installation Information. But this requirement
+does not apply if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has been installed
+in ROM).
+
+The requirement to provide Installation Information does not include a requirement
+to continue to provide support service, warranty, or updates for a work that
+has been modified or installed by the recipient, or for the User Product in
+which it has been modified or installed. Access to a network may be denied
+when the modification itself materially and adversely affects the operation
+of the network or violates the rules and protocols for communication across
+the network.
+
+Corresponding Source conveyed, and Installation Information provided, in accord
+with this section must be in a format that is publicly documented (and with
+an implementation available to the public in source code form), and must require
+no special password or key for unpacking, reading or copying.
+
+ 7. Additional Terms.
+
+"Additional permissions" are terms that supplement the terms of this License
+by making exceptions from one or more of its conditions. Additional permissions
+that are applicable to the entire Program shall be treated as though they
+were included in this License, to the extent that they are valid under applicable
+law. If additional permissions apply only to part of the Program, that part
+may be used separately under those permissions, but the entire Program remains
+governed by this License without regard to the additional permissions.
+
+When you convey a copy of a covered work, you may at your option remove any
+additional permissions from that copy, or from any part of it. (Additional
+permissions may be written to require their own removal in certain cases when
+you modify the work.) You may place additional permissions on material, added
+by you to a covered work, for which you have or can give appropriate copyright
+permission.
+
+Notwithstanding any other provision of this License, for material you add
+to a covered work, you may (if authorized by the copyright holders of that
+material) supplement the terms of this License with terms:
+
+a) Disclaiming warranty or limiting liability differently from the terms of
+sections 15 and 16 of this License; or
+
+b) Requiring preservation of specified reasonable legal notices or author
+attributions in that material or in the Appropriate Legal Notices displayed
+by works containing it; or
+
+c) Prohibiting misrepresentation of the origin of that material, or requiring
+that modified versions of such material be marked in reasonable ways as different
+from the original version; or
+
+d) Limiting the use for publicity purposes of names of licensors or authors
+of the material; or
+
+e) Declining to grant rights under trademark law for use of some trade names,
+trademarks, or service marks; or
+
+f) Requiring indemnification of licensors and authors of that material by
+anyone who conveys the material (or modified versions of it) with contractual
+assumptions of liability to the recipient, for any liability that these contractual
+assumptions directly impose on those licensors and authors.
+
+All other non-permissive additional terms are considered "further restrictions"
+within the meaning of section 10. If the Program as you received it, or any
+part of it, contains a notice stating that it is governed by this License
+along with a term that is a further restriction, you may remove that term.
+If a license document contains a further restriction but permits relicensing
+or conveying under this License, you may add to a covered work material governed
+by the terms of that license document, provided that the further restriction
+does not survive such relicensing or conveying.
+
+If you add terms to a covered work in accord with this section, you must place,
+in the relevant source files, a statement of the additional terms that apply
+to those files, or a notice indicating where to find the applicable terms.
+
+Additional terms, permissive or non-permissive, may be stated in the form
+of a separately written license, or stated as exceptions; the above requirements
+apply either way.
+
+ 8. Termination.
+
+You may not propagate or modify a covered work except as expressly provided
+under this License. Any attempt otherwise to propagate or modify it is void,
+and will automatically terminate your rights under this License (including
+any patent licenses granted under the third paragraph of section 11).
+
+However, if you cease all violation of this License, then your license from
+a particular copyright holder is reinstated (a) provisionally, unless and
+until the copyright holder explicitly and finally terminates your license,
+and (b) permanently, if the copyright holder fails to notify you of the violation
+by some reasonable means prior to 60 days after the cessation.
+
+Moreover, your license from a particular copyright holder is reinstated permanently
+if the copyright holder notifies you of the violation by some reasonable means,
+this is the first time you have received notice of violation of this License
+(for any work) from that copyright holder, and you cure the violation prior
+to 30 days after your receipt of the notice.
+
+Termination of your rights under this section does not terminate the licenses
+of parties who have received copies or rights from you under this License.
+If your rights have been terminated and not permanently reinstated, you do
+not qualify to receive new licenses for the same material under section 10.
+
+ 9. Acceptance Not Required for Having Copies.
+
+You are not required to accept this License in order to receive or run a copy
+of the Program. Ancillary propagation of a covered work occurring solely as
+a consequence of using peer-to-peer transmission to receive a copy likewise
+does not require acceptance. However, nothing other than this License grants
+you permission to propagate or modify any covered work. These actions infringe
+copyright if you do not accept this License. Therefore, by modifying or propagating
+a covered work, you indicate your acceptance of this License to do so.
+
+ 10. Automatic Licensing of Downstream Recipients.
+
+Each time you convey a covered work, the recipient automatically receives
+a license from the original licensors, to run, modify and propagate that work,
+subject to this License. You are not responsible for enforcing compliance
+by third parties with this License.
+
+An "entity transaction" is a transaction transferring control of an organization,
+or substantially all assets of one, or subdividing an organization, or merging
+organizations. If propagation of a covered work results from an entity transaction,
+each party to that transaction who receives a copy of the work also receives
+whatever licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the Corresponding
+Source of the work from the predecessor in interest, if the predecessor has
+it or can get it with reasonable efforts.
+
+You may not impose any further restrictions on the exercise of the rights
+granted or affirmed under this License. For example, you may not impose a
+license fee, royalty, or other charge for exercise of rights granted under
+this License, and you may not initiate litigation (including a cross-claim
+or counterclaim in a lawsuit) alleging that any patent claim is infringed
+by making, using, selling, offering for sale, or importing the Program or
+any portion of it.
+
+ 11. Patents.
+
+A "contributor" is a copyright holder who authorizes use under this License
+of the Program or a work on which the Program is based. The work thus licensed
+is called the contributor's "contributor version".
+
+A contributor's "essential patent claims" are all patent claims owned or controlled
+by the contributor, whether already acquired or hereafter acquired, that would
+be infringed by some manner, permitted by this License, of making, using,
+or selling its contributor version, but do not include claims that would be
+infringed only as a consequence of further modification of the contributor
+version. For purposes of this definition, "control" includes the right to
+grant patent sublicenses in a manner consistent with the requirements of this
+License.
+
+Each contributor grants you a non-exclusive, worldwide, royalty-free patent
+license under the contributor's essential patent claims, to make, use, sell,
+offer for sale, import and otherwise run, modify and propagate the contents
+of its contributor version.
+
+In the following three paragraphs, a "patent license" is any express agreement
+or commitment, however denominated, not to enforce a patent (such as an express
+permission to practice a patent or covenant not to s ue for patent infringement).
+To "grant" such a patent license to a party means to make such an agreement
+or commitment not to enforce a patent against the party.
+
+If you convey a covered work, knowingly relying on a patent license, and the
+Corresponding Source of the work is not available for anyone to copy, free
+of charge and under the terms of this License, through a publicly available
+network server or other readily accessible means, then you must either (1)
+cause the Corresponding Source to be so available, or (2) arrange to deprive
+yourself of the benefit of the patent license for this particular work, or
+(3) arrange, in a manner consistent with the requirements of this License,
+to extend the patent
+
+license to downstream recipients. "Knowingly relying" means you have actual
+knowledge that, but for the patent license, your conveying the covered work
+in a country, or your recipient's use of the covered work in a country, would
+infringe one or more identifiable patents in that country that you have reason
+to believe are valid.
+
+If, pursuant to or in connection with a single transaction or arrangement,
+you convey, or propagate by procuring conveyance of, a covered work, and grant
+a patent license to some of the parties receiving the covered work authorizing
+them to use, propagate, modify or convey a specific copy of the covered work,
+then the patent license you grant is automatically extended to all recipients
+of the covered work and works based on it.
+
+A patent license is "discriminatory" if it does not include within the scope
+of its coverage, prohibits the exercise of, or is conditioned on the non-exercise
+of one or more of the rights that are specifically granted under this License.
+You may not convey a covered work if you are a party to an arrangement with
+a third party that is in the business of distributing software, under which
+you make payment to the third party based on the extent of your activity of
+conveying the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory patent
+license (a) in connection with copies of the covered work conveyed by you
+(or copies made from those copies), or (b) primarily for and in connection
+with specific products or compilations that contain the covered work, unless
+you entered into that arrangement, or that patent license was granted, prior
+to 28 March 2007.
+
+Nothing in this License shall be construed as excluding or limiting any implied
+license or other defenses to infringement that may otherwise be available
+to you under applicable patent law.
+
+ 12. No Surrender of Others' Freedom.
+
+If conditions are imposed on you (whether by court order, agreement or otherwise)
+that contradict the conditions of this License, they do not excuse you from
+the conditions of this License. If you cannot convey a covered work so as
+to satisfy simultaneously your obligations under this License and any other
+pertinent obligations, then as a consequence you may
+
+not convey it at all. For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey the
+Program, the only way you could satisfy both those terms and this License
+would be to refrain entirely from conveying the Program.
+
+ 13. Remote Network Interaction; Use with the GNU General Public License.
+
+Notwithstanding any other provision of this License, if you modify the Program,
+your modified version must prominently offer all users interacting with it
+remotely through a computer network (if your version supports such interaction)
+an opportunity to receive the Corresponding Source of your version by providing
+access to the Corresponding Source from a network server at no charge, through
+some standard or customary means of facilitating copying of software. This
+Corresponding Source shall include the Corresponding Source for any work covered
+by version 3 of the GNU General Public License that is incorporated pursuant
+to the following paragraph.
+
+Notwithstanding any other provision of this License, you have permission to
+link or combine any covered work with a work licensed under version 3 of the
+GNU General Public License into a single combined work, and to convey the
+resulting work. The terms of this License will continue to apply to the part
+which is the covered work, but the work with which it is combined will remain
+governed by version 3 of the GNU General Public License.
+
+ 14. Revised Versions of this License.
+
+The Free Software Foundation may publish revised and/or new versions of the
+GNU Affero General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to address
+new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program specifies
+that a certain numbered version of the GNU Affero General Public License "or
+any later version" applies to it, you have the option of following the terms
+and conditions either of that numbered version or of any later version published
+by the Free Software Foundation. If the Program does not specify a version
+number of the GNU Affero General Public License, you may choose any version
+ever published by the Free Software Foundation.
+
+If the Program specifies that a proxy can decide which future versions of
+the GNU Affero General Public License can be used, that proxy's public statement
+of acceptance of a version permanently authorizes you to choose that version
+for the Program.
+
+Later license versions may give you additional or different permissions. However,
+no additional obligations are imposed on any author or copyright holder as
+a result of your choosing to follow a later version.
+
+ 15. Disclaimer of Warranty.
+
+THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE
+LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
+OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER
+EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM
+PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR
+CORRECTION.
+
+ 16. Limitation of Liability.
+
+IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL
+ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM
+AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL,
+INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO
+USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED
+INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE
+PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER
+PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+
+ 17. Interpretation of Sections 15 and 16.
+
+If the disclaimer of warranty and limitation of liability provided above cannot
+be given local legal effect according to their terms, reviewing courts shall
+apply local law that most closely approximates an absolute waiver of all civil
+liability in connection with the Program, unless a warranty or assumption
+of liability accompanies a copy of the Program in return for a fee. END OF
+TERMS AND CONDITIONS
+
+How to Apply These Terms to Your New Programs
+
+If you develop a new program, and you want it to be of the greatest possible
+use to the public, the best way to achieve this is to make it free software
+which everyone can redistribute and change under these terms.
+
+To do so, attach the following notices to the program. It is safest to attach
+them to the start of each source file to most effectively state the exclusion
+of warranty; and each file should have at least the "copyright" line and a
+pointer to where the full notice is found.
+
+
+
+Copyright (C)
+
+This program is free software: you can redistribute it and/or modify it under
+the terms of the GNU Affero General Public License as published by the Free
+Software Foundation, either version 3 of the License, or (at your option)
+any later version.
+
+This program is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more
+details.
+
+You should have received a copy of the GNU Affero General Public License along
+with this program. If not, see .
+
+Also add information on how to contact you by electronic and paper mail.
+
+If your software can interact with users remotely through a computer network,
+you should also make sure that it provides a way for users to get its source.
+For example, if your program is a web application, its interface could display
+a "Source" link that leads users to an archive of the code. There are many
+ways you could offer source, and different solutions will be better for different
+programs; see section 13 for the specific requirements.
+
+You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary. For
+more information on this, and how to apply and follow the GNU AGPL, see .
diff --git a/app/javascript/skins/glitch/pink-moonlight/README.md b/app/javascript/skins/glitch/pink-moonlight/README.md
new file mode 100644
index 0000000000..c38db3a23f
--- /dev/null
+++ b/app/javascript/skins/glitch/pink-moonlight/README.md
@@ -0,0 +1,15 @@
+# Pink Moonlight for Glitch-Soc
+
+![Pink Moonlight](https://git.barkshark.tk/GSThemes/pink-moonlight/raw/branch/master/preview.png)
+
+To install, just cd to your glitch-soc dir and run the following command:
+
+```
+git submodule add https://git.barkshark.tk/GSThemes/pink-moonlight.git app/javascript/skins/glitch/pink-moonlight
+```
+
+Check for updates:
+
+```
+git submodule update --remote
+```
\ No newline at end of file
diff --git a/app/javascript/skins/glitch/pink-moonlight/common.scss b/app/javascript/skins/glitch/pink-moonlight/common.scss
new file mode 100644
index 0000000000..ff195e15e1
--- /dev/null
+++ b/app/javascript/skins/glitch/pink-moonlight/common.scss
@@ -0,0 +1,477 @@
+//@import 'styles/pink-moonlight/variables';
+
+$black: #000000;
+$white: #EABBE8;
+
+$classic-base-color: #889FD1;
+$classic-primary-color: #9baec8;
+$classic-secondary-color: #472046;
+$classic-highlight-color: #6B3469;
+
+$ui-base-color: $classic-secondary-color !default;
+$ui-base-lighter-color: darken($ui-base-color, 57%);
+$ui-highlight-color: $classic-highlight-color !default;
+$ui-primary-color: $classic-primary-color !default;
+$ui-secondary-color: $classic-base-color !default;
+
+$primary-text-color: $white !default;
+$darker-text-color: darken($primary-text-color,5) !default;
+$dark-text-color: darken($primary-text-color, 5);
+$action-button-color: lighten($classic-base-color, 5);
+
+$base-overlay-background: $white !default;
+
+$inverted-text-color: $black !default;
+$lighter-text-color: $classic-base-color !default;
+$light-text-color: #444b5d;
+$highlight-text-color: #EA98E7;
+
+$account-background-color: $white !default;
+$custom-error-red: #912A61;
+
+//Invert darkened and lightened colors
+@function darken($color, $amount) {
+ @return hsl(hue($color), saturation($color), lightness($color) + $amount);
+}
+
+@function lighten($color, $amount) {
+ @return hsl(hue($color), saturation($color), lightness($color) - $amount);
+}
+
+$emojis-requiring-outlines: 'alien' 'baseball' 'chains' 'chicken' 'cloud' 'crescent_moon' 'dash' 'dove_of_peace' 'eyes' 'first_quarter_moon' 'first_quarter_moon_with_face' 'fish_cake' 'full_moon' 'full_moon_with_face' 'ghost' 'goat' 'grey_exclamation' 'grey_question' 'ice_skate' 'last_quarter_moon' 'last_quarter_moon_with_face' 'lightning' 'loud_sound' 'moon' 'mute' 'page_with_curl' 'rain_cloud' 'ram' 'rice' 'rice_ball' 'rooster' 'sheep' 'skull' 'skull_and_crossbones' 'snow_cloud' 'sound' 'speaker' 'speech_balloon' 'thought_balloon' 'volleyball' 'waning_crescent_moon' 'waning_gibbous_moon' 'waving_white_flag' 'waxing_crescent_moon' 'white_circle' 'white_large_square' 'white_medium_small_square' 'white_medium_square' 'white_small_square' 'wind_blowing_face';
+
+@import 'flavours/glitch/styles/index';
+//@import 'styles/pink-moonlight/diff';
+
+// Notes!
+// Sass color functions, "darken" and "lighten" are automatically replaced.
+
+.glitch.local-settings {
+ background: $ui-base-color;
+ color: $primary-text-color;
+
+ &__navigation {
+ background: darken($ui-base-color, 8%);
+ }
+
+ &__navigation__item {
+ background: darken($ui-base-color, 8%);
+
+ &:hover {
+ background: $ui-base-color;
+ }
+ }
+}
+
+.notification__dismiss-overlay {
+ .wrappy {
+ box-shadow: unset;
+ }
+
+ .ckbox {
+ text-shadow: unset;
+ }
+}
+
+.status.status-direct {
+ background: darken($ui-base-color, 8%);
+
+ &.collapsed> .status__content:after {
+ background: linear-gradient(rgba(darken($ui-base-color, 8%), 0), rgba(darken($ui-base-color, 8%), 1));
+ }
+}
+
+.focusable:focus.status.status-direct {
+ background: darken($ui-base-color, 4%);
+
+ &.collapsed> .status__content:after {
+ background: linear-gradient(rgba(darken($ui-base-color, 4%), 0), rgba(darken($ui-base-color, 4%), 1));
+ }
+}
+
+// Change columns' default background colors
+.column {
+ > .scrollable {
+ background: darken($ui-base-color, 13%);
+ }
+}
+
+.status.collapsed .status__content:after {
+ background: linear-gradient(rgba(darken($ui-base-color, 13%), 0), rgba(darken($ui-base-color, 13%), 1));
+}
+
+.drawer__inner {
+ background: $ui-base-color;
+}
+
+.drawer > .contents {
+ background: $ui-base-color url('data:image/svg+xml;utf8,') no-repeat bottom / 100% auto !important;
+
+ .mastodon {
+ filter: contrast(75%) brightness(75%) !important;
+ }
+}
+
+// Change the default appearance of the content warning button
+.status__content {
+
+ .status__content__spoiler-link {
+
+ background: lighten($ui-base-color, 30%);
+
+ &:hover {
+ background: lighten($ui-base-color, 35%);
+ text-decoration: none;
+ }
+
+ }
+
+}
+
+// Change the background colors of media and video spoilers
+.media-spoiler,
+.video-player__spoiler {
+ background: $ui-base-color;
+}
+
+// Change the colors used in the dropdown menu
+.dropdown-menu {
+ background: $ui-base-color;
+}
+
+.dropdown-menu__arrow {
+
+ &.left {
+ border-left-color: $ui-base-color;
+ }
+
+ &.top {
+ border-top-color: $ui-base-color;
+ }
+
+ &.bottom {
+ border-bottom-color: $ui-base-color;
+ }
+
+ &.right {
+ border-right-color: $ui-base-color;
+ }
+
+}
+
+.dropdown-menu__item {
+ a {
+ background: $ui-base-color;
+ color: $ui-secondary-color;
+ }
+}
+
+// Change the default color of several parts of the compose form
+.composer {
+
+ .composer--spoiler input, .composer--textarea textarea {
+ color: lighten($ui-base-color, 80%);
+
+ &:disabled { background: lighten($simple-background-color, 10%) }
+
+ &::placeholder {
+ color: lighten($ui-base-color, 70%);
+ }
+ }
+
+ .composer--options {
+ background: lighten($ui-base-color, 10%);
+ box-shadow: unset;
+
+ & > hr {
+ display: none;
+ }
+ }
+
+ .composer--options--dropdown--content--item {
+ color: $ui-primary-color;
+
+ strong {
+ color: $ui-primary-color;
+ }
+
+ }
+
+}
+
+.composer--upload_form--actions .icon-button {
+ color: lighten($white, 7%);
+
+ &:active,
+ &:focus,
+ &:hover {
+ color: $white;
+ }
+}
+
+.composer--upload_form--item > div input {
+ color: lighten($white, 7%);
+
+ &::placeholder {
+ color: lighten($white, 10%);
+ }
+}
+
+.dropdown-menu__separator {
+ border-bottom-color: lighten($ui-base-color, 12%);
+}
+
+.status__content,
+.reply-indicator__content {
+ a {
+ color: $highlight-text-color;
+ }
+}
+
+.emoji-mart-bar {
+ border-color: darken($ui-base-color, 4%);
+
+ &:first-child {
+ background: lighten($ui-base-color, 10%);
+ }
+}
+
+.emoji-mart-search input {
+ background: rgba($ui-base-color, 0.3);
+ border-color: $ui-base-color;
+}
+
+.composer--textarea--suggestions {
+ background: lighten($ui-base-color, 10%)
+}
+
+.composer--textarea--suggestions--item {
+ &:hover,
+ &:focus,
+ &:active,
+ &.selected {
+ background: darken($ui-base-color, 4%);
+ }
+}
+
+.react-toggle-track {
+ background: $ui-secondary-color;
+}
+
+.react-toggle:hover:not(.react-toggle--disabled) .react-toggle-track {
+ background: lighten($ui-secondary-color, 10%);
+}
+
+.react-toggle.react-toggle--checked:hover:not(.react-toggle--disabled) .react-toggle-track {
+ background: darken($ui-highlight-color, 10%);
+}
+
+// Change the background colors of modals
+.actions-modal,
+.boost-modal,
+.confirmation-modal,
+.mute-modal,
+.report-modal,
+.embed-modal,
+.error-modal,
+.onboarding-modal {
+ background: $ui-base-color;
+}
+
+.boost-modal__action-bar,
+.confirmation-modal__action-bar,
+.mute-modal__action-bar,
+.onboarding-modal__paginator,
+.error-modal__footer {
+ background: darken($ui-base-color, 6%);
+
+ .onboarding-modal__nav,
+ .error-modal__nav {
+ &:hover,
+ &:focus,
+ &:active {
+ background-color: darken($ui-base-color, 12%);
+ }
+ }
+}
+
+// Change the default color used for the text in an empty column or on the error column
+.empty-column-indicator,
+.error-column {
+ color: $primary-text-color;
+}
+
+// Change the default colors used on some parts of the profile pages
+.activity-stream-tabs {
+
+ background: $account-background-color;
+
+ a {
+ &.active {
+ color: $ui-primary-color;
+ }
+ }
+
+}
+
+.activity-stream {
+
+ .entry {
+ background: $account-background-color;
+ }
+
+ .status.light {
+
+ .status__content {
+ color: $primary-text-color;
+ }
+
+ .display-name {
+ strong {
+ color: $primary-text-color;
+ }
+ }
+
+ }
+
+}
+
+.accounts-grid {
+ .account-grid-card {
+
+ .controls {
+ .icon-button {
+ color: $ui-secondary-color;
+ }
+ }
+
+ .name {
+ a {
+ color: $primary-text-color;
+ }
+ }
+
+ .username {
+ color: $ui-secondary-color;
+ }
+
+ .account__header__content {
+ color: $primary-text-color;
+ }
+
+ }
+}
+
+/* Custom overrides */
+
+.column > .scrollable {
+ background: $ui-base-color;
+}
+
+.composer--textarea>label .textarea, .composer--spoiler input, .composer.composer--textarea textarea {
+ color: $primary-text-color !important;
+ background: lighten($ui-base-color, 10);
+}
+
+.drawer--header>*, .column-header__button, .column-header__notif-cleaning-buttons button {
+ color: $primary-text-color !important;
+}
+
+.display-name__account, .drawer--account>.acct, .getting-started p {
+ color: $action-button-color;
+}
+
+.button {
+ background: darken($ui-base-color, 8);
+}
+
+.button:disabled {
+ background: darken($ui-base-color, 5);
+}
+
+.activity-stream .entry {
+ background: darken($ui-base-color, 1);
+}
+
+.status__content__spoiler-link, .status.light .status__content, .status.light .display-name strong {
+ color: $primary-text-color !important;
+}
+
+.glitch.local-settings__navigation__item.close {
+ background: darken($custom-error-red, 5);
+}
+
+.glitch.local-settings__navigation__item.close:hover {
+ background: darken($custom-error-red, 10);
+}
+
+.glitch.local-settings__navigation__item.active {
+ background: lighten($classic-highlight-color, 10);
+}
+
+.glitch.local-settings__navigation__item.active:hover {
+ background: lighten($classic-highlight-color, 5);
+}
+
+.status:hover, .notification-follow:hover {
+ background: darken($ui-base-color, 2);
+}
+
+.status.status-direct {
+ background: lighten($ui-base-color, 3);
+}
+
+.status.status-direct:hover {
+ background: darken($ui-base-color, 1);
+}
+
+.account__header.account__header__fields dd a {
+ color: lighten($primary-text-color, 5);
+}
+
+.public-layout .public-account-header__bar .avatar img {
+ background: #521a50 !important;
+}
+
+.actions-modal ul li:not(:empty) a {
+ color: $classic-primary-color !important;
+}
+
+.actions-modal .status {
+ background: #270c26 !important;
+}
+
+.ui {
+ background: lighten($ui-base-color, 10%) !important;
+}
+
+/* Polls */
+.compose-form__poll-wrapper {
+ background: #0c040c;
+ border: 0px;
+}
+
+.compose-form__poll-wrapper .poll__footer {
+ border: 0px;
+}
+
+.compose-form__poll-wrapper .button.button-secondary {
+ border-color: darken($ui-base-color, 10%) !important;
+ color: $primary-text-color !important;
+}
+
+.button.button-secondary {
+ color: $white !important;
+}
+
+.compose-form__poll-wrapper select {
+ background: $ui-base-color !important;
+ color: $primary-text-color !important;
+ border-color: darken($ui-base-color, 10%) !important;
+}
+
+.poll__text input[type="text"] {
+ background-color: $ui-base-color !important;
+ color: $primary-text-color !important;
+ border-color: darken($ui-base-color, 10%) !important;
+}
diff --git a/app/javascript/skins/glitch/pink-moonlight/names.yml b/app/javascript/skins/glitch/pink-moonlight/names.yml
new file mode 100644
index 0000000000..9a2568fb49
--- /dev/null
+++ b/app/javascript/skins/glitch/pink-moonlight/names.yml
@@ -0,0 +1,4 @@
+en:
+ skins:
+ glitch:
+ pink-moonlight: Pink Moonlight
diff --git a/app/javascript/skins/glitch/pink-moonlight/preview.png b/app/javascript/skins/glitch/pink-moonlight/preview.png
new file mode 100644
index 0000000000..aaa8a68e7f
Binary files /dev/null and b/app/javascript/skins/glitch/pink-moonlight/preview.png differ
diff --git a/app/lib/request.rb b/app/lib/request.rb
index 5f7075a3c9..657dbb4bfb 100644
--- a/app/lib/request.rb
+++ b/app/lib/request.rb
@@ -234,7 +234,9 @@ class Request
alias new open
def check_private_address(address)
- raise Mastodon::HostValidationError if PrivateAddressCheck.private_address?(IPAddr.new(address.to_s))
+ #raise Mastodon::HostValidationError if PrivateAddressCheck.private_address?(IPAddr.new(address.to_s))
+ # People run multiple AP servers on the same network sometimes
+ nil
end
end
end
diff --git a/app/lib/sanitize_config.rb b/app/lib/sanitize_config.rb
index e6e861eb9c..1ce0daf879 100644
--- a/app/lib/sanitize_config.rb
+++ b/app/lib/sanitize_config.rb
@@ -39,7 +39,7 @@ class Sanitize
end
MASTODON_STRICT ||= freeze_config(
- elements: %w(p br span a abbr del pre blockquote code b strong u sub i em h1 h2 h3 h4 h5 ul ol li),
+ elements: %w(p br span a abbr del pre blockquote code b strong u sub i em h1 h2 h3 h4 h5 ul ol li center marquee img),
attributes: {
'a' => %w(href rel class title),
diff --git a/app/models/media_attachment.rb b/app/models/media_attachment.rb
index 815ac0258c..561b5eb78a 100644
--- a/app/models/media_attachment.rb
+++ b/app/models/media_attachment.rb
@@ -123,7 +123,7 @@ class MediaAttachment < ApplicationRecord
include Attachmentable
validates :account, presence: true
- validates :description, length: { maximum: 420 }, if: :local?
+ validates :description, length: { maximum: (ENV['MAX_AUDIO_LENGTH'] || 420).to_i }, if: :local?
scope :attached, -> { where.not(status_id: nil).or(where.not(scheduled_status_id: nil)) }
scope :unattached, -> { where(status_id: nil, scheduled_status_id: nil) }
diff --git a/config/sidekiq.yml b/config/sidekiq.yml
index 0ec1742abf..9f215665c3 100644
--- a/config/sidekiq.yml
+++ b/config/sidekiq.yml
@@ -1,9 +1,9 @@
---
-:concurrency: 5
+:concurrency: 50
:queues:
- - [default, 6]
- - [push, 4]
- - [mailers, 2]
+ - [default, 50]
+ - [push, 25]
+ - [mailers, 5]
- [pull]
:schedule:
scheduled_statuses_scheduler:
diff --git a/dist/caddy.conf b/dist/caddy.conf
new file mode 100644
index 0000000000..a0cd4f3547
--- /dev/null
+++ b/dist/caddy.conf
@@ -0,0 +1,52 @@
+example.com {
+ redir 301 {
+ /.well-known/host-meta https://mastodon.barkshark.tk{uri}
+ }
+}
+
+mastodon.example.com {
+ root /home/mastodon/mastodon/public
+ log /var/log/mastodon-access.log {
+ rotate_size 2
+ rotate_keep 30
+ }
+ errors /var/log/mastodon-error.log {
+ * 500.html
+ rotate_size 2
+ rotate_keep 30
+ }
+
+ gzip
+
+ header / {
+ Strict-Transport-Security "max-age=31536000;"
+ #-Content-Security-Policy
+ }
+
+ header /emoji Cache-Control "public, max-age=31536000, immutable"
+ header /packs Cache-Control "public, max-age=31536000, immutable"
+ header /system/accounts/avatars Cache-Control "public, max-age=31536000, immutable"
+ header /system/media_attachments/files Cache-Control "public, max-age=31536000, immutable"
+
+ rewrite {
+ if {path} is /
+ to /proxy{path}
+ }
+
+ rewrite {
+ if {path} not_has /api/v1/streaming
+ to {path} /proxy{path}
+ }
+
+ proxy /proxy localhost:3000 {
+ without /proxy
+
+ transparent
+ websocket
+ }
+
+ proxy /api/v1/streaming localhost:4000 {
+ transparent
+ websocket
+ }
+}
\ No newline at end of file
diff --git a/dist/mastodon-sidekiq.service b/dist/mastodon-sidekiq.service
index 721a866090..c0ded5550e 100644
--- a/dist/mastodon-sidekiq.service
+++ b/dist/mastodon-sidekiq.service
@@ -1,15 +1,15 @@
[Unit]
Description=mastodon-sidekiq
After=network.target
+PartOf=mastodon.target
[Service]
Type=simple
User=mastodon
-WorkingDirectory=/home/mastodon/live
+WorkingDirectory=workdir
Environment="RAILS_ENV=production"
-Environment="DB_POOL=25"
-Environment="MALLOC_ARENA_MAX=2"
-ExecStart=/home/mastodon/.rbenv/shims/bundle exec sidekiq -c 25
+#Environment="RUBYOPT=--jit"
+ExecStart=homedir/.rbenv/shims/bundle exec sidekiq -c 50 -q default -q push -q mailers -q pull
TimeoutSec=15
Restart=always
diff --git a/dist/mastodon-streaming.service b/dist/mastodon-streaming.service
index c324fccf46..e42979cbc1 100644
--- a/dist/mastodon-streaming.service
+++ b/dist/mastodon-streaming.service
@@ -1,15 +1,15 @@
[Unit]
Description=mastodon-streaming
After=network.target
+PartOf=mastodon.target
[Service]
Type=simple
User=mastodon
-WorkingDirectory=/home/mastodon/live
+WorkingDirectory=workdir
Environment="NODE_ENV=production"
Environment="PORT=4000"
-Environment="STREAMING_CLUSTER_NUM=1"
-ExecStart=/usr/bin/node ./streaming
+ExecStart=/usr/bin/npm run start
TimeoutSec=15
Restart=always
diff --git a/dist/mastodon-web.service b/dist/mastodon-web.service
index 30fcbec1e0..f3431bcb65 100644
--- a/dist/mastodon-web.service
+++ b/dist/mastodon-web.service
@@ -1,14 +1,16 @@
[Unit]
Description=mastodon-web
After=network.target
+PartOf=mastodon.target
[Service]
Type=simple
User=mastodon
-WorkingDirectory=/home/mastodon/live
+WorkingDirectory=workdir
Environment="RAILS_ENV=production"
Environment="PORT=3000"
-ExecStart=/home/mastodon/.rbenv/shims/bundle exec puma -C config/puma.rb
+Environment="RUBYOPT=--jit"
+ExecStart=homedir/.rbenv/shims/bundle exec puma -C config/puma.rb
ExecReload=/bin/kill -SIGUSR1 $MAINPID
TimeoutSec=15
Restart=always
diff --git a/dist/mastodon.target b/dist/mastodon.target
new file mode 100644
index 0000000000..69f0425b18
--- /dev/null
+++ b/dist/mastodon.target
@@ -0,0 +1,6 @@
+[Unit]
+Description=Mastodon
+Wants=mastodon-sidekiq.service mastodon-streaming.service mastodon-web.service
+
+[Install]
+WantedBy=multi-user.target
diff --git a/dist/recompile.sh b/dist/recompile.sh
new file mode 100755
index 0000000000..35d9ab6819
--- /dev/null
+++ b/dist/recompile.sh
@@ -0,0 +1,5 @@
+#!/bin/sh
+MAXMEM=${1:-4096}
+NODE_OPTIONS=--max-old-space-size=$MAXMEM
+RAILS_ENV=production
+bundle exec rails assets:precompile
\ No newline at end of file
diff --git a/dist/setupdev-refresh.sh b/dist/setupdev-refresh.sh
new file mode 100755
index 0000000000..a755b2a6a3
--- /dev/null
+++ b/dist/setupdev-refresh.sh
@@ -0,0 +1,37 @@
+#!/usr/bin/env bash
+function installRuby {
+ # update rbenv
+ (cd $HOME/.rbenv && git pull && git submodule update --init --recursive)
+
+ rbMasto=`cat .ruby-version`
+ rbVersions=`rbenv versions`
+
+ # build and install ruby with jemalloc
+ if [[ *$rbMasto* == $rbVersions ]]; then
+ RUBY_CONFIGURE_OPTS=--with-jemalloc rbenv install $rbMasto
+ fi
+}
+
+function installMastoDeps {
+ # create database user
+ echo "DROP DATABASE IF EXISTS mastodon_development;" | sudo -u postgres psql
+
+ # update gem
+ printf 'y\n' | gem update --system --no-document
+
+ # install ruby and nodejs deps
+ gem install bundler foreman --no-document
+ bundle install -j$(getconf _NPROCESSORS_ONLN)
+ yarn install --pure-lockfile
+
+ # setup db
+ bundle exec rails db:setup
+}
+
+installRuby
+installMastoDeps
+
+# Done!
+echo "Setup done! Run 'foreman start' to start sidekiq, streaming, web, and webpack
+ Username: admin@localhost:3000
+ Password: mastodonadmin"
diff --git a/dist/setupdev.sh b/dist/setupdev.sh
new file mode 100755
index 0000000000..28ea47d5ca
--- /dev/null
+++ b/dist/setupdev.sh
@@ -0,0 +1,79 @@
+#!/usr/bin/env bash
+function installDebDeps {
+ . /etc/os-release
+ # install curl
+ sudo apt install curl gnupg --no-install-recommends -y
+
+ # setup node repo if not running ubuntu
+ if [ $NAME == "Ubuntu" && $VERSION_ID -ge "18.04" ]
+ then
+ echo "Skipping node repository since it's uneccessary on this OS"
+ else
+ curl -sL https://deb.nodesource.com/setup_8.x | sudo bash -
+ fi
+
+ # setup yarn repo
+ curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add -
+ echo "deb https://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list
+
+ # update repos
+ sudo apt update
+
+ # install needed libraries & programs for ruby & mastodon
+ sudo apt install --no-install-recommends -y imagemagick ffmpeg libpq-dev libxml2-dev libxslt1-dev file \
+ g++ libprotobuf-dev protobuf-compiler pkg-config nodejs gcc autoconf libjemalloc-dev \
+ bison build-essential libssl-dev libyaml-dev libreadline-dev \
+ zlib1g-dev libncurses5-dev libffi-dev libgdbm-dev \
+ redis-server redis-tools postgresql postgresql-contrib \
+ yarn libidn11-dev libicu-dev libjemalloc-dev
+}
+
+function installRuby {
+ rbMasto=`cat .ruby-version`
+ rbVersions=`rbenv versions`
+
+ # setup rbenv
+ git clone https://github.com/rbenv/rbenv.git $HOME/.rbenv
+ cd $HOME/.rbenv && src/configure && make -C src
+
+ # add rubyenv to bashrc
+ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> $HOME/.bashrc
+ echo 'eval "$(rbenv init -)"' >> $HOME/.bashrc
+
+ # apply env
+ export PATH="$HOME/.rbenv/bin:$PATH"
+ eval "$(rbenv init -)"
+
+ # install ruby-build
+ git clone https://github.com/rbenv/ruby-build.git ~/.rbenv/plugins/ruby-build
+
+ # build and install ruby with jemalloc
+ if [[ *$rbMasto* == $rbVersions ]]; then
+ RUBY_CONFIGURE_OPTS=--with-jemalloc rbenv install $rbMasto
+ fi
+}
+
+function installMastoDeps {
+ # create database user
+ echo "CREATE USER $(whoami) CREATEDB;" | sudo -u postgres psql
+
+ # update gem
+ printf 'y\n' | gem update --system --no-document
+
+ # install ruby and nodejs deps
+ gem install bundler foreman --no-document
+ bundle install -j$(getconf _NPROCESSORS_ONLN)
+ yarn install --pure-lockfile
+
+ # setup db
+ bundle exec rails db:setup
+}
+
+installDebDeps
+installRuby
+installMastoDeps
+
+# Done!
+echo "Setup done! Run 'foreman start' to start sidekiq, streaming, web, and webpack
+ Username: admin@localhost:3000
+ Password: mastodonadmin"
diff --git a/dist/setupprod.sh b/dist/setupprod.sh
new file mode 100755
index 0000000000..622c210a55
--- /dev/null
+++ b/dist/setupprod.sh
@@ -0,0 +1,97 @@
+#!/usr/bin/env bash
+RAILS_ENV=production
+NODE_ENV=production
+
+function installDebDeps {
+ . /etc/os-release
+ # install curl
+ sudo apt install curl gnupg --no-install-recommends -y
+
+ # setup node repo if not running ubuntu
+ if [ $NAME == "Ubuntu" && $VERSION_ID -ge "18.04" ]
+ then
+ echo "Skipping node repository since it's uneccessary on this OS"
+ else
+ curl -sL https://deb.nodesource.com/setup_8.x | sudo bash -
+ fi
+
+ # setup yarn repo
+ curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add -
+ echo "deb https://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list
+
+ # update repos
+ sudo apt update
+
+ # install needed libraries & programs for ruby & mastodon
+ sudo apt install --no-install-recommends -y imagemagick ffmpeg libpq-dev libxml2-dev libxslt1-dev file \
+ g++ libprotobuf-dev protobuf-compiler pkg-config nodejs gcc autoconf libjemalloc-dev \
+ bison build-essential libssl-dev libyaml-dev libreadline-dev \
+ zlib1g-dev libncurses5-dev libffi-dev libgdbm-dev \
+ redis-server redis-tools postgresql postgresql-contrib \
+ yarn libidn11-dev libicu-dev libjemalloc-dev
+}
+
+function installRuby {
+ # setup rbenv
+ git clone https://github.com/rbenv/rbenv.git $HOME/.rbenv
+ cd $HOME/.rbenv && src/configure && make -C src
+
+ # add rubyenv to bashrc
+ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> $HOME/.bashrc
+ echo 'eval "$(rbenv init -)"' >> $HOME/.bashrc
+
+ # apply env
+ export PATH="$HOME/.rbenv/bin:$PATH"
+ eval "$(rbenv init -)"
+
+ # install ruby-build
+ git clone https://github.com/rbenv/ruby-build.git ~/.rbenv/plugins/ruby-build
+
+ # build and install ruby with jemalloc
+ if [[ *$rbMasto* == $rbVersions ]]; then
+ RUBY_CONFIGURE_OPTS=--with-jemalloc rbenv install $rbMasto
+ fi
+}
+
+function installMasto {
+ # create database user
+ echo "CREATE USER $(whoami) CREATEDB;" | sudo -u postgres psql
+
+ # update gem
+ printf 'y\n' | gem update --system --no-document
+
+ # install ruby and nodejs deps
+ gem install bundler --no-document
+ bundle install -j$(getconf _NPROCESSORS_ONLN) --deployment --without development test
+ yarn install --pure-lockfile
+
+ # setup db
+ bundle exec rake mastodon:setup
+}
+
+function installServices {
+ SYSDIR=/etc/systemd/system
+
+ # Copy service files
+ sudo cp dist/mastodon-*.service $SYSDIR/
+ sudo cp dist/mastodon.target $SYSDIR/
+
+ # Set the correct paths for the services
+ sudo sed -i -e 's#workdir#'$PWD'#g' $SYSDIR/mastodon-*.service
+ sudo sed -i -e 's#homedir#'$HOME'#g' $SYSDIR/mastodon-*.service
+
+ # Re-read service files and set mastodon to start on boot
+ sudo systemctl daemon-reload
+ sudo systemctl enable mastodon.target
+}
+
+installDebDeps
+installRuby
+installMasto
+installServices
+
+# Uncomment to install all the extra themes
+#git submodule update --init --recursive
+
+# Done!
+echo "Setup done! Make any changes to .env.production if necessary and then run 'sudo systemctl start mastodon.target'"
diff --git a/lib/mastodon/domains_cli.rb b/lib/mastodon/domains_cli.rb
index b081581fe5..af176d3142 100644
--- a/lib/mastodon/domains_cli.rb
+++ b/lib/mastodon/domains_cli.rb
@@ -28,7 +28,8 @@ module Mastodon
say('.', :green, false)
end
- DomainBlock.where(domain: domain).destroy_all unless options[:dry_run]
+ # Don't unblock domains that get purged. They're usually blocked for a reason
+ #DomainBlock.where(domain: domain).destroy_all unless options[:dry_run]
say
say("Removed #{removed} accounts#{dry_run}", :green)